[AArch64] Add support for the SVE2 ACLE
authorRichard Sandiford <richard.sandiford@arm.com>
Thu, 9 Jan 2020 16:36:42 +0000 (16:36 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 9 Jan 2020 16:36:42 +0000 (16:36 +0000)
This patch adds support for the SVE2 ACLE,  The implementation
and tests follow the same pattern as the exiting SVE ACLE support.

2020-01-09  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* config.gcc (aarch64*-*-*): Add aarch64-sve-builtins-sve2.o to
extra_objs.
* config/aarch64/t-aarch64 (aarch64-sve-builtins.o): Depend on
aarch64-sve-builtins-base.def, aarch64-sve-builtins-sve2.def and
aarch64-sve-builtins-sve2.h.
(aarch64-sve-builtins-sve2.o): New rule.
* config/aarch64/aarch64.h (AARCH64_ISA_SVE2_AES): New macro.
(AARCH64_ISA_SVE2_BITPERM, AARCH64_ISA_SVE2_SHA3): Likewise.
(AARCH64_ISA_SVE2_SM4, TARGET_SVE2_AES, TARGET_SVE2_BITPERM): Likewise.
(TARGET_SVE2_SHA, TARGET_SVE2_SM4): Likewise.
* config/aarch64/aarch64-c.c (aarch64_update_cpp_builtins): Handle
TARGET_SVE2_AES, TARGET_SVE2_BITPERM, TARGET_SVE2_SHA3 and
TARGET_SVE2_SM4.
* config/aarch64/aarch64-sve.md: Update comments with SVE2
instructions that are handled here.
(@cond_asrd<mode>): Generalize to...
(@cond_<SVE_INT_SHIFT_IMM:sve_int_op><mode>): ...this.
(*cond_asrd<mode>_2): Generalize to...
(*cond_<SVE_INT_SHIFT_IMM:sve_int_op><mode>_2): ...this.
(*cond_asrd<mode>_z): Generalize to...
(*cond_<SVE_INT_SHIFT_IMM:sve_int_op><mode>_z): ...this.
* config/aarch64/aarch64.md (UNSPEC_LDNT1_GATHER): New unspec.
(UNSPEC_STNT1_SCATTER, UNSPEC_WHILEGE, UNSPEC_WHILEGT): Likewise.
(UNSPEC_WHILEHI, UNSPEC_WHILEHS): Likewise.
* config/aarch64/aarch64-sve2.md (@aarch64_gather_ldnt<mode>): New
pattern.
(@aarch64_gather_ldnt_<ANY_EXTEND:optab><SVE_FULL_SDI:mode><SVE_PARTIAL_I:mode>)
(@aarch64_scatter_stnt<mode>): Likewise.
(@aarch64_scatter_stnt_<SVE_FULL_SDI:mode><SVE_PARTIAL_I:mode>)
(@aarch64_mul_lane_<mode>): Likewise.
(@aarch64_sve_suqadd<mode>_const): Likewise.
(*<sur>h<addsub><mode>): Generalize to...
(@aarch64_pred_<SVE2_COND_INT_BINARY_REV:sve_int_op><mode>): ...this
new pattern.
(@cond_<SVE2_COND_INT_BINARY:sve_int_op><mode>): New expander.
(*cond_<SVE2_COND_INT_BINARY:sve_int_op><mode>_2): New pattern.
(*cond_<SVE2_COND_INT_BINARY:sve_int_op><mode>_3): Likewise.
(*cond_<SVE2_COND_INT_BINARY:sve_int_op><mode>_any): Likewise.
(*cond_<SVE2_COND_INT_BINARY_NOREV:sve_int_op><mode>_z): Likewise.
(@aarch64_sve_<SVE2_INT_BINARY:sve_int_op><mode>):: Likewise.
(@aarch64_sve_<SVE2_INT_BINARY:sve_int_op>_lane_<mode>): Likewise.
(@aarch64_pred_<SVE2_COND_INT_SHIFT:sve_int_op><mode>): Likewise.
(@cond_<SVE2_COND_INT_SHIFT:sve_int_op><mode>): New expander.
(*cond_<SVE2_COND_INT_SHIFT:sve_int_op><mode>_2): New pattern.
(*cond_<SVE2_COND_INT_SHIFT:sve_int_op><mode>_3): Likewise.
(*cond_<SVE2_COND_INT_SHIFT:sve_int_op><mode>_any): Likewise.
(@aarch64_sve_<SVE2_INT_TERNARY:sve_int_op><mode>): Likewise.
(@aarch64_sve_<SVE2_INT_TERNARY_LANE:sve_int_op>_lane_<mode>)
(@aarch64_sve_add_mul_lane_<mode>): Likewise.
(@aarch64_sve_sub_mul_lane_<mode>): Likewise.
(@aarch64_sve2_xar<mode>): Likewise.
(@aarch64_sve2_bcax<mode>): Likewise.
(*aarch64_sve2_eor3<mode>): Rename to...
(@aarch64_sve2_eor3<mode>): ...this.
(@aarch64_sve2_bsl<mode>): New expander.
(@aarch64_sve2_nbsl<mode>): Likewise.
(@aarch64_sve2_bsl1n<mode>): Likewise.
(@aarch64_sve2_bsl2n<mode>): Likewise.
(@aarch64_sve_add_<SHIFTRT:sve_int_op><mode>): Likewise.
(*aarch64_sve2_sra<mode>): Add MOVPRFX support.
(@aarch64_sve_add_<VRSHR_N:sve_int_op><mode>): New pattern.
(@aarch64_sve_<SVE2_INT_SHIFT_INSERT:sve_int_op><mode>): Likewise.
(@aarch64_sve2_<USMAX:su>aba<mode>): New expander.
(*aarch64_sve2_<USMAX:su>aba<mode>): New pattern.
(@aarch64_sve_<SVE2_INT_BINARY_WIDE:sve_int_op><mode>): Likewise.
(<su>mull<bt><Vwide>): Generalize to...
(@aarch64_sve_<SVE2_INT_BINARY_LONG:sve_int_op><mode>): ...this new
pattern.
(@aarch64_sve_<SVE2_INT_BINARY_LONG_lANE:sve_int_op>_lane_<mode>)
(@aarch64_sve_<SVE2_INT_SHIFT_IMM_LONG:sve_int_op><mode>)
(@aarch64_sve_add_<SVE2_INT_ADD_BINARY_LONG:sve_int_op><mode>)
(@aarch64_sve_add_<SVE2_INT_ADD_BINARY_LONG_LANE:sve_int_op>_lane_<mode>)
(@aarch64_sve_qadd_<SVE2_INT_QADD_BINARY_LONG:sve_int_op><mode>)
(@aarch64_sve_qadd_<SVE2_INT_QADD_BINARY_LONG_LANE:sve_int_op>_lane_<mode>)
(@aarch64_sve_sub_<SVE2_INT_SUB_BINARY_LONG:sve_int_op><mode>)
(@aarch64_sve_sub_<SVE2_INT_SUB_BINARY_LONG_LANE:sve_int_op>_lane_<mode>)
(@aarch64_sve_qsub_<SVE2_INT_QSUB_BINARY_LONG:sve_int_op><mode>)
(@aarch64_sve_qsub_<SVE2_INT_QSUB_BINARY_LONG_LANE:sve_int_op>_lane_<mode>)
(@aarch64_sve_<SVE2_FP_TERNARY_LONG:sve_fp_op><mode>): New patterns.
(@aarch64_<SVE2_FP_TERNARY_LONG_LANE:sve_fp_op>_lane_<mode>)
(@aarch64_sve_<SVE2_INT_UNARY_NARROWB:sve_int_op><mode>): Likewise.
(@aarch64_sve_<SVE2_INT_UNARY_NARROWT:sve_int_op><mode>): Likewise.
(@aarch64_sve_<SVE2_INT_BINARY_NARROWB:sve_int_op><mode>): Likewise.
(@aarch64_sve_<SVE2_INT_BINARY_NARROWT:sve_int_op><mode>): Likewise.
(<SHRNB:r>shrnb<mode>): Generalize to...
(@aarch64_sve_<SVE2_INT_SHIFT_IMM_NARROWB:sve_int_op><mode>): ...this
new pattern.
(<SHRNT:r>shrnt<mode>): Generalize to...
(@aarch64_sve_<SVE2_INT_SHIFT_IMM_NARROWT:sve_int_op><mode>): ...this
new pattern.
(@aarch64_pred_<SVE2_INT_BINARY_PAIR:sve_int_op><mode>): New pattern.
(@aarch64_pred_<SVE2_FP_BINARY_PAIR:sve_fp_op><mode>): Likewise.
(@cond_<SVE2_INT_BINARY_PAIR_LONG:sve_int_op><mode>): New expander.
(*cond_<SVE2_INT_BINARY_PAIR_LONG:sve_int_op><mode>_2): New pattern.
(*cond_<SVE2_INT_BINARY_PAIR_LONG:sve_int_op><mode>_z): Likewise.
(@aarch64_sve_<SVE2_INT_CADD:optab><mode>): Likewise.
(@aarch64_sve_<SVE2_INT_CMLA:optab><mode>): Likewise.
(@aarch64_<SVE2_INT_CMLA:optab>_lane_<mode>): Likewise.
(@aarch64_sve_<SVE2_INT_CDOT:optab><mode>): Likewise.
(@aarch64_<SVE2_INT_CDOT:optab>_lane_<mode>): Likewise.
(@aarch64_pred_<SVE2_COND_FP_UNARY_LONG:sve_fp_op><mode>): Likewise.
(@cond_<SVE2_COND_FP_UNARY_LONG:sve_fp_op><mode>): New expander.
(*cond_<SVE2_COND_FP_UNARY_LONG:sve_fp_op><mode>): New pattern.
(@aarch64_sve2_cvtnt<mode>): Likewise.
(@aarch64_pred_<SVE2_COND_FP_UNARY_NARROWB:sve_fp_op><mode>): Likewise.
(@cond_<SVE2_COND_FP_UNARY_NARROWB:sve_fp_op><mode>): New expander.
(*cond_<SVE2_COND_FP_UNARY_NARROWB:sve_fp_op><mode>_any): New pattern.
(@aarch64_sve2_cvtxnt<mode>): Likewise.
(@aarch64_pred_<SVE2_U32_UNARY:sve_int_op><mode>): Likewise.
(@cond_<SVE2_U32_UNARY:sve_int_op><mode>): New expander.
(*cond_<SVE2_U32_UNARY:sve_int_op><mode>): New pattern.
(@aarch64_pred_<SVE2_COND_INT_UNARY_FP:sve_fp_op><mode>): Likewise.
(@cond_<SVE2_COND_INT_UNARY_FP:sve_fp_op><mode>): New expander.
(*cond_<SVE2_COND_INT_UNARY_FP:sve_fp_op><mode>): New pattern.
(@aarch64_sve2_pmul<mode>): Likewise.
(@aarch64_sve_<SVE2_PMULL:optab><mode>): Likewise.
(@aarch64_sve_<SVE2_PMULL_PAIR:optab><mode>): Likewise.
(@aarch64_sve2_tbl2<mode>): Likewise.
(@aarch64_sve2_tbx<mode>): Likewise.
(@aarch64_sve_<SVE2_INT_BITPERM:sve_int_op><mode>): Likewise.
(@aarch64_sve2_histcnt<mode>): Likewise.
(@aarch64_sve2_histseg<mode>): Likewise.
(@aarch64_pred_<SVE2_MATCH:sve_int_op><mode>): Likewise.
(*aarch64_pred_<SVE2_MATCH:sve_int_op><mode>_cc): Likewise.
(*aarch64_pred_<SVE2_MATCH:sve_int_op><mode>_ptest): Likewise.
(aarch64_sve2_aes<CRYPTO_AES:aes_op>): Likewise.
(aarch64_sve2_aes<CRYPTO_AESMC:aesmc_op>): Likewise.
(*aarch64_sve2_aese_fused, *aarch64_sve2_aesd_fused): Likewise.
(aarch64_sve2_rax1, aarch64_sve2_sm4e, aarch64_sve2_sm4ekey): Likewise.
(<su>mulh<r>s<mode>3): Update after above pattern name changes.
* config/aarch64/iterators.md (VNx16QI_ONLY, VNx4SF_ONLY)
(SVE_STRUCT2, SVE_FULL_BHI, SVE_FULL_HSI, SVE_FULL_HDI)
(SVE2_PMULL_PAIR_I): New mode iterators.
(UNSPEC_ADCLB, UNSPEC_ADCLT, UNSPEC_ADDHNB, UNSPEC_ADDHNT, UNSPEC_BDEP)
(UNSPEC_BEXT, UNSPEC_BGRP, UNSPEC_CADD90, UNSPEC_CADD270, UNSPEC_CDOT)
(UNSPEC_CDOT90, UNSPEC_CDOT180, UNSPEC_CDOT270, UNSPEC_CMLA)
(UNSPEC_CMLA90, UNSPEC_CMLA180, UNSPEC_CMLA270, UNSPEC_COND_FCVTLT)
(UNSPEC_COND_FCVTNT, UNSPEC_COND_FCVTX, UNSPEC_COND_FCVTXNT)
(UNSPEC_COND_FLOGB, UNSPEC_EORBT, UNSPEC_EORTB, UNSPEC_FADDP)
(UNSPEC_FMAXP, UNSPEC_FMAXNMP, UNSPEC_FMLALB, UNSPEC_FMLALT)
(UNSPEC_FMLSLB, UNSPEC_FMLSLT, UNSPEC_FMINP, UNSPEC_FMINNMP)
(UNSPEC_HISTCNT, UNSPEC_HISTSEG, UNSPEC_MATCH, UNSPEC_NMATCH)
(UNSPEC_PMULLB, UNSPEC_PMULLB_PAIR, UNSPEC_PMULLT, UNSPEC_PMULLT_PAIR)
(UNSPEC_RADDHNB, UNSPEC_RADDHNT, UNSPEC_RSUBHNB, UNSPEC_RSUBHNT)
(UNSPEC_SLI, UNSPEC_SRI, UNSPEC_SABDLB, UNSPEC_SABDLT, UNSPEC_SADDLB)
(UNSPEC_SADDLBT, UNSPEC_SADDLT, UNSPEC_SADDWB, UNSPEC_SADDWT)
(UNSPEC_SBCLB, UNSPEC_SBCLT, UNSPEC_SMAXP, UNSPEC_SMINP)
(UNSPEC_SQCADD90, UNSPEC_SQCADD270, UNSPEC_SQDMULLB, UNSPEC_SQDMULLBT)
(UNSPEC_SQDMULLT, UNSPEC_SQRDCMLAH, UNSPEC_SQRDCMLAH90)
(UNSPEC_SQRDCMLAH180, UNSPEC_SQRDCMLAH270, UNSPEC_SQRSHRNB)
(UNSPEC_SQRSHRNT, UNSPEC_SQRSHRUNB, UNSPEC_SQRSHRUNT, UNSPEC_SQSHRNB)
(UNSPEC_SQSHRNT, UNSPEC_SQSHRUNB, UNSPEC_SQSHRUNT, UNSPEC_SQXTNB)
(UNSPEC_SQXTNT, UNSPEC_SQXTUNB, UNSPEC_SQXTUNT, UNSPEC_SSHLLB)
(UNSPEC_SSHLLT, UNSPEC_SSUBLB, UNSPEC_SSUBLBT, UNSPEC_SSUBLT)
(UNSPEC_SSUBLTB, UNSPEC_SSUBWB, UNSPEC_SSUBWT, UNSPEC_SUBHNB)
(UNSPEC_SUBHNT, UNSPEC_TBL2, UNSPEC_UABDLB, UNSPEC_UABDLT)
(UNSPEC_UADDLB, UNSPEC_UADDLT, UNSPEC_UADDWB, UNSPEC_UADDWT)
(UNSPEC_UMAXP, UNSPEC_UMINP, UNSPEC_UQRSHRNB, UNSPEC_UQRSHRNT)
(UNSPEC_UQSHRNB, UNSPEC_UQSHRNT, UNSPEC_UQXTNB, UNSPEC_UQXTNT)
(UNSPEC_USHLLB, UNSPEC_USHLLT, UNSPEC_USUBLB, UNSPEC_USUBLT)
(UNSPEC_USUBWB, UNSPEC_USUBWT): New unspecs.
(UNSPEC_SMULLB, UNSPEC_SMULLT, UNSPEC_UMULLB, UNSPEC_UMULLT)
(UNSPEC_SMULHS, UNSPEC_SMULHRS, UNSPEC_UMULHS, UNSPEC_UMULHRS)
(UNSPEC_RSHRNB, UNSPEC_RSHRNT, UNSPEC_SHRNB, UNSPEC_SHRNT): Move
further down file.
(VNARROW, Ventype): New mode attributes.
(Vewtype): Handle VNx2DI.  Fix typo in comment.
(VDOUBLE): New mode attribute.
(sve_lane_con): Handle VNx8HI.
(SVE_INT_UNARY): Include ss_abs and ss_neg for TARGET_SVE2.
(SVE_INT_BINARY): Likewise ss_plus, us_plus, ss_minus and us_minus.
(sve_int_op, sve_int_op_rev): Handle the above codes.
(sve_pred_int_rhs2_operand): Likewise.
(MULLBT, SHRNB, SHRNT): Delete.
(SVE_INT_SHIFT_IMM): New int iterator.
(SVE_WHILE): Add UNSPEC_WHILEGE, UNSPEC_WHILEGT, UNSPEC_WHILEHI
and UNSPEC_WHILEHS for TARGET_SVE2.
(SVE2_U32_UNARY, SVE2_INT_UNARY_NARROWB, SVE2_INT_UNARY_NARROWT)
(SVE2_INT_BINARY, SVE2_INT_BINARY_LANE, SVE2_INT_BINARY_LONG)
(SVE2_INT_BINARY_LONG_LANE, SVE2_INT_BINARY_NARROWB)
(SVE2_INT_BINARY_NARROWT, SVE2_INT_BINARY_PAIR, SVE2_FP_BINARY_PAIR)
(SVE2_INT_BINARY_PAIR_LONG, SVE2_INT_BINARY_WIDE): New int iterators.
(SVE2_INT_SHIFT_IMM_LONG, SVE2_INT_SHIFT_IMM_NARROWB): Likewise.
(SVE2_INT_SHIFT_IMM_NARROWT, SVE2_INT_SHIFT_INSERT, SVE2_INT_CADD)
(SVE2_INT_BITPERM, SVE2_INT_TERNARY, SVE2_INT_TERNARY_LANE): Likewise.
(SVE2_FP_TERNARY_LONG, SVE2_FP_TERNARY_LONG_LANE, SVE2_INT_CMLA)
(SVE2_INT_CDOT, SVE2_INT_ADD_BINARY_LONG, SVE2_INT_QADD_BINARY_LONG)
(SVE2_INT_SUB_BINARY_LONG, SVE2_INT_QSUB_BINARY_LONG): Likewise.
(SVE2_INT_ADD_BINARY_LONG_LANE, SVE2_INT_QADD_BINARY_LONG_LANE)
(SVE2_INT_SUB_BINARY_LONG_LANE, SVE2_INT_QSUB_BINARY_LONG_LANE)
(SVE2_COND_INT_UNARY_FP, SVE2_COND_FP_UNARY_LONG): Likewise.
(SVE2_COND_FP_UNARY_NARROWB, SVE2_COND_INT_BINARY): Likewise.
(SVE2_COND_INT_BINARY_NOREV, SVE2_COND_INT_BINARY_REV): Likewise.
(SVE2_COND_INT_SHIFT, SVE2_MATCH, SVE2_PMULL): Likewise.
(optab): Handle the new unspecs.
(su, r): Remove entries for UNSPEC_SHRNB, UNSPEC_SHRNT, UNSPEC_RSHRNB
and UNSPEC_RSHRNT.
(lr): Handle the new unspecs.
(bt): Delete.
(cmp_op, while_optab_cmp, sve_int_op): Handle the new unspecs.
(sve_int_op_rev, sve_int_add_op, sve_int_qadd_op, sve_int_sub_op)
(sve_int_qsub_op): New int attributes.
(sve_fp_op, rot): Handle the new unspecs.
* config/aarch64/aarch64-sve-builtins.h
(function_resolver::require_matching_pointer_type): Declare.
(function_resolver::resolve_unary): Add an optional boolean argument.
(function_resolver::finish_opt_n_resolution): Add an optional
type_suffix_index argument.
(gimple_folder::redirect_call): Declare.
(gimple_expander::prepare_gather_address_operands): Add an optional
bool parameter.
* config/aarch64/aarch64-sve-builtins.cc: Include
aarch64-sve-builtins-sve2.h.
(TYPES_b_unsigned, TYPES_b_integer, TYPES_bh_integer): New macros.
(TYPES_bs_unsigned, TYPES_hs_signed, TYPES_hs_integer): Likewise.
(TYPES_hd_unsigned, TYPES_hsd_signed): Likewise.
(TYPES_hsd_integer): Use TYPES_hsd_signed.
(TYPES_s_float_hsd_integer, TYPES_s_float_sd_integer): New macros.
(TYPES_s_unsigned): Likewise.
(TYPES_s_integer): Use TYPES_s_unsigned.
(TYPES_sd_signed, TYPES_sd_unsigned): New macros.
(TYPES_sd_integer): Use them.
(TYPES_d_unsigned): New macro.
(TYPES_d_integer): Use it.
(TYPES_d_data, TYPES_cvt_long, TYPES_cvt_narrow_s): New macros.
(TYPES_cvt_narrow): Likewise.
(DEF_SVE_TYPES_ARRAY): Include the new types macros above.
(preds_mx): New variable.
(function_builder::add_overloaded_function): Allow the new feature
set to be more restrictive than the original one.
(function_resolver::infer_pointer_type): Remove qualifiers from
the pointer type before printing it.
(function_resolver::require_matching_pointer_type): New function.
(function_resolver::resolve_sv_displacement): Handle functions
that don't support 32-bit vector indices or svint32_t vector offsets.
(function_resolver::finish_opt_n_resolution): Take the inferred type
as a separate argument.
(function_resolver::resolve_unary): Optionally treat all forms in
the same way as normal merging functions.
(gimple_folder::redirect_call): New function.
(function_expander::prepare_gather_address_operands): Add an argument
that says whether scaled forms are available.  If they aren't,
handle scaling of vector indices and don't add the extension and
scaling operands.
(function_expander::map_to_unspecs): If aarch64_sve isn't available,
fall back to using cond_* instead.
* config/aarch64/aarch64-sve-builtins-functions.h (rtx_code_function):
Split out the member variables into...
(rtx_code_function_base): ...this new base class.
(rtx_code_function_rotated): Inherit rtx_code_function_base.
(unspec_based_function): Split out the member variables into...
(unspec_based_function_base): ...this new base class.
(unspec_based_function_rotated): Inherit unspec_based_function_base.
(unspec_based_function_exact_insn): New class.
(unspec_based_add_function, unspec_based_add_lane_function)
(unspec_based_lane_function, unspec_based_pred_function)
(unspec_based_qadd_function, unspec_based_qadd_lane_function)
(unspec_based_qsub_function, unspec_based_qsub_lane_function)
(unspec_based_sub_function, unspec_based_sub_lane_function): New
typedefs.
(unspec_based_fused_function): New class.
(unspec_based_mla_function, unspec_based_mls_function): New typedefs.
(unspec_based_fused_lane_function): New class.
(unspec_based_mla_lane_function, unspec_based_mls_lane_function): New
typedefs.
(CODE_FOR_MODE1): New macro.
(fixed_insn_function): New class.
(while_comparison): Likewise.
* config/aarch64/aarch64-sve-builtins-shapes.h (binary_long_lane)
(binary_long_opt_n, binary_narrowb_opt_n, binary_narrowt_opt_n)
(binary_to_uint, binary_wide, binary_wide_opt_n, compare, compare_ptr)
(load_ext_gather_index_restricted, load_ext_gather_offset_restricted)
(load_gather_sv_restricted, shift_left_imm_long): Declare.
(shift_left_imm_to_uint, shift_right_imm_narrowb): Likewise.
(shift_right_imm_narrowt, shift_right_imm_narrowb_to_uint): Likewise.
(shift_right_imm_narrowt_to_uint, store_scatter_index_restricted)
(store_scatter_offset_restricted, tbl_tuple, ternary_long_lane)
(ternary_long_opt_n, ternary_qq_lane_rotate, ternary_qq_rotate)
(ternary_shift_left_imm, ternary_shift_right_imm, ternary_uint)
(unary_convert_narrowt, unary_long, unary_narrowb, unary_narrowt)
(unary_narrowb_to_uint, unary_narrowt_to_uint, unary_to_int): Likewise.
* config/aarch64/aarch64-sve-builtins-shapes.cc (apply_predication):
Also add an initial argument for unary_convert_narrowt, regardless
of the predication type.
(build_32_64): Allow loads and stores to specify MODE_none.
(build_sv_index64, build_sv_uint_offset): New functions.
(long_type_suffix): New function.
(binary_imm_narrowb_base, binary_imm_narrowt_base): New classes.
(binary_imm_long_base, load_gather_sv_base): Likewise.
(shift_right_imm_narrow_wrapper, ternary_shift_imm_base): Likewise.
(ternary_resize2_opt_n_base, ternary_resize2_lane_base): Likewise.
(unary_narrowb_base, unary_narrowt_base): Likewise.
(binary_long_lane_def, binary_long_lane): New shape.
(binary_long_opt_n_def, binary_long_opt_n): Likewise.
(binary_narrowb_opt_n_def, binary_narrowb_opt_n): Likewise.
(binary_narrowt_opt_n_def, binary_narrowt_opt_n): Likewise.
(binary_to_uint_def, binary_to_uint): Likewise.
(binary_wide_def, binary_wide): Likewise.
(binary_wide_opt_n_def, binary_wide_opt_n): Likewise.
(compare_def, compare): Likewise.
(compare_ptr_def, compare_ptr): Likewise.
(load_ext_gather_index_restricted_def,
load_ext_gather_index_restricted): Likewise.
(load_ext_gather_offset_restricted_def,
load_ext_gather_offset_restricted): Likewise.
(load_gather_sv_def): Inherit from load_gather_sv_base.
(load_gather_sv_restricted_def, load_gather_sv_restricted): New shape.
(shift_left_imm_def, shift_left_imm): Likewise.
(shift_left_imm_long_def, shift_left_imm_long): Likewise.
(shift_left_imm_to_uint_def, shift_left_imm_to_uint): Likewise.
(store_scatter_index_restricted_def,
store_scatter_index_restricted): Likewise.
(store_scatter_offset_restricted_def,
store_scatter_offset_restricted): Likewise.
(tbl_tuple_def, tbl_tuple): Likewise.
(ternary_long_lane_def, ternary_long_lane): Likewise.
(ternary_long_opt_n_def, ternary_long_opt_n): Likewise.
(ternary_qq_lane_def): Inherit from ternary_resize2_lane_base.
(ternary_qq_lane_rotate_def, ternary_qq_lane_rotate): New shape
(ternary_qq_opt_n_def): Inherit from ternary_resize2_opt_n_base.
(ternary_qq_rotate_def, ternary_qq_rotate): New shape.
(ternary_shift_left_imm_def, ternary_shift_left_imm): Likewise.
(ternary_shift_right_imm_def, ternary_shift_right_imm): Likewise.
(ternary_uint_def, ternary_uint): Likewise.
(unary_convert): Fix typo in comment.
(unary_convert_narrowt_def, unary_convert_narrowt): New shape.
(unary_long_def, unary_long): Likewise.
(unary_narrowb_def, unary_narrowb): Likewise.
(unary_narrowt_def, unary_narrowt): Likewise.
(unary_narrowb_to_uint_def, unary_narrowb_to_uint): Likewise.
(unary_narrowt_to_uint_def, unary_narrowt_to_uint): Likewise.
(unary_to_int_def, unary_to_int): Likewise.
* config/aarch64/aarch64-sve-builtins-base.cc (unspec_cmla)
(unspec_fcmla, unspec_cond_fcmla, expand_mla_mls_lane): New functions.
(svasrd_impl): Delete.
(svcadd_impl::expand): Handle integer operations too.
(svcmla_impl::expand, svcmla_lane::expand): Likewise, using the
new functions to derive the unspec numbers.
(svmla_svmls_lane_impl): Replace with...
(svmla_lane_impl, svmls_lane_impl): ...these new classes.  Handle
integer operations too.
(svwhile_impl): Rename to...
(svwhilelx_impl): ...this and inherit from while_comparison.
(svasrd): Use unspec_based_function.
(svmla_lane): Use svmla_lane_impl.
(svmls_lane): Use svmls_lane_impl.
(svrecpe, svrsqrte): Handle unsigned integer operations too.
(svwhilele, svwhilelt): Use svwhilelx_impl.
* config/aarch64/aarch64-sve-builtins-sve2.h: New file.
* config/aarch64/aarch64-sve-builtins-sve2.cc: Likewise.
* config/aarch64/aarch64-sve-builtins-sve2.def: Likewise.
* config/aarch64/aarch64-sve-builtins.def: Include
aarch64-sve-builtins-sve2.def.

gcc/testsuite/
* g++.target/aarch64/sve/acle/general-c++/mul_lane_1.c: New test.
* g++.target/aarch64/sve2/acle: New directory.
* gcc.target/aarch64/pragma_cpp_predefs_3.c: New test.
* gcc.target/aarch64/sve/acle/asm/test_sve_acle.h (TEST_TYPE_CHANGE_Z)
(TEST_DUAL_ZD, TEST_TYPE_CHANGE_ZX, TEST_TBL2, TEST_TBL2_REV): New
macros.
* gcc.target/aarch64/sve/acle/general-c/binary_lane_1.c: Do not
expect an error saying that the function has no f32 form, but instead
expect an error about SVE2 being required if the current target
doesn't support SVE2.
* gcc.target/aarch64/sve/acle/general-c/ternary_lane_1.c: Likewise.
* gcc.target/aarch64/sve/acle/general-c/ternary_lane_rotate_1.c Likewise.
* gcc.target/aarch64/sve/acle/general-c/binary_long_lane_1.c,
* gcc.target/aarch64/sve/acle/general-c/binary_long_opt_n_1.c,
* gcc.target/aarch64/sve/acle/general-c/binary_narrowb_opt_n_1.c,
* gcc.target/aarch64/sve/acle/general-c/binary_narrowt_opt_n_1.c,
* gcc.target/aarch64/sve/acle/general-c/binary_to_uint_1.c,
* gcc.target/aarch64/sve/acle/general-c/binary_wide_1.c,
* gcc.target/aarch64/sve/acle/general-c/binary_wide_opt_n_1.c,
* gcc.target/aarch64/sve/acle/general-c/compare_1.c,
* gcc.target/aarch64/sve/acle/general-c/compare_ptr_1.c,
* gcc.target/aarch64/sve/acle/general-c/load_ext_gather_index_restricted_1.c,
* gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_1.c,
* gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_2.c,
* gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_3.c,
* gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_4.c,
* gcc.target/aarch64/sve/acle/general-c/load_gather_sv_restricted_1.c,
* gcc.target/aarch64/sve/acle/general-c/load_gather_sv_restricted_2.c,
* gcc.target/aarch64/sve/acle/general-c/mul_lane_1.c,
* gcc.target/aarch64/sve/acle/general-c/shift_left_imm_long_1.c,
* gcc.target/aarch64/sve/acle/general-c/shift_left_imm_to_uint_1.c,
* gcc.target/aarch64/sve/acle/general-c/shift_left_imm_to_uint_2.c,
* gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowb_1.c,
* gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowb_to_uint_1.c,
* gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowt_1.c,
* gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowt_to_uint_1.c,
* gcc.target/aarch64/sve/acle/general-c/store_scatter_index_restricted_1.c,
* gcc.target/aarch64/sve/acle/general-c/store_scatter_offset_restricted_1.c,
* gcc.target/aarch64/sve/acle/general-c/tbl_tuple_1.c,
* gcc.target/aarch64/sve/acle/general-c/ternary_long_lane_1.c,
* gcc.target/aarch64/sve/acle/general-c/ternary_long_opt_n_1.c,
* gcc.target/aarch64/sve/acle/general-c/ternary_qq_lane_rotate_1.c,
* gcc.target/aarch64/sve/acle/general-c/ternary_qq_rotate_1.c,
* gcc.target/aarch64/sve/acle/general-c/ternary_shift_right_imm_1.c,
* gcc.target/aarch64/sve/acle/general-c/ternary_uint_1.c,
* gcc.target/aarch64/sve/acle/general-c/unary_convert_narrowt_1.c,
* gcc.target/aarch64/sve/acle/general-c/unary_narrowb_1.c,
* gcc.target/aarch64/sve/acle/general-c/unary_narrowb_to_uint_1.c,
* gcc.target/aarch64/sve/acle/general-c/unary_narrowt_1.c,
* gcc.target/aarch64/sve/acle/general-c/unary_narrowt_to_uint_1.c,
* gcc.target/aarch64/sve/acle/general-c/unary_to_int_1.c: New tests.
* gcc.target/aarch64/sve2/bcax_1.c: Likewise.
* gcc.target/aarch64/sve2/acle: New directory.

From-SVN: r280060

919 files changed:
gcc/ChangeLog
gcc/config.gcc
gcc/config/aarch64/aarch64-c.c
gcc/config/aarch64/aarch64-sve-builtins-base.cc
gcc/config/aarch64/aarch64-sve-builtins-functions.h
gcc/config/aarch64/aarch64-sve-builtins-shapes.cc
gcc/config/aarch64/aarch64-sve-builtins-shapes.h
gcc/config/aarch64/aarch64-sve-builtins-sve2.cc [new file with mode: 0644]
gcc/config/aarch64/aarch64-sve-builtins-sve2.def [new file with mode: 0644]
gcc/config/aarch64/aarch64-sve-builtins-sve2.h [new file with mode: 0644]
gcc/config/aarch64/aarch64-sve-builtins.cc
gcc/config/aarch64/aarch64-sve-builtins.def
gcc/config/aarch64/aarch64-sve-builtins.h
gcc/config/aarch64/aarch64-sve.md
gcc/config/aarch64/aarch64-sve2.md
gcc/config/aarch64/aarch64.h
gcc/config/aarch64/aarch64.md
gcc/config/aarch64/iterators.md
gcc/config/aarch64/t-aarch64
gcc/testsuite/ChangeLog
gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mul_lane_1.c [new file with mode: 0644]
gcc/testsuite/g++.target/aarch64/sve2/acle/aarch64-sve2-acle-asm.exp [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/asm/test_sve_acle.h
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_lane_1.c
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_long_lane_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_long_opt_n_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_narrowb_opt_n_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_narrowt_opt_n_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_to_uint_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_wide_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_wide_opt_n_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/compare_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/compare_ptr_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_index_restricted_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_gather_sv_restricted_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_gather_sv_restricted_2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mul_lane_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_left_imm_long_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_left_imm_to_uint_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_left_imm_to_uint_2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowb_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowb_to_uint_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowt_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowt_to_uint_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/store_scatter_index_restricted_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/store_scatter_offset_restricted_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/tbl_tuple_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_lane_1.c
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_lane_rotate_1.c
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_long_lane_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_long_opt_n_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_qq_lane_rotate_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_qq_rotate_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_shift_right_imm_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_uint_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/unary_convert_narrowt_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/unary_narrowb_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/unary_narrowb_to_uint_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/unary_narrowt_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/unary_narrowt_to_uint_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/unary_to_int_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/aarch64-sve2-acle-asm.exp [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/aarch64-sve2-acle.exp [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adalp_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adalp_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adalp_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adalp_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adalp_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adalp_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adclb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adclb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adclt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adclt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlbt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlbt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlbt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_f16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_f64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aesd_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aese_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aesimc_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aesmc_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cdot_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cdot_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cdot_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cdot_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_lane_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_lane_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_lane_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cvtlt_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cvtlt_f64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cvtnt_f16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cvtnt_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cvtx_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cvtxnt_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/histcnt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/histcnt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/histcnt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/histcnt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/histseg_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/histseg_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1_gather_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1_gather_f64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1_gather_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1_gather_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1_gather_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1_gather_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sb_gather_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sb_gather_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sb_gather_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sb_gather_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sh_gather_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sh_gather_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sh_gather_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sh_gather_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sw_gather_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sw_gather_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1ub_gather_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1ub_gather_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1ub_gather_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1ub_gather_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1uh_gather_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1uh_gather_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1uh_gather_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1uh_gather_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1uw_gather_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1uw_gather_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/logb_f16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/logb_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/logb_f64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/match_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/match_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/match_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/match_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxnmp_f16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxnmp_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxnmp_f64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_f16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_f64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minnmp_f16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minnmp_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minnmp_f64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_f16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_f64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mla_lane_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mla_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mla_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mla_lane_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mla_lane_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mla_lane_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_lane_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_lane_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_lane_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_lane_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_lane_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_lane_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mls_lane_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mls_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mls_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mls_lane_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mls_lane_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mls_lane_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_lane_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_lane_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_lane_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_lane_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_lane_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_lane_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mul_lane_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mul_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mul_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mul_lane_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mul_lane_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mul_lane_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_lane_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_lane_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_lane_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_lane_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nmatch_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nmatch_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nmatch_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nmatch_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmul_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullb_pair_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullb_pair_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullb_pair_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullt_pair_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullt_pair_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullt_pair_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qabs_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qabs_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qabs_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qabs_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qcadd_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qcadd_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qcadd_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qcadd_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalb_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalb_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalbt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalbt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalbt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalt_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalt_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslb_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslb_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslbt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslbt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslbt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslt_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslt_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_lane_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullb_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullb_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullt_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullt_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qneg_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qneg_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qneg_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qneg_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdcmlah_lane_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdcmlah_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdcmlah_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdcmlah_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdcmlah_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdcmlah_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_lane_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_lane_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_lane_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_lane_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_lane_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrunb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrunb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrunb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrunt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrunt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrunt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshlu_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshlu_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshlu_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshlu_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrunb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrunb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrunb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrunt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrunt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrunt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtunb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtunb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtunb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtunt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtunt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtunt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rax1_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rax1_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/recpe_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsqrte_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sbclb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sbclb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sbclt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sbclt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sm4e_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sm4ekey_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sqadd_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sqadd_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sqadd_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sqadd_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1_scatter_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1_scatter_f64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1_scatter_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1_scatter_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1_scatter_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1_scatter_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1b_scatter_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1b_scatter_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1b_scatter_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1b_scatter_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1h_scatter_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1h_scatter_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1h_scatter_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1h_scatter_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1w_scatter_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1w_scatter_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublbt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublbt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublbt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subltb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subltb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subltb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwb_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwb_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwb_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwb_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwb_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwb_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwt_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwt_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwt_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwt_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwt_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwt_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_f16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_f64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_f16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_f64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/test_sve_acle.h [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/uqadd_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/uqadd_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/uqadd_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/uqadd_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilege_b16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilege_b32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilege_b64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilege_b8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilegt_b16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilegt_b32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilegt_b64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilegt_b8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_f16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_f64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_f16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_f32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_f64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_s16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_s32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_s64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_s8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_u16.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_u32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_u64.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_u8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/general/match_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/general/match_2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/general/match_3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilerw_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilerw_2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilerw_3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilerw_4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilewr_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilewr_2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilewr_3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilewr_4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sve2/bcax_1.c [new file with mode: 0644]

index de59d4c..706bb93 100644 (file)
@@ -1,5 +1,361 @@
 2020-01-09  Richard Sandiford  <richard.sandiford@arm.com>
 
+       * config.gcc (aarch64*-*-*): Add aarch64-sve-builtins-sve2.o to
+       extra_objs.
+       * config/aarch64/t-aarch64 (aarch64-sve-builtins.o): Depend on
+       aarch64-sve-builtins-base.def, aarch64-sve-builtins-sve2.def and
+       aarch64-sve-builtins-sve2.h.
+       (aarch64-sve-builtins-sve2.o): New rule.
+       * config/aarch64/aarch64.h (AARCH64_ISA_SVE2_AES): New macro.
+       (AARCH64_ISA_SVE2_BITPERM, AARCH64_ISA_SVE2_SHA3): Likewise.
+       (AARCH64_ISA_SVE2_SM4, TARGET_SVE2_AES, TARGET_SVE2_BITPERM): Likewise.
+       (TARGET_SVE2_SHA, TARGET_SVE2_SM4): Likewise.
+       * config/aarch64/aarch64-c.c (aarch64_update_cpp_builtins): Handle
+       TARGET_SVE2_AES, TARGET_SVE2_BITPERM, TARGET_SVE2_SHA3 and
+       TARGET_SVE2_SM4.
+       * config/aarch64/aarch64-sve.md: Update comments with SVE2
+       instructions that are handled here.
+       (@cond_asrd<mode>): Generalize to...
+       (@cond_<SVE_INT_SHIFT_IMM:sve_int_op><mode>): ...this.
+       (*cond_asrd<mode>_2): Generalize to...
+       (*cond_<SVE_INT_SHIFT_IMM:sve_int_op><mode>_2): ...this.
+       (*cond_asrd<mode>_z): Generalize to...
+       (*cond_<SVE_INT_SHIFT_IMM:sve_int_op><mode>_z): ...this.
+       * config/aarch64/aarch64.md (UNSPEC_LDNT1_GATHER): New unspec.
+       (UNSPEC_STNT1_SCATTER, UNSPEC_WHILEGE, UNSPEC_WHILEGT): Likewise.
+       (UNSPEC_WHILEHI, UNSPEC_WHILEHS): Likewise.
+       * config/aarch64/aarch64-sve2.md (@aarch64_gather_ldnt<mode>): New
+       pattern.
+       (@aarch64_gather_ldnt_<ANY_EXTEND:optab><SVE_FULL_SDI:mode><SVE_PARTIAL_I:mode>)
+       (@aarch64_scatter_stnt<mode>): Likewise.
+       (@aarch64_scatter_stnt_<SVE_FULL_SDI:mode><SVE_PARTIAL_I:mode>)
+       (@aarch64_mul_lane_<mode>): Likewise.
+       (@aarch64_sve_suqadd<mode>_const): Likewise.
+       (*<sur>h<addsub><mode>): Generalize to...
+       (@aarch64_pred_<SVE2_COND_INT_BINARY_REV:sve_int_op><mode>): ...this
+       new pattern.
+       (@cond_<SVE2_COND_INT_BINARY:sve_int_op><mode>): New expander.
+       (*cond_<SVE2_COND_INT_BINARY:sve_int_op><mode>_2): New pattern.
+       (*cond_<SVE2_COND_INT_BINARY:sve_int_op><mode>_3): Likewise.
+       (*cond_<SVE2_COND_INT_BINARY:sve_int_op><mode>_any): Likewise.
+       (*cond_<SVE2_COND_INT_BINARY_NOREV:sve_int_op><mode>_z): Likewise.
+       (@aarch64_sve_<SVE2_INT_BINARY:sve_int_op><mode>):: Likewise.
+       (@aarch64_sve_<SVE2_INT_BINARY:sve_int_op>_lane_<mode>): Likewise.
+       (@aarch64_pred_<SVE2_COND_INT_SHIFT:sve_int_op><mode>): Likewise.
+       (@cond_<SVE2_COND_INT_SHIFT:sve_int_op><mode>): New expander.
+       (*cond_<SVE2_COND_INT_SHIFT:sve_int_op><mode>_2): New pattern.
+       (*cond_<SVE2_COND_INT_SHIFT:sve_int_op><mode>_3): Likewise.
+       (*cond_<SVE2_COND_INT_SHIFT:sve_int_op><mode>_any): Likewise.
+       (@aarch64_sve_<SVE2_INT_TERNARY:sve_int_op><mode>): Likewise.
+       (@aarch64_sve_<SVE2_INT_TERNARY_LANE:sve_int_op>_lane_<mode>)
+       (@aarch64_sve_add_mul_lane_<mode>): Likewise.
+       (@aarch64_sve_sub_mul_lane_<mode>): Likewise.
+       (@aarch64_sve2_xar<mode>): Likewise.
+       (@aarch64_sve2_bcax<mode>): Likewise.
+       (*aarch64_sve2_eor3<mode>): Rename to...
+       (@aarch64_sve2_eor3<mode>): ...this.
+       (@aarch64_sve2_bsl<mode>): New expander.
+       (@aarch64_sve2_nbsl<mode>): Likewise.
+       (@aarch64_sve2_bsl1n<mode>): Likewise.
+       (@aarch64_sve2_bsl2n<mode>): Likewise.
+       (@aarch64_sve_add_<SHIFTRT:sve_int_op><mode>): Likewise.
+       (*aarch64_sve2_sra<mode>): Add MOVPRFX support.
+       (@aarch64_sve_add_<VRSHR_N:sve_int_op><mode>): New pattern.
+       (@aarch64_sve_<SVE2_INT_SHIFT_INSERT:sve_int_op><mode>): Likewise.
+       (@aarch64_sve2_<USMAX:su>aba<mode>): New expander.
+       (*aarch64_sve2_<USMAX:su>aba<mode>): New pattern.
+       (@aarch64_sve_<SVE2_INT_BINARY_WIDE:sve_int_op><mode>): Likewise.
+       (<su>mull<bt><Vwide>): Generalize to...
+       (@aarch64_sve_<SVE2_INT_BINARY_LONG:sve_int_op><mode>): ...this new
+       pattern.
+       (@aarch64_sve_<SVE2_INT_BINARY_LONG_lANE:sve_int_op>_lane_<mode>)
+       (@aarch64_sve_<SVE2_INT_SHIFT_IMM_LONG:sve_int_op><mode>)
+       (@aarch64_sve_add_<SVE2_INT_ADD_BINARY_LONG:sve_int_op><mode>)
+       (@aarch64_sve_add_<SVE2_INT_ADD_BINARY_LONG_LANE:sve_int_op>_lane_<mode>)
+       (@aarch64_sve_qadd_<SVE2_INT_QADD_BINARY_LONG:sve_int_op><mode>)
+       (@aarch64_sve_qadd_<SVE2_INT_QADD_BINARY_LONG_LANE:sve_int_op>_lane_<mode>)
+       (@aarch64_sve_sub_<SVE2_INT_SUB_BINARY_LONG:sve_int_op><mode>)
+       (@aarch64_sve_sub_<SVE2_INT_SUB_BINARY_LONG_LANE:sve_int_op>_lane_<mode>)
+       (@aarch64_sve_qsub_<SVE2_INT_QSUB_BINARY_LONG:sve_int_op><mode>)
+       (@aarch64_sve_qsub_<SVE2_INT_QSUB_BINARY_LONG_LANE:sve_int_op>_lane_<mode>)
+       (@aarch64_sve_<SVE2_FP_TERNARY_LONG:sve_fp_op><mode>): New patterns.
+       (@aarch64_<SVE2_FP_TERNARY_LONG_LANE:sve_fp_op>_lane_<mode>)
+       (@aarch64_sve_<SVE2_INT_UNARY_NARROWB:sve_int_op><mode>): Likewise.
+       (@aarch64_sve_<SVE2_INT_UNARY_NARROWT:sve_int_op><mode>): Likewise.
+       (@aarch64_sve_<SVE2_INT_BINARY_NARROWB:sve_int_op><mode>): Likewise.
+       (@aarch64_sve_<SVE2_INT_BINARY_NARROWT:sve_int_op><mode>): Likewise.
+       (<SHRNB:r>shrnb<mode>): Generalize to...
+       (@aarch64_sve_<SVE2_INT_SHIFT_IMM_NARROWB:sve_int_op><mode>): ...this
+       new pattern.
+       (<SHRNT:r>shrnt<mode>): Generalize to...
+       (@aarch64_sve_<SVE2_INT_SHIFT_IMM_NARROWT:sve_int_op><mode>): ...this
+       new pattern.
+       (@aarch64_pred_<SVE2_INT_BINARY_PAIR:sve_int_op><mode>): New pattern.
+       (@aarch64_pred_<SVE2_FP_BINARY_PAIR:sve_fp_op><mode>): Likewise.
+       (@cond_<SVE2_INT_BINARY_PAIR_LONG:sve_int_op><mode>): New expander.
+       (*cond_<SVE2_INT_BINARY_PAIR_LONG:sve_int_op><mode>_2): New pattern.
+       (*cond_<SVE2_INT_BINARY_PAIR_LONG:sve_int_op><mode>_z): Likewise.
+       (@aarch64_sve_<SVE2_INT_CADD:optab><mode>): Likewise.
+       (@aarch64_sve_<SVE2_INT_CMLA:optab><mode>): Likewise.
+       (@aarch64_<SVE2_INT_CMLA:optab>_lane_<mode>): Likewise.
+       (@aarch64_sve_<SVE2_INT_CDOT:optab><mode>): Likewise.
+       (@aarch64_<SVE2_INT_CDOT:optab>_lane_<mode>): Likewise.
+       (@aarch64_pred_<SVE2_COND_FP_UNARY_LONG:sve_fp_op><mode>): Likewise.
+       (@cond_<SVE2_COND_FP_UNARY_LONG:sve_fp_op><mode>): New expander.
+       (*cond_<SVE2_COND_FP_UNARY_LONG:sve_fp_op><mode>): New pattern.
+       (@aarch64_sve2_cvtnt<mode>): Likewise.
+       (@aarch64_pred_<SVE2_COND_FP_UNARY_NARROWB:sve_fp_op><mode>): Likewise.
+       (@cond_<SVE2_COND_FP_UNARY_NARROWB:sve_fp_op><mode>): New expander.
+       (*cond_<SVE2_COND_FP_UNARY_NARROWB:sve_fp_op><mode>_any): New pattern.
+       (@aarch64_sve2_cvtxnt<mode>): Likewise.
+       (@aarch64_pred_<SVE2_U32_UNARY:sve_int_op><mode>): Likewise.
+       (@cond_<SVE2_U32_UNARY:sve_int_op><mode>): New expander.
+       (*cond_<SVE2_U32_UNARY:sve_int_op><mode>): New pattern.
+       (@aarch64_pred_<SVE2_COND_INT_UNARY_FP:sve_fp_op><mode>): Likewise.
+       (@cond_<SVE2_COND_INT_UNARY_FP:sve_fp_op><mode>): New expander.
+       (*cond_<SVE2_COND_INT_UNARY_FP:sve_fp_op><mode>): New pattern.
+       (@aarch64_sve2_pmul<mode>): Likewise.
+       (@aarch64_sve_<SVE2_PMULL:optab><mode>): Likewise.
+       (@aarch64_sve_<SVE2_PMULL_PAIR:optab><mode>): Likewise.
+       (@aarch64_sve2_tbl2<mode>): Likewise.
+       (@aarch64_sve2_tbx<mode>): Likewise.
+       (@aarch64_sve_<SVE2_INT_BITPERM:sve_int_op><mode>): Likewise.
+       (@aarch64_sve2_histcnt<mode>): Likewise.
+       (@aarch64_sve2_histseg<mode>): Likewise.
+       (@aarch64_pred_<SVE2_MATCH:sve_int_op><mode>): Likewise.
+       (*aarch64_pred_<SVE2_MATCH:sve_int_op><mode>_cc): Likewise.
+       (*aarch64_pred_<SVE2_MATCH:sve_int_op><mode>_ptest): Likewise.
+       (aarch64_sve2_aes<CRYPTO_AES:aes_op>): Likewise.
+       (aarch64_sve2_aes<CRYPTO_AESMC:aesmc_op>): Likewise.
+       (*aarch64_sve2_aese_fused, *aarch64_sve2_aesd_fused): Likewise.
+       (aarch64_sve2_rax1, aarch64_sve2_sm4e, aarch64_sve2_sm4ekey): Likewise.
+       (<su>mulh<r>s<mode>3): Update after above pattern name changes.
+       * config/aarch64/iterators.md (VNx16QI_ONLY, VNx4SF_ONLY)
+       (SVE_STRUCT2, SVE_FULL_BHI, SVE_FULL_HSI, SVE_FULL_HDI)
+       (SVE2_PMULL_PAIR_I): New mode iterators.
+       (UNSPEC_ADCLB, UNSPEC_ADCLT, UNSPEC_ADDHNB, UNSPEC_ADDHNT, UNSPEC_BDEP)
+       (UNSPEC_BEXT, UNSPEC_BGRP, UNSPEC_CADD90, UNSPEC_CADD270, UNSPEC_CDOT)
+       (UNSPEC_CDOT90, UNSPEC_CDOT180, UNSPEC_CDOT270, UNSPEC_CMLA)
+       (UNSPEC_CMLA90, UNSPEC_CMLA180, UNSPEC_CMLA270, UNSPEC_COND_FCVTLT)
+       (UNSPEC_COND_FCVTNT, UNSPEC_COND_FCVTX, UNSPEC_COND_FCVTXNT)
+       (UNSPEC_COND_FLOGB, UNSPEC_EORBT, UNSPEC_EORTB, UNSPEC_FADDP)
+       (UNSPEC_FMAXP, UNSPEC_FMAXNMP, UNSPEC_FMLALB, UNSPEC_FMLALT)
+       (UNSPEC_FMLSLB, UNSPEC_FMLSLT, UNSPEC_FMINP, UNSPEC_FMINNMP)
+       (UNSPEC_HISTCNT, UNSPEC_HISTSEG, UNSPEC_MATCH, UNSPEC_NMATCH)
+       (UNSPEC_PMULLB, UNSPEC_PMULLB_PAIR, UNSPEC_PMULLT, UNSPEC_PMULLT_PAIR)
+       (UNSPEC_RADDHNB, UNSPEC_RADDHNT, UNSPEC_RSUBHNB, UNSPEC_RSUBHNT)
+       (UNSPEC_SLI, UNSPEC_SRI, UNSPEC_SABDLB, UNSPEC_SABDLT, UNSPEC_SADDLB)
+       (UNSPEC_SADDLBT, UNSPEC_SADDLT, UNSPEC_SADDWB, UNSPEC_SADDWT)
+       (UNSPEC_SBCLB, UNSPEC_SBCLT, UNSPEC_SMAXP, UNSPEC_SMINP)
+       (UNSPEC_SQCADD90, UNSPEC_SQCADD270, UNSPEC_SQDMULLB, UNSPEC_SQDMULLBT)
+       (UNSPEC_SQDMULLT, UNSPEC_SQRDCMLAH, UNSPEC_SQRDCMLAH90)
+       (UNSPEC_SQRDCMLAH180, UNSPEC_SQRDCMLAH270, UNSPEC_SQRSHRNB)
+       (UNSPEC_SQRSHRNT, UNSPEC_SQRSHRUNB, UNSPEC_SQRSHRUNT, UNSPEC_SQSHRNB)
+       (UNSPEC_SQSHRNT, UNSPEC_SQSHRUNB, UNSPEC_SQSHRUNT, UNSPEC_SQXTNB)
+       (UNSPEC_SQXTNT, UNSPEC_SQXTUNB, UNSPEC_SQXTUNT, UNSPEC_SSHLLB)
+       (UNSPEC_SSHLLT, UNSPEC_SSUBLB, UNSPEC_SSUBLBT, UNSPEC_SSUBLT)
+       (UNSPEC_SSUBLTB, UNSPEC_SSUBWB, UNSPEC_SSUBWT, UNSPEC_SUBHNB)
+       (UNSPEC_SUBHNT, UNSPEC_TBL2, UNSPEC_UABDLB, UNSPEC_UABDLT)
+       (UNSPEC_UADDLB, UNSPEC_UADDLT, UNSPEC_UADDWB, UNSPEC_UADDWT)
+       (UNSPEC_UMAXP, UNSPEC_UMINP, UNSPEC_UQRSHRNB, UNSPEC_UQRSHRNT)
+       (UNSPEC_UQSHRNB, UNSPEC_UQSHRNT, UNSPEC_UQXTNB, UNSPEC_UQXTNT)
+       (UNSPEC_USHLLB, UNSPEC_USHLLT, UNSPEC_USUBLB, UNSPEC_USUBLT)
+       (UNSPEC_USUBWB, UNSPEC_USUBWT): New unspecs.
+       (UNSPEC_SMULLB, UNSPEC_SMULLT, UNSPEC_UMULLB, UNSPEC_UMULLT)
+       (UNSPEC_SMULHS, UNSPEC_SMULHRS, UNSPEC_UMULHS, UNSPEC_UMULHRS)
+       (UNSPEC_RSHRNB, UNSPEC_RSHRNT, UNSPEC_SHRNB, UNSPEC_SHRNT): Move
+       further down file.
+       (VNARROW, Ventype): New mode attributes.
+       (Vewtype): Handle VNx2DI.  Fix typo in comment.
+       (VDOUBLE): New mode attribute.
+       (sve_lane_con): Handle VNx8HI.
+       (SVE_INT_UNARY): Include ss_abs and ss_neg for TARGET_SVE2.
+       (SVE_INT_BINARY): Likewise ss_plus, us_plus, ss_minus and us_minus.
+       (sve_int_op, sve_int_op_rev): Handle the above codes.
+       (sve_pred_int_rhs2_operand): Likewise.
+       (MULLBT, SHRNB, SHRNT): Delete.
+       (SVE_INT_SHIFT_IMM): New int iterator.
+       (SVE_WHILE): Add UNSPEC_WHILEGE, UNSPEC_WHILEGT, UNSPEC_WHILEHI
+       and UNSPEC_WHILEHS for TARGET_SVE2.
+       (SVE2_U32_UNARY, SVE2_INT_UNARY_NARROWB, SVE2_INT_UNARY_NARROWT)
+       (SVE2_INT_BINARY, SVE2_INT_BINARY_LANE, SVE2_INT_BINARY_LONG)
+       (SVE2_INT_BINARY_LONG_LANE, SVE2_INT_BINARY_NARROWB)
+       (SVE2_INT_BINARY_NARROWT, SVE2_INT_BINARY_PAIR, SVE2_FP_BINARY_PAIR)
+       (SVE2_INT_BINARY_PAIR_LONG, SVE2_INT_BINARY_WIDE): New int iterators.
+       (SVE2_INT_SHIFT_IMM_LONG, SVE2_INT_SHIFT_IMM_NARROWB): Likewise.
+       (SVE2_INT_SHIFT_IMM_NARROWT, SVE2_INT_SHIFT_INSERT, SVE2_INT_CADD)
+       (SVE2_INT_BITPERM, SVE2_INT_TERNARY, SVE2_INT_TERNARY_LANE): Likewise.
+       (SVE2_FP_TERNARY_LONG, SVE2_FP_TERNARY_LONG_LANE, SVE2_INT_CMLA)
+       (SVE2_INT_CDOT, SVE2_INT_ADD_BINARY_LONG, SVE2_INT_QADD_BINARY_LONG)
+       (SVE2_INT_SUB_BINARY_LONG, SVE2_INT_QSUB_BINARY_LONG): Likewise.
+       (SVE2_INT_ADD_BINARY_LONG_LANE, SVE2_INT_QADD_BINARY_LONG_LANE)
+       (SVE2_INT_SUB_BINARY_LONG_LANE, SVE2_INT_QSUB_BINARY_LONG_LANE)
+       (SVE2_COND_INT_UNARY_FP, SVE2_COND_FP_UNARY_LONG): Likewise.
+       (SVE2_COND_FP_UNARY_NARROWB, SVE2_COND_INT_BINARY): Likewise.
+       (SVE2_COND_INT_BINARY_NOREV, SVE2_COND_INT_BINARY_REV): Likewise.
+       (SVE2_COND_INT_SHIFT, SVE2_MATCH, SVE2_PMULL): Likewise.
+       (optab): Handle the new unspecs.
+       (su, r): Remove entries for UNSPEC_SHRNB, UNSPEC_SHRNT, UNSPEC_RSHRNB
+       and UNSPEC_RSHRNT.
+       (lr): Handle the new unspecs.
+       (bt): Delete.
+       (cmp_op, while_optab_cmp, sve_int_op): Handle the new unspecs.
+       (sve_int_op_rev, sve_int_add_op, sve_int_qadd_op, sve_int_sub_op)
+       (sve_int_qsub_op): New int attributes.
+       (sve_fp_op, rot): Handle the new unspecs.
+       * config/aarch64/aarch64-sve-builtins.h
+       (function_resolver::require_matching_pointer_type): Declare.
+       (function_resolver::resolve_unary): Add an optional boolean argument.
+       (function_resolver::finish_opt_n_resolution): Add an optional
+       type_suffix_index argument.
+       (gimple_folder::redirect_call): Declare.
+       (gimple_expander::prepare_gather_address_operands): Add an optional
+       bool parameter.
+       * config/aarch64/aarch64-sve-builtins.cc: Include
+       aarch64-sve-builtins-sve2.h.
+       (TYPES_b_unsigned, TYPES_b_integer, TYPES_bh_integer): New macros.
+       (TYPES_bs_unsigned, TYPES_hs_signed, TYPES_hs_integer): Likewise.
+       (TYPES_hd_unsigned, TYPES_hsd_signed): Likewise.
+       (TYPES_hsd_integer): Use TYPES_hsd_signed.
+       (TYPES_s_float_hsd_integer, TYPES_s_float_sd_integer): New macros.
+       (TYPES_s_unsigned): Likewise.
+       (TYPES_s_integer): Use TYPES_s_unsigned.
+       (TYPES_sd_signed, TYPES_sd_unsigned): New macros.
+       (TYPES_sd_integer): Use them.
+       (TYPES_d_unsigned): New macro.
+       (TYPES_d_integer): Use it.
+       (TYPES_d_data, TYPES_cvt_long, TYPES_cvt_narrow_s): New macros.
+       (TYPES_cvt_narrow): Likewise.
+       (DEF_SVE_TYPES_ARRAY): Include the new types macros above.
+       (preds_mx): New variable.
+       (function_builder::add_overloaded_function): Allow the new feature
+       set to be more restrictive than the original one.
+       (function_resolver::infer_pointer_type): Remove qualifiers from
+       the pointer type before printing it.
+       (function_resolver::require_matching_pointer_type): New function.
+       (function_resolver::resolve_sv_displacement): Handle functions
+       that don't support 32-bit vector indices or svint32_t vector offsets.
+       (function_resolver::finish_opt_n_resolution): Take the inferred type
+       as a separate argument.
+       (function_resolver::resolve_unary): Optionally treat all forms in
+       the same way as normal merging functions.
+       (gimple_folder::redirect_call): New function.
+       (function_expander::prepare_gather_address_operands): Add an argument
+       that says whether scaled forms are available.  If they aren't,
+       handle scaling of vector indices and don't add the extension and
+       scaling operands.
+       (function_expander::map_to_unspecs): If aarch64_sve isn't available,
+       fall back to using cond_* instead.
+       * config/aarch64/aarch64-sve-builtins-functions.h (rtx_code_function):
+       Split out the member variables into...
+       (rtx_code_function_base): ...this new base class.
+       (rtx_code_function_rotated): Inherit rtx_code_function_base.
+       (unspec_based_function): Split out the member variables into...
+       (unspec_based_function_base): ...this new base class.
+       (unspec_based_function_rotated): Inherit unspec_based_function_base.
+       (unspec_based_function_exact_insn): New class.
+       (unspec_based_add_function, unspec_based_add_lane_function)
+       (unspec_based_lane_function, unspec_based_pred_function)
+       (unspec_based_qadd_function, unspec_based_qadd_lane_function)
+       (unspec_based_qsub_function, unspec_based_qsub_lane_function)
+       (unspec_based_sub_function, unspec_based_sub_lane_function): New
+       typedefs.
+       (unspec_based_fused_function): New class.
+       (unspec_based_mla_function, unspec_based_mls_function): New typedefs.
+       (unspec_based_fused_lane_function): New class.
+       (unspec_based_mla_lane_function, unspec_based_mls_lane_function): New
+       typedefs.
+       (CODE_FOR_MODE1): New macro.
+       (fixed_insn_function): New class.
+       (while_comparison): Likewise.
+       * config/aarch64/aarch64-sve-builtins-shapes.h (binary_long_lane)
+       (binary_long_opt_n, binary_narrowb_opt_n, binary_narrowt_opt_n)
+       (binary_to_uint, binary_wide, binary_wide_opt_n, compare, compare_ptr)
+       (load_ext_gather_index_restricted, load_ext_gather_offset_restricted)
+       (load_gather_sv_restricted, shift_left_imm_long): Declare.
+       (shift_left_imm_to_uint, shift_right_imm_narrowb): Likewise.
+       (shift_right_imm_narrowt, shift_right_imm_narrowb_to_uint): Likewise.
+       (shift_right_imm_narrowt_to_uint, store_scatter_index_restricted)
+       (store_scatter_offset_restricted, tbl_tuple, ternary_long_lane)
+       (ternary_long_opt_n, ternary_qq_lane_rotate, ternary_qq_rotate)
+       (ternary_shift_left_imm, ternary_shift_right_imm, ternary_uint)
+       (unary_convert_narrowt, unary_long, unary_narrowb, unary_narrowt)
+       (unary_narrowb_to_uint, unary_narrowt_to_uint, unary_to_int): Likewise.
+       * config/aarch64/aarch64-sve-builtins-shapes.cc (apply_predication):
+       Also add an initial argument for unary_convert_narrowt, regardless
+       of the predication type.
+       (build_32_64): Allow loads and stores to specify MODE_none.
+       (build_sv_index64, build_sv_uint_offset): New functions.
+       (long_type_suffix): New function.
+       (binary_imm_narrowb_base, binary_imm_narrowt_base): New classes.
+       (binary_imm_long_base, load_gather_sv_base): Likewise.
+       (shift_right_imm_narrow_wrapper, ternary_shift_imm_base): Likewise.
+       (ternary_resize2_opt_n_base, ternary_resize2_lane_base): Likewise.
+       (unary_narrowb_base, unary_narrowt_base): Likewise.
+       (binary_long_lane_def, binary_long_lane): New shape.
+       (binary_long_opt_n_def, binary_long_opt_n): Likewise.
+       (binary_narrowb_opt_n_def, binary_narrowb_opt_n): Likewise.
+       (binary_narrowt_opt_n_def, binary_narrowt_opt_n): Likewise.
+       (binary_to_uint_def, binary_to_uint): Likewise.
+       (binary_wide_def, binary_wide): Likewise.
+       (binary_wide_opt_n_def, binary_wide_opt_n): Likewise.
+       (compare_def, compare): Likewise.
+       (compare_ptr_def, compare_ptr): Likewise.
+       (load_ext_gather_index_restricted_def,
+       load_ext_gather_index_restricted): Likewise.
+       (load_ext_gather_offset_restricted_def,
+       load_ext_gather_offset_restricted): Likewise.
+       (load_gather_sv_def): Inherit from load_gather_sv_base.
+       (load_gather_sv_restricted_def, load_gather_sv_restricted): New shape.
+       (shift_left_imm_def, shift_left_imm): Likewise.
+       (shift_left_imm_long_def, shift_left_imm_long): Likewise.
+       (shift_left_imm_to_uint_def, shift_left_imm_to_uint): Likewise.
+       (store_scatter_index_restricted_def,
+       store_scatter_index_restricted): Likewise.
+       (store_scatter_offset_restricted_def,
+       store_scatter_offset_restricted): Likewise.
+       (tbl_tuple_def, tbl_tuple): Likewise.
+       (ternary_long_lane_def, ternary_long_lane): Likewise.
+       (ternary_long_opt_n_def, ternary_long_opt_n): Likewise.
+       (ternary_qq_lane_def): Inherit from ternary_resize2_lane_base.
+       (ternary_qq_lane_rotate_def, ternary_qq_lane_rotate): New shape
+       (ternary_qq_opt_n_def): Inherit from ternary_resize2_opt_n_base.
+       (ternary_qq_rotate_def, ternary_qq_rotate): New shape.
+       (ternary_shift_left_imm_def, ternary_shift_left_imm): Likewise.
+       (ternary_shift_right_imm_def, ternary_shift_right_imm): Likewise.
+       (ternary_uint_def, ternary_uint): Likewise.
+       (unary_convert): Fix typo in comment.
+       (unary_convert_narrowt_def, unary_convert_narrowt): New shape.
+       (unary_long_def, unary_long): Likewise.
+       (unary_narrowb_def, unary_narrowb): Likewise.
+       (unary_narrowt_def, unary_narrowt): Likewise.
+       (unary_narrowb_to_uint_def, unary_narrowb_to_uint): Likewise.
+       (unary_narrowt_to_uint_def, unary_narrowt_to_uint): Likewise.
+       (unary_to_int_def, unary_to_int): Likewise.
+       * config/aarch64/aarch64-sve-builtins-base.cc (unspec_cmla)
+       (unspec_fcmla, unspec_cond_fcmla, expand_mla_mls_lane): New functions.
+       (svasrd_impl): Delete.
+       (svcadd_impl::expand): Handle integer operations too.
+       (svcmla_impl::expand, svcmla_lane::expand): Likewise, using the
+       new functions to derive the unspec numbers.
+       (svmla_svmls_lane_impl): Replace with...
+       (svmla_lane_impl, svmls_lane_impl): ...these new classes.  Handle
+       integer operations too.
+       (svwhile_impl): Rename to...
+       (svwhilelx_impl): ...this and inherit from while_comparison.
+       (svasrd): Use unspec_based_function.
+       (svmla_lane): Use svmla_lane_impl.
+       (svmls_lane): Use svmls_lane_impl.
+       (svrecpe, svrsqrte): Handle unsigned integer operations too.
+       (svwhilele, svwhilelt): Use svwhilelx_impl.
+       * config/aarch64/aarch64-sve-builtins-sve2.h: New file.
+       * config/aarch64/aarch64-sve-builtins-sve2.cc: Likewise.
+       * config/aarch64/aarch64-sve-builtins-sve2.def: Likewise.
+       * config/aarch64/aarch64-sve-builtins.def: Include
+       aarch64-sve-builtins-sve2.def.
+
+2020-01-09  Richard Sandiford  <richard.sandiford@arm.com>
+
        * config/aarch64/aarch64-protos.h (aarch64_sve_arith_immediate_p)
        (aarch64_sve_sqadd_sqsub_immediate_p): Add a machine_mode argument.
        * config/aarch64/aarch64.c (aarch64_sve_arith_immediate_p)
index 6c957c4..2c57c24 100644 (file)
@@ -319,7 +319,7 @@ aarch64*-*-*)
        c_target_objs="aarch64-c.o"
        cxx_target_objs="aarch64-c.o"
        d_target_objs="aarch64-d.o"
-       extra_objs="aarch64-builtins.o aarch-common.o aarch64-sve-builtins.o aarch64-sve-builtins-shapes.o aarch64-sve-builtins-base.o cortex-a57-fma-steering.o aarch64-speculation.o falkor-tag-collision-avoidance.o aarch64-bti-insert.o"
+       extra_objs="aarch64-builtins.o aarch-common.o aarch64-sve-builtins.o aarch64-sve-builtins-shapes.o aarch64-sve-builtins-base.o aarch64-sve-builtins-sve2.o cortex-a57-fma-steering.o aarch64-speculation.o falkor-tag-collision-avoidance.o aarch64-bti-insert.o"
        target_gtfiles="\$(srcdir)/config/aarch64/aarch64-builtins.c \$(srcdir)/config/aarch64/aarch64-sve-builtins.h \$(srcdir)/config/aarch64/aarch64-sve-builtins.cc"
        target_has_targetm_common=yes
        ;;
index 9ccca42..b422530 100644 (file)
@@ -150,6 +150,11 @@ aarch64_update_cpp_builtins (cpp_reader *pfile)
       builtin_define_with_int_value ("__ARM_FEATURE_SVE_BITS", bits);
     }
   aarch64_def_or_undef (TARGET_SVE2, "__ARM_FEATURE_SVE2", pfile);
+  aarch64_def_or_undef (TARGET_SVE2_AES, "__ARM_FEATURE_SVE2_AES", pfile);
+  aarch64_def_or_undef (TARGET_SVE2_BITPERM,
+                       "__ARM_FEATURE_SVE2_BITPERM", pfile);
+  aarch64_def_or_undef (TARGET_SVE2_SHA3, "__ARM_FEATURE_SVE2_SHA3", pfile);
+  aarch64_def_or_undef (TARGET_SVE2_SM4, "__ARM_FEATURE_SVE2_SM4", pfile);
 
   aarch64_def_or_undef (TARGET_LSE, "__ARM_FEATURE_ATOMICS", pfile);
   aarch64_def_or_undef (TARGET_AES, "__ARM_FEATURE_AES", pfile);
index e6145b4..16a7898 100644 (file)
@@ -49,6 +49,48 @@ using namespace aarch64_sve;
 
 namespace {
 
+/* Return the UNSPEC_CMLA* unspec for rotation amount ROT.  */
+static int
+unspec_cmla (int rot)
+{
+  switch (rot)
+    {
+    case 0: return UNSPEC_CMLA;
+    case 90: return UNSPEC_CMLA90;
+    case 180: return UNSPEC_CMLA180;
+    case 270: return UNSPEC_CMLA270;
+    default: gcc_unreachable ();
+    }
+}
+
+/* Return the UNSPEC_FCMLA* unspec for rotation amount ROT.  */
+static int
+unspec_fcmla (int rot)
+{
+  switch (rot)
+    {
+    case 0: return UNSPEC_FCMLA;
+    case 90: return UNSPEC_FCMLA90;
+    case 180: return UNSPEC_FCMLA180;
+    case 270: return UNSPEC_FCMLA270;
+    default: gcc_unreachable ();
+    }
+}
+
+/* Return the UNSPEC_COND_FCMLA* unspec for rotation amount ROT.  */
+static int
+unspec_cond_fcmla (int rot)
+{
+  switch (rot)
+    {
+    case 0: return UNSPEC_COND_FCMLA;
+    case 90: return UNSPEC_COND_FCMLA90;
+    case 180: return UNSPEC_COND_FCMLA180;
+    case 270: return UNSPEC_COND_FCMLA270;
+    default: gcc_unreachable ();
+    }
+}
+
 /* Expand a call to svmad, or svmla after reordering its operands.
    Make _m forms merge with argument MERGE_ARGNO.  */
 static rtx
@@ -69,6 +111,19 @@ expand_mad (function_expander &e,
   return e.use_cond_insn (icode, merge_argno);
 }
 
+/* Expand a call to svmla_lane or svmls_lane using floating-point unspec
+   UNSPEC.  */
+static rtx
+expand_mla_mls_lane (function_expander &e, int unspec)
+{
+  /* Put the operands in the normal (fma ...) order, with the accumulator
+     last.  This fits naturally since that's also the unprinted operand
+     in the asm output.  */
+  e.rotate_inputs_left (0, 4);
+  insn_code icode = code_for_aarch64_lane (unspec, e.vector_mode (0));
+  return e.use_exact_insn (icode);
+}
+
 /* Expand a call to svmsb, or svmls after reordering its operands.
    Make _m forms merge with argument MERGE_ARGNO.  */
 static rtx
@@ -172,16 +227,6 @@ public:
   unsigned int m_shift;
 };
 
-class svasrd_impl : public function_base
-{
-public:
-  rtx
-  expand (function_expander &e) const OVERRIDE
-  {
-    return e.use_cond_insn (code_for_cond_asrd (e.vector_mode (0)));
-  }
-};
-
 class svbic_impl : public function_base
 {
 public:
@@ -248,12 +293,14 @@ public:
   expand (function_expander &e) const OVERRIDE
   {
     /* Convert the rotation amount into a specific unspec.  */
-    int rot = INTVAL (e.args[3]);
-    e.args.ordered_remove (3);
-    int unspec = (rot == 90 ? UNSPEC_COND_FCADD90
-                 : rot == 270 ? UNSPEC_COND_FCADD270
-                 : (gcc_unreachable (), 0));
-    return e.map_to_unspecs (-1, -1, unspec);
+    int rot = INTVAL (e.args.pop ());
+    if (rot == 90)
+      return e.map_to_unspecs (UNSPEC_CADD90, UNSPEC_CADD90,
+                              UNSPEC_COND_FCADD90);
+    if (rot == 270)
+      return e.map_to_unspecs (UNSPEC_CADD270, UNSPEC_CADD270,
+                              UNSPEC_COND_FCADD270);
+    gcc_unreachable ();
   }
 };
 
@@ -288,18 +335,19 @@ public:
   expand (function_expander &e) const OVERRIDE
   {
     /* Convert the rotation amount into a specific unspec.  */
-    int rot = INTVAL (e.args[4]);
-    e.args.ordered_remove (4);
-    int unspec = (rot == 0 ? UNSPEC_COND_FCMLA
-                 : rot == 90 ? UNSPEC_COND_FCMLA90
-                 : rot == 180 ? UNSPEC_COND_FCMLA180
-                 : rot == 270 ? UNSPEC_COND_FCMLA270
-                 : (gcc_unreachable (), 0));
-
-    /* Make the operand order the same as the one used by the fma optabs,
-       with the accumulator last.  */
-    e.rotate_inputs_left (1, 4);
-    return e.map_to_unspecs (-1, -1, unspec, 3);
+    int rot = INTVAL (e.args.pop ());
+    if (e.type_suffix (0).float_p)
+      {
+       /* Make the operand order the same as the one used by the fma optabs,
+          with the accumulator last.  */
+       e.rotate_inputs_left (1, 4);
+       return e.map_to_unspecs (-1, -1, unspec_cond_fcmla (rot), 3);
+      }
+    else
+      {
+       int cmla = unspec_cmla (rot);
+       return e.map_to_unspecs (cmla, cmla, -1);
+      }
   }
 };
 
@@ -310,19 +358,21 @@ public:
   expand (function_expander &e) const OVERRIDE
   {
     /* Convert the rotation amount into a specific unspec.  */
-    int rot = INTVAL (e.args[4]);
-    e.args.ordered_remove (4);
-    int unspec = (rot == 0 ? UNSPEC_FCMLA
-                 : rot == 90 ? UNSPEC_FCMLA90
-                 : rot == 180 ? UNSPEC_FCMLA180
-                 : rot == 270 ? UNSPEC_FCMLA270
-                 : (gcc_unreachable (), 0));
-
-    /* Make the operand order the same as the one used by the fma optabs,
-       with the accumulator last.  */
-    e.rotate_inputs_left (0, 4);
-    insn_code icode = code_for_aarch64_lane (unspec, e.vector_mode (0));
-    return e.use_exact_insn (icode);
+    int rot = INTVAL (e.args.pop ());
+    machine_mode mode = e.vector_mode (0);
+    if (e.type_suffix (0).float_p)
+      {
+       /* Make the operand order the same as the one used by the fma optabs,
+          with the accumulator last.  */
+       e.rotate_inputs_left (0, 4);
+       insn_code icode = code_for_aarch64_lane (unspec_fcmla (rot), mode);
+       return e.use_exact_insn (icode);
+      }
+    else
+      {
+       insn_code icode = code_for_aarch64_lane (unspec_cmla (rot), mode);
+       return e.use_exact_insn (icode);
+      }
   }
 };
 
@@ -1376,26 +1426,19 @@ public:
   }
 };
 
-/* Base class for svmla_lane and svmls_lane.  */
-class svmla_svmls_lane_impl : public function_base
+class svmla_lane_impl : public function_base
 {
 public:
-  CONSTEXPR svmla_svmls_lane_impl (int unspec)
-    : m_unspec (unspec) {}
-
   rtx
   expand (function_expander &e) const OVERRIDE
   {
-    /* Put the operands in the normal (fma ...) order, with the accumulator
-       last.  This fits naturally since that's also the unprinted operand
-       in the asm output.  */
-    e.rotate_inputs_left (0, 4);
-    insn_code icode = code_for_aarch64_lane (m_unspec, e.vector_mode (0));
-    return e.use_exact_insn (icode);
+    if (e.type_suffix (0).integer_p)
+      {
+       machine_mode mode = e.vector_mode (0);
+       return e.use_exact_insn (code_for_aarch64_sve_add_mul_lane (mode));
+      }
+    return expand_mla_mls_lane (e, UNSPEC_FMLA);
   }
-
-  /* The unspec code associated with the operation.  */
-  int m_unspec;
 };
 
 class svmls_impl : public function_base
@@ -1433,6 +1476,21 @@ public:
   }
 };
 
+class svmls_lane_impl : public function_base
+{
+public:
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    if (e.type_suffix (0).integer_p)
+      {
+       machine_mode mode = e.vector_mode (0);
+       return e.use_exact_insn (code_for_aarch64_sve_sub_mul_lane (mode));
+      }
+    return expand_mla_mls_lane (e, UNSPEC_FMLS);
+  }
+};
+
 class svmsb_impl : public function_base
 {
 public:
@@ -2275,12 +2333,11 @@ public:
 };
 
 /* A function_base for svwhilele and svwhilelt functions.  */
-class svwhile_impl : public function_base
+class svwhilelx_impl : public while_comparison
 {
 public:
-  CONSTEXPR svwhile_impl (int unspec_for_sint, int unspec_for_uint, bool eq_p)
-    : m_unspec_for_sint (unspec_for_sint),
-      m_unspec_for_uint (unspec_for_uint), m_eq_p (eq_p)
+  CONSTEXPR svwhilelx_impl (int unspec_for_sint, int unspec_for_uint, bool eq_p)
+    : while_comparison (unspec_for_sint, unspec_for_uint), m_eq_p (eq_p)
   {}
 
   /* Try to fold a call by treating its arguments as constants of type T.  */
@@ -2342,24 +2399,6 @@ public:
       return fold_type<poly_int64> (f);
   }
 
-  rtx
-  expand (function_expander &e) const OVERRIDE
-  {
-    /* Suffix 0 determines the predicate mode, suffix 1 determines the
-       scalar mode and signedness.  */
-    int unspec = (e.type_suffix (1).unsigned_p
-                 ? m_unspec_for_uint
-                 : m_unspec_for_sint);
-    machine_mode pred_mode = e.vector_mode (0);
-    scalar_mode reg_mode = GET_MODE_INNER (e.vector_mode (1));
-    return e.use_exact_insn (code_for_while (unspec, reg_mode, pred_mode));
-  }
-
-  /* The unspec codes associated with signed and unsigned operations
-     respectively.  */
-  int m_unspec_for_sint;
-  int m_unspec_for_uint;
-
   /* True svwhilele, false for svwhilelt.  */
   bool m_eq_p;
 };
@@ -2428,7 +2467,7 @@ FUNCTION (svand, rtx_code_function, (AND, AND))
 FUNCTION (svandv, reduction, (UNSPEC_ANDV))
 FUNCTION (svasr, rtx_code_function, (ASHIFTRT, ASHIFTRT))
 FUNCTION (svasr_wide, shift_wide, (ASHIFTRT, UNSPEC_ASHIFTRT_WIDE))
-FUNCTION (svasrd, svasrd_impl,)
+FUNCTION (svasrd, unspec_based_function, (UNSPEC_ASRD, -1, -1))
 FUNCTION (svbic, svbic_impl,)
 FUNCTION (svbrka, svbrk_unary_impl, (UNSPEC_BRKA))
 FUNCTION (svbrkb, svbrk_unary_impl, (UNSPEC_BRKB))
@@ -2554,9 +2593,9 @@ FUNCTION (svminnm, unspec_based_function, (-1, -1, UNSPEC_COND_FMINNM))
 FUNCTION (svminnmv, reduction, (UNSPEC_FMINNMV))
 FUNCTION (svminv, reduction, (UNSPEC_SMINV, UNSPEC_UMINV, UNSPEC_FMINV))
 FUNCTION (svmla, svmla_impl,)
-FUNCTION (svmla_lane, svmla_svmls_lane_impl, (UNSPEC_FMLA))
+FUNCTION (svmla_lane, svmla_lane_impl,)
 FUNCTION (svmls, svmls_impl,)
-FUNCTION (svmls_lane, svmla_svmls_lane_impl, (UNSPEC_FMLS))
+FUNCTION (svmls_lane, svmls_lane_impl,)
 FUNCTION (svmov, svmov_impl,)
 FUNCTION (svmsb, svmsb_impl,)
 FUNCTION (svmul, rtx_code_function, (MULT, MULT, UNSPEC_COND_FMUL))
@@ -2613,7 +2652,7 @@ FUNCTION (svqincw_pat, svqinc_bhwd_impl, (SImode))
 FUNCTION (svqsub, rtx_code_function, (SS_MINUS, US_MINUS, -1))
 FUNCTION (svrbit, unspec_based_function, (UNSPEC_RBIT, UNSPEC_RBIT, -1))
 FUNCTION (svrdffr, svrdffr_impl,)
-FUNCTION (svrecpe, unspec_based_function, (-1, -1, UNSPEC_FRECPE))
+FUNCTION (svrecpe, unspec_based_function, (-1, UNSPEC_URECPE, UNSPEC_FRECPE))
 FUNCTION (svrecps, unspec_based_function, (-1, -1, UNSPEC_FRECPS))
 FUNCTION (svrecpx, unspec_based_function, (-1, -1, UNSPEC_COND_FRECPX))
 FUNCTION (svreinterpret, svreinterpret_impl,)
@@ -2628,7 +2667,7 @@ FUNCTION (svrintn, unspec_based_function, (-1, -1, UNSPEC_COND_FRINTN))
 FUNCTION (svrintp, unspec_based_function, (-1, -1, UNSPEC_COND_FRINTP))
 FUNCTION (svrintx, unspec_based_function, (-1, -1, UNSPEC_COND_FRINTX))
 FUNCTION (svrintz, unspec_based_function, (-1, -1, UNSPEC_COND_FRINTZ))
-FUNCTION (svrsqrte, unspec_based_function, (-1, -1, UNSPEC_RSQRTE))
+FUNCTION (svrsqrte, unspec_based_function, (-1, UNSPEC_RSQRTE, UNSPEC_RSQRTE))
 FUNCTION (svrsqrts, unspec_based_function, (-1, -1, UNSPEC_RSQRTS))
 FUNCTION (svscale, unspec_based_function, (-1, -1, UNSPEC_COND_FSCALE))
 FUNCTION (svsel, svsel_impl,)
@@ -2666,8 +2705,8 @@ FUNCTION (svunpkhi, svunpk_impl, (true))
 FUNCTION (svunpklo, svunpk_impl, (false))
 FUNCTION (svuzp1, svuzp_impl, (0))
 FUNCTION (svuzp2, svuzp_impl, (1))
-FUNCTION (svwhilele, svwhile_impl, (UNSPEC_WHILELE, UNSPEC_WHILELS, true))
-FUNCTION (svwhilelt, svwhile_impl, (UNSPEC_WHILELT, UNSPEC_WHILELO, false))
+FUNCTION (svwhilele, svwhilelx_impl, (UNSPEC_WHILELE, UNSPEC_WHILELS, true))
+FUNCTION (svwhilelt, svwhilelx_impl, (UNSPEC_WHILELT, UNSPEC_WHILELO, false))
 FUNCTION (svwrffr, svwrffr_impl,)
 FUNCTION (svzip1, svzip_impl, (0))
 FUNCTION (svzip2, svzip_impl, (1))
index 9782176..71a3943 100644 (file)
@@ -173,23 +173,18 @@ public:
   scalar_int_mode m_to_mode;
 };
 
-/* A function_base for functions that have an associated rtx code.
-   It supports all forms of predication except PRED_implicit.  */
-class rtx_code_function : public function_base
+/* An incomplete function_base for functions that have an associated rtx code.
+   It simply records information about the mapping for derived classes
+   to use.  */
+class rtx_code_function_base : public function_base
 {
 public:
-  CONSTEXPR rtx_code_function (rtx_code code_for_sint, rtx_code code_for_uint,
-                              int unspec_for_fp = -1)
+  CONSTEXPR rtx_code_function_base (rtx_code code_for_sint,
+                                   rtx_code code_for_uint,
+                                   int unspec_for_fp = -1)
     : m_code_for_sint (code_for_sint), m_code_for_uint (code_for_uint),
       m_unspec_for_fp (unspec_for_fp) {}
 
-  rtx
-  expand (function_expander &e) const OVERRIDE
-  {
-    return e.map_to_rtx_codes (m_code_for_sint, m_code_for_uint,
-                              m_unspec_for_fp);
-  }
-
   /* The rtx code to use for signed and unsigned integers respectively.
      Can be UNKNOWN for functions that don't have integer forms.  */
   rtx_code m_code_for_sint;
@@ -200,18 +195,34 @@ public:
   int m_unspec_for_fp;
 };
 
+/* A function_base for functions that have an associated rtx code.
+   It supports all forms of predication except PRED_implicit.  */
+class rtx_code_function : public rtx_code_function_base
+{
+public:
+  CONSTEXPR rtx_code_function (rtx_code code_for_sint, rtx_code code_for_uint,
+                              int unspec_for_fp = -1)
+    : rtx_code_function_base (code_for_sint, code_for_uint, unspec_for_fp) {}
+
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    return e.map_to_rtx_codes (m_code_for_sint, m_code_for_uint,
+                              m_unspec_for_fp);
+  }
+};
+
 /* Like rtx_code_function, but for functions that take what is normally
    the final argument first.  One use of this class is to handle binary
    reversed operations; another is to handle MLA-style operations that
    are normally expressed in GCC as MAD-style operations.  */
-class rtx_code_function_rotated : public function_base
+class rtx_code_function_rotated : public rtx_code_function_base
 {
 public:
   CONSTEXPR rtx_code_function_rotated (rtx_code code_for_sint,
                                       rtx_code code_for_uint,
                                       int unspec_for_fp = -1)
-    : m_code_for_sint (code_for_sint), m_code_for_uint (code_for_uint),
-      m_unspec_for_fp (unspec_for_fp) {}
+    : rtx_code_function_base (code_for_sint, code_for_uint, unspec_for_fp) {}
 
   rtx
   expand (function_expander &e) const OVERRIDE
@@ -223,27 +234,48 @@ public:
     return e.map_to_rtx_codes (m_code_for_sint, m_code_for_uint,
                               m_unspec_for_fp, nargs - 1);
   }
+};
 
-  /* The rtx code to use for signed and unsigned integers respectively.
-     Can be UNKNOWN for functions that don't have integer forms.  */
-  rtx_code m_code_for_sint;
-  rtx_code m_code_for_uint;
+/* An incomplete function_base for functions that have an associated
+   unspec code, with separate codes for signed integers, unsigned
+   integers and floating-point values.  The class simply records
+   information about the mapping for derived classes to use.  */
+class unspec_based_function_base : public function_base
+{
+public:
+  CONSTEXPR unspec_based_function_base (int unspec_for_sint,
+                                       int unspec_for_uint,
+                                       int unspec_for_fp)
+    : m_unspec_for_sint (unspec_for_sint),
+      m_unspec_for_uint (unspec_for_uint),
+      m_unspec_for_fp (unspec_for_fp)
+  {}
 
-  /* The UNSPEC_COND_* to use for floating-point operations.  Can be -1
-     for functions that only operate on integers.  */
+  /* Return the unspec code to use for INSTANCE, based on type suffix 0.  */
+  int
+  unspec_for (const function_instance &instance) const
+  {
+    return (!instance.type_suffix (0).integer_p ? m_unspec_for_fp
+           : instance.type_suffix (0).unsigned_p ? m_unspec_for_uint
+           : m_unspec_for_sint);
+  }
+
+  /* The unspec code associated with signed-integer, unsigned-integer
+     and floating-point operations respectively.  */
+  int m_unspec_for_sint;
+  int m_unspec_for_uint;
   int m_unspec_for_fp;
 };
 
 /* A function_base for functions that have an associated unspec code.
    It supports all forms of predication except PRED_implicit.  */
-class unspec_based_function : public function_base
+class unspec_based_function : public unspec_based_function_base
 {
 public:
   CONSTEXPR unspec_based_function (int unspec_for_sint, int unspec_for_uint,
                                   int unspec_for_fp)
-    : m_unspec_for_sint (unspec_for_sint),
-      m_unspec_for_uint (unspec_for_uint),
-      m_unspec_for_fp (unspec_for_fp)
+    : unspec_based_function_base (unspec_for_sint, unspec_for_uint,
+                                 unspec_for_fp)
   {}
 
   rtx
@@ -252,27 +284,20 @@ public:
     return e.map_to_unspecs (m_unspec_for_sint, m_unspec_for_uint,
                             m_unspec_for_fp);
   }
-
-  /* The unspec code associated with signed-integer, unsigned-integer
-     and floating-point operations respectively.  */
-  int m_unspec_for_sint;
-  int m_unspec_for_uint;
-  int m_unspec_for_fp;
 };
 
 /* Like unspec_based_function, but for functions that take what is normally
    the final argument first.  One use of this class is to handle binary
    reversed operations; another is to handle MLA-style operations that
    are normally expressed in GCC as MAD-style operations.  */
-class unspec_based_function_rotated : public function_base
+class unspec_based_function_rotated : public unspec_based_function_base
 {
 public:
   CONSTEXPR unspec_based_function_rotated (int unspec_for_sint,
                                           int unspec_for_uint,
                                           int unspec_for_fp)
-    : m_unspec_for_sint (unspec_for_sint),
-      m_unspec_for_uint (unspec_for_uint),
-      m_unspec_for_fp (unspec_for_fp)
+    : unspec_based_function_base (unspec_for_sint, unspec_for_uint,
+                                 unspec_for_fp)
   {}
 
   rtx
@@ -285,13 +310,138 @@ public:
     return e.map_to_unspecs (m_unspec_for_sint, m_unspec_for_uint,
                             m_unspec_for_fp, nargs - 1);
   }
+};
 
-  /* The unspec code associated with signed-integer, unsigned-integer
-     and floating-point operations respectively.  */
-  int m_unspec_for_sint;
-  int m_unspec_for_uint;
-  int m_unspec_for_fp;
+/* Like unspec_based_function, but map the function directly to
+   CODE (UNSPEC, M) instead of using the generic predication-based
+   expansion. where M is the vector mode associated with type suffix 0.
+   This is useful if the unspec doesn't describe the full operation or
+   if the usual predication rules don't apply for some reason.  */
+template<insn_code (*CODE) (int, machine_mode)>
+class unspec_based_function_exact_insn : public unspec_based_function_base
+{
+public:
+  CONSTEXPR unspec_based_function_exact_insn (int unspec_for_sint,
+                                             int unspec_for_uint,
+                                             int unspec_for_fp)
+    : unspec_based_function_base (unspec_for_sint, unspec_for_uint,
+                                 unspec_for_fp)
+  {}
+
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    return e.use_exact_insn (CODE (unspec_for (e), e.vector_mode (0)));
+  }
+};
+
+/* A function that performs an unspec and then adds it to another value.  */
+typedef unspec_based_function_exact_insn<code_for_aarch64_sve_add>
+  unspec_based_add_function;
+typedef unspec_based_function_exact_insn<code_for_aarch64_sve_add_lane>
+  unspec_based_add_lane_function;
+
+/* Generic unspec-based _lane function.  */
+typedef unspec_based_function_exact_insn<code_for_aarch64_sve_lane>
+  unspec_based_lane_function;
+
+/* A functon that uses aarch64_pred* patterns regardless of the
+   predication type.  */
+typedef unspec_based_function_exact_insn<code_for_aarch64_pred>
+  unspec_based_pred_function;
+
+/* Like unspec_based_add_function and unspec_based_add_lane_function,
+   but using saturating addition.  */
+typedef unspec_based_function_exact_insn<code_for_aarch64_sve_qadd>
+  unspec_based_qadd_function;
+typedef unspec_based_function_exact_insn<code_for_aarch64_sve_qadd_lane>
+  unspec_based_qadd_lane_function;
+
+/* Like unspec_based_sub_function and unspec_based_sub_lane_function,
+   but using saturating subtraction.  */
+typedef unspec_based_function_exact_insn<code_for_aarch64_sve_qsub>
+  unspec_based_qsub_function;
+typedef unspec_based_function_exact_insn<code_for_aarch64_sve_qsub_lane>
+  unspec_based_qsub_lane_function;
+
+/* A function that performs an unspec and then subtracts it from
+   another value.  */
+typedef unspec_based_function_exact_insn<code_for_aarch64_sve_sub>
+  unspec_based_sub_function;
+typedef unspec_based_function_exact_insn<code_for_aarch64_sve_sub_lane>
+  unspec_based_sub_lane_function;
+
+/* A function that acts like unspec_based_function_exact_insn<INT_CODE>
+   when operating on integers, but that expands to an (fma ...)-style
+   aarch64_sve* operation when applied to floats.  */
+template<insn_code (*INT_CODE) (int, machine_mode)>
+class unspec_based_fused_function : public unspec_based_function_base
+{
+public:
+  CONSTEXPR unspec_based_fused_function (int unspec_for_sint,
+                                        int unspec_for_uint,
+                                        int unspec_for_fp)
+    : unspec_based_function_base (unspec_for_sint, unspec_for_uint,
+                                 unspec_for_fp)
+  {}
+
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    int unspec = unspec_for (e);
+    insn_code icode;
+    if (e.type_suffix (0).float_p)
+      {
+       /* Put the operands in the normal (fma ...) order, with the accumulator
+          last.  This fits naturally since that's also the unprinted operand
+          in the asm output.  */
+       e.rotate_inputs_left (0, e.pred != PRED_none ? 4 : 3);
+       icode = code_for_aarch64_sve (unspec, e.vector_mode (0));
+      }
+    else
+      icode = INT_CODE (unspec, e.vector_mode (0));
+    return e.use_exact_insn (icode);
+  }
+};
+typedef unspec_based_fused_function<code_for_aarch64_sve_add>
+  unspec_based_mla_function;
+typedef unspec_based_fused_function<code_for_aarch64_sve_sub>
+  unspec_based_mls_function;
+
+/* Like unspec_based_fused_function, but for _lane functions.  */
+template<insn_code (*INT_CODE) (int, machine_mode)>
+class unspec_based_fused_lane_function : public unspec_based_function_base
+{
+public:
+  CONSTEXPR unspec_based_fused_lane_function (int unspec_for_sint,
+                                             int unspec_for_uint,
+                                             int unspec_for_fp)
+    : unspec_based_function_base (unspec_for_sint, unspec_for_uint,
+                                 unspec_for_fp)
+  {}
+
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    int unspec = unspec_for (e);
+    insn_code icode;
+    if (e.type_suffix (0).float_p)
+      {
+       /* Put the operands in the normal (fma ...) order, with the accumulator
+          last.  This fits naturally since that's also the unprinted operand
+          in the asm output.  */
+       e.rotate_inputs_left (0, e.pred != PRED_none ? 5 : 4);
+       icode = code_for_aarch64_lane (unspec, e.vector_mode (0));
+      }
+    else
+      icode = INT_CODE (unspec, e.vector_mode (0));
+    return e.use_exact_insn (icode);
+  }
 };
+typedef unspec_based_fused_lane_function<code_for_aarch64_sve_add_lane>
+  unspec_based_mla_lane_function;
+typedef unspec_based_fused_lane_function<code_for_aarch64_sve_sub_lane>
+  unspec_based_mls_lane_function;
 
 /* A function_base that uses CODE_FOR_MODE (M) to get the associated
    instruction code, where M is the vector mode associated with type
@@ -311,11 +461,31 @@ public:
    mode associated with the first type suffix.  */
 #define CODE_FOR_MODE0(PATTERN) code_for_mode_function<code_for_##PATTERN, 0>
 
+/* Likewise for the second type suffix.  */
+#define CODE_FOR_MODE1(PATTERN) code_for_mode_function<code_for_##PATTERN, 1>
+
 /* Like CODE_FOR_MODE0, but the function doesn't raise exceptions when
    operating on floating-point data.  */
 #define QUIET_CODE_FOR_MODE0(PATTERN) \
   quiet< code_for_mode_function<code_for_##PATTERN, 0> >
 
+/* A function_base for functions that always expand to a fixed insn pattern,
+   regardless of what the suffixes are.  */
+class fixed_insn_function : public function_base
+{
+public:
+  CONSTEXPR fixed_insn_function (insn_code code) : m_code (code) {}
+
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    return e.use_exact_insn (m_code);
+  }
+
+  /* The instruction to use.  */
+  insn_code m_code;
+};
+
 /* A function_base for functions that permute their arguments.  */
 class permute : public quiet<function_base>
 {
@@ -456,6 +626,34 @@ public:
   rtx_code m_code;
 };
 
+/* A function_base for svwhile* functions.  */
+class while_comparison : public function_base
+{
+public:
+  CONSTEXPR while_comparison (int unspec_for_sint, int unspec_for_uint)
+    : m_unspec_for_sint (unspec_for_sint),
+      m_unspec_for_uint (unspec_for_uint)
+  {}
+
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    /* Suffix 0 determines the predicate mode, suffix 1 determines the
+       scalar mode and signedness.  */
+    int unspec = (e.type_suffix (1).unsigned_p
+                 ? m_unspec_for_uint
+                 : m_unspec_for_sint);
+    machine_mode pred_mode = e.vector_mode (0);
+    scalar_mode reg_mode = GET_MODE_INNER (e.vector_mode (1));
+    return e.use_exact_insn (code_for_while (unspec, reg_mode, pred_mode));
+  }
+
+  /* The unspec codes associated with signed and unsigned operations
+     respectively.  */
+  int m_unspec_for_sint;
+  int m_unspec_for_uint;
+};
+
 }
 
 /* Declare the global function base NAME, creating it from an instance
index 69a0621..b047abf 100644 (file)
@@ -63,8 +63,11 @@ apply_predication (const function_instance &instance, tree return_type,
     {
       argument_types.quick_insert (0, get_svbool_t ());
       /* For unary merge operations, the first argument is a vector with
-        the same type as the result.  */
-      if (argument_types.length () == 2 && instance.pred == PRED_m)
+        the same type as the result.  For unary_convert_narrowt it also
+        provides the "bottom" half of active elements, and is present
+        for all types of predication.  */
+      if ((argument_types.length () == 2 && instance.pred == PRED_m)
+         || instance.shape == shapes::unary_convert_narrowt)
        argument_types.quick_insert (0, return_type);
     }
 }
@@ -286,13 +289,17 @@ build_one (function_builder &b, const char *signature,
                         group.required_extensions, force_direct_overloads);
 }
 
-/* Add a function instance for every type and predicate combination
-   in GROUP, which describes some sort of gather or scatter operation.
-   If the function has any type suffixes (as for loads and stores),
-   the first function type suffix specifies either a 32-bit or a 64-bit
-   type; use MODE32 for the former and MODE64 for the latter.  If the
-   function has no type suffixes (as for prefetches), add one MODE32 form
-   and one MODE64 form for each predication type.
+/* GROUP describes some sort of gather or scatter operation.  There are
+   two cases:
+
+   - If the function has any type suffixes (as for loads and stores), the
+     first function type suffix specifies either a 32-bit or a 64-bit type,
+     which in turn selects either MODE32 or MODE64 as the addressing mode.
+     Add a function instance for every type and predicate combination
+     in GROUP for which the associated addressing mode is not MODE_none.
+
+   - If the function has no type suffixes (as for prefetches), add one
+     MODE32 form and one MODE64 form for each predication type.
 
    The other arguments are as for build_all.  */
 static void
@@ -303,6 +310,7 @@ build_32_64 (function_builder &b, const char *signature,
   for (unsigned int pi = 0; group.preds[pi] != NUM_PREDS; ++pi)
     if (group.types[0][0] == NUM_TYPE_SUFFIXES)
       {
+       gcc_assert (mode32 != MODE_none && mode64 != MODE_none);
        build_one (b, signature, group, mode32, 0, pi,
                   force_direct_overloads);
        build_one (b, signature, group, mode64, 0, pi,
@@ -314,8 +322,9 @@ build_32_64 (function_builder &b, const char *signature,
          unsigned int bits = type_suffixes[group.types[ti][0]].element_bits;
          gcc_assert (bits == 32 || bits == 64);
          mode_suffix_index mode = bits == 32 ? mode32 : mode64;
-         build_one (b, signature, group, mode, ti, pi,
-                    force_direct_overloads);
+         if (mode != MODE_none)
+           build_one (b, signature, group, mode, ti, pi,
+                      force_direct_overloads);
        }
 }
 
@@ -332,6 +341,15 @@ build_sv_index (function_builder &b, const char *signature,
   build_32_64 (b, signature, group, MODE_u32index, MODE_u64index);
 }
 
+/* Like build_sv_index, but only handle 64-bit types.  */
+static void
+build_sv_index64 (function_builder &b, const char *signature,
+                 const function_group_info &group)
+{
+  build_32_64 (b, signature, group, MODE_none, MODE_s64index);
+  build_32_64 (b, signature, group, MODE_none, MODE_u64index);
+}
+
 /* Like build_sv_index, but taking vector byte offsets instead of vector
    array indices.  */
 static void
@@ -342,6 +360,16 @@ build_sv_offset (function_builder &b, const char *signature,
   build_32_64 (b, signature, group, MODE_u32offset, MODE_u64offset);
 }
 
+/* Like build_sv_offset, but exclude offsets that must be interpreted
+   as signed (i.e. s32offset).  */
+static void
+build_sv_uint_offset (function_builder &b, const char *signature,
+                     const function_group_info &group)
+{
+  build_32_64 (b, signature, group, MODE_none, MODE_s64offset);
+  build_32_64 (b, signature, group, MODE_u32offset, MODE_u64offset);
+}
+
 /* For every type and predicate combination in GROUP, add a function
    that takes a vector base address and no displacement.  The vector
    base has the same element size as the first type suffix.
@@ -397,6 +425,21 @@ build_all (function_builder &b, const char *signature,
                 force_direct_overloads);
 }
 
+/* TYPE is the largest type suffix associated with the arguments of R,
+   but the result is twice as wide.  Return the associated type suffix
+   if it exists, otherwise report an appropriate error and return
+   NUM_TYPE_SUFFIXES.  */
+static type_suffix_index
+long_type_suffix (function_resolver &r, type_suffix_index type)
+{
+  unsigned int element_bits = type_suffixes[type].element_bits;
+  if (type_suffixes[type].integer_p && element_bits < 64)
+    return find_type_suffix (type_suffixes[type].tclass, element_bits * 2);
+
+  r.report_no_such_form (type);
+  return NUM_TYPE_SUFFIXES;
+}
+
 /* Declare the function shape NAME, pointing it to an instance
    of class <NAME>_def.  */
 #define SHAPE(NAME) \
@@ -449,6 +492,94 @@ struct adr_base : public overloaded_base<0>
   };
 };
 
+/* Base class for narrowing bottom binary functions that take an
+   immediate second operand.  The result is half the size of input
+   and has class CLASS.  */
+template<type_class_index CLASS = function_resolver::SAME_TYPE_CLASS>
+struct binary_imm_narrowb_base : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_n);
+    STATIC_ASSERT (CLASS == function_resolver::SAME_TYPE_CLASS
+                  || CLASS == TYPE_unsigned);
+    if (CLASS == TYPE_unsigned)
+      build_all (b, "vhu0,v0,su64", group, MODE_n);
+    else
+      build_all (b, "vh0,v0,su64", group, MODE_n);
+  }
+
+  tree
+  resolve (function_resolver &r) const OVERRIDE
+  {
+    return r.resolve_uniform (1, 1);
+  }
+};
+
+/* The top equivalent of binary_imm_narrowb_base.  It takes three arguments,
+   with the first being the values of the even elements, which are typically
+   the result of the narrowb operation.  */
+template<type_class_index CLASS = function_resolver::SAME_TYPE_CLASS>
+struct binary_imm_narrowt_base : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_n);
+    STATIC_ASSERT (CLASS == function_resolver::SAME_TYPE_CLASS
+                  || CLASS == TYPE_unsigned);
+    if (CLASS == TYPE_unsigned)
+      build_all (b, "vhu0,vhu0,v0,su64", group, MODE_n);
+    else
+      build_all (b, "vh0,vh0,v0,su64", group, MODE_n);
+  }
+
+  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_vector_type (i, i + 1, type, CLASS, r.HALF_SIZE)
+       || !r.require_integer_immediate (i + 2))
+      return error_mark_node;
+
+    return r.resolve_to (r.mode_suffix_id, type);
+  }
+};
+
+/* Base class for long (i.e. narrow op narrow -> wide) binary functions
+   that take an immediate second operand.  The type suffix specifies
+   the wider type.  */
+struct binary_imm_long_base : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_n);
+    build_all (b, "v0,vh0,su64", group, MODE_n);
+  }
+
+  tree
+  resolve (function_resolver &r) const OVERRIDE
+  {
+    unsigned int i, nargs;
+    type_suffix_index type, result_type;
+    if (!r.check_gp_argument (2, i, nargs)
+       || (type = r.infer_vector_type (i)) == NUM_TYPE_SUFFIXES
+       || !r.require_integer_immediate (i + 1)
+       || (result_type = long_type_suffix (r, type)) == NUM_TYPE_SUFFIXES)
+      return error_mark_node;
+
+    if (tree res = r.lookup_form (r.mode_suffix_id, result_type))
+      return res;
+
+    return r.report_no_such_form (type);
+  }
+};
+
 /* Base class for inc_dec and inc_dec_pat.  */
 struct inc_dec_base : public overloaded_base<0>
 {
@@ -518,6 +649,26 @@ struct load_contiguous_base : public overloaded_base<0>
   }
 };
 
+/* Base class for gather loads that take a scalar base and a vector
+   displacement (either an offset or an index).  */
+struct load_gather_sv_base : public overloaded_base<0>
+{
+  tree
+  resolve (function_resolver &r) const OVERRIDE
+  {
+    unsigned int i, nargs;
+    mode_suffix_index mode;
+    type_suffix_index type;
+    if (!r.check_gp_argument (2, i, nargs)
+       || (type = r.infer_pointer_type (i, true)) == NUM_TYPE_SUFFIXES
+       || (mode = r.resolve_sv_displacement (i + 1, type, true),
+           mode == MODE_none))
+      return error_mark_node;
+
+    return r.resolve_to (mode, type);
+  }
+};
+
 /* Base class for load_ext_gather_index and load_ext_gather_offset,
    which differ only in the units of the displacement.  */
 struct load_ext_gather_base : public overloaded_base<1>
@@ -578,6 +729,19 @@ struct prefetch_gather_base : public overloaded_base<0>
   }
 };
 
+/* Wraps BASE to provide a narrowing shift right function.  Argument N
+   is an immediate shift amount in the range [1, sizeof(<t0>_t) * 4].  */
+template<typename BASE, unsigned int N>
+struct shift_right_imm_narrow_wrapper : public BASE
+{
+  bool
+  check (function_checker &c) const OVERRIDE
+  {
+    unsigned int bits = c.type_suffix (0).element_bits / 2;
+    return c.require_immediate_range (N, 1, bits);
+  }
+};
+
 /* Base class for store_scatter_index and store_scatter_offset,
    which differ only in the units of the displacement.  */
 struct store_scatter_base : public overloaded_base<0>
@@ -607,6 +771,128 @@ struct store_scatter_base : public overloaded_base<0>
   }
 };
 
+/* Base class for ternary operations in which the final argument is an
+   immediate shift amount.  The derived class should check the range.  */
+struct ternary_shift_imm_base : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_n);
+    build_all (b, "v0,v0,v0,su64", group, MODE_n);
+  }
+
+  tree
+  resolve (function_resolver &r) const OVERRIDE
+  {
+    return r.resolve_uniform (2, 1);
+  }
+};
+
+/* Base class for ternary operations in which the first argument has the
+   same element type as the result, and in which the second and third
+   arguments have an element type that is derived the first.  MODIFIER
+   is the number of element bits in the second and third arguments,
+   or a function_resolver modifier that says how this precision is
+   derived from the first argument's elements.  */
+template<unsigned int MODIFIER>
+struct ternary_resize2_opt_n_base : public overloaded_base<0>
+{
+  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)) == NUM_TYPE_SUFFIXES
+       || !r.require_derived_vector_type (i + 1, i, type, r.SAME_TYPE_CLASS,
+                                          MODIFIER))
+      return error_mark_node;
+
+    return r.finish_opt_n_resolution (i + 2, i, type, r.SAME_TYPE_CLASS,
+                                     MODIFIER);
+  }
+};
+
+/* Like ternary_resize2_opt_n_base, but for functions that take a final
+   lane argument.  */
+template<unsigned int MODIFIER>
+struct ternary_resize2_lane_base : public overloaded_base<0>
+{
+  tree
+  resolve (function_resolver &r) const OVERRIDE
+  {
+    unsigned int i, nargs;
+    type_suffix_index type;
+    if (!r.check_gp_argument (4, i, nargs)
+       || (type = r.infer_vector_type (i)) == NUM_TYPE_SUFFIXES
+       || !r.require_derived_vector_type (i + 1, i, type, r.SAME_TYPE_CLASS,
+                                          MODIFIER)
+       || !r.require_derived_vector_type (i + 2, i, type, r.SAME_TYPE_CLASS,
+                                          MODIFIER)
+       || !r.require_integer_immediate (i + 3))
+      return error_mark_node;
+
+    return r.resolve_to (r.mode_suffix_id, type);
+  }
+};
+
+/* Base class for narrowing bottom unary functions.  The result is half
+   the size of input and has class CLASS.  */
+template<type_class_index CLASS = function_resolver::SAME_TYPE_CLASS>
+struct unary_narrowb_base : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    STATIC_ASSERT (CLASS == function_resolver::SAME_TYPE_CLASS
+                  || CLASS == TYPE_unsigned);
+    if (CLASS == TYPE_unsigned)
+      build_all (b, "vhu0,v0", group, MODE_none);
+    else
+      build_all (b, "vh0,v0", group, MODE_none);
+  }
+
+  tree
+  resolve (function_resolver &r) const OVERRIDE
+  {
+    return r.resolve_unary (CLASS, r.HALF_SIZE);
+  }
+};
+
+/* The top equivalent of unary_imm_narrowb_base.  All forms take the values
+   of the even elements as an extra argument, before any governing predicate.
+   These even elements are typically the result of the narrowb operation.  */
+template<type_class_index CLASS = function_resolver::SAME_TYPE_CLASS>
+struct unary_narrowt_base : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    STATIC_ASSERT (CLASS == function_resolver::SAME_TYPE_CLASS
+                  || CLASS == TYPE_unsigned);
+    if (CLASS == TYPE_unsigned)
+      build_all (b, "vhu0,vhu0,v0", group, MODE_none);
+    else
+      build_all (b, "vh0,vh0,v0", group, MODE_none);
+  }
+
+  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_derived_vector_type (i, i + 1, type, CLASS, r.HALF_SIZE))
+      return error_mark_node;
+
+    return r.resolve_to (r.mode_suffix_id, type);
+  }
+};
+
 /* sv<m0>_t svfoo[_m0base]_[m1]index(sv<m0>_t, sv<m1>_t)
 
    for all valid combinations of vector base type <m0> and vector
@@ -719,6 +1005,73 @@ struct binary_lane_def : public overloaded_base<0>
 };
 SHAPE (binary_lane)
 
+/* sv<t0>_t svfoo[_t0](sv<t0:half>_t, sv<t0:half>_t, uint64_t).
+
+   where the final argument is an integer constant expression in the
+   range [0, 32 / sizeof (<t0>_t) - 1].  */
+struct binary_long_lane_def : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    build_all (b, "v0,vh0,vh0,su64", group, MODE_none);
+  }
+
+  tree
+  resolve (function_resolver &r) const OVERRIDE
+  {
+    unsigned int i, nargs;
+    type_suffix_index type, result_type;
+    if (!r.check_gp_argument (3, i, nargs)
+       || (type = r.infer_vector_type (i)) == NUM_TYPE_SUFFIXES
+       || !r.require_matching_vector_type (i + 1, type)
+       || !r.require_integer_immediate (i + 2)
+       || (result_type = long_type_suffix (r, type)) == NUM_TYPE_SUFFIXES)
+      return error_mark_node;
+
+    if (tree res = r.lookup_form (r.mode_suffix_id, result_type))
+      return res;
+
+    return r.report_no_such_form (type);
+  }
+
+  bool
+  check (function_checker &c) const OVERRIDE
+  {
+    return c.require_immediate_lane_index (2);
+  }
+};
+SHAPE (binary_long_lane)
+
+/* sv<t0>_t svfoo[_t0](sv<t0:half>_t, sv<t0:half>_t)
+   sv<t0>_t svfoo[_n_t0](sv<t0:half>_t, <t0:half>_t).  */
+struct binary_long_opt_n_def : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    build_all (b, "v0,vh0,vh0", group, MODE_none);
+    build_all (b, "v0,vh0,sh0", group, MODE_n);
+  }
+
+  tree
+  resolve (function_resolver &r) const OVERRIDE
+  {
+    unsigned int i, nargs;
+    type_suffix_index type, result_type;
+    if (!r.check_gp_argument (2, i, nargs)
+       || (type = r.infer_vector_type (i)) == NUM_TYPE_SUFFIXES
+       || (result_type = long_type_suffix (r, type)) == NUM_TYPE_SUFFIXES)
+      return error_mark_node;
+
+    return r.finish_opt_n_resolution (i + 1, i, type, r.SAME_TYPE_CLASS,
+                                     r.SAME_SIZE, result_type);
+  }
+};
+SHAPE (binary_long_opt_n)
+
 /* sv<t0>_t svfoo[_n_t0](sv<t0>_t, <t0>_t).
 
    i.e. a binary operation in which the final argument is always a scalar
@@ -747,25 +1100,19 @@ struct binary_n_def : public overloaded_base<0>
 };
 SHAPE (binary_n)
 
-/* sv<t0>_t svfoo[_t0](sv<t0>_t, sv<t0>_t)
-   sv<t0>_t svfoo[_n_t0](sv<t0>_t, <t0>_t)
+/* sv<t0:half>_t svfoo[_t0](sv<t0>_t, sv<t0>_t)
+   sv<t0:half>_t svfoo[_n_t0](sv<t0>_t, <t0>_t)
 
-   i.e. the standard shape for binary operations that operate on
-   uniform types.  */
-struct binary_opt_n_def : public overloaded_base<0>
+   i.e. a version of binary_opt_n in which the output elements are half the
+   width of the input elements.  */
+struct binary_narrowb_opt_n_def : public overloaded_base<0>
 {
   void
   build (function_builder &b, const function_group_info &group) const OVERRIDE
   {
     b.add_overloaded_functions (group, MODE_none);
-    build_all (b, "v0,v0,v0", group, MODE_none);
-    /* _b functions do not have an _n form, but are classified as
-       binary_opt_n so that they can be overloaded with vector
-       functions.  */
-    if (group.types[0][0] == TYPE_SUFFIX_b)
-      gcc_assert (group.types[0][1] == NUM_TYPE_SUFFIXES);
-    else
-      build_all (b, "v0,v0,s0", group, MODE_n);
+    build_all (b, "vh0,v0,v0", group, MODE_none);
+    build_all (b, "vh0,v0,s0", group, MODE_n);
   }
 
   tree
@@ -774,38 +1121,97 @@ struct binary_opt_n_def : public overloaded_base<0>
     return r.resolve_uniform_opt_n (2);
   }
 };
-SHAPE (binary_opt_n)
-
-/* svbool_t svfoo(svbool_t, svbool_t).  */
-struct binary_pred_def : public nonoverloaded_base
-{
-  void
-  build (function_builder &b, const function_group_info &group) const OVERRIDE
-  {
-    build_all (b, "v0,v0,v0", group, MODE_none);
-  }
-};
-SHAPE (binary_pred)
+SHAPE (binary_narrowb_opt_n)
 
-/* sv<t0>_t svfoo[_<t0>](sv<t0>_t, sv<t0>_t, uint64_t)
+/* sv<t0:half>_t svfoo[_t0](sv<t0:half>_t, sv<t0>_t, sv<t0>_t)
+   sv<t0:half>_t svfoo[_n_t0](sv<t0:half>_t, sv<t0>_t, <t0>_t)
 
-   where the final argument must be 90 or 270.  */
-struct binary_rotate_def : public overloaded_base<0>
+   This is the "top" counterpart to binary_narrowb_opt_n.  */
+struct binary_narrowt_opt_n_def : public overloaded_base<0>
 {
   void
   build (function_builder &b, const function_group_info &group) const OVERRIDE
   {
     b.add_overloaded_functions (group, MODE_none);
-    build_all (b, "v0,v0,v0,su64", group, MODE_none);
+    build_all (b, "vh0,vh0,v0,v0", group, MODE_none);
+    build_all (b, "vh0,vh0,v0,s0", group, MODE_n);
   }
 
   tree
   resolve (function_resolver &r) const OVERRIDE
   {
-    return r.resolve_uniform (2, 1);
-  }
-
-  bool
+    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_vector_type (i, i + 1, type, r.SAME_TYPE_CLASS,
+                                          r.HALF_SIZE))
+      return error_mark_node;
+
+    return r.finish_opt_n_resolution (i + 2, i + 1, type);
+  }
+};
+SHAPE (binary_narrowt_opt_n)
+
+/* sv<t0>_t svfoo[_t0](sv<t0>_t, sv<t0>_t)
+   sv<t0>_t svfoo[_n_t0](sv<t0>_t, <t0>_t)
+
+   i.e. the standard shape for binary operations that operate on
+   uniform types.  */
+struct binary_opt_n_def : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    build_all (b, "v0,v0,v0", group, MODE_none);
+    /* _b functions do not have an _n form, but are classified as
+       binary_opt_n so that they can be overloaded with vector
+       functions.  */
+    if (group.types[0][0] == TYPE_SUFFIX_b)
+      gcc_assert (group.types[0][1] == NUM_TYPE_SUFFIXES);
+    else
+      build_all (b, "v0,v0,s0", group, MODE_n);
+  }
+
+  tree
+  resolve (function_resolver &r) const OVERRIDE
+  {
+    return r.resolve_uniform_opt_n (2);
+  }
+};
+SHAPE (binary_opt_n)
+
+/* svbool_t svfoo(svbool_t, svbool_t).  */
+struct binary_pred_def : public nonoverloaded_base
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    build_all (b, "v0,v0,v0", group, MODE_none);
+  }
+};
+SHAPE (binary_pred)
+
+/* sv<t0>_t svfoo[_<t0>](sv<t0>_t, sv<t0>_t, uint64_t)
+
+   where the final argument must be 90 or 270.  */
+struct binary_rotate_def : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    build_all (b, "v0,v0,v0,su64", group, MODE_none);
+  }
+
+  tree
+  resolve (function_resolver &r) const OVERRIDE
+  {
+    return r.resolve_uniform (2, 1);
+  }
+
+  bool
   check (function_checker &c) const OVERRIDE
   {
     return c.require_immediate_either_or (2, 90, 270);
@@ -827,6 +1233,26 @@ struct binary_scalar_def : public nonoverloaded_base
 };
 SHAPE (binary_scalar)
 
+/* sv<t0:uint>_t svfoo[_t0](sv<t0>_t, sv<t0>_t).
+
+   i.e. a version of "binary" that returns unsigned integers.  */
+struct binary_to_uint_def : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    build_all (b, "vu0,v0,v0", group, MODE_none);
+  }
+
+  tree
+  resolve (function_resolver &r) const OVERRIDE
+  {
+    return r.resolve_uniform (2);
+  }
+};
+SHAPE (binary_to_uint)
+
 /* sv<t0>_t svfoo[_t0](sv<t0>_t, sv<t0:uint>_t)
 
    i.e. a version of "binary" in which the final argument is always an
@@ -969,6 +1395,59 @@ struct binary_uint64_opt_n_def : public overloaded_base<0>
 };
 SHAPE (binary_uint64_opt_n)
 
+/* sv<t0>_t svfoo[_t0](sv<t0>_t, sv<t0:half>_t).  */
+struct binary_wide_def : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    build_all (b, "v0,v0,vh0", group, MODE_none);
+  }
+
+  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)) == NUM_TYPE_SUFFIXES
+       || !r.require_derived_vector_type (i + 1, i, type, r.SAME_TYPE_CLASS,
+                                          r.HALF_SIZE))
+      return error_mark_node;
+
+    return r.resolve_to (r.mode_suffix_id, type);
+  }
+};
+SHAPE (binary_wide)
+
+/* sv<t0>_t svfoo[_t0](sv<t0>_t, sv<t0:half>_t)
+   sv<t0>_t svfoo[_n_t0](sv<t0>_t, <t0:half>_t).  */
+struct binary_wide_opt_n_def : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    build_all (b, "v0,v0,vh0", group, MODE_none);
+    build_all (b, "v0,v0,sh0", group, MODE_n);
+  }
+
+  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)) == NUM_TYPE_SUFFIXES)
+      return error_mark_node;
+
+    return r.finish_opt_n_resolution (i + 1, i, type, r.SAME_TYPE_CLASS,
+                                     r.HALF_SIZE);
+  }
+};
+SHAPE (binary_wide_opt_n)
+
 /* sv<t0>_t svfoo[_t0](sv<t0>_t, sv<t0>_t)
    <t0>_t svfoo[_n_t0](<t0>_t, sv<t0>_t).  */
 struct clast_def : public overloaded_base<0>
@@ -1009,6 +1488,24 @@ struct clast_def : public overloaded_base<0>
 };
 SHAPE (clast)
 
+/* svbool_t svfoo[_t0](sv<t0>_t, sv<t0>_t).  */
+struct compare_def : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    build_all (b, "vp,v0,v0", group, MODE_none);
+  }
+
+  tree
+  resolve (function_resolver &r) const OVERRIDE
+  {
+    return r.resolve_uniform (2);
+  }
+};
+SHAPE (compare)
+
 /* svbool_t svfoo[_t0](sv<t0>_t, sv<t0>_t)
    svbool_t svfoo[_n_t0](sv<t0>_t, <t0>_t)
 
@@ -1031,6 +1528,31 @@ struct compare_opt_n_def : public overloaded_base<0>
 };
 SHAPE (compare_opt_n)
 
+/* svbool_t svfoo[_t0](const <t0>_t *, const <t0>_t *).  */
+struct compare_ptr_def : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    build_all (b, "vp,al,al", group, MODE_none);
+  }
+
+  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_pointer_type (i)) == NUM_TYPE_SUFFIXES
+       || !r.require_matching_pointer_type (i + 1, i, type))
+      return error_mark_node;
+
+    return r.resolve_to (r.mode_suffix_id, type);
+  }
+};
+SHAPE (compare_ptr)
+
 /* svbool_t svfoo_t0[_t1](<t1>_t, <t1>_t)
 
    where _t0 is a _b<bits> suffix that describes the predicate result.
@@ -1456,6 +1978,26 @@ struct load_ext_gather_index_def : public load_ext_gather_base
 };
 SHAPE (load_ext_gather_index)
 
+/* sv<t0>_t svfoo_[s64]index_t0(const <X>_t *, svint64_t)
+   sv<t0>_t svfoo_[u64]index_t0(const <X>_t *, svuint64_t)
+
+   sv<t0>_t svfoo[_u32base]_index_t0(svuint32_t, int64_t)
+   sv<t0>_t svfoo[_u64base]_index_t0(svuint64_t, int64_t)
+
+   where <X> is determined by the function base name.  This is
+   load_ext_gather_index that doesn't support 32-bit vector indices.  */
+struct load_ext_gather_index_restricted_def : public load_ext_gather_base
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_index);
+    build_sv_index64 (b, "t0,al,d", group);
+    build_vs_index (b, "t0,b,ss64", group);
+  }
+};
+SHAPE (load_ext_gather_index_restricted)
+
 /* sv<t0>_t svfoo_[s32]offset_t0(const <X>_t *, svint32_t)
    sv<t0>_t svfoo_[s64]offset_t0(const <X>_t *, svint64_t)
    sv<t0>_t svfoo_[u32]offset_t0(const <X>_t *, svuint32_t)
@@ -1481,6 +2023,31 @@ struct load_ext_gather_offset_def : public load_ext_gather_base
 };
 SHAPE (load_ext_gather_offset)
 
+/* sv<t0>_t svfoo_[s64]offset_t0(const <X>_t *, svint64_t)
+   sv<t0>_t svfoo_[u32]offset_t0(const <X>_t *, svuint32_t)
+   sv<t0>_t svfoo_[u64]offset_t0(const <X>_t *, svuint64_t)
+
+   sv<t0>_t svfoo[_u32base]_t0(svuint32_t)
+   sv<t0>_t svfoo[_u64base]_t0(svuint64_t)
+
+   sv<t0>_t svfoo[_u32base]_offset_t0(svuint32_t, int64_t)
+   sv<t0>_t svfoo[_u64base]_offset_t0(svuint64_t, int64_t)
+
+   where <X> is determined by the function base name.  This is
+   load_ext_gather_offset without the s32 vector offset form.  */
+struct load_ext_gather_offset_restricted_def : public load_ext_gather_base
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_offset);
+    build_sv_uint_offset (b, "t0,al,d", group);
+    build_v_base (b, "t0,b", group, true);
+    build_vs_offset (b, "t0,b,ss64", group);
+  }
+};
+SHAPE (load_ext_gather_offset_restricted)
+
 /* sv<t0>_t svfoo_[s32]index[_t0](const <t0>_t *, svint32_t)
    sv<t0>_t svfoo_[s64]index[_t0](const <t0>_t *, svint64_t)
    sv<t0>_t svfoo_[u32]index[_t0](const <t0>_t *, svuint32_t)
@@ -1490,7 +2057,7 @@ SHAPE (load_ext_gather_offset)
    sv<t0>_t svfoo_[s64]offset[_t0](const <t0>_t *, svint64_t)
    sv<t0>_t svfoo_[u32]offset[_t0](const <t0>_t *, svuint32_t)
    sv<t0>_t svfoo_[u64]offset[_t0](const <t0>_t *, svuint64_t).  */
-struct load_gather_sv_def : public overloaded_base<0>
+struct load_gather_sv_def : public load_gather_sv_base
 {
   void
   build (function_builder &b, const function_group_info &group) const OVERRIDE
@@ -1500,23 +2067,30 @@ struct load_gather_sv_def : public overloaded_base<0>
     build_sv_index (b, "t0,al,d", group);
     build_sv_offset (b, "t0,al,d", group);
   }
+};
+SHAPE (load_gather_sv)
 
-  tree
-  resolve (function_resolver &r) const OVERRIDE
-  {
-    unsigned int i, nargs;
-    mode_suffix_index mode;
-    type_suffix_index type;
-    if (!r.check_gp_argument (2, i, nargs)
-       || (type = r.infer_pointer_type (i, true)) == NUM_TYPE_SUFFIXES
-       || (mode = r.resolve_sv_displacement (i + 1, type, true),
-           mode == MODE_none))
-      return error_mark_node;
+/* sv<t0>_t svfoo_[u32]index[_t0](const <t0>_t *, svuint32_t)
+   sv<t0>_t svfoo_[u64]index[_t0](const <t0>_t *, svuint64_t)
 
-    return r.resolve_to (mode, type);
+   sv<t0>_t svfoo_[s64]offset[_t0](const <t0>_t *, svint64_t)
+   sv<t0>_t svfoo_[u32]offset[_t0](const <t0>_t *, svuint32_t)
+   sv<t0>_t svfoo_[u64]offset[_t0](const <t0>_t *, svuint64_t)
+
+   This is load_gather_sv without the 32-bit vector index forms and
+   without the s32 vector offset form.  */
+struct load_gather_sv_restricted_def : public load_gather_sv_base
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_index);
+    b.add_overloaded_functions (group, MODE_offset);
+    build_sv_index64 (b, "t0,al,d", group);
+    build_sv_uint_offset (b, "t0,al,d", group);
   }
 };
-SHAPE (load_gather_sv)
+SHAPE (load_gather_sv_restricted)
 
 /* sv<t0>_t svfoo[_u32base]_t0(svuint32_t)
    sv<t0>_t svfoo[_u64base]_t0(svuint64_t)
@@ -1748,6 +2322,64 @@ SHAPE (setffr)
 /* sv<t0>_t svfoo[_n_t0])(sv<t0>_t, uint64_t)
 
    where the final argument must be an integer constant expression in the
+   range [0, sizeof (<t0>_t) * 8 - 1].  */
+struct shift_left_imm_def : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_n);
+    build_all (b, "v0,v0,su64", group, MODE_n);
+  }
+
+  tree
+  resolve (function_resolver &r) const OVERRIDE
+  {
+    return r.resolve_uniform (1, 1);
+  }
+
+  bool
+  check (function_checker &c) const OVERRIDE
+  {
+    unsigned int bits = c.type_suffix (0).element_bits;
+    return c.require_immediate_range (1, 0, bits - 1);
+  }
+};
+SHAPE (shift_left_imm)
+
+/* sv<t0>_t svfoo[_n_t0])(sv<t0:half>_t, uint64_t)
+
+   where the final argument must be an integer constant expression in the
+   range [0, sizeof (<t0>_t) * 4 - 1].  */
+struct shift_left_imm_long_def : public binary_imm_long_base
+{
+  bool
+  check (function_checker &c) const OVERRIDE
+  {
+    unsigned int bits = c.type_suffix (0).element_bits / 2;
+    return c.require_immediate_range (1, 0, bits - 1);
+  }
+};
+SHAPE (shift_left_imm_long)
+
+/* sv<t0:uint>_t svfoo[_n_t0])(sv<t0>_t, uint64_t)
+
+   where the final argument must be an integer constant expression in the
+   range [0, sizeof (<t0>_t) * 8 - 1].  */
+struct shift_left_imm_to_uint_def : public shift_left_imm_def
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_n);
+    build_all (b, "vu0,v0,su64", group, MODE_n);
+  }
+};
+SHAPE (shift_left_imm_to_uint)
+
+/* sv<t0>_t svfoo[_n_t0])(sv<t0>_t, uint64_t)
+
+   where the final argument must be an integer constant expression in the
    range [1, sizeof (<t0>_t) * 8].  */
 struct shift_right_imm_def : public overloaded_base<0>
 {
@@ -1773,6 +2405,42 @@ struct shift_right_imm_def : public overloaded_base<0>
 };
 SHAPE (shift_right_imm)
 
+/* sv<t0:half>_t svfoo[_n_t0])(sv<t0>_t, uint64_t)
+
+   where the final argument must be an integer constant expression in the
+   range [1, sizeof (<t0>_t) * 4].  */
+typedef shift_right_imm_narrow_wrapper<binary_imm_narrowb_base<>, 1>
+  shift_right_imm_narrowb_def;
+SHAPE (shift_right_imm_narrowb)
+
+/* sv<t0:half>_t svfoo[_n_t0])(sv<t0:half>_t, sv<t0>_t, uint64_t)
+
+   where the final argument must be an integer constant expression in the
+   range [1, sizeof (<t0>_t) * 4].  */
+typedef shift_right_imm_narrow_wrapper<binary_imm_narrowt_base<>, 2>
+  shift_right_imm_narrowt_def;
+SHAPE (shift_right_imm_narrowt)
+
+/* sv<t0:uint:half>_t svfoo[_n_t0])(sv<t0>_t, uint64_t)
+
+   where the final argument must be an integer constant expression in the
+   range [1, sizeof (<t0>_t) * 4].  */
+typedef binary_imm_narrowb_base<TYPE_unsigned>
+  binary_imm_narrowb_base_unsigned;
+typedef shift_right_imm_narrow_wrapper<binary_imm_narrowb_base_unsigned, 1>
+  shift_right_imm_narrowb_to_uint_def;
+SHAPE (shift_right_imm_narrowb_to_uint)
+
+/* sv<t0:uint:half>_t svfoo[_n_t0])(sv<t0:uint:half>_t, sv<t0>_t, uint64_t)
+
+   where the final argument must be an integer constant expression in the
+   range [1, sizeof (<t0>_t) * 4].  */
+typedef binary_imm_narrowt_base<TYPE_unsigned>
+  binary_imm_narrowt_base_unsigned;
+typedef shift_right_imm_narrow_wrapper<binary_imm_narrowt_base_unsigned, 2>
+  shift_right_imm_narrowt_to_uint_def;
+SHAPE (shift_right_imm_narrowt_to_uint)
+
 /* void svfoo[_t0](<X>_t *, sv<t0>[xN]_t)
    void svfoo_vnum[_t0](<X>_t *, int64_t, sv<t0>[xN]_t)
 
@@ -1830,6 +2498,26 @@ struct store_scatter_index_def : public store_scatter_base
 };
 SHAPE (store_scatter_index)
 
+/* void svfoo_[s64]index[_t0](<X>_t *, svint64_t, sv<t0>_t)
+   void svfoo_[u64]index[_t0](<X>_t *, svuint64_t, sv<t0>_t)
+
+   void svfoo[_u32base]_index[_t0](svuint32_t, int64_t, sv<t0>_t)
+   void svfoo[_u64base]_index[_t0](svuint64_t, int64_t, sv<t0>_t)
+
+   i.e. a version of store_scatter_index that doesn't support 32-bit
+   vector indices.  */
+struct store_scatter_index_restricted_def : public store_scatter_base
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_index);
+    build_sv_index64 (b, "_,as,d,t0", group);
+    build_vs_index (b, "_,b,ss64,t0", group);
+  }
+};
+SHAPE (store_scatter_index_restricted)
+
 /* void svfoo_[s32]offset[_t0](<X>_t *, svint32_t, sv<t0>_t)
    void svfoo_[s64]offset[_t0](<X>_t *, svint64_t, sv<t0>_t)
    void svfoo_[u32]offset[_t0](<X>_t *, svuint32_t, sv<t0>_t)
@@ -1857,6 +2545,57 @@ struct store_scatter_offset_def : public store_scatter_base
 };
 SHAPE (store_scatter_offset)
 
+/* void svfoo_[s64]offset[_t0](<X>_t *, svint64_t, sv<t0>_t)
+   void svfoo_[u32]offset[_t0](<X>_t *, svuint32_t, sv<t0>_t)
+   void svfoo_[u64]offset[_t0](<X>_t *, svuint64_t, sv<t0>_t)
+
+   void svfoo[_u32base_t0](svuint32_t, sv<t0>_t)
+   void svfoo[_u64base_t0](svuint64_t, sv<t0>_t)
+
+   void svfoo[_u32base]_offset[_t0](svuint32_t, int64_t, sv<t0>_t)
+   void svfoo[_u64base]_offset[_t0](svuint64_t, int64_t, sv<t0>_t)
+
+   i.e. a version of store_scatter_offset that doesn't support svint32_t
+   offsets.  */
+struct store_scatter_offset_restricted_def : public store_scatter_base
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    b.add_overloaded_functions (group, MODE_offset);
+    build_sv_uint_offset (b, "_,as,d,t0", group);
+    build_v_base (b, "_,b,t0", group);
+    build_vs_offset (b, "_,b,ss64,t0", group);
+  }
+};
+SHAPE (store_scatter_offset_restricted)
+
+/* sv<t0>_t svfoo[_t0](sv<t0>xN_t, sv<t0:uint>_t).  */
+struct tbl_tuple_def : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    build_all (b, "v0,t0,vu0", group, MODE_none);
+  }
+
+  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_tuple_type (i)) == NUM_TYPE_SUFFIXES
+       || !r.require_derived_vector_type (i + 1, i, type, TYPE_unsigned))
+      return error_mark_node;
+
+    return r.resolve_to (r.mode_suffix_id, type);
+  }
+};
+SHAPE (tbl_tuple)
+
 /* svbool_t svfoo[_<t0>](sv<t0>_t, sv<t0>_t, sv<t0>_t, uint64_t)
 
    where the final argument is an integer constant expression in the
@@ -1913,6 +2652,47 @@ struct ternary_lane_rotate_def : public overloaded_base<0>
 };
 SHAPE (ternary_lane_rotate)
 
+/* sv<t0>_t svfoo[_t0](sv<t0>_t, sv<t0:half>_t, sv<t0:half>_t, uint64_t)
+
+   where the final argument is an integer constant expression in the range
+   [0, 32 / sizeof (<t0>_t) - 1].  */
+struct ternary_long_lane_def
+  : public ternary_resize2_lane_base<function_resolver::HALF_SIZE>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    build_all (b, "v0,v0,vh0,vh0,su64", group, MODE_none);
+  }
+
+  bool
+  check (function_checker &c) const OVERRIDE
+  {
+    return c.require_immediate_lane_index (3);
+  }
+};
+SHAPE (ternary_long_lane)
+
+/* sv<t0>_t svfoo[_t0](sv<t0>_t, sv<t0:half>_t, sv<t0:half>_t)
+   sv<t0>_t svfoo[_n_t0](sv<t0>_t, sv<t0:half>_t, <t0:half>_t)
+
+   i.e. a version of the standard ternary shape ternary_opt_n in which
+   the element type of the last two arguments is the half-sized
+   equivalent of <t0>.  */
+struct ternary_long_opt_n_def
+  : public ternary_resize2_opt_n_base<function_resolver::HALF_SIZE>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    build_all (b, "v0,v0,vh0,vh0", group, MODE_none);
+    build_all (b, "v0,v0,vh0,sh0", group, MODE_n);
+  }
+};
+SHAPE (ternary_long_opt_n)
+
 /* sv<t0>_t svfoo[_t0](sv<t0>_t, sv<t0>_t, sv<t0>_t)
    sv<t0>_t svfoo[_n_t0](sv<t0>_t, sv<t0>_t, <t0>_t)
 
@@ -1940,7 +2720,8 @@ SHAPE (ternary_opt_n)
 
    where the final argument is an integer constant expression in the range
    [0, 16 / sizeof (<t0>_t) - 1].  */
-struct ternary_qq_lane_def : public overloaded_base<0>
+struct ternary_qq_lane_def
+  : public ternary_resize2_lane_base<function_resolver::QUARTER_SIZE>
 {
   void
   build (function_builder &b, const function_group_info &group) const OVERRIDE
@@ -1949,18 +2730,41 @@ struct ternary_qq_lane_def : public overloaded_base<0>
     build_all (b, "v0,v0,vq0,vq0,su64", group, MODE_none);
   }
 
+  bool
+  check (function_checker &c) const OVERRIDE
+  {
+    return c.require_immediate_lane_index (3, 4);
+  }
+};
+SHAPE (ternary_qq_lane)
+
+/* svbool_t svfoo[_<t0>](sv<t0>_t, sv<t0:quarter>_t, sv<t0:quarter>_t,
+                        uint64_t)
+
+   where the final argument is an integer constant expression in
+   {0, 90, 180, 270}.  */
+struct ternary_qq_lane_rotate_def : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    build_all (b, "v0,v0,vq0,vq0,su64,su64", group, MODE_none);
+  }
+
   tree
   resolve (function_resolver &r) const OVERRIDE
   {
     unsigned int i, nargs;
     type_suffix_index type;
-    if (!r.check_gp_argument (4, i, nargs)
+    if (!r.check_gp_argument (5, i, nargs)
        || (type = r.infer_vector_type (i)) == NUM_TYPE_SUFFIXES
        || !r.require_derived_vector_type (i + 1, i, type, r.SAME_TYPE_CLASS,
                                           r.QUARTER_SIZE)
        || !r.require_derived_vector_type (i + 2, i, type, r.SAME_TYPE_CLASS,
                                           r.QUARTER_SIZE)
-       || !r.require_integer_immediate (i + 3))
+       || !r.require_integer_immediate (i + 3)
+       || !r.require_integer_immediate (i + 4))
       return error_mark_node;
 
     return r.resolve_to (r.mode_suffix_id, type);
@@ -1969,10 +2773,11 @@ struct ternary_qq_lane_def : public overloaded_base<0>
   bool
   check (function_checker &c) const OVERRIDE
   {
-    return c.require_immediate_lane_index (3, 4);
+    return (c.require_immediate_lane_index (3, 4)
+           && c.require_immediate_one_of (4, 0, 90, 180, 270));
   }
 };
-SHAPE (ternary_qq_lane)
+SHAPE (ternary_qq_lane_rotate)
 
 /* sv<t0>_t svfoo[_t0](sv<t0>_t, sv<t0.quarter>_t, sv<t0.quarter>_t)
    sv<t0>_t svfoo[_n_t0](sv<t0>_t, sv<t0.quarter>_t, <t0.quarter>_t)
@@ -1980,7 +2785,8 @@ SHAPE (ternary_qq_lane)
    i.e. a version of the standard ternary shape ternary_opt_n in which
    the element type of the last two arguments is the quarter-sized
    equivalent of <t0>.  */
-struct ternary_qq_opt_n_def : public overloaded_base<0>
+struct ternary_qq_opt_n_def
+  : public ternary_resize2_opt_n_base<function_resolver::QUARTER_SIZE>
 {
   void
   build (function_builder &b, const function_group_info &group) const OVERRIDE
@@ -1989,23 +2795,47 @@ struct ternary_qq_opt_n_def : public overloaded_base<0>
     build_all (b, "v0,v0,vq0,vq0", group, MODE_none);
     build_all (b, "v0,v0,vq0,sq0", group, MODE_n);
   }
+};
+SHAPE (ternary_qq_opt_n)
+
+/* svbool_t svfoo[_<t0>](sv<t0>_t, sv<t0:quarter>_t, sv<t0:quarter>_t,
+                        uint64_t)
+
+   where the final argument is an integer constant expression in
+   {0, 90, 180, 270}.  */
+struct ternary_qq_rotate_def : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    build_all (b, "v0,v0,vq0,vq0,su64", group, MODE_none);
+  }
 
   tree
   resolve (function_resolver &r) const OVERRIDE
   {
     unsigned int i, nargs;
     type_suffix_index type;
-    if (!r.check_gp_argument (3, i, nargs)
+    if (!r.check_gp_argument (4, i, nargs)
        || (type = r.infer_vector_type (i)) == NUM_TYPE_SUFFIXES
        || !r.require_derived_vector_type (i + 1, i, type, r.SAME_TYPE_CLASS,
-                                          r.QUARTER_SIZE))
+                                          r.QUARTER_SIZE)
+       || !r.require_derived_vector_type (i + 2, i, type, r.SAME_TYPE_CLASS,
+                                          r.QUARTER_SIZE)
+       || !r.require_integer_immediate (i + 3))
       return error_mark_node;
 
-    return r.finish_opt_n_resolution (i + 2, i, type, r.SAME_TYPE_CLASS,
-                                     r.QUARTER_SIZE);
+    return r.resolve_to (r.mode_suffix_id, type);
+  }
+
+  bool
+  check (function_checker &c) const OVERRIDE
+  {
+    return c.require_immediate_one_of (3, 0, 90, 180, 270);
   }
 };
-SHAPE (ternary_qq_opt_n)
+SHAPE (ternary_qq_rotate)
 
 /* svbool_t svfoo[_<t0>](sv<t0>_t, sv<t0>_t, sv<t0>_t, uint64_t)
 
@@ -2034,6 +2864,62 @@ struct ternary_rotate_def : public overloaded_base<0>
 };
 SHAPE (ternary_rotate)
 
+/* sv<t0>_t svfoo[_n_t0])(sv<t0>_t, sv<t0>_t, uint64_t)
+
+   where the final argument must be an integer constant expression in the
+   range [0, sizeof (<t0>_t) * 8 - 1].  */
+struct ternary_shift_left_imm_def : public ternary_shift_imm_base
+{
+  bool
+  check (function_checker &c) const OVERRIDE
+  {
+    unsigned int bits = c.type_suffix (0).element_bits;
+    return c.require_immediate_range (2, 0, bits - 1);
+  }
+};
+SHAPE (ternary_shift_left_imm)
+
+/* sv<t0>_t svfoo[_n_t0])(sv<t0>_t, sv<t0>_t, uint64_t)
+
+   where the final argument must be an integer constant expression in the
+   range [1, sizeof (<t0>_t) * 8].  */
+struct ternary_shift_right_imm_def : public ternary_shift_imm_base
+{
+  bool
+  check (function_checker &c) const OVERRIDE
+  {
+    unsigned int bits = c.type_suffix (0).element_bits;
+    return c.require_immediate_range (2, 1, bits);
+  }
+};
+SHAPE (ternary_shift_right_imm)
+
+/* sv<t0>_t svfoo[_t0](sv<t0>_t, sv<t0>_t, sv<t0:uint>_t).  */
+struct ternary_uint_def : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    build_all (b, "v0,v0,v0,vu0", group, MODE_none);
+  }
+
+  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)) == NUM_TYPE_SUFFIXES
+       || !r.require_matching_vector_type (i + 1, type)
+       || !r.require_derived_vector_type (i + 2, i, type, TYPE_unsigned))
+      return error_mark_node;
+
+    return r.resolve_to (r.mode_suffix_id, type);
+  }
+};
+SHAPE (ternary_uint)
+
 /* svbool_t svfoo[_<t0>](sv<t0>_t, sv<t0>_t, uint64_t)
 
    where the final argument is an integer constant expression in the
@@ -2082,7 +2968,7 @@ struct unary_def : public overloaded_base<0>
 };
 SHAPE (unary)
 
-/* sv<t0>_t svfoo_t0[_t1](svbool_t, sv<t1>_t)
+/* sv<t0>_t svfoo_t0[_t1](sv<t1>_t)
 
    where the target type <t0> must be specified explicitly but the source
    type <t1> can be inferred.  */
@@ -2104,6 +2990,57 @@ struct unary_convert_def : public overloaded_base<1>
 };
 SHAPE (unary_convert)
 
+/* sv<t0>_t svfoo_t0[_t1](sv<t0>_t, sv<t1>_t)
+
+   This is a version of unary_convert in which the even-indexed
+   elements are passed in as a first parameter, before any governing
+   predicate.  */
+struct unary_convert_narrowt_def : public overloaded_base<1>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    build_all (b, "v0,v1", group, MODE_none);
+  }
+
+  tree
+  resolve (function_resolver &r) const OVERRIDE
+  {
+    return r.resolve_unary (r.type_suffix (0).tclass,
+                           r.type_suffix (0).element_bits, true);
+  }
+};
+SHAPE (unary_convert_narrowt)
+
+/* sv<t0>_t svfoo[_t0](sv<t0:half>_t).  */
+struct unary_long_def : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    build_all (b, "v0,vh0", group, MODE_none);
+  }
+
+  tree
+  resolve (function_resolver &r) const OVERRIDE
+  {
+    unsigned int i, nargs;
+    type_suffix_index type, result_type;
+    if (!r.check_gp_argument (1, i, nargs)
+       || (type = r.infer_vector_type (i)) == NUM_TYPE_SUFFIXES
+       || (result_type = long_type_suffix (r, type)) == NUM_TYPE_SUFFIXES)
+      return error_mark_node;
+
+    if (tree res = r.lookup_form (r.mode_suffix_id, result_type))
+      return res;
+
+    return r.report_no_such_form (type);
+  }
+};
+SHAPE (unary_long)
+
 /* sv<t0>_t svfoo[_n]_t0(<t0>_t).  */
 struct unary_n_def : public overloaded_base<1>
 {
@@ -2124,6 +3061,22 @@ struct unary_n_def : public overloaded_base<1>
 };
 SHAPE (unary_n)
 
+/* sv<t0:half>_t svfoo[_t0](sv<t0>_t).  */
+typedef unary_narrowb_base<> unary_narrowb_def;
+SHAPE (unary_narrowb)
+
+/* sv<t0:half>_t svfoo[_t0](sv<t0:half>_t, sv<t0>_t).  */
+typedef unary_narrowt_base<> unary_narrowt_def;
+SHAPE (unary_narrowt)
+
+/* sv<t0:uint:half>_t svfoo[_t0](sv<t0>_t).  */
+typedef unary_narrowb_base<TYPE_unsigned> unary_narrowb_to_uint_def;
+SHAPE (unary_narrowb_to_uint)
+
+/* sv<t0:uint:half>_t svfoo[_t0](sv<t0:uint:half>_t, sv<t0>_t).  */
+typedef unary_narrowt_base<TYPE_unsigned> unary_narrowt_to_uint_def;
+SHAPE (unary_narrowt_to_uint)
+
 /* svbool_t svfoo(svbool_t).  */
 struct unary_pred_def : public nonoverloaded_base
 {
@@ -2135,6 +3088,27 @@ struct unary_pred_def : public nonoverloaded_base
 };
 SHAPE (unary_pred)
 
+/* sv<t0:int>_t svfoo[_t0](sv<t0>_t)
+
+   i.e. a version of "unary" in which the returned vector contains
+   signed integers.  */
+struct unary_to_int_def : public overloaded_base<0>
+{
+  void
+  build (function_builder &b, const function_group_info &group) const OVERRIDE
+  {
+    b.add_overloaded_functions (group, MODE_none);
+    build_all (b, "vs0,v0", group, MODE_none);
+  }
+
+  tree
+  resolve (function_resolver &r) const OVERRIDE
+  {
+    return r.resolve_unary (TYPE_signed);
+  }
+};
+SHAPE (unary_to_int)
+
 /* sv<t0:uint>_t svfoo[_t0](sv<t0>_t)
 
    i.e. a version of "unary" in which the returned vector contains
index 1513712..2a75a82 100644 (file)
@@ -76,18 +76,27 @@ namespace aarch64_sve
     extern const function_shape *const binary;
     extern const function_shape *const binary_int_opt_n;
     extern const function_shape *const binary_lane;
+    extern const function_shape *const binary_long_lane;
+    extern const function_shape *const binary_long_opt_n;
     extern const function_shape *const binary_n;
+    extern const function_shape *const binary_narrowb_opt_n;
+    extern const function_shape *const binary_narrowt_opt_n;
     extern const function_shape *const binary_opt_n;
     extern const function_shape *const binary_pred;
     extern const function_shape *const binary_rotate;
     extern const function_shape *const binary_scalar;
+    extern const function_shape *const binary_to_uint;
     extern const function_shape *const binary_uint;
     extern const function_shape *const binary_uint_n;
     extern const function_shape *const binary_uint_opt_n;
     extern const function_shape *const binary_uint64_n;
     extern const function_shape *const binary_uint64_opt_n;
+    extern const function_shape *const binary_wide;
+    extern const function_shape *const binary_wide_opt_n;
     extern const function_shape *const clast;
+    extern const function_shape *const compare;
     extern const function_shape *const compare_opt_n;
+    extern const function_shape *const compare_ptr;
     extern const function_shape *const compare_scalar;
     extern const function_shape *const compare_wide_opt_n;
     extern const function_shape *const count_inherent;
@@ -108,8 +117,11 @@ namespace aarch64_sve
     extern const function_shape *const load;
     extern const function_shape *const load_ext;
     extern const function_shape *const load_ext_gather_index;
+    extern const function_shape *const load_ext_gather_index_restricted;
     extern const function_shape *const load_ext_gather_offset;
+    extern const function_shape *const load_ext_gather_offset_restricted;
     extern const function_shape *const load_gather_sv;
+    extern const function_shape *const load_gather_sv_restricted;
     extern const function_shape *const load_gather_vs;
     extern const function_shape *const load_replicate;
     extern const function_shape *const pattern_pred;
@@ -122,21 +134,44 @@ namespace aarch64_sve
     extern const function_shape *const reduction_wide;
     extern const function_shape *const set;
     extern const function_shape *const setffr;
+    extern const function_shape *const shift_left_imm_long;
+    extern const function_shape *const shift_left_imm_to_uint;
     extern const function_shape *const shift_right_imm;
+    extern const function_shape *const shift_right_imm_narrowb;
+    extern const function_shape *const shift_right_imm_narrowt;
+    extern const function_shape *const shift_right_imm_narrowb_to_uint;
+    extern const function_shape *const shift_right_imm_narrowt_to_uint;
     extern const function_shape *const store;
     extern const function_shape *const store_scatter_index;
+    extern const function_shape *const store_scatter_index_restricted;
     extern const function_shape *const store_scatter_offset;
+    extern const function_shape *const store_scatter_offset_restricted;
+    extern const function_shape *const tbl_tuple;
     extern const function_shape *const ternary_lane;
     extern const function_shape *const ternary_lane_rotate;
+    extern const function_shape *const ternary_long_lane;
+    extern const function_shape *const ternary_long_opt_n;
     extern const function_shape *const ternary_opt_n;
     extern const function_shape *const ternary_qq_lane;
+    extern const function_shape *const ternary_qq_lane_rotate;
     extern const function_shape *const ternary_qq_opt_n;
+    extern const function_shape *const ternary_qq_rotate;
     extern const function_shape *const ternary_rotate;
+    extern const function_shape *const ternary_shift_left_imm;
+    extern const function_shape *const ternary_shift_right_imm;
+    extern const function_shape *const ternary_uint;
     extern const function_shape *const tmad;
     extern const function_shape *const unary;
     extern const function_shape *const unary_convert;
+    extern const function_shape *const unary_convert_narrowt;
+    extern const function_shape *const unary_long;
     extern const function_shape *const unary_n;
+    extern const function_shape *const unary_narrowb;
+    extern const function_shape *const unary_narrowt;
+    extern const function_shape *const unary_narrowb_to_uint;
+    extern const function_shape *const unary_narrowt_to_uint;
     extern const function_shape *const unary_pred;
+    extern const function_shape *const unary_to_int;
     extern const function_shape *const unary_to_uint;
     extern const function_shape *const unary_uint;
     extern const function_shape *const unary_widen;
diff --git a/gcc/config/aarch64/aarch64-sve-builtins-sve2.cc b/gcc/config/aarch64/aarch64-sve-builtins-sve2.cc
new file mode 100644 (file)
index 0000000..fa3b506
--- /dev/null
@@ -0,0 +1,654 @@
+/* ACLE support for AArch64 SVE (__ARM_FEATURE_SVE2 intrinsics)
+   Copyright (C) 2020 Free Software Foundation, Inc.
+
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   GCC is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
+#include "tree.h"
+#include "rtl.h"
+#include "tm_p.h"
+#include "memmodel.h"
+#include "insn-codes.h"
+#include "optabs.h"
+#include "recog.h"
+#include "expr.h"
+#include "basic-block.h"
+#include "function.h"
+#include "fold-const.h"
+#include "gimple.h"
+#include "gimple-iterator.h"
+#include "gimplify.h"
+#include "explow.h"
+#include "emit-rtl.h"
+#include "tree-vector-builder.h"
+#include "rtx-vector-builder.h"
+#include "vec-perm-indices.h"
+#include "aarch64-sve-builtins.h"
+#include "aarch64-sve-builtins-shapes.h"
+#include "aarch64-sve-builtins-base.h"
+#include "aarch64-sve-builtins-sve2.h"
+#include "aarch64-sve-builtins-functions.h"
+
+using namespace aarch64_sve;
+
+namespace {
+
+/* Return the UNSPEC_CDOT* unspec for rotation amount ROT.  */
+static int
+unspec_cdot (int rot)
+{
+  switch (rot)
+    {
+    case 0: return UNSPEC_CDOT;
+    case 90: return UNSPEC_CDOT90;
+    case 180: return UNSPEC_CDOT180;
+    case 270: return UNSPEC_CDOT270;
+    default: gcc_unreachable ();
+    }
+}
+
+/* Return the UNSPEC_SQRDCMLAH* unspec for rotation amount ROT.  */
+static int
+unspec_sqrdcmlah (int rot)
+{
+  switch (rot)
+    {
+    case 0: return UNSPEC_SQRDCMLAH;
+    case 90: return UNSPEC_SQRDCMLAH90;
+    case 180: return UNSPEC_SQRDCMLAH180;
+    case 270: return UNSPEC_SQRDCMLAH270;
+    default: gcc_unreachable ();
+    }
+}
+
+class svaba_impl : public function_base
+{
+public:
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    rtx_code max_code = e.type_suffix (0).unsigned_p ? UMAX : SMAX;
+    machine_mode mode = e.vector_mode (0);
+    return e.use_exact_insn (code_for_aarch64_sve2_aba (max_code, mode));
+  }
+};
+
+class svcdot_impl : public function_base
+{
+public:
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    /* Convert the rotation amount into a specific unspec.  */
+    int rot = INTVAL (e.args.pop ());
+    return e.use_exact_insn (code_for_aarch64_sve (unspec_cdot (rot),
+                                                  e.vector_mode (0)));
+  }
+};
+
+class svcdot_lane_impl : public function_base
+{
+public:
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    /* Convert the rotation amount into a specific unspec.  */
+    int rot = INTVAL (e.args.pop ());
+    return e.use_exact_insn (code_for_aarch64_lane (unspec_cdot (rot),
+                                                   e.vector_mode (0)));
+  }
+};
+
+class svldnt1_gather_impl : public full_width_access
+{
+public:
+  unsigned int
+  call_properties (const function_instance &) const OVERRIDE
+  {
+    return CP_READ_MEMORY;
+  }
+
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    e.prepare_gather_address_operands (1, false);
+    machine_mode mem_mode = e.memory_vector_mode ();
+    return e.use_exact_insn (code_for_aarch64_gather_ldnt (mem_mode));
+  }
+};
+
+/* Implements extending forms of svldnt1_gather.  */
+class svldnt1_gather_extend_impl : public extending_load
+{
+public:
+  CONSTEXPR svldnt1_gather_extend_impl (type_suffix_index memory_type)
+    : extending_load (memory_type) {}
+
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    e.prepare_gather_address_operands (1, false);
+    /* Add a constant predicate for the extension rtx.  */
+    e.args.quick_push (CONSTM1_RTX (VNx16BImode));
+    insn_code icode = code_for_aarch64_gather_ldnt (extend_rtx_code (),
+                                                   e.vector_mode (0),
+                                                   e.memory_vector_mode ());
+    return e.use_exact_insn (icode);
+  }
+};
+
+/* Implements both svmatch and svnmatch; the unspec parameter decides
+   between them.  */
+class svmatch_svnmatch_impl : public function_base
+{
+public:
+  CONSTEXPR svmatch_svnmatch_impl (int unspec) : m_unspec (unspec) {}
+
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    /* These are UNSPEC_PRED_Z operations and so need a hint operand.  */
+    e.add_ptrue_hint (0, e.gp_mode (0));
+    return e.use_exact_insn (code_for_aarch64_pred (m_unspec,
+                                                   e.vector_mode (0)));
+  }
+
+  int m_unspec;
+};
+
+/* Implements both svmovlb and svmovlt; the unspec parameters decide
+   between them.  */
+class svmovl_lb_impl : public unspec_based_function_base
+{
+public:
+  CONSTEXPR svmovl_lb_impl (int unspec_for_sint, int unspec_for_uint,
+                           int unspec_for_fp)
+    : unspec_based_function_base (unspec_for_sint, unspec_for_uint,
+                                 unspec_for_fp)
+  {}
+
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    e.args.quick_push (const0_rtx);
+    return e.map_to_unspecs (m_unspec_for_sint, m_unspec_for_uint,
+                            m_unspec_for_fp);
+  }
+};
+
+class svqcadd_impl : public function_base
+{
+public:
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    /* Convert the rotation amount into a specific unspec.  */
+    int rot = INTVAL (e.args.pop ());
+    if (rot == 90)
+      return e.map_to_unspecs (UNSPEC_SQCADD90, -1, -1);
+    if (rot == 270)
+      return e.map_to_unspecs (UNSPEC_SQCADD270, -1, -1);
+    gcc_unreachable ();
+  }
+};
+
+class svqrdcmlah_impl : public function_base
+{
+public:
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    /* Convert the rotation amount into a specific unspec.  */
+    int rot = INTVAL (e.args.pop ());
+    return e.use_exact_insn (code_for_aarch64_sve (unspec_sqrdcmlah (rot),
+                                                  e.vector_mode (0)));
+  }
+};
+
+class svqrdcmlah_lane_impl : public function_base
+{
+public:
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    /* Convert the rotation amount into a specific unspec.  */
+    int rot = INTVAL (e.args.pop ());
+    return e.use_exact_insn (code_for_aarch64_lane (unspec_sqrdcmlah (rot),
+                                                   e.vector_mode (0)));
+  }
+};
+
+class svqrshl_impl : public unspec_based_function
+{
+public:
+  CONSTEXPR svqrshl_impl ()
+    : unspec_based_function (UNSPEC_SQRSHL, UNSPEC_UQRSHL, -1) {}
+
+  gimple *
+  fold (gimple_folder &f) const OVERRIDE
+  {
+    if (tree amount = uniform_integer_cst_p (gimple_call_arg (f.call, 2)))
+      {
+       if (wi::to_widest (amount) >= 0)
+         {
+           /* The rounding has no effect, and [SU]QSHL has immediate forms
+              that we can use for sensible shift amounts.  */
+           function_instance instance ("svqshl", functions::svqshl,
+                                       shapes::binary_int_opt_n, MODE_n,
+                                       f.type_suffix_ids, f.pred);
+           return f.redirect_call (instance);
+         }
+       else
+         {
+           /* The saturation has no effect, and [SU]RSHL has immediate forms
+              that we can use for sensible shift amounts.  */
+           function_instance instance ("svrshl", functions::svrshl,
+                                       shapes::binary_int_opt_n, MODE_n,
+                                       f.type_suffix_ids, f.pred);
+           return f.redirect_call (instance);
+         }
+      }
+    return NULL;
+  }
+};
+
+class svqshl_impl : public unspec_based_function
+{
+public:
+  CONSTEXPR svqshl_impl ()
+    : unspec_based_function (UNSPEC_SQSHL, UNSPEC_UQSHL, -1) {}
+
+  gimple *
+  fold (gimple_folder &f) const OVERRIDE
+  {
+    if (tree amount = uniform_integer_cst_p (gimple_call_arg (f.call, 2)))
+      {
+       int element_bits = f.type_suffix (0).element_bits;
+       if (wi::to_widest (amount) >= -element_bits
+           && wi::to_widest (amount) < 0)
+         {
+           /* The saturation has no effect for right shifts, so we can
+              use the immediate form of ASR or LSR.  */
+           amount = wide_int_to_tree (TREE_TYPE (amount),
+                                      -wi::to_wide (amount));
+           function_instance instance ("svasr", functions::svasr,
+                                       shapes::binary_uint_opt_n, MODE_n,
+                                       f.type_suffix_ids, f.pred);
+           if (f.type_suffix (0).unsigned_p)
+             {
+               instance.base_name = "svlsr";
+               instance.base = functions::svlsr;
+             }
+           gcall *call = as_a <gcall *> (f.redirect_call (instance));
+           gimple_call_set_arg (call, 2, amount);
+           return call;
+         }
+      }
+    return NULL;
+  }
+};
+
+class svrshl_impl : public unspec_based_function
+{
+public:
+  CONSTEXPR svrshl_impl ()
+    : unspec_based_function (UNSPEC_SRSHL, UNSPEC_URSHL, -1) {}
+
+  gimple *
+  fold (gimple_folder &f) const OVERRIDE
+  {
+    if (tree amount = uniform_integer_cst_p (gimple_call_arg (f.call, 2)))
+      {
+       if (wi::to_widest (amount) >= 0)
+         {
+           /* The rounding has no effect, and LSL has immediate forms
+              that we can use for sensible shift amounts.  */
+           function_instance instance ("svlsl", functions::svlsl,
+                                       shapes::binary_uint_opt_n, MODE_n,
+                                       f.type_suffix_ids, f.pred);
+           gcall *call = as_a <gcall *> (f.redirect_call (instance));
+           gimple_call_set_arg (call, 2, amount);
+           return call;
+         }
+       int element_bits = f.type_suffix (0).element_bits;
+       if (wi::to_widest (amount) >= -element_bits)
+         {
+           /* The shift amount is in range of [SU]RSHR.  */
+           amount = wide_int_to_tree (TREE_TYPE (amount),
+                                      -wi::to_wide (amount));
+           function_instance instance ("svrshr", functions::svrshr,
+                                       shapes::shift_right_imm, MODE_n,
+                                       f.type_suffix_ids, f.pred);
+           gcall *call = as_a <gcall *> (f.redirect_call (instance));
+           gimple_call_set_arg (call, 2, amount);
+           return call;
+         }
+      }
+    return NULL;
+  }
+};
+
+class svsqadd_impl : public function_base
+{
+public:
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    machine_mode mode = e.vector_mode (0);
+    if (e.pred == PRED_x
+       && aarch64_sve_sqadd_sqsub_immediate_p (mode, e.args[2], false))
+      return e.map_to_rtx_codes (UNKNOWN, US_PLUS, -1);
+    return e.map_to_unspecs (-1, UNSPEC_USQADD, -1);
+  }
+};
+
+class svsra_impl : public function_base
+{
+public:
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    rtx_code shift_code = e.type_suffix (0).unsigned_p ? LSHIFTRT : ASHIFTRT;
+    machine_mode mode = e.vector_mode (0);
+    return e.use_exact_insn (code_for_aarch64_sve_add (shift_code, mode));
+  }
+};
+
+class svstnt1_scatter_impl : public full_width_access
+{
+public:
+  unsigned int
+  call_properties (const function_instance &) const OVERRIDE
+  {
+    return CP_WRITE_MEMORY;
+  }
+
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    e.prepare_gather_address_operands (1, false);
+    machine_mode mem_mode = e.memory_vector_mode ();
+    return e.use_exact_insn (code_for_aarch64_scatter_stnt (mem_mode));
+  }
+};
+
+/* Implements truncating forms of svstnt1_scatter.  */
+class svstnt1_scatter_truncate_impl : public truncating_store
+{
+public:
+  CONSTEXPR svstnt1_scatter_truncate_impl (scalar_int_mode to_mode)
+    : truncating_store (to_mode) {}
+
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    e.prepare_gather_address_operands (1, false);
+    insn_code icode = code_for_aarch64_scatter_stnt (e.vector_mode (0),
+                                                    e.memory_vector_mode ());
+    return e.use_exact_insn (icode);
+  }
+};
+
+class svtbl2_impl : public quiet<multi_vector_function>
+{
+public:
+  CONSTEXPR svtbl2_impl () : quiet<multi_vector_function> (2) {}
+
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    return e.use_exact_insn (code_for_aarch64_sve2_tbl2 (e.vector_mode (0)));
+  }
+};
+
+class svuqadd_impl : public function_base
+{
+public:
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    machine_mode mode = e.vector_mode (0);
+    if (e.pred == PRED_x
+       && aarch64_sve_arith_immediate_p (mode, e.args[2], false))
+      return e.use_unpred_insn (code_for_aarch64_sve_suqadd_const (mode));
+    return e.map_to_unspecs (UNSPEC_SUQADD, -1, -1);
+  }
+};
+
+/* Implements both svwhilerw and svwhilewr; the unspec parameter decides
+   between them.  */
+class svwhilerw_svwhilewr_impl : public full_width_access
+{
+public:
+  CONSTEXPR svwhilerw_svwhilewr_impl (int unspec) : m_unspec (unspec) {}
+
+  rtx
+  expand (function_expander &e) const OVERRIDE
+  {
+    return e.use_exact_insn (code_for_while (m_unspec, Pmode, e.gp_mode (0)));
+  }
+
+  int m_unspec;
+};
+
+} /* end anonymous namespace */
+
+namespace aarch64_sve {
+
+FUNCTION (svaba, svaba_impl,)
+FUNCTION (svabalb, unspec_based_add_function, (UNSPEC_SABDLB,
+                                              UNSPEC_UABDLB, -1))
+FUNCTION (svabalt, unspec_based_add_function, (UNSPEC_SABDLT,
+                                              UNSPEC_UABDLT, -1))
+FUNCTION (svadclb, unspec_based_function, (-1, UNSPEC_ADCLB, -1))
+FUNCTION (svadclt, unspec_based_function, (-1, UNSPEC_ADCLT, -1))
+FUNCTION (svaddhnb, unspec_based_function, (UNSPEC_ADDHNB, UNSPEC_ADDHNB, -1))
+FUNCTION (svaddhnt, unspec_based_function, (UNSPEC_ADDHNT, UNSPEC_ADDHNT, -1))
+FUNCTION (svabdlb, unspec_based_function, (UNSPEC_SABDLB, UNSPEC_UABDLB, -1))
+FUNCTION (svabdlt, unspec_based_function, (UNSPEC_SABDLT, UNSPEC_UABDLT, -1))
+FUNCTION (svadalp, unspec_based_function, (UNSPEC_SADALP, UNSPEC_UADALP, -1))
+FUNCTION (svaddlb, unspec_based_function, (UNSPEC_SADDLB, UNSPEC_UADDLB, -1))
+FUNCTION (svaddlbt, unspec_based_function, (UNSPEC_SADDLBT, -1, -1))
+FUNCTION (svaddlt, unspec_based_function, (UNSPEC_SADDLT, UNSPEC_UADDLT, -1))
+FUNCTION (svaddwb, unspec_based_function, (UNSPEC_SADDWB, UNSPEC_UADDWB, -1))
+FUNCTION (svaddwt, unspec_based_function, (UNSPEC_SADDWT, UNSPEC_UADDWT, -1))
+FUNCTION (svaddp, unspec_based_pred_function, (UNSPEC_ADDP, UNSPEC_ADDP,
+                                              UNSPEC_FADDP))
+FUNCTION (svaesd, fixed_insn_function, (CODE_FOR_aarch64_sve2_aesd))
+FUNCTION (svaese, fixed_insn_function, (CODE_FOR_aarch64_sve2_aese))
+FUNCTION (svaesimc, fixed_insn_function, (CODE_FOR_aarch64_sve2_aesimc))
+FUNCTION (svaesmc, fixed_insn_function, (CODE_FOR_aarch64_sve2_aesmc))
+FUNCTION (svbcax, CODE_FOR_MODE0 (aarch64_sve2_bcax),)
+FUNCTION (svbdep, unspec_based_function, (UNSPEC_BDEP, UNSPEC_BDEP, -1))
+FUNCTION (svbext, unspec_based_function, (UNSPEC_BEXT, UNSPEC_BEXT, -1))
+FUNCTION (svbgrp, unspec_based_function, (UNSPEC_BGRP, UNSPEC_BGRP, -1))
+FUNCTION (svbsl, CODE_FOR_MODE0 (aarch64_sve2_bsl),)
+FUNCTION (svbsl1n, CODE_FOR_MODE0 (aarch64_sve2_bsl1n),)
+FUNCTION (svbsl2n, CODE_FOR_MODE0 (aarch64_sve2_bsl2n),)
+FUNCTION (svcdot, svcdot_impl,)
+FUNCTION (svcdot_lane, svcdot_lane_impl,)
+FUNCTION (svcvtlt, unspec_based_function, (-1, -1, UNSPEC_COND_FCVTLT))
+FUNCTION (svcvtnt, CODE_FOR_MODE1 (aarch64_sve2_cvtnt),)
+FUNCTION (svcvtx, unspec_based_function, (-1, -1, UNSPEC_COND_FCVTX))
+FUNCTION (svcvtxnt, CODE_FOR_MODE1 (aarch64_sve2_cvtxnt),)
+FUNCTION (sveor3, CODE_FOR_MODE0 (aarch64_sve2_eor3),)
+FUNCTION (sveorbt, unspec_based_function, (UNSPEC_EORBT, UNSPEC_EORBT, -1))
+FUNCTION (sveortb, unspec_based_function, (UNSPEC_EORTB, UNSPEC_EORTB, -1))
+FUNCTION (svhadd, unspec_based_function, (UNSPEC_SHADD, UNSPEC_UHADD, -1))
+FUNCTION (svhsub, unspec_based_function, (UNSPEC_SHSUB, UNSPEC_UHSUB, -1))
+FUNCTION (svhistcnt, CODE_FOR_MODE0 (aarch64_sve2_histcnt),)
+FUNCTION (svhistseg, CODE_FOR_MODE0 (aarch64_sve2_histseg),)
+FUNCTION (svhsubr, unspec_based_function_rotated, (UNSPEC_SHSUB,
+                                                  UNSPEC_UHSUB, -1))
+FUNCTION (svldnt1_gather, svldnt1_gather_impl,)
+FUNCTION (svldnt1sb_gather, svldnt1_gather_extend_impl, (TYPE_SUFFIX_s8))
+FUNCTION (svldnt1sh_gather, svldnt1_gather_extend_impl, (TYPE_SUFFIX_s16))
+FUNCTION (svldnt1sw_gather, svldnt1_gather_extend_impl, (TYPE_SUFFIX_s32))
+FUNCTION (svldnt1ub_gather, svldnt1_gather_extend_impl, (TYPE_SUFFIX_u8))
+FUNCTION (svldnt1uh_gather, svldnt1_gather_extend_impl, (TYPE_SUFFIX_u16))
+FUNCTION (svldnt1uw_gather, svldnt1_gather_extend_impl, (TYPE_SUFFIX_u32))
+FUNCTION (svlogb, unspec_based_function, (-1, -1, UNSPEC_COND_FLOGB))
+FUNCTION (svmatch, svmatch_svnmatch_impl, (UNSPEC_MATCH))
+FUNCTION (svmaxp, unspec_based_pred_function, (UNSPEC_SMAXP, UNSPEC_UMAXP,
+                                              UNSPEC_FMAXP))
+FUNCTION (svmaxnmp, unspec_based_pred_function, (-1, -1, UNSPEC_FMAXNMP))
+FUNCTION (svminp, unspec_based_pred_function, (UNSPEC_SMINP, UNSPEC_UMINP,
+                                              UNSPEC_FMINP))
+FUNCTION (svminnmp, unspec_based_pred_function, (-1, -1, UNSPEC_FMINNMP))
+FUNCTION (svmlalb, unspec_based_mla_function, (UNSPEC_SMULLB,
+                                              UNSPEC_UMULLB, UNSPEC_FMLALB))
+FUNCTION (svmlalb_lane, unspec_based_mla_lane_function, (UNSPEC_SMULLB,
+                                                        UNSPEC_UMULLB,
+                                                        UNSPEC_FMLALB))
+FUNCTION (svmlalt, unspec_based_mla_function, (UNSPEC_SMULLT,
+                                              UNSPEC_UMULLT, UNSPEC_FMLALT))
+FUNCTION (svmlalt_lane, unspec_based_mla_lane_function, (UNSPEC_SMULLT,
+                                                        UNSPEC_UMULLT,
+                                                        UNSPEC_FMLALT))
+FUNCTION (svmlslb, unspec_based_mls_function, (UNSPEC_SMULLB,
+                                              UNSPEC_UMULLB, UNSPEC_FMLSLB))
+FUNCTION (svmlslb_lane, unspec_based_mls_lane_function, (UNSPEC_SMULLB,
+                                                        UNSPEC_UMULLB,
+                                                        UNSPEC_FMLSLB))
+FUNCTION (svmlslt, unspec_based_mls_function, (UNSPEC_SMULLT,
+                                              UNSPEC_UMULLT, UNSPEC_FMLSLT))
+FUNCTION (svmlslt_lane, unspec_based_mls_lane_function, (UNSPEC_SMULLT,
+                                                        UNSPEC_UMULLT,
+                                                        UNSPEC_FMLSLT))
+FUNCTION (svmovlb, svmovl_lb_impl, (UNSPEC_SSHLLB, UNSPEC_USHLLB, -1))
+FUNCTION (svmovlt, svmovl_lb_impl, (UNSPEC_SSHLLT, UNSPEC_USHLLT, -1))
+FUNCTION (svmullb, unspec_based_function, (UNSPEC_SMULLB, UNSPEC_UMULLB, -1))
+FUNCTION (svmullb_lane, unspec_based_lane_function, (UNSPEC_SMULLB,
+                                                    UNSPEC_UMULLB, -1))
+FUNCTION (svmullt, unspec_based_function, (UNSPEC_SMULLT, UNSPEC_UMULLT, -1))
+FUNCTION (svmullt_lane, unspec_based_lane_function, (UNSPEC_SMULLT,
+                                                    UNSPEC_UMULLT, -1))
+FUNCTION (svnbsl, CODE_FOR_MODE0 (aarch64_sve2_nbsl),)
+FUNCTION (svnmatch, svmatch_svnmatch_impl, (UNSPEC_NMATCH))
+FUNCTION (svpmul, CODE_FOR_MODE0 (aarch64_sve2_pmul),)
+FUNCTION (svpmullb, unspec_based_function, (-1, UNSPEC_PMULLB, -1))
+FUNCTION (svpmullb_pair, unspec_based_function, (-1, UNSPEC_PMULLB_PAIR, -1))
+FUNCTION (svpmullt, unspec_based_function, (-1, UNSPEC_PMULLT, -1))
+FUNCTION (svpmullt_pair, unspec_based_function, (-1, UNSPEC_PMULLT_PAIR, -1))
+FUNCTION (svqabs, rtx_code_function, (SS_ABS, UNKNOWN, UNKNOWN))
+FUNCTION (svqcadd, svqcadd_impl,)
+FUNCTION (svqdmlalb, unspec_based_qadd_function, (UNSPEC_SQDMULLB, -1, -1))
+FUNCTION (svqdmlalb_lane, unspec_based_qadd_lane_function, (UNSPEC_SQDMULLB,
+                                                           -1, -1))
+FUNCTION (svqdmlalbt, unspec_based_qadd_function, (UNSPEC_SQDMULLBT, -1, -1))
+FUNCTION (svqdmlalt, unspec_based_qadd_function, (UNSPEC_SQDMULLT, -1, -1))
+FUNCTION (svqdmlalt_lane, unspec_based_qadd_lane_function, (UNSPEC_SQDMULLT,
+                                                           -1, -1))
+FUNCTION (svqdmlslb, unspec_based_qsub_function, (UNSPEC_SQDMULLB, -1, -1))
+FUNCTION (svqdmlslb_lane, unspec_based_qsub_lane_function, (UNSPEC_SQDMULLB,
+                                                           -1, -1))
+FUNCTION (svqdmlslbt, unspec_based_qsub_function, (UNSPEC_SQDMULLBT, -1, -1))
+FUNCTION (svqdmlslt, unspec_based_qsub_function, (UNSPEC_SQDMULLT, -1, -1))
+FUNCTION (svqdmlslt_lane, unspec_based_qsub_lane_function, (UNSPEC_SQDMULLT,
+                                                           -1, -1))
+FUNCTION (svqdmulh, unspec_based_function, (UNSPEC_SQDMULH, -1, -1))
+FUNCTION (svqdmulh_lane, unspec_based_lane_function, (UNSPEC_SQDMULH, -1, -1))
+FUNCTION (svqdmullb, unspec_based_function, (UNSPEC_SQDMULLB, -1, -1))
+FUNCTION (svqdmullb_lane, unspec_based_lane_function, (UNSPEC_SQDMULLB,
+                                                      -1, -1))
+FUNCTION (svqdmullt, unspec_based_function, (UNSPEC_SQDMULLT, -1, -1))
+FUNCTION (svqdmullt_lane, unspec_based_lane_function, (UNSPEC_SQDMULLT,
+                                                      -1, -1))
+FUNCTION (svqneg, rtx_code_function, (SS_NEG, UNKNOWN, UNKNOWN))
+FUNCTION (svqrdcmlah, svqrdcmlah_impl,)
+FUNCTION (svqrdcmlah_lane, svqrdcmlah_lane_impl,)
+FUNCTION (svqrdmulh, unspec_based_function, (UNSPEC_SQRDMULH, -1, -1))
+FUNCTION (svqrdmulh_lane, unspec_based_lane_function, (UNSPEC_SQRDMULH,
+                                                      -1, -1))
+FUNCTION (svqrdmlah, unspec_based_function, (UNSPEC_SQRDMLAH, -1, -1))
+FUNCTION (svqrdmlah_lane, unspec_based_lane_function, (UNSPEC_SQRDMLAH,
+                                                      -1, -1))
+FUNCTION (svqrdmlsh, unspec_based_function, (UNSPEC_SQRDMLSH, -1, -1))
+FUNCTION (svqrdmlsh_lane, unspec_based_lane_function, (UNSPEC_SQRDMLSH,
+                                                      -1, -1))
+FUNCTION (svqrshl, svqrshl_impl,)
+FUNCTION (svqrshrnb, unspec_based_function, (UNSPEC_SQRSHRNB,
+                                            UNSPEC_UQRSHRNB, -1))
+FUNCTION (svqrshrnt, unspec_based_function, (UNSPEC_SQRSHRNT,
+                                            UNSPEC_UQRSHRNT, -1))
+FUNCTION (svqrshrunb, unspec_based_function, (UNSPEC_SQRSHRUNB, -1, -1))
+FUNCTION (svqrshrunt, unspec_based_function, (UNSPEC_SQRSHRUNT, -1, -1))
+FUNCTION (svqshl, svqshl_impl,)
+FUNCTION (svqshlu, unspec_based_function, (UNSPEC_SQSHLU, -1, -1))
+FUNCTION (svqshrnb, unspec_based_function, (UNSPEC_SQSHRNB,
+                                           UNSPEC_UQSHRNB, -1))
+FUNCTION (svqshrnt, unspec_based_function, (UNSPEC_SQSHRNT,
+                                           UNSPEC_UQSHRNT, -1))
+FUNCTION (svqshrunb, unspec_based_function, (UNSPEC_SQSHRUNB, -1, -1))
+FUNCTION (svqshrunt, unspec_based_function, (UNSPEC_SQSHRUNT, -1, -1))
+FUNCTION (svqsubr, rtx_code_function_rotated, (SS_MINUS, US_MINUS, -1))
+FUNCTION (svqxtnb, unspec_based_function, (UNSPEC_SQXTNB, UNSPEC_UQXTNB, -1))
+FUNCTION (svqxtnt, unspec_based_function, (UNSPEC_SQXTNT, UNSPEC_UQXTNT, -1))
+FUNCTION (svqxtunb, unspec_based_function, (UNSPEC_SQXTUNB, -1, -1))
+FUNCTION (svqxtunt, unspec_based_function, (UNSPEC_SQXTUNT, -1, -1))
+FUNCTION (svraddhnb, unspec_based_function, (UNSPEC_RADDHNB,
+                                            UNSPEC_RADDHNB, -1))
+FUNCTION (svraddhnt, unspec_based_function, (UNSPEC_RADDHNT,
+                                            UNSPEC_RADDHNT, -1))
+FUNCTION (svrax1, fixed_insn_function, (CODE_FOR_aarch64_sve2_rax1))
+FUNCTION (svrhadd, unspec_based_function, (UNSPEC_SRHADD, UNSPEC_URHADD, -1))
+FUNCTION (svrshl, svrshl_impl,)
+FUNCTION (svrshr, unspec_based_function, (UNSPEC_SRSHR, UNSPEC_URSHR, -1))
+FUNCTION (svrshrnb, unspec_based_function, (UNSPEC_RSHRNB, UNSPEC_RSHRNB, -1))
+FUNCTION (svrshrnt, unspec_based_function, (UNSPEC_RSHRNT, UNSPEC_RSHRNT, -1))
+FUNCTION (svrsra, unspec_based_add_function, (UNSPEC_SRSHR, UNSPEC_URSHR, -1))
+FUNCTION (svrsubhnb, unspec_based_function, (UNSPEC_RSUBHNB,
+                                            UNSPEC_RSUBHNB, -1))
+FUNCTION (svrsubhnt, unspec_based_function, (UNSPEC_RSUBHNT,
+                                            UNSPEC_RSUBHNT, -1))
+FUNCTION (svsbclb, unspec_based_function, (-1, UNSPEC_SBCLB, -1))
+FUNCTION (svsbclt, unspec_based_function, (-1, UNSPEC_SBCLT, -1))
+FUNCTION (svshllb, unspec_based_function, (UNSPEC_SSHLLB, UNSPEC_USHLLB, -1))
+FUNCTION (svshllt, unspec_based_function, (UNSPEC_SSHLLT, UNSPEC_USHLLT, -1))
+FUNCTION (svshrnb, unspec_based_function, (UNSPEC_SHRNB, UNSPEC_SHRNB, -1))
+FUNCTION (svshrnt, unspec_based_function, (UNSPEC_SHRNT, UNSPEC_SHRNT, -1))
+FUNCTION (svsli, unspec_based_function, (UNSPEC_SLI, UNSPEC_SLI, -1))
+FUNCTION (svsm4e, fixed_insn_function, (CODE_FOR_aarch64_sve2_sm4e))
+FUNCTION (svsm4ekey, fixed_insn_function, (CODE_FOR_aarch64_sve2_sm4ekey))
+FUNCTION (svsqadd, svsqadd_impl,)
+FUNCTION (svsra, svsra_impl,)
+FUNCTION (svsri, unspec_based_function, (UNSPEC_SRI, UNSPEC_SRI, -1))
+FUNCTION (svstnt1_scatter, svstnt1_scatter_impl,)
+FUNCTION (svstnt1b_scatter, svstnt1_scatter_truncate_impl, (QImode))
+FUNCTION (svstnt1h_scatter, svstnt1_scatter_truncate_impl, (HImode))
+FUNCTION (svstnt1w_scatter, svstnt1_scatter_truncate_impl, (SImode))
+FUNCTION (svsubhnb, unspec_based_function, (UNSPEC_SUBHNB, UNSPEC_SUBHNB, -1))
+FUNCTION (svsubhnt, unspec_based_function, (UNSPEC_SUBHNT, UNSPEC_SUBHNT, -1))
+FUNCTION (svsublb, unspec_based_function, (UNSPEC_SSUBLB, UNSPEC_USUBLB, -1))
+FUNCTION (svsublbt, unspec_based_function, (UNSPEC_SSUBLBT, -1, -1))
+FUNCTION (svsublt, unspec_based_function, (UNSPEC_SSUBLT, UNSPEC_USUBLT, -1))
+FUNCTION (svsubltb, unspec_based_function, (UNSPEC_SSUBLTB, -1, -1))
+FUNCTION (svsubwb, unspec_based_function, (UNSPEC_SSUBWB, UNSPEC_USUBWB, -1))
+FUNCTION (svsubwt, unspec_based_function, (UNSPEC_SSUBWT, UNSPEC_USUBWT, -1))
+FUNCTION (svtbl2, svtbl2_impl,)
+FUNCTION (svtbx, CODE_FOR_MODE0 (aarch64_sve2_tbx),)
+FUNCTION (svuqadd, svuqadd_impl,)
+FUNCTION (svwhilege, while_comparison, (UNSPEC_WHILEGE, UNSPEC_WHILEHS))
+FUNCTION (svwhilegt, while_comparison, (UNSPEC_WHILEGT, UNSPEC_WHILEHI))
+FUNCTION (svwhilerw, svwhilerw_svwhilewr_impl, (UNSPEC_WHILERW))
+FUNCTION (svwhilewr, svwhilerw_svwhilewr_impl, (UNSPEC_WHILEWR))
+FUNCTION (svxar, CODE_FOR_MODE0 (aarch64_sve2_xar),)
+
+} /* end namespace aarch64_sve */
diff --git a/gcc/config/aarch64/aarch64-sve-builtins-sve2.def b/gcc/config/aarch64/aarch64-sve-builtins-sve2.def
new file mode 100644 (file)
index 0000000..5ab41c3
--- /dev/null
@@ -0,0 +1,214 @@
+/* ACLE support for AArch64 SVE (__ARM_FEATURE_SVE intrinsics)
+   Copyright (C) 2020 Free Software Foundation, Inc.
+
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   GCC is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#define REQUIRED_EXTENSIONS AARCH64_FL_SVE2
+DEF_SVE_FUNCTION (svaba, ternary_opt_n, all_integer, none)
+DEF_SVE_FUNCTION (svabalb, ternary_long_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svabalt, ternary_long_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svadalp, binary_wide, hsd_integer, mxz)
+DEF_SVE_FUNCTION (svadclb, ternary_opt_n, sd_unsigned, none)
+DEF_SVE_FUNCTION (svadclt, ternary_opt_n, sd_unsigned, none)
+DEF_SVE_FUNCTION (svaddhnb, binary_narrowb_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svaddhnt, binary_narrowt_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svabdlb, binary_long_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svabdlt, binary_long_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svaddlb, binary_long_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svaddlbt, binary_long_opt_n, hsd_signed, none)
+DEF_SVE_FUNCTION (svaddlt, binary_long_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svaddp, binary, all_data, mx)
+DEF_SVE_FUNCTION (svaddwb, binary_wide_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svaddwt, binary_wide_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svbcax, ternary_opt_n, all_integer, none)
+DEF_SVE_FUNCTION (svbsl, ternary_opt_n, all_integer, none)
+DEF_SVE_FUNCTION (svbsl1n, ternary_opt_n, all_integer, none)
+DEF_SVE_FUNCTION (svbsl2n, ternary_opt_n, all_integer, none)
+DEF_SVE_FUNCTION (svcadd, binary_rotate, all_integer, none)
+DEF_SVE_FUNCTION (svcdot, ternary_qq_rotate, sd_signed, none)
+DEF_SVE_FUNCTION (svcdot_lane, ternary_qq_lane_rotate, sd_signed, none)
+DEF_SVE_FUNCTION (svcmla, ternary_rotate, all_integer, none)
+DEF_SVE_FUNCTION (svcmla_lane, ternary_lane_rotate, hs_integer, none)
+DEF_SVE_FUNCTION (svcvtlt, unary_convert, cvt_long, mx)
+DEF_SVE_FUNCTION (svcvtnt, unary_convert_narrowt, cvt_narrow, mx)
+DEF_SVE_FUNCTION (svcvtx, unary_convert, cvt_narrow_s, mxz)
+DEF_SVE_FUNCTION (svcvtxnt, unary_convert_narrowt, cvt_narrow_s, mx)
+DEF_SVE_FUNCTION (sveor3, ternary_opt_n, all_integer, none)
+DEF_SVE_FUNCTION (sveorbt, ternary_opt_n, all_integer, none)
+DEF_SVE_FUNCTION (sveortb, ternary_opt_n, all_integer, none)
+DEF_SVE_FUNCTION (svhadd, binary_opt_n, all_integer, mxz)
+DEF_SVE_FUNCTION (svhistcnt, binary_to_uint, sd_integer, z)
+DEF_SVE_FUNCTION (svhistseg, binary_to_uint, b_integer, none)
+DEF_SVE_FUNCTION (svhsub, binary_opt_n, all_integer, mxz)
+DEF_SVE_FUNCTION (svhsubr, binary_opt_n, all_integer, mxz)
+DEF_SVE_FUNCTION (svldnt1_gather, load_gather_sv_restricted, sd_data, implicit)
+DEF_SVE_FUNCTION (svldnt1_gather, load_gather_vs, sd_data, implicit)
+DEF_SVE_FUNCTION (svldnt1sb_gather, load_ext_gather_offset_restricted, sd_integer, implicit)
+DEF_SVE_FUNCTION (svldnt1sh_gather, load_ext_gather_offset_restricted, sd_integer, implicit)
+DEF_SVE_FUNCTION (svldnt1sh_gather, load_ext_gather_index_restricted, sd_integer, implicit)
+DEF_SVE_FUNCTION (svldnt1sw_gather, load_ext_gather_offset_restricted, d_integer, implicit)
+DEF_SVE_FUNCTION (svldnt1sw_gather, load_ext_gather_index_restricted, d_integer, implicit)
+DEF_SVE_FUNCTION (svldnt1ub_gather, load_ext_gather_offset_restricted, sd_integer, implicit)
+DEF_SVE_FUNCTION (svldnt1uh_gather, load_ext_gather_offset_restricted, sd_integer, implicit)
+DEF_SVE_FUNCTION (svldnt1uh_gather, load_ext_gather_index_restricted, sd_integer, implicit)
+DEF_SVE_FUNCTION (svldnt1uw_gather, load_ext_gather_offset_restricted, d_integer, implicit)
+DEF_SVE_FUNCTION (svldnt1uw_gather, load_ext_gather_index_restricted, d_integer, implicit)
+DEF_SVE_FUNCTION (svlogb, unary_to_int, all_float, mxz)
+DEF_SVE_FUNCTION (svmatch, compare, bh_integer, implicit)
+DEF_SVE_FUNCTION (svmaxp, binary, all_data, mx)
+DEF_SVE_FUNCTION (svmaxnmp, binary, all_float, mx)
+DEF_SVE_FUNCTION (svmla_lane, ternary_lane, hsd_integer, none)
+DEF_SVE_FUNCTION (svmlalb, ternary_long_opt_n, s_float_hsd_integer, none)
+DEF_SVE_FUNCTION (svmlalb_lane, ternary_long_lane, s_float_sd_integer, none)
+DEF_SVE_FUNCTION (svmlalt, ternary_long_opt_n, s_float_hsd_integer, none)
+DEF_SVE_FUNCTION (svmlalt_lane, ternary_long_lane, s_float_sd_integer, none)
+DEF_SVE_FUNCTION (svmls_lane, ternary_lane, hsd_integer, none)
+DEF_SVE_FUNCTION (svmlslb, ternary_long_opt_n, s_float_hsd_integer, none)
+DEF_SVE_FUNCTION (svmlslb_lane, ternary_long_lane, s_float_sd_integer, none)
+DEF_SVE_FUNCTION (svmlslt, ternary_long_opt_n, s_float_hsd_integer, none)
+DEF_SVE_FUNCTION (svmlslt_lane, ternary_long_lane, s_float_sd_integer, none)
+DEF_SVE_FUNCTION (svminp, binary, all_data, mx)
+DEF_SVE_FUNCTION (svminnmp, binary, all_float, mx)
+DEF_SVE_FUNCTION (svmovlb, unary_long, hsd_integer, none)
+DEF_SVE_FUNCTION (svmovlt, unary_long, hsd_integer, none)
+DEF_SVE_FUNCTION (svmul_lane, binary_lane, hsd_integer, none)
+DEF_SVE_FUNCTION (svmullb, binary_long_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svmullb_lane, binary_long_lane, sd_integer, none)
+DEF_SVE_FUNCTION (svmullt, binary_long_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svmullt_lane, binary_long_lane, sd_integer, none)
+DEF_SVE_FUNCTION (svnbsl, ternary_opt_n, all_integer, none)
+DEF_SVE_FUNCTION (svnmatch, compare, bh_integer, implicit)
+DEF_SVE_FUNCTION (svpmul, binary_opt_n, b_unsigned, none)
+DEF_SVE_FUNCTION (svpmullb, binary_long_opt_n, hd_unsigned, none)
+DEF_SVE_FUNCTION (svpmullb_pair, binary_opt_n, bs_unsigned, none)
+DEF_SVE_FUNCTION (svpmullt, binary_long_opt_n, hd_unsigned, none)
+DEF_SVE_FUNCTION (svpmullt_pair, binary_opt_n, bs_unsigned, none)
+DEF_SVE_FUNCTION (svqabs, unary, all_signed, mxz)
+DEF_SVE_FUNCTION (svqadd, binary_opt_n, all_integer, mxz)
+DEF_SVE_FUNCTION (svqcadd, binary_rotate, all_signed, none)
+DEF_SVE_FUNCTION (svqdmlalb, ternary_long_opt_n, hsd_signed, none)
+DEF_SVE_FUNCTION (svqdmlalb_lane, ternary_long_lane, sd_signed, none)
+DEF_SVE_FUNCTION (svqdmlalbt, ternary_long_opt_n, hsd_signed, none)
+DEF_SVE_FUNCTION (svqdmlalt, ternary_long_opt_n, hsd_signed, none)
+DEF_SVE_FUNCTION (svqdmlalt_lane, ternary_long_lane, sd_signed, none)
+DEF_SVE_FUNCTION (svqdmlslb, ternary_long_opt_n, hsd_signed, none)
+DEF_SVE_FUNCTION (svqdmlslb_lane, ternary_long_lane, sd_signed, none)
+DEF_SVE_FUNCTION (svqdmlslbt, ternary_long_opt_n, hsd_signed, none)
+DEF_SVE_FUNCTION (svqdmlslt, ternary_long_opt_n, hsd_signed, none)
+DEF_SVE_FUNCTION (svqdmlslt_lane, ternary_long_lane, sd_signed, none)
+DEF_SVE_FUNCTION (svqdmulh, binary_opt_n, all_signed, none)
+DEF_SVE_FUNCTION (svqdmulh_lane, binary_lane, hsd_signed, none)
+DEF_SVE_FUNCTION (svqdmullb, binary_long_opt_n, hsd_signed, none)
+DEF_SVE_FUNCTION (svqdmullb_lane, binary_long_lane, sd_signed, none)
+DEF_SVE_FUNCTION (svqdmullt, binary_long_opt_n, hsd_signed, none)
+DEF_SVE_FUNCTION (svqdmullt_lane, binary_long_lane, sd_signed, none)
+DEF_SVE_FUNCTION (svqneg, unary, all_signed, mxz)
+DEF_SVE_FUNCTION (svqrdmulh, binary_opt_n, all_signed, none)
+DEF_SVE_FUNCTION (svqrdmulh_lane, binary_lane, hsd_signed, none)
+DEF_SVE_FUNCTION (svqrdmlah, ternary_opt_n, all_signed, none)
+DEF_SVE_FUNCTION (svqrdmlah_lane, ternary_lane, hsd_signed, none)
+DEF_SVE_FUNCTION (svqrdmlsh, ternary_opt_n, all_signed, none)
+DEF_SVE_FUNCTION (svqrdmlsh_lane, ternary_lane, hsd_signed, none)
+DEF_SVE_FUNCTION (svqrdcmlah, ternary_rotate, all_signed, none)
+DEF_SVE_FUNCTION (svqrdcmlah_lane, ternary_lane_rotate, hs_signed, none)
+DEF_SVE_FUNCTION (svqrshrnb, shift_right_imm_narrowb, hsd_integer, none)
+DEF_SVE_FUNCTION (svqrshrnt, shift_right_imm_narrowt, hsd_integer, none)
+DEF_SVE_FUNCTION (svqrshrunb, shift_right_imm_narrowb_to_uint, hsd_signed, none)
+DEF_SVE_FUNCTION (svqrshrunt, shift_right_imm_narrowt_to_uint, hsd_signed, none)
+DEF_SVE_FUNCTION (svqshl, binary_int_opt_n, all_integer, mxz)
+DEF_SVE_FUNCTION (svqshlu, shift_left_imm_to_uint, all_signed, mxz)
+DEF_SVE_FUNCTION (svqshrnb, shift_right_imm_narrowb, hsd_integer, none)
+DEF_SVE_FUNCTION (svqshrnt, shift_right_imm_narrowt, hsd_integer, none)
+DEF_SVE_FUNCTION (svqshrunb, shift_right_imm_narrowb_to_uint, hsd_signed, none)
+DEF_SVE_FUNCTION (svqshrunt, shift_right_imm_narrowt_to_uint, hsd_signed, none)
+DEF_SVE_FUNCTION (svqrshl, binary_int_opt_n, all_integer, mxz)
+DEF_SVE_FUNCTION (svqsub, binary_opt_n, all_integer, mxz)
+DEF_SVE_FUNCTION (svqsubr, binary_opt_n, all_integer, mxz)
+DEF_SVE_FUNCTION (svqxtnb, unary_narrowb, hsd_integer, none)
+DEF_SVE_FUNCTION (svqxtnt, unary_narrowt, hsd_integer, none)
+DEF_SVE_FUNCTION (svqxtunb, unary_narrowb_to_uint, hsd_signed, none)
+DEF_SVE_FUNCTION (svqxtunt, unary_narrowt_to_uint, hsd_signed, none)
+DEF_SVE_FUNCTION (svraddhnb, binary_narrowb_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svraddhnt, binary_narrowt_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svrecpe, unary, s_unsigned, mxz)
+DEF_SVE_FUNCTION (svrhadd, binary_opt_n, all_integer, mxz)
+DEF_SVE_FUNCTION (svrsqrte, unary, s_unsigned, mxz)
+DEF_SVE_FUNCTION (svrshl, binary_int_opt_n, all_integer, mxz)
+DEF_SVE_FUNCTION (svrshr, shift_right_imm, all_integer, mxz)
+DEF_SVE_FUNCTION (svrshrnb, shift_right_imm_narrowb, hsd_integer, none)
+DEF_SVE_FUNCTION (svrshrnt, shift_right_imm_narrowt, hsd_integer, none)
+DEF_SVE_FUNCTION (svrsra, ternary_shift_right_imm, all_integer, none)
+DEF_SVE_FUNCTION (svrsubhnb, binary_narrowb_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svrsubhnt, binary_narrowt_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svsbclb, ternary_opt_n, sd_unsigned, none)
+DEF_SVE_FUNCTION (svsbclt, ternary_opt_n, sd_unsigned, none)
+DEF_SVE_FUNCTION (svshllb, shift_left_imm_long, hsd_integer, none)
+DEF_SVE_FUNCTION (svshllt, shift_left_imm_long, hsd_integer, none)
+DEF_SVE_FUNCTION (svshrnb, shift_right_imm_narrowb, hsd_integer, none)
+DEF_SVE_FUNCTION (svshrnt, shift_right_imm_narrowt, hsd_integer, none)
+DEF_SVE_FUNCTION (svsli, ternary_shift_left_imm, all_integer, none)
+DEF_SVE_FUNCTION (svsqadd, binary_int_opt_n, all_unsigned, mxz)
+DEF_SVE_FUNCTION (svsra, ternary_shift_right_imm, all_integer, none)
+DEF_SVE_FUNCTION (svsri, ternary_shift_right_imm, all_integer, none)
+DEF_SVE_FUNCTION (svstnt1_scatter, store_scatter_index_restricted, sd_data, implicit)
+DEF_SVE_FUNCTION (svstnt1_scatter, store_scatter_offset_restricted, sd_data, implicit)
+DEF_SVE_FUNCTION (svstnt1b_scatter, store_scatter_offset_restricted, sd_integer, implicit)
+DEF_SVE_FUNCTION (svstnt1h_scatter, store_scatter_index_restricted, sd_integer, implicit)
+DEF_SVE_FUNCTION (svstnt1h_scatter, store_scatter_offset_restricted, sd_integer, implicit)
+DEF_SVE_FUNCTION (svstnt1w_scatter, store_scatter_index_restricted, d_integer, implicit)
+DEF_SVE_FUNCTION (svstnt1w_scatter, store_scatter_offset_restricted, d_integer, implicit)
+DEF_SVE_FUNCTION (svsubhnb, binary_narrowb_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svsubhnt, binary_narrowt_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svsublb, binary_long_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svsublbt, binary_long_opt_n, hsd_signed, none)
+DEF_SVE_FUNCTION (svsublt, binary_long_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svsubltb, binary_long_opt_n, hsd_signed, none)
+DEF_SVE_FUNCTION (svsubwb, binary_wide_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svsubwt, binary_wide_opt_n, hsd_integer, none)
+DEF_SVE_FUNCTION (svtbl2, tbl_tuple, all_data, none)
+DEF_SVE_FUNCTION (svtbx, ternary_uint, all_data, none)
+DEF_SVE_FUNCTION (svuqadd, binary_uint_opt_n, all_signed, mxz)
+DEF_SVE_FUNCTION (svwhilege, compare_scalar, while, none)
+DEF_SVE_FUNCTION (svwhilegt, compare_scalar, while, none)
+DEF_SVE_FUNCTION (svwhilerw, compare_ptr, all_data, none)
+DEF_SVE_FUNCTION (svwhilewr, compare_ptr, all_data, none)
+DEF_SVE_FUNCTION (svxar, ternary_shift_right_imm, all_integer, none)
+#undef REQUIRED_EXTENSIONS
+
+#define REQUIRED_EXTENSIONS (AARCH64_FL_SVE2 | AARCH64_FL_SVE2_AES)
+DEF_SVE_FUNCTION (svaesd, binary, b_unsigned, none)
+DEF_SVE_FUNCTION (svaese, binary, b_unsigned, none)
+DEF_SVE_FUNCTION (svaesmc, unary, b_unsigned, none)
+DEF_SVE_FUNCTION (svaesimc, unary, b_unsigned, none)
+DEF_SVE_FUNCTION (svpmullb_pair, binary_opt_n, d_unsigned, none)
+DEF_SVE_FUNCTION (svpmullt_pair, binary_opt_n, d_unsigned, none)
+#undef REQUIRED_EXTENSIONS
+
+#define REQUIRED_EXTENSIONS (AARCH64_FL_SVE2 | AARCH64_FL_SVE2_BITPERM)
+DEF_SVE_FUNCTION (svbdep, binary_opt_n, all_unsigned, none)
+DEF_SVE_FUNCTION (svbext, binary_opt_n, all_unsigned, none)
+DEF_SVE_FUNCTION (svbgrp, binary_opt_n, all_unsigned, none)
+#undef REQUIRED_EXTENSIONS
+
+#define REQUIRED_EXTENSIONS (AARCH64_FL_SVE2 | AARCH64_FL_SVE2_SHA3)
+DEF_SVE_FUNCTION (svrax1, binary, d_integer, none)
+#undef REQUIRED_EXTENSIONS
+
+#define REQUIRED_EXTENSIONS (AARCH64_FL_SVE2 | AARCH64_FL_SVE2_SM4)
+DEF_SVE_FUNCTION (svsm4e, binary, s_unsigned, none)
+DEF_SVE_FUNCTION (svsm4ekey, binary, s_unsigned, none)
+#undef REQUIRED_EXTENSIONS
diff --git a/gcc/config/aarch64/aarch64-sve-builtins-sve2.h b/gcc/config/aarch64/aarch64-sve-builtins-sve2.h
new file mode 100644 (file)
index 0000000..90e29fc
--- /dev/null
@@ -0,0 +1,191 @@
+/* ACLE support for AArch64 SVE (__ARM_FEATURE_SVE intrinsics)
+   Copyright (C) 2020 Free Software Foundation, Inc.
+
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   GCC is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef GCC_AARCH64_SVE_BUILTINS_SVE2_H
+#define GCC_AARCH64_SVE_BUILTINS_SVE2_H
+
+namespace aarch64_sve
+{
+  namespace functions
+  {
+    extern const function_base *const svaba;
+    extern const function_base *const svabalb;
+    extern const function_base *const svabalt;
+    extern const function_base *const svabdlb;
+    extern const function_base *const svabdlt;
+    extern const function_base *const svadalp;
+    extern const function_base *const svadclb;
+    extern const function_base *const svadclt;
+    extern const function_base *const svaddhnb;
+    extern const function_base *const svaddhnt;
+    extern const function_base *const svaddlb;
+    extern const function_base *const svaddlbt;
+    extern const function_base *const svaddlt;
+    extern const function_base *const svaddp;
+    extern const function_base *const svaddwb;
+    extern const function_base *const svaddwt;
+    extern const function_base *const svaesd;
+    extern const function_base *const svaese;
+    extern const function_base *const svaesimc;
+    extern const function_base *const svaesmc;
+    extern const function_base *const svbcax;
+    extern const function_base *const svbdep;
+    extern const function_base *const svbext;
+    extern const function_base *const svbgrp;
+    extern const function_base *const svbsl;
+    extern const function_base *const svbsl1n;
+    extern const function_base *const svbsl2n;
+    extern const function_base *const svcdot;
+    extern const function_base *const svcdot_lane;
+    extern const function_base *const svcvtlt;
+    extern const function_base *const svcvtnt;
+    extern const function_base *const svcvtx;
+    extern const function_base *const svcvtxnt;
+    extern const function_base *const sveor3;
+    extern const function_base *const sveorbt;
+    extern const function_base *const sveortb;
+    extern const function_base *const svhadd;
+    extern const function_base *const svhistcnt;
+    extern const function_base *const svhistseg;
+    extern const function_base *const svhsub;
+    extern const function_base *const svhsubr;
+    extern const function_base *const svldnt1_gather;
+    extern const function_base *const svldnt1sb_gather;
+    extern const function_base *const svldnt1sh_gather;
+    extern const function_base *const svldnt1sw_gather;
+    extern const function_base *const svldnt1ub_gather;
+    extern const function_base *const svldnt1uh_gather;
+    extern const function_base *const svldnt1uw_gather;
+    extern const function_base *const svlogb;
+    extern const function_base *const svmatch;
+    extern const function_base *const svmaxp;
+    extern const function_base *const svmaxnmp;
+    extern const function_base *const svmlalb;
+    extern const function_base *const svmlalb_lane;
+    extern const function_base *const svmlalt;
+    extern const function_base *const svmlalt_lane;
+    extern const function_base *const svmlslb;
+    extern const function_base *const svmlslb_lane;
+    extern const function_base *const svmlslt;
+    extern const function_base *const svmlslt_lane;
+    extern const function_base *const svminp;
+    extern const function_base *const svminnmp;
+    extern const function_base *const svmovlb;
+    extern const function_base *const svmovlt;
+    extern const function_base *const svmullb;
+    extern const function_base *const svmullb_lane;
+    extern const function_base *const svmullt;
+    extern const function_base *const svmullt_lane;
+    extern const function_base *const svnbsl;
+    extern const function_base *const svnmatch;
+    extern const function_base *const svpmul;
+    extern const function_base *const svpmullb;
+    extern const function_base *const svpmullb_pair;
+    extern const function_base *const svpmullt;
+    extern const function_base *const svpmullt_pair;
+    extern const function_base *const svqabs;
+    extern const function_base *const svqcadd;
+    extern const function_base *const svqdmlalb;
+    extern const function_base *const svqdmlalb_lane;
+    extern const function_base *const svqdmlalbt;
+    extern const function_base *const svqdmlalt;
+    extern const function_base *const svqdmlalt_lane;
+    extern const function_base *const svqdmlslb;
+    extern const function_base *const svqdmlslb_lane;
+    extern const function_base *const svqdmlslbt;
+    extern const function_base *const svqdmlslt;
+    extern const function_base *const svqdmlslt_lane;
+    extern const function_base *const svqdmulh;
+    extern const function_base *const svqdmulh_lane;
+    extern const function_base *const svqdmullb;
+    extern const function_base *const svqdmullb_lane;
+    extern const function_base *const svqdmullt;
+    extern const function_base *const svqdmullt_lane;
+    extern const function_base *const svqneg;
+    extern const function_base *const svqrdcmlah;
+    extern const function_base *const svqrdcmlah_lane;
+    extern const function_base *const svqrdmulh;
+    extern const function_base *const svqrdmulh_lane;
+    extern const function_base *const svqrdmlah;
+    extern const function_base *const svqrdmlah_lane;
+    extern const function_base *const svqrdmlsh;
+    extern const function_base *const svqrdmlsh_lane;
+    extern const function_base *const svqrshl;
+    extern const function_base *const svqrshrnb;
+    extern const function_base *const svqrshrnt;
+    extern const function_base *const svqrshrunb;
+    extern const function_base *const svqrshrunt;
+    extern const function_base *const svqshl;
+    extern const function_base *const svqshlu;
+    extern const function_base *const svqshrnb;
+    extern const function_base *const svqshrnt;
+    extern const function_base *const svqshrunb;
+    extern const function_base *const svqshrunt;
+    extern const function_base *const svqsubr;
+    extern const function_base *const svqxtnb;
+    extern const function_base *const svqxtnt;
+    extern const function_base *const svqxtunb;
+    extern const function_base *const svqxtunt;
+    extern const function_base *const svraddhnb;
+    extern const function_base *const svraddhnt;
+    extern const function_base *const svrax1;
+    extern const function_base *const svrhadd;
+    extern const function_base *const svrshl;
+    extern const function_base *const svrshr;
+    extern const function_base *const svrshrnb;
+    extern const function_base *const svrshrnt;
+    extern const function_base *const svrsra;
+    extern const function_base *const svrsubhnb;
+    extern const function_base *const svrsubhnt;
+    extern const function_base *const svsbclb;
+    extern const function_base *const svsbclt;
+    extern const function_base *const svshllb;
+    extern const function_base *const svshllt;
+    extern const function_base *const svshrnb;
+    extern const function_base *const svshrnt;
+    extern const function_base *const svsli;
+    extern const function_base *const svsm4e;
+    extern const function_base *const svsm4ekey;
+    extern const function_base *const svsqadd;
+    extern const function_base *const svsra;
+    extern const function_base *const svsri;
+    extern const function_base *const svstnt1_scatter;
+    extern const function_base *const svstnt1b_scatter;
+    extern const function_base *const svstnt1h_scatter;
+    extern const function_base *const svstnt1w_scatter;
+    extern const function_base *const svsubhnb;
+    extern const function_base *const svsubhnt;
+    extern const function_base *const svsublb;
+    extern const function_base *const svsublbt;
+    extern const function_base *const svsublt;
+    extern const function_base *const svsubltb;
+    extern const function_base *const svsubwb;
+    extern const function_base *const svsubwt;
+    extern const function_base *const svtbl2;
+    extern const function_base *const svtbx;
+    extern const function_base *const svuqadd;
+    extern const function_base *const svwhilege;
+    extern const function_base *const svwhilegt;
+    extern const function_base *const svwhilerw;
+    extern const function_base *const svwhilewr;
+    extern const function_base *const svxar;
+  }
+}
+
+#endif
index b09067c..7aab5bd 100644 (file)
@@ -50,6 +50,7 @@
 #include "attribs.h"
 #include "aarch64-sve-builtins.h"
 #include "aarch64-sve-builtins-base.h"
+#include "aarch64-sve-builtins-sve2.h"
 #include "aarch64-sve-builtins-shapes.h"
 
 namespace aarch64_sve {
@@ -190,6 +191,24 @@ CONSTEXPR const type_suffix_info type_suffixes[NUM_TYPE_SUFFIXES + 1] = {
 #define TYPES_b(S, D) \
   S (b)
 
+/* _u8.  */
+#define TYPES_b_unsigned(S, D) \
+  S (u8)
+
+/* _s8
+   _u8.  */
+#define TYPES_b_integer(S, D) \
+  S (s8), TYPES_b_unsigned (S, D)
+
+/* _s8 _s16
+   _u8 _u16.  */
+#define TYPES_bh_integer(S, D) \
+  S (s8), S (s16), S (u8), S (u16)
+
+/* _u8 _u32.  */
+#define TYPES_bs_unsigned(S, D) \
+  S (u8), S (u32)
+
 /* _s8 _s16 _s32.  */
 #define TYPES_bhs_signed(S, D) \
   S (s8), S (s16), S (s32)
@@ -208,23 +227,64 @@ CONSTEXPR const type_suffix_info type_suffixes[NUM_TYPE_SUFFIXES + 1] = {
 #define TYPES_h_integer(S, D) \
   S (s16), S (u16)
 
+/* _s16 _s32.  */
+#define TYPES_hs_signed(S, D) \
+  S (s16), S (s32)
+
+/* _s16 _s32
+   _u16 _u32.  */
+#define TYPES_hs_integer(S, D) \
+  TYPES_hs_signed (S, D), S (u16), S (u32)
+
 /* _f16 _f32.  */
 #define TYPES_hs_float(S, D) \
   S (f16), S (f32)
 
+/* _u16 _u64.  */
+#define TYPES_hd_unsigned(S, D) \
+  S (u16), S (u64)
+
+/* _s16 _s32 _s64.  */
+#define TYPES_hsd_signed(S, D) \
+  S (s16), S (s32), S (s64)
+
 /* _s16 _s32 _s64
    _u16 _u32 _u64.  */
 #define TYPES_hsd_integer(S, D) \
-  S (s16), S (s32), S (s64), S (u16), S (u32), S (u64)
+  TYPES_hsd_signed (S, D), S (u16), S (u32), S (u64)
+
+/*      _f32
+   _s16 _s32 _s64
+   _u16 _u32 _u64.  */
+#define TYPES_s_float_hsd_integer(S, D) \
+  S (f32), TYPES_hsd_integer (S, D)
+
+/* _f32
+   _s32 _s64
+   _u32 _u64.  */
+#define TYPES_s_float_sd_integer(S, D) \
+  S (f32), TYPES_sd_integer (S, D)
+
+/* _u32.  */
+#define TYPES_s_unsigned(S, D) \
+  S (u32)
 
 /* _s32 _u32.  */
 #define TYPES_s_integer(S, D) \
-  S (s32), S (u32)
+  S (s32), TYPES_s_unsigned (S, D)
+
+/* _s32 _s64.  */
+#define TYPES_sd_signed(S, D) \
+  S (s32), S (s64)
+
+/* _u32 _u64.  */
+#define TYPES_sd_unsigned(S, D) \
+  S (u32), S (u64)
 
 /* _s32 _s64
    _u32 _u64.  */
 #define TYPES_sd_integer(S, D) \
-  S (s32), S (s64), S (u32), S (u64)
+  TYPES_sd_signed (S, D), TYPES_sd_unsigned (S, D)
 
 /* _f32 _f64
    _s32 _s64
@@ -238,10 +298,20 @@ CONSTEXPR const type_suffix_info type_suffixes[NUM_TYPE_SUFFIXES + 1] = {
 #define TYPES_all_float_and_sd_integer(S, D) \
   TYPES_all_float (S, D), TYPES_sd_integer (S, D)
 
+/* _u64.  */
+#define TYPES_d_unsigned(S, D) \
+  S (u64)
+
 /* _s64
    _u64.  */
 #define TYPES_d_integer(S, D) \
-  S (s64), S (u64)
+  S (s64), TYPES_d_unsigned (S, D)
+
+/* _f64
+   _s64
+   _u64.  */
+#define TYPES_d_data(S, D) \
+  S (f64), TYPES_d_integer (S, D)
 
 /* All the type combinations allowed by svcvt.  */
 #define TYPES_cvt(S, D) \
@@ -265,6 +335,20 @@ CONSTEXPR const type_suffix_info type_suffixes[NUM_TYPE_SUFFIXES + 1] = {
   D (u32, f16), D (u32, f32), D (u32, f64), \
   D (u64, f16), D (u64, f32), D (u64, f64)
 
+/* _f32_f16
+   _f64_f32.  */
+#define TYPES_cvt_long(S, D) \
+  D (f32, f16), D (f64, f32)
+
+/* _f16_f32.  */
+#define TYPES_cvt_narrow_s(S, D) \
+  D (f32, f64)
+
+/* _f16_f32
+   _f32_f64.  */
+#define TYPES_cvt_narrow(S, D) \
+  D (f16, f32), TYPES_cvt_narrow_s (S, D)
+
 /* { _s32 _s64 } x { _b8 _b16 _b32 _b64 }
    { _u32 _u64 }.  */
 #define TYPES_inc_dec_n1(D, A) \
@@ -334,18 +418,36 @@ DEF_SVE_TYPES_ARRAY (all_unsigned);
 DEF_SVE_TYPES_ARRAY (all_integer);
 DEF_SVE_TYPES_ARRAY (all_data);
 DEF_SVE_TYPES_ARRAY (b);
+DEF_SVE_TYPES_ARRAY (b_unsigned);
+DEF_SVE_TYPES_ARRAY (b_integer);
+DEF_SVE_TYPES_ARRAY (bh_integer);
+DEF_SVE_TYPES_ARRAY (bs_unsigned);
 DEF_SVE_TYPES_ARRAY (bhs_signed);
 DEF_SVE_TYPES_ARRAY (bhs_unsigned);
 DEF_SVE_TYPES_ARRAY (bhs_integer);
 DEF_SVE_TYPES_ARRAY (h_integer);
+DEF_SVE_TYPES_ARRAY (hs_signed);
+DEF_SVE_TYPES_ARRAY (hs_integer);
 DEF_SVE_TYPES_ARRAY (hs_float);
+DEF_SVE_TYPES_ARRAY (hd_unsigned);
+DEF_SVE_TYPES_ARRAY (hsd_signed);
 DEF_SVE_TYPES_ARRAY (hsd_integer);
+DEF_SVE_TYPES_ARRAY (s_float_hsd_integer);
+DEF_SVE_TYPES_ARRAY (s_float_sd_integer);
+DEF_SVE_TYPES_ARRAY (s_unsigned);
 DEF_SVE_TYPES_ARRAY (s_integer);
+DEF_SVE_TYPES_ARRAY (sd_signed);
+DEF_SVE_TYPES_ARRAY (sd_unsigned);
 DEF_SVE_TYPES_ARRAY (sd_integer);
 DEF_SVE_TYPES_ARRAY (sd_data);
 DEF_SVE_TYPES_ARRAY (all_float_and_sd_integer);
+DEF_SVE_TYPES_ARRAY (d_unsigned);
 DEF_SVE_TYPES_ARRAY (d_integer);
+DEF_SVE_TYPES_ARRAY (d_data);
 DEF_SVE_TYPES_ARRAY (cvt);
+DEF_SVE_TYPES_ARRAY (cvt_long);
+DEF_SVE_TYPES_ARRAY (cvt_narrow_s);
+DEF_SVE_TYPES_ARRAY (cvt_narrow);
 DEF_SVE_TYPES_ARRAY (inc_dec_n);
 DEF_SVE_TYPES_ARRAY (reinterpret);
 DEF_SVE_TYPES_ARRAY (while);
@@ -357,6 +459,12 @@ static const predication_index preds_none[] = { PRED_none, NUM_PREDS };
    explicit suffix.  */
 static const predication_index preds_implicit[] = { PRED_implicit, NUM_PREDS };
 
+/* Used by functions that allow merging and "don't care" predication,
+   but are not suitable for predicated MOVPRFX.  */
+static const predication_index preds_mx[] = {
+  PRED_m, PRED_x, NUM_PREDS
+};
+
 /* Used by functions that allow merging, zeroing and "don't care"
    predication.  */
 static const predication_index preds_mxz[] = {
@@ -854,8 +962,11 @@ function_builder::add_unique_function (const function_instance &instance,
    resolution.  REQUIRED_EXTENSIONS are the set of architecture extensions
    that the function requires.
 
-   For simplicity, deal with duplicate attempts to add the same
-   function.  */
+   For simplicity, deal with duplicate attempts to add the same function,
+   including cases in which the new function requires more features than
+   the original one did.  In that case we'll check whether the required
+   features are available as part of resolving the function to the
+   relevant unique function.  */
 void
 function_builder::add_overloaded_function (const function_instance &instance,
                                           uint64_t required_extensions)
@@ -863,7 +974,8 @@ function_builder::add_overloaded_function (const function_instance &instance,
   char *name = get_name (instance, true);
   if (registered_function **map_value = m_overload_names.get (name))
     gcc_assert ((*map_value)->instance == instance
-               && (*map_value)->required_extensions == required_extensions);
+               && ((*map_value)->required_extensions
+                   & ~required_extensions) == 0);
   else
     {
       registered_function &rfn
@@ -1079,7 +1191,7 @@ function_resolver::infer_pointer_type (unsigned int argno,
     {
       error_at (location, "passing %qT to argument %d of %qE, but %qT is not"
                " a valid SVE element type", actual, argno + 1, fndecl,
-               target);
+               build_qualified_type (target, 0));
       return NUM_TYPE_SUFFIXES;
     }
   unsigned int bits = type_suffixes[type].element_bits;
@@ -1447,6 +1559,28 @@ require_derived_vector_type (unsigned int argno,
   return false;
 }
 
+/* Require argument ARGNO to match argument FIRST_ARGNO, which was inferred
+   to be a pointer to a scalar element of type TYPE.  */
+bool
+function_resolver::require_matching_pointer_type (unsigned int argno,
+                                                 unsigned int first_argno,
+                                                 type_suffix_index type)
+{
+  type_suffix_index new_type = infer_pointer_type (argno);
+  if (new_type == NUM_TYPE_SUFFIXES)
+    return false;
+
+  if (type != new_type)
+    {
+      error_at (location, "passing %qT to argument %d of %qE, but"
+               " argument %d had type %qT", get_argument_type (argno),
+               argno + 1, fndecl, first_argno + 1,
+               get_argument_type (first_argno));
+      return false;
+    }
+  return true;
+}
+
 /* Require argument ARGNO to be a (possibly variable) scalar, using EXPECTED
    as the name of its expected type.  Return true if the argument has the
    right form, otherwise report an appropriate error.  */
@@ -1641,6 +1775,31 @@ function_resolver::resolve_sv_displacement (unsigned int argno,
       return mode;
     }
 
+  unsigned int required_bits = type_suffixes[type].element_bits;
+  if (required_bits == 32
+      && displacement_units () == UNITS_elements
+      && !lookup_form (MODE_s32index, type)
+      && !lookup_form (MODE_u32index, type))
+    {
+      if (lookup_form (MODE_u32base_index, type))
+       {
+         if (type_suffix_ids[0] == NUM_TYPE_SUFFIXES)
+           {
+             gcc_assert (!load_p);
+             error_at (location, "when storing %qT, %qE requires a vector"
+                       " base and a scalar index", get_vector_type (type),
+                       fndecl);
+           }
+         else
+           error_at (location, "%qE requires a vector base and a scalar"
+                     " index", fndecl);
+       }
+      else
+       error_at (location, "%qE does not support 32-bit vector type %qT",
+                 fndecl, get_vector_type (type));
+      return MODE_none;
+    }
+
   /* Check for some form of vector type, without naming any in particular
      as being expected.  */
   type_suffix_index displacement_type = infer_vector_type (argno);
@@ -1650,7 +1809,6 @@ function_resolver::resolve_sv_displacement (unsigned int argno,
   /* If the displacement type is consistent with the data vector type,
      try to find the associated mode suffix.  This will fall through
      for non-integral displacement types.  */
-  unsigned int required_bits = type_suffixes[type].element_bits;
   if (type_suffixes[displacement_type].element_bits == required_bits)
     {
       vector_type_index displacement_vector_type
@@ -1659,7 +1817,21 @@ function_resolver::resolve_sv_displacement (unsigned int argno,
                                                 displacement_vector_type,
                                                 displacement_units ());
       if (mode != MODE_none)
-       return mode;
+       {
+         if (mode == MODE_s32offset
+             && !lookup_form (mode, type)
+             && lookup_form (MODE_u32offset, type))
+           {
+             if (type_suffix_ids[0] == NUM_TYPE_SUFFIXES)
+               error_at (location, "%qE does not support 32-bit sign-extended"
+                         " offsets", fndecl);
+             else
+               error_at (location, "%qE does not support sign-extended"
+                         " offsets", fndecl);
+             return MODE_none;
+           }
+         return mode;
+       }
     }
 
   if (type_suffix_ids[0] == NUM_TYPE_SUFFIXES)
@@ -1873,11 +2045,12 @@ function_resolver::check_gp_argument (unsigned int nops,
    in the latter case.  This "_n" form might only exist for certain
    type suffixes.
 
-   ARGNO is the index of the final argument.  The inferred type
-   suffix is FIRST_TYPE, which was obtained from argument FIRST_ARGNO.
+   ARGNO is the index of the final argument.  The inferred type suffix
+   was obtained from argument FIRST_ARGNO, which has type FIRST_TYPE.
    EXPECTED_TCLASS and EXPECTED_BITS describe the expected properties
    of the final vector or scalar argument, in the same way as for
-   require_derived_vector_type.
+   require_derived_vector_type.  INFERRED_TYPE is the inferred type
+   suffix itself, or NUM_TYPE_SUFFIXES if it's the same as FIRST_TYPE.
 
    Return the function decl of the resolved function on success,
    otherwise report a suitable error and return error_mark_node.  */
@@ -1885,9 +2058,12 @@ tree function_resolver::
 finish_opt_n_resolution (unsigned int argno, unsigned int first_argno,
                         type_suffix_index first_type,
                         type_class_index expected_tclass,
-                        unsigned int expected_bits)
+                        unsigned int expected_bits,
+                        type_suffix_index inferred_type)
 {
-  tree scalar_form = lookup_form (MODE_n, first_type);
+  if (inferred_type == NUM_TYPE_SUFFIXES)
+    inferred_type = first_type;
+  tree scalar_form = lookup_form (MODE_n, inferred_type);
 
   /* Allow the final argument to be scalar, if an _n form exists.  */
   if (scalar_argument_p (argno))
@@ -1897,7 +2073,7 @@ finish_opt_n_resolution (unsigned int argno, unsigned int first_argno,
 
       /* Check the vector form normally.  If that succeeds, raise an
         error about having no corresponding _n form.  */
-      tree res = resolve_to (mode_suffix_id, first_type);
+      tree res = resolve_to (mode_suffix_id, inferred_type);
       if (res != error_mark_node)
        error_at (location, "passing %qT to argument %d of %qE, but its"
                  " %qT form does not accept scalars",
@@ -1917,13 +2093,14 @@ finish_opt_n_resolution (unsigned int argno, unsigned int first_argno,
                                    expected_tclass, expected_bits))
     return error_mark_node;
 
-  return resolve_to (mode_suffix_id, first_type);
+  return resolve_to (mode_suffix_id, inferred_type);
 }
 
 /* Resolve a (possibly predicated) unary function.  If the function uses
-   merge predication, there is an extra vector argument before the
-   governing predicate that specifies the values of inactive elements.
-   This argument has the following properties:
+   merge predication or if TREAT_AS_MERGE_P is true, there is an extra
+   vector argument before the governing predicate that specifies the
+   values of inactive elements.  This argument has the following
+   properties:
 
    - the type class must be the same as for active elements if MERGE_TCLASS
      is SAME_TYPE_CLASS, otherwise it must be MERGE_TCLASS itself.
@@ -1935,10 +2112,11 @@ finish_opt_n_resolution (unsigned int argno, unsigned int first_argno,
    otherwise report a suitable error and return error_mark_node.  */
 tree
 function_resolver::resolve_unary (type_class_index merge_tclass,
-                                 unsigned int merge_bits)
+                                 unsigned int merge_bits,
+                                 bool treat_as_merge_p)
 {
   type_suffix_index type;
-  if (pred == PRED_m)
+  if (pred == PRED_m || treat_as_merge_p)
     {
       if (!check_num_arguments (3))
        return error_mark_node;
@@ -2302,6 +2480,19 @@ gimple_folder::load_store_cookie (tree type)
   return build_int_cst (build_pointer_type (type), TYPE_ALIGN_UNIT (type));
 }
 
+/* Fold the call to a call to INSTANCE, with the same arguments.  */
+gimple *
+gimple_folder::redirect_call (const function_instance &instance)
+{
+  registered_function *rfn
+    = function_table->find_with_hash (instance, instance.hash ());
+  if (!rfn)
+    return NULL;
+
+  gimple_call_set_fndecl (call, rfn->decl);
+  return call;
+}
+
 /* Fold the call to a PTRUE, taking the element size from type suffix 0.  */
 gimple *
 gimple_folder::fold_to_ptrue ()
@@ -2584,14 +2775,22 @@ function_expander::generate_insn (insn_code icode)
 
    - a scalar base
    - a vector displacement
+
+   If SCALED_P is true, it also expects:
+
    - a const_int that is 1 if the displacement is zero-extended from 32 bits
-   - a scaling multiplier (1 for bytes, 2 for .h indices, etc.).  */
+   - a scaling multiplier (1 for bytes, 2 for .h indices, etc.).
+
+   If SCALED_P is false, the displacement is implicitly zero-extended
+   and the scaling multiplier is implicitly 1.  */
 void
-function_expander::prepare_gather_address_operands (unsigned int argno)
+function_expander::prepare_gather_address_operands (unsigned int argno,
+                                                   bool scaled_p)
 {
   machine_mode mem_mode = memory_vector_mode ();
   tree vector_type = base_vector_type ();
   units_index units = displacement_units ();
+  int shift_idx = -1;
   if (units == UNITS_none)
     {
       /* Vector base, no displacement.  Convert to an integer zero base
@@ -2605,31 +2804,45 @@ function_expander::prepare_gather_address_operands (unsigned int argno)
         a vector byte offset.  */
       std::swap (args[argno], args[argno + 1]);
       if (units == UNITS_elements)
-       {
-         /* Convert the original scalar array index to a byte offset.  */
-         rtx size = gen_int_mode (GET_MODE_UNIT_SIZE (mem_mode), DImode);
-         args[argno] = simplify_gen_binary (MULT, DImode, args[argno], size);
-         units = UNITS_bytes;
-       }
+       shift_idx = argno;
     }
   else
     {
-      /* Scalar base, vector displacement.  This is what the md pattern wants,
-        so we just need to make sure that the scalar base has DImode.  */
+      /* Scalar base, vector displacement.  This is the order that the md
+        pattern wants.  */
       if (Pmode == SImode)
        args[argno] = simplify_gen_unary (ZERO_EXTEND, DImode,
                                          args[argno], SImode);
       vector_type = displacement_vector_type ();
+      if (units == UNITS_elements && !scaled_p)
+       shift_idx = argno + 1;
     }
   tree scalar_displacement_type = TREE_TYPE (vector_type);
 
-  bool uxtw_p = (TYPE_PRECISION (scalar_displacement_type) < 64
-                && TYPE_UNSIGNED (scalar_displacement_type));
+  if (shift_idx >= 0)
+    {
+      machine_mode arg_mode = GET_MODE (args[shift_idx]);
+      if (arg_mode == VOIDmode)
+       arg_mode = DImode;
+      unsigned int elt_bytes = GET_MODE_UNIT_SIZE (mem_mode);
+      rtx shift = gen_int_mode (exact_log2 (elt_bytes), DImode);
+      args[shift_idx] = simplify_gen_binary (ASHIFT, arg_mode,
+                                            args[shift_idx], shift);
+      units = UNITS_bytes;
+    }
+
+  bool uxtw_p = (TYPE_PRECISION (scalar_displacement_type) == 64
+                || TYPE_UNSIGNED (scalar_displacement_type));
   unsigned int scale = (units == UNITS_bytes
                        ? 1 : GET_MODE_UNIT_SIZE (mem_mode));
 
-  args.quick_insert (argno + 2, GEN_INT (uxtw_p));
-  args.quick_insert (argno + 3, GEN_INT (scale));
+  if (scaled_p)
+    {
+      args.quick_insert (argno + 2, GEN_INT (uxtw_p));
+      args.quick_insert (argno + 3, GEN_INT (scale));
+    }
+  else
+    gcc_assert (uxtw_p && scale == 1);
 }
 
 /* The final argument is an immediate svprfop value.  Add two fake arguments
@@ -2969,7 +3182,11 @@ function_expander::map_to_unspecs (int unspec_for_sint, int unspec_for_uint,
     }
 
   if (pred == PRED_none || pred == PRED_x)
-    return use_unpred_insn (code_for_aarch64_sve (unspec, mode));
+    {
+      insn_code icode = maybe_code_for_aarch64_sve (unspec, mode);
+      if (icode != CODE_FOR_nothing)
+       return use_unpred_insn (icode);
+    }
 
   insn_code icode = code_for_cond (unspec, vector_mode (0));
   return use_cond_insn (icode, merge_argno);
index 9731a22..040f1d8 100644 (file)
@@ -91,6 +91,7 @@ DEF_SVE_TYPE_SUFFIX (u32, svuint32_t, unsigned, 32, VNx4SImode)
 DEF_SVE_TYPE_SUFFIX (u64, svuint64_t, unsigned, 64, VNx2DImode)
 
 #include "aarch64-sve-builtins-base.def"
+#include "aarch64-sve-builtins-sve2.def"
 
 #undef DEF_SVE_FUNCTION
 #undef DEF_SVE_TYPE_SUFFIX
index 7d07c10..f307233 100644 (file)
@@ -416,6 +416,8 @@ public:
                                             type_suffix_index);
   bool require_derived_scalar_type (unsigned int, type_class_index,
                                    unsigned int = SAME_SIZE);
+  bool require_matching_pointer_type (unsigned int, unsigned int,
+                                     type_suffix_index);
   bool require_integer_immediate (unsigned int);
 
   vector_type_index infer_vector_base_type (unsigned int);
@@ -430,12 +432,13 @@ public:
   bool check_num_arguments (unsigned int);
   bool check_gp_argument (unsigned int, unsigned int &, unsigned int &);
   tree resolve_unary (type_class_index = SAME_TYPE_CLASS,
-                     unsigned int = SAME_SIZE);
+                     unsigned int = SAME_SIZE, bool = false);
   tree resolve_uniform (unsigned int, unsigned int = 0);
   tree resolve_uniform_opt_n (unsigned int);
   tree finish_opt_n_resolution (unsigned int, unsigned int, type_suffix_index,
                                type_class_index = SAME_TYPE_CLASS,
-                               unsigned int = SAME_SIZE);
+                               unsigned int = SAME_SIZE,
+                               type_suffix_index = NUM_TYPE_SUFFIXES);
 
   tree resolve ();
 
@@ -493,6 +496,7 @@ public:
   tree fold_contiguous_base (gimple_seq &, tree);
   tree load_store_cookie (tree);
 
+  gimple *redirect_call (const function_instance &);
   gimple *fold_to_pfalse ();
   gimple *fold_to_ptrue ();
   gimple *fold_to_vl_pred (unsigned int);
@@ -536,7 +540,7 @@ public:
   void add_fixed_operand (rtx);
   rtx generate_insn (insn_code);
 
-  void prepare_gather_address_operands (unsigned int);
+  void prepare_gather_address_operands (unsigned int, bool = true);
   void prepare_prefetch_operands ();
   void add_ptrue_hint (unsigned int, machine_mode);
   void rotate_inputs_left (unsigned int, unsigned int);
index fcb674f..22eda93 100644 (file)
 ;; - ORR    (merging form only)
 ;; - SMAX
 ;; - SMIN
+;; - SQADD  (SVE2 merging form only)
+;; - SQSUB  (SVE2 merging form only)
 ;; - SUB    (merging form only)
 ;; - UMAX
 ;; - UMIN
+;; - UQADD  (SVE2 merging form only)
+;; - UQSUB  (SVE2 merging form only)
 ;; -------------------------------------------------------------------------
 
 ;; Unpredicated integer binary operations that have an immediate form.
 ;; -------------------------------------------------------------------------
 ;; Includes:
 ;; - ASRD
+;; - SQSHLU (SVE2)
+;; - SRSHR (SVE2)
+;; - URSHR (SVE2)
 ;; -------------------------------------------------------------------------
 
-;; Unpredicated ASRD.
+;; Unpredicated <SVE_INT_OP>.
 (define_expand "sdiv_pow2<mode>3"
   [(set (match_operand:SVE_FULL_I 0 "register_operand")
        (unspec:SVE_FULL_I
   }
 )
 
-;; Predicated ASRD with merging.
-(define_expand "@cond_asrd<mode>"
+;; Predicated right shift with merging.
+(define_expand "@cond_<sve_int_op><mode>"
   [(set (match_operand:SVE_FULL_I 0 "register_operand")
        (unspec:SVE_FULL_I
          [(match_operand:<VPRED> 1 "register_operand")
           (unspec:SVE_FULL_I
             [(match_operand:SVE_FULL_I 2 "register_operand")
-             (match_operand:SVE_FULL_I 3 "aarch64_simd_rshift_imm")]
-            UNSPEC_ASRD)
+             (match_operand:SVE_FULL_I 3 "aarch64_simd_<lr>shift_imm")]
+            SVE_INT_SHIFT_IMM)
           (match_operand:SVE_FULL_I 4 "aarch64_simd_reg_or_zero")]
          UNSPEC_SEL))]
   "TARGET_SVE"
 )
 
-;; Predicated ASRD, merging with the first input.
-(define_insn "*cond_asrd<mode>_2"
+;; Predicated right shift, merging with the first input.
+(define_insn "*cond_<sve_int_op><mode>_2"
   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
        (unspec:SVE_FULL_I
          [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
           (unspec:SVE_FULL_I
             [(match_operand:SVE_FULL_I 2 "register_operand" "0, w")
-             (match_operand:SVE_FULL_I 3 "aarch64_simd_rshift_imm")]
-            UNSPEC_ASRD)
+             (match_operand:SVE_FULL_I 3 "aarch64_simd_<lr>shift_imm")]
+            SVE_INT_SHIFT_IMM)
           (match_dup 2)]
          UNSPEC_SEL))]
   "TARGET_SVE"
   "@
-   asrd\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
-   movprfx\t%0, %2\;asrd\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3"
+   <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
+   movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3"
   [(set_attr "movprfx" "*,yes")])
 
-;; Predicated ASRD, merging with zero.
-(define_insn "*cond_asrd<mode>_z"
+;; Predicated right shift, merging with zero.
+(define_insn "*cond_<sve_int_op><mode>_z"
   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w")
        (unspec:SVE_FULL_I
          [(match_operand:<VPRED> 1 "register_operand" "Upl")
           (unspec:SVE_FULL_I
             [(match_operand:SVE_FULL_I 2 "register_operand" "w")
-             (match_operand:SVE_FULL_I 3 "aarch64_simd_rshift_imm")]
-            UNSPEC_ASRD)
+             (match_operand:SVE_FULL_I 3 "aarch64_simd_<lr>shift_imm")]
+            SVE_INT_SHIFT_IMM)
           (match_operand:SVE_FULL_I 4 "aarch64_simd_imm_zero")]
          UNSPEC_SEL))]
   "TARGET_SVE"
-  "movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;asrd\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3"
+  "movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3"
   [(set_attr "movprfx" "yes")])
 
 ;; -------------------------------------------------------------------------
 ;; ---- [INT] While tests
 ;; -------------------------------------------------------------------------
 ;; Includes:
+;; - WHILEGE (SVE2)
+;; - WHILEGT (SVE2)
+;; - WHILEHI (SVE2)
+;; - WHILEHS (SVE2)
 ;; - WHILELE
 ;; - WHILELO
 ;; - WHILELS
index 1b2b6b2..eaded5d 100644 (file)
 ;; The file is organised into the following sections (search for the full
 ;; line):
 ;;
+;; == Moves
+;; ---- Non-temporal gather loads
+;; ---- Non-temporal scatter stores
+;;
 ;; == Uniform binary arithmnetic
+;; ---- [INT] Multiplication
 ;; ---- [INT] Scaled high-part multiplication
 ;; ---- [INT] General binary arithmetic that maps to unspecs
+;; ---- [INT] Saturating binary arithmetic
+;; ---- [INT] Saturating left shifts
 ;;
 ;; == Uniform ternary arithmnetic
+;; ---- [INT] General ternary arithmetic that maps to unspecs
+;; ---- [INT] Multiply-and-accumulate operations
+;; ---- [INT] Binary logic operations with rotation
 ;; ---- [INT] Ternary logic operations
 ;; ---- [INT] Shift-and-accumulate operations
+;; ---- [INT] Shift-and-insert operations
+;; ---- [INT] Sum of absolute differences
 ;;
 ;; == Extending arithmetic
+;; ---- [INT] Wide binary arithmetic
 ;; ---- [INT] Long binary arithmetic
+;; ---- [INT] Long left shifts
+;; ---- [INT] Long binary arithmetic with accumulation
+;; ---- [FP] Long multiplication with accumulation
 ;;
 ;; == Narrowing arithnetic
+;; ---- [INT] Narrowing unary arithmetic
+;; ---- [INT] Narrowing binary arithmetic
 ;; ---- [INT] Narrowing right shifts
 ;;
+;; == Pairwise arithmetic
+;; ---- [INT] Pairwise arithmetic
+;; ---- [FP] Pairwise arithmetic
+;; ---- [INT] Pairwise arithmetic with accumulation
+;;
+;; == Complex arithmetic
+;; ---- [INT] Complex binary operations
+;; ---- [INT] Complex ternary operations
+;; ---- [INT] Complex dot product
+;;
+;; == Conversions
+;; ---- [FP<-FP] Widening conversions
+;; ---- [FP<-FP] Narrowing conversions
+;;
+;; == Other arithmetic
+;; ---- [INT] Reciprocal approximation
+;; ---- [INT<-FP] Base-2 logarithm
+;; ---- [INT] Polynomial multiplication
+;;
+;; == Permutation
+;; ---- [INT,FP] General permutes
+;; ---- [INT] Optional bit-permute extensions
+;;
 ;; == General
 ;; ---- Check for aliases between pointers
+;; ---- Histogram processing
+;; ---- String matching
+;;
+;; == Crypotographic extensions
+;; ---- Optional AES extensions
+;; ---- Optional SHA-3 extensions
+;; ---- Optional SM4 extensions
+
+;; =========================================================================
+;; == Moves
+;; =========================================================================
+
+;; -------------------------------------------------------------------------
+;; ---- Non-temporal gather loads
+;; -------------------------------------------------------------------------
+;; Includes gather forms of:
+;; - LDNT1B
+;; - LDNT1D
+;; - LDNT1H
+;; - LDNT1W
+;; -------------------------------------------------------------------------
+
+;; Non-extending loads.
+(define_insn "@aarch64_gather_ldnt<mode>"
+  [(set (match_operand:SVE_FULL_SD 0 "register_operand" "=w, w")
+       (unspec:SVE_FULL_SD
+         [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
+          (match_operand:DI 2 "aarch64_reg_or_zero" "Z, r")
+          (match_operand:<V_INT_EQUIV> 3 "register_operand" "w, w")
+          (mem:BLK (scratch))]
+         UNSPEC_LDNT1_GATHER))]
+  "TARGET_SVE2"
+  "@
+   ldnt1<Vesize>\t%0.<Vetype>, %1/z, [%3.<Vetype>]
+   ldnt1<Vesize>\t%0.<Vetype>, %1/z, [%3.<Vetype>, %2]"
+)
+
+;; Extending loads.
+(define_insn_and_rewrite "@aarch64_gather_ldnt_<ANY_EXTEND:optab><SVE_FULL_SDI:mode><SVE_PARTIAL_I:mode>"
+  [(set (match_operand:SVE_FULL_SDI 0 "register_operand" "=w, w")
+       (unspec:SVE_FULL_SDI
+         [(match_operand:<SVE_FULL_SDI:VPRED> 4 "general_operand" "UplDnm, UplDnm")
+          (ANY_EXTEND:SVE_FULL_SDI
+            (unspec:SVE_PARTIAL_I
+              [(match_operand:<SVE_FULL_SDI:VPRED> 1 "register_operand" "Upl, Upl")
+               (match_operand:DI 2 "aarch64_reg_or_zero" "Z, r")
+               (match_operand:<SVE_FULL_SDI:V_INT_EQUIV> 3 "register_operand" "w, w")
+               (mem:BLK (scratch))]
+              UNSPEC_LDNT1_GATHER))]
+         UNSPEC_PRED_X))]
+  "TARGET_SVE2
+   && (~<SVE_FULL_SDI:narrower_mask> & <SVE_PARTIAL_I:self_mask>) == 0"
+  "@
+   ldnt1<ANY_EXTEND:s><SVE_PARTIAL_I:Vesize>\t%0.<SVE_FULL_SDI:Vetype>, %1/z, [%3.<SVE_FULL_SDI:Vetype>]
+   ldnt1<ANY_EXTEND:s><SVE_PARTIAL_I:Vesize>\t%0.<SVE_FULL_SDI:Vetype>, %1/z, [%3.<SVE_FULL_SDI:Vetype>, %2]"
+  "&& !CONSTANT_P (operands[4])"
+  {
+    operands[4] = CONSTM1_RTX (<SVE_FULL_SDI:VPRED>mode);
+  }
+)
+
+;; -------------------------------------------------------------------------
+;; ---- Non-temporal scatter stores
+;; -------------------------------------------------------------------------
+;; Includes scatter forms of:
+;; - STNT1B
+;; - STNT1D
+;; - STNT1H
+;; - STNT1W
+;; -------------------------------------------------------------------------
+
+;; Non-truncating stores.
+(define_insn "@aarch64_scatter_stnt<mode>"
+  [(set (mem:BLK (scratch))
+       (unspec:BLK
+         [(match_operand:<VPRED> 0 "register_operand" "Upl, Upl")
+          (match_operand:DI 1 "aarch64_reg_or_zero" "Z, r")
+          (match_operand:<V_INT_EQUIV> 2 "register_operand" "w, w")
+          (match_operand:SVE_FULL_SD 3 "register_operand" "w, w")]
+
+         UNSPEC_STNT1_SCATTER))]
+  "TARGET_SVE"
+  "@
+   stnt1<Vesize>\t%3.<Vetype>, %0, [%2.<Vetype>]
+   stnt1<Vesize>\t%3.<Vetype>, %0, [%2.<Vetype>, %1]"
+)
+
+;; Truncating stores.
+(define_insn "@aarch64_scatter_stnt_<SVE_FULL_SDI:mode><SVE_PARTIAL_I:mode>"
+  [(set (mem:BLK (scratch))
+       (unspec:BLK
+         [(match_operand:<SVE_FULL_SDI:VPRED> 0 "register_operand" "Upl, Upl")
+          (match_operand:DI 1 "aarch64_reg_or_zero" "Z, r")
+          (match_operand:<SVE_FULL_SDI:V_INT_EQUIV> 2 "register_operand" "w, w")
+          (truncate:SVE_PARTIAL_I
+            (match_operand:SVE_FULL_SDI 3 "register_operand" "w, w"))]
+         UNSPEC_STNT1_SCATTER))]
+  "TARGET_SVE2
+   && (~<SVE_FULL_SDI:narrower_mask> & <SVE_PARTIAL_I:self_mask>) == 0"
+  "@
+   stnt1<SVE_PARTIAL_I:Vesize>\t%3.<SVE_FULL_SDI:Vetype>, %0, [%2.<SVE_FULL_SDI:Vetype>]
+   stnt1<SVE_PARTIAL_I:Vesize>\t%3.<SVE_FULL_SDI:Vetype>, %0, [%2.<SVE_FULL_SDI:Vetype>, %1]"
+)
 
 ;; =========================================================================
 ;; == Uniform binary arithmnetic
 ;; =========================================================================
 
 ;; -------------------------------------------------------------------------
+;; ---- [INT] Multiplication
+;; -------------------------------------------------------------------------
+;; Includes the lane forms of:
+;; - MUL
+;; -------------------------------------------------------------------------
+
+(define_insn "@aarch64_mul_lane_<mode>"
+  [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w")
+       (mult:SVE_FULL_HSDI
+         (unspec:SVE_FULL_HSDI
+           [(match_operand:SVE_FULL_HSDI 2 "register_operand" "<sve_lane_con>")
+            (match_operand:SI 3 "const_int_operand")]
+           UNSPEC_SVE_LANE_SELECT)
+         (match_operand:SVE_FULL_HSDI 1 "register_operand" "w")))]
+  "TARGET_SVE2"
+  "mul\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>[%3]"
+)
+
+;; -------------------------------------------------------------------------
 ;; ---- [INT] Scaled high-part multiplication
 ;; -------------------------------------------------------------------------
 ;; The patterns in this section are synthetic.
 
     rtx prod_b = gen_reg_rtx (<VWIDE>mode);
     rtx prod_t = gen_reg_rtx (<VWIDE>mode);
-    emit_insn (gen_<su>mullb<Vwide> (prod_b, operands[1], operands[2]));
-    emit_insn (gen_<su>mullt<Vwide> (prod_t, operands[1], operands[2]));
+    emit_insn (gen_aarch64_sve_<su>mullb<Vwide> (prod_b, operands[1],
+                                                operands[2]));
+    emit_insn (gen_aarch64_sve_<su>mullt<Vwide> (prod_t, operands[1],
+                                                operands[2]));
 
     rtx shift = GEN_INT (GET_MODE_UNIT_BITSIZE (<MODE>mode) - 1);
-    emit_insn (gen_<r>shrnb<mode> (operands[0], prod_b, shift));
-    emit_insn (gen_<r>shrnt<mode> (operands[0], operands[0], prod_t, shift));
+    emit_insn (gen_aarch64_sve_<r>shrnb<Vwide> (operands[0], prod_b, shift));
+    emit_insn (gen_aarch64_sve_<r>shrnt<Vwide> (operands[0], operands[0],
+                                               prod_t, shift));
 
     DONE;
   }
 ;; Includes:
 ;; - SHADD
 ;; - SHSUB
+;; - SHSUBR
+;; - SQRSHL
+;; - SQRSHLR
 ;; - SRHADD
+;; - SRSHL
+;; - SRSHLR
+;; - SUQADD
 ;; - UHADD
 ;; - UHSUB
+;; - UHSUBR
+;; - UQRSHL
+;; - UQRSHLR
 ;; - URHADD
+;; - URSHL
+;; - URSHLR
+;; - USQADD
 ;; -------------------------------------------------------------------------
 
 ;; Integer average (floor).
   }
 )
 
-;; Predicated halving addsub.
-(define_insn "*<sur>h<addsub><mode>"
+;; The immediate form of SQADD acts as an immediate form of SUQADD
+;; over its full range.  In contrast to the ss_plus pattern, we do
+;; not need to treat byte immediates specially.  E.g.:
+;;
+;;     SQADD   Z0.B, Z0.B, #128
+;;
+;; is equivalent to:
+;;
+;;     MOV     Z1.B, #128
+;;     SUQADD  Z0.B, P0/M, Z0.B, Z1.B
+;;
+;; even though it's not equivalent to:
+;;
+;;     MOV     Z1.B, #128
+;;     SQADD   Z0.B, P0/M, Z0.B, Z1.B  // Saturating subtraction of 128
+(define_insn "@aarch64_sve_suqadd<mode>_const"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
+       (unspec:SVE_FULL_I
+         [(match_operand:SVE_FULL_I 1 "register_operand" "0, w")
+          (match_operand:SVE_FULL_I 2 "aarch64_sve_arith_immediate")]
+         UNSPEC_SUQADD))]
+  "TARGET_SVE2"
+  "@
+   sqadd\t%0.<Vetype>, %0.<Vetype>, #%D2
+   movprfx\t%0, %1\;sqadd\t%0.<Vetype>, %0.<Vetype>, #%D2"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; General predicated binary arithmetic.  All operations handled here
+;; are commutative or have a reversed form.
+(define_insn "@aarch64_pred_<sve_int_op><mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, w, ?&w")
+       (unspec:SVE_FULL_I
+         [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl, Upl")
+          (unspec:SVE_FULL_I
+            [(match_operand:SVE_FULL_I 2 "register_operand" "0, w, w")
+             (match_operand:SVE_FULL_I 3 "register_operand" "w, 0, w")]
+            SVE2_COND_INT_BINARY_REV)]
+         UNSPEC_PRED_X))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
+   <sve_int_op_rev>\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>
+   movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
+  [(set_attr "movprfx" "*,*,yes")]
+)
+
+;; Predicated binary arithmetic with merging.
+(define_expand "@cond_<sve_int_op><mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand")
+       (unspec:SVE_FULL_I
+         [(match_operand:<VPRED> 1 "register_operand")
+          (unspec:SVE_FULL_I
+            [(match_dup 5)
+             (unspec:SVE_FULL_I
+               [(match_operand:SVE_FULL_I 2 "register_operand")
+                (match_operand:SVE_FULL_I 3 "register_operand")]
+               SVE2_COND_INT_BINARY)]
+            UNSPEC_PRED_X)
+          (match_operand:SVE_FULL_I 4 "aarch64_simd_reg_or_zero")]
+         UNSPEC_SEL))]
+  "TARGET_SVE2"
+  {
+    operands[5] = CONSTM1_RTX (<MODE>mode);
+  }
+)
+
+;; Predicated binary arithmetic, merging with the first input.
+(define_insn_and_rewrite "*cond_<sve_int_op><mode>_2"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
+       (unspec:SVE_FULL_I
+         [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
+          (unspec:SVE_FULL_I
+            [(match_operand 4)
+             (unspec:SVE_FULL_I
+               [(match_operand:SVE_FULL_I 2 "register_operand" "0, w")
+                (match_operand:SVE_FULL_I 3 "register_operand" "w, w")]
+               SVE2_COND_INT_BINARY)]
+            UNSPEC_PRED_X)
+          (match_dup 2)]
+         UNSPEC_SEL))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
+   movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
+  "&& !CONSTANT_P (operands[4])"
+  {
+    operands[4] = CONSTM1_RTX (<VPRED>mode);
+  }
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; Predicated binary arithmetic, merging with the second input.
+(define_insn_and_rewrite "*cond_<sve_int_op><mode>_3"
   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
        (unspec:SVE_FULL_I
          [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
           (unspec:SVE_FULL_I
-            [(match_operand:SVE_FULL_I 2 "register_operand" "%0, w")
-             (match_operand:SVE_FULL_I 3 "register_operand" "w, w")]
-            HADDSUB)]
+            [(match_operand 4)
+             (unspec:SVE_FULL_I
+               [(match_operand:SVE_FULL_I 2 "register_operand" "w, w")
+                (match_operand:SVE_FULL_I 3 "register_operand" "0, w")]
+               SVE2_COND_INT_BINARY_REV)]
+            UNSPEC_PRED_X)
+          (match_dup 3)]
+         UNSPEC_SEL))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_op_rev>\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>
+   movprfx\t%0, %3\;<sve_int_op_rev>\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>"
+  "&& !CONSTANT_P (operands[4])"
+  {
+    operands[4] = CONSTM1_RTX (<VPRED>mode);
+  }
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; Predicated binary operations, merging with an independent value.
+(define_insn_and_rewrite "*cond_<sve_int_op><mode>_any"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=&w, &w, &w, &w, ?&w")
+       (unspec:SVE_FULL_I
+         [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl, Upl, Upl, Upl")
+          (unspec:SVE_FULL_I
+            [(match_operand 5)
+             (unspec:SVE_FULL_I
+               [(match_operand:SVE_FULL_I 2 "register_operand" "0, w, w, w, w")
+                (match_operand:SVE_FULL_I 3 "register_operand" "w, 0, w, w, w")]
+               SVE2_COND_INT_BINARY_REV)]
+            UNSPEC_PRED_X)
+          (match_operand:SVE_FULL_I 4 "aarch64_simd_reg_or_zero" "Dz, Dz, Dz, 0, w")]
+         UNSPEC_SEL))]
+  "TARGET_SVE2
+   && !rtx_equal_p (operands[2], operands[4])
+   && !rtx_equal_p (operands[3], operands[4])"
+  "@
+   movprfx\t%0.<Vetype>, %1/z, %0.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
+   movprfx\t%0.<Vetype>, %1/z, %0.<Vetype>\;<sve_int_op_rev>\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>
+   movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
+   movprfx\t%0.<Vetype>, %1/m, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
+   #"
+  "&& 1"
+  {
+    if (reload_completed
+        && register_operand (operands[4], <MODE>mode)
+        && !rtx_equal_p (operands[0], operands[4]))
+      {
+       emit_insn (gen_vcond_mask_<mode><vpred> (operands[0], operands[2],
+                                                operands[4], operands[1]));
+       operands[4] = operands[2] = operands[0];
+      }
+    else if (!CONSTANT_P (operands[5]))
+      operands[5] = CONSTM1_RTX (<VPRED>mode);
+    else
+      FAIL;
+  }
+  [(set_attr "movprfx" "yes")]
+)
+
+;; Predicated binary operations with no reverse form, merging with zero.
+;; At present we don't generate these patterns via a cond_* optab,
+;; so there's no correctness requirement to handle merging with an
+;; independent value.
+(define_insn_and_rewrite "*cond_<sve_int_op><mode>_z"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=&w, &w")
+       (unspec:SVE_FULL_I
+         [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
+          (unspec:SVE_FULL_I
+            [(match_operand 5)
+             (unspec:SVE_FULL_I
+               [(match_operand:SVE_FULL_I 2 "register_operand" "0, w")
+                (match_operand:SVE_FULL_I 3 "register_operand" "w, w")]
+               SVE2_COND_INT_BINARY_NOREV)]
+            UNSPEC_PRED_X)
+          (match_operand:SVE_FULL_I 4 "aarch64_simd_imm_zero")]
+         UNSPEC_SEL))]
+  "TARGET_SVE2"
+  "@
+   movprfx\t%0.<Vetype>, %1/z, %0.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
+   movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
+  "&& !CONSTANT_P (operands[5])"
+  {
+    operands[5] = CONSTM1_RTX (<VPRED>mode);
+  }
+  [(set_attr "movprfx" "yes")]
+)
+
+;; -------------------------------------------------------------------------
+;; ---- [INT] Saturating binary arithmetic
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - SQDMULH
+;; - SQRDMULH
+;; -------------------------------------------------------------------------
+
+(define_insn "@aarch64_sve_<sve_int_op><mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w")
+       (unspec:SVE_FULL_I
+         [(match_operand:SVE_FULL_I 1 "register_operand" "w")
+          (match_operand:SVE_FULL_I 2 "register_operand" "w")]
+         SVE2_INT_BINARY))]
+  "TARGET_SVE2"
+  "<sve_int_op>\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>"
+)
+
+(define_insn "@aarch64_sve_<sve_int_op>_lane_<mode>"
+  [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w")
+       (unspec:SVE_FULL_HSDI
+         [(match_operand:SVE_FULL_HSDI 1 "register_operand" "w")
+          (unspec:SVE_FULL_HSDI
+            [(match_operand:SVE_FULL_HSDI 2 "register_operand" "<sve_lane_con>")
+             (match_operand:SI 3 "const_int_operand")]
+            UNSPEC_SVE_LANE_SELECT)]
+         SVE2_INT_BINARY_LANE))]
+  "TARGET_SVE2"
+  "<sve_int_op>\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>[%3]"
+)
+
+;; -------------------------------------------------------------------------
+;; ---- [INT] Saturating left shifts
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - SQSHL
+;; - SQSHLR
+;; - UQSHL
+;; - UQSHLR
+;; -------------------------------------------------------------------------
+
+;; Predicated left shifts.
+(define_insn "@aarch64_pred_<sve_int_op><mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, w, w, ?&w, ?&w")
+       (unspec:SVE_FULL_I
+         [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl, Upl, Upl, Upl")
+          (unspec:SVE_FULL_I
+            [(match_operand:SVE_FULL_I 2 "register_operand" "0, 0, w, w, w")
+             (match_operand:SVE_FULL_I 3 "aarch64_sve_<lr>shift_operand" "D<lr>, w, 0, D<lr>, w")]
+            SVE2_COND_INT_SHIFT)]
          UNSPEC_PRED_X))]
   "TARGET_SVE2"
   "@
-   <sur>h<addsub>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
-   movprfx\t%0, %2\;<sur>h<addsub>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
+   <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
+   <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
+   <sve_int_op>r\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>
+   movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
+   movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
+  [(set_attr "movprfx" "*,*,*,yes,yes")]
+)
+
+;; Predicated left shifts with merging.
+(define_expand "@cond_<sve_int_op><mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand")
+       (unspec:SVE_FULL_I
+         [(match_operand:<VPRED> 1 "register_operand")
+          (unspec:SVE_FULL_I
+            [(match_dup 5)
+             (unspec:SVE_FULL_I
+               [(match_operand:SVE_FULL_I 2 "register_operand")
+                (match_operand:SVE_FULL_I 3 "aarch64_sve_<lr>shift_operand")]
+               SVE2_COND_INT_SHIFT)]
+            UNSPEC_PRED_X)
+          (match_operand:SVE_FULL_I 4 "register_operand")]
+         UNSPEC_SEL))]
+  "TARGET_SVE2"
+  {
+    operands[5] = CONSTM1_RTX (<VPRED>mode);
+  }
+)
+
+;; Predicated left shifts, merging with the first input.
+(define_insn_and_rewrite "*cond_<sve_int_op><mode>_2"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, w, ?&w, ?&w")
+       (unspec:SVE_FULL_I
+         [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl, Upl, Upl")
+          (unspec:SVE_FULL_I
+            [(match_operand 4)
+             (unspec:SVE_FULL_I
+               [(match_operand:SVE_FULL_I 2 "register_operand" "0, 0, w, w")
+                (match_operand:SVE_FULL_I 3 "aarch64_sve_<lr>shift_operand" "D<lr>, w, D<lr>, w")]
+               SVE2_COND_INT_SHIFT)]
+            UNSPEC_PRED_X)
+          (match_dup 2)]
+         UNSPEC_SEL))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
+   <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
+   movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
+   movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
+  "&& !CONSTANT_P (operands[4])"
+  {
+    operands[4] = CONSTM1_RTX (<VPRED>mode);
+  }
+  [(set_attr "movprfx" "*,*,yes,yes")]
+)
+
+;; Predicated left shifts, merging with the second input.
+(define_insn_and_rewrite "*cond_<sve_int_op><mode>_3"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
+       (unspec:SVE_FULL_I
+         [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
+          (unspec:SVE_FULL_I
+            [(match_operand 4)
+             (unspec:SVE_FULL_I
+               [(match_operand:SVE_FULL_I 2 "register_operand" "w, w")
+                (match_operand:SVE_FULL_I 3 "register_operand" "0, w")]
+               SVE2_COND_INT_SHIFT)]
+            UNSPEC_PRED_X)
+          (match_dup 3)]
+         UNSPEC_SEL))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_op>r\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>
+   movprfx\t%0, %3\;<sve_int_op>r\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>"
+  "&& !CONSTANT_P (operands[4])"
+  {
+    operands[4] = CONSTM1_RTX (<VPRED>mode);
+  }
   [(set_attr "movprfx" "*,yes")]
 )
 
+;; Predicated left shifts, merging with an independent value.
+(define_insn_and_rewrite "*cond_<sve_int_op><mode>_any"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=&w, &w, &w, &w, &w, &w, &w, ?&w, ?&w")
+       (unspec:SVE_FULL_I
+         [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl, Upl, Upl, Upl, Upl, Upl, Upl, Upl")
+          (unspec:SVE_FULL_I
+            [(match_operand 5)
+             (unspec:SVE_FULL_I
+               [(match_operand:SVE_FULL_I 2 "register_operand" "0, 0, w, w, w, w, w, w, w")
+                (match_operand:SVE_FULL_I 3 "aarch64_sve_<lr>shift_operand" "D<lr>, w, 0, D<lr>, w, D<lr>, w, D<lr>, w")]
+               SVE2_COND_INT_SHIFT)]
+            UNSPEC_PRED_X)
+          (match_operand:SVE_FULL_I 4 "aarch64_simd_reg_or_zero" "Dz, Dz, Dz, Dz, Dz, 0, 0, w, w")]
+         UNSPEC_SEL))]
+  "TARGET_SVE2
+   && !rtx_equal_p (operands[2], operands[4])
+   && (CONSTANT_P (operands[4]) || !rtx_equal_p (operands[3], operands[4]))"
+  "@
+   movprfx\t%0.<Vetype>, %1/z, %0.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
+   movprfx\t%0.<Vetype>, %1/z, %0.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
+   movprfx\t%0.<Vetype>, %1/z, %0.<Vetype>\;<sve_int_op>r\t%0.<Vetype>, %1/m, %0.<Vetype>, %2.<Vetype>
+   movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
+   movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
+   movprfx\t%0.<Vetype>, %1/m, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
+   movprfx\t%0.<Vetype>, %1/m, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
+  #
+  #"
+  "&& 1"
+  {
+    if (reload_completed
+        && register_operand (operands[4], <MODE>mode)
+        && !rtx_equal_p (operands[0], operands[4]))
+      {
+       emit_insn (gen_vcond_mask_<mode><vpred> (operands[0], operands[2],
+                                                operands[4], operands[1]));
+       operands[4] = operands[2] = operands[0];
+      }
+    else if (!CONSTANT_P (operands[5]))
+      operands[5] = CONSTM1_RTX (<VPRED>mode);
+    else
+      FAIL;
+  }
+  [(set_attr "movprfx" "yes")]
+)
+
 ;; =========================================================================
 ;; == Uniform ternary arithmnetic
 ;; =========================================================================
 
 ;; -------------------------------------------------------------------------
+;; ---- [INT] General ternary arithmetic that maps to unspecs
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - ADCLB
+;; - ADCLT
+;; - EORBT
+;; - EORTB
+;; - SBCLB
+;; - SBCLT
+;; - SQRDMLAH
+;; - SQRDMLSH
+;; -------------------------------------------------------------------------
+
+(define_insn "@aarch64_sve_<sve_int_op><mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
+       (unspec:SVE_FULL_I
+         [(match_operand:SVE_FULL_I 2 "register_operand" "w, w")
+          (match_operand:SVE_FULL_I 3 "register_operand" "w, w")
+          (match_operand:SVE_FULL_I 1 "register_operand" "0, w")]
+         SVE2_INT_TERNARY))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_op>\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>
+   movprfx\t%0, %1\;<sve_int_op>\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>"
+)
+
+(define_insn "@aarch64_sve_<sve_int_op>_lane_<mode>"
+  [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w, ?&w")
+       (unspec:SVE_FULL_HSDI
+         [(match_operand:SVE_FULL_HSDI 2 "register_operand" "w, w")
+          (unspec:SVE_FULL_HSDI
+            [(match_operand:SVE_FULL_HSDI 3 "register_operand" "<sve_lane_con>, <sve_lane_con>")
+             (match_operand:SI 4 "const_int_operand")]
+            UNSPEC_SVE_LANE_SELECT)
+          (match_operand:SVE_FULL_HSDI 1 "register_operand" "0, w")]
+         SVE2_INT_TERNARY_LANE))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_op>\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>[%4]
+   movprfx\t%0, %1\;<sve_int_op>\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>[%4]"
+)
+
+;; -------------------------------------------------------------------------
+;; ---- [INT] Multiply-and-accumulate operations
+;; -------------------------------------------------------------------------
+;; Includes the lane forms of:
+;; - MLA
+;; - MLS
+;; -------------------------------------------------------------------------
+
+(define_insn "@aarch64_sve_add_mul_lane_<mode>"
+  [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w, ?&w")
+       (plus:SVE_FULL_HSDI
+         (mult:SVE_FULL_HSDI
+           (unspec:SVE_FULL_HSDI
+             [(match_operand:SVE_FULL_HSDI 3 "register_operand" "<sve_lane_con>, <sve_lane_con>")
+              (match_operand:SI 4 "const_int_operand")]
+             UNSPEC_SVE_LANE_SELECT)
+           (match_operand:SVE_FULL_HSDI 2 "register_operand" "w, w"))
+         (match_operand:SVE_FULL_HSDI 1 "register_operand" "0, w")))]
+  "TARGET_SVE2"
+  "@
+   mla\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>[%4]
+   movprfx\t%0, %1\;mla\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>[%4]"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+(define_insn "@aarch64_sve_sub_mul_lane_<mode>"
+  [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w, ?&w")
+       (minus:SVE_FULL_HSDI
+         (match_operand:SVE_FULL_HSDI 1 "register_operand" "0, w")
+         (mult:SVE_FULL_HSDI
+           (unspec:SVE_FULL_HSDI
+             [(match_operand:SVE_FULL_HSDI 3 "register_operand" "<sve_lane_con>, <sve_lane_con>")
+              (match_operand:SI 4 "const_int_operand")]
+             UNSPEC_SVE_LANE_SELECT)
+           (match_operand:SVE_FULL_HSDI 2 "register_operand" "w, w"))))]
+  "TARGET_SVE2"
+  "@
+   mls\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>[%4]
+   movprfx\t%0, %1\;mls\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>[%4]"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; -------------------------------------------------------------------------
+;; ---- [INT] Binary logic operations with rotation
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - XAR
+;; -------------------------------------------------------------------------
+
+(define_insn "@aarch64_sve2_xar<mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
+       (rotatert:SVE_FULL_I
+         (xor:SVE_FULL_I
+           (match_operand:SVE_FULL_I 1 "register_operand" "%0, w")
+           (match_operand:SVE_FULL_I 2 "register_operand" "w, w"))
+         (match_operand:SVE_FULL_I 3 "aarch64_simd_rshift_imm")))]
+  "TARGET_SVE2"
+  "@
+  xar\t%0.<Vetype>, %0.<Vetype>, %2.<Vetype>, #%3
+  movprfx\t%0, %1\;xar\t%0.<Vetype>, %0.<Vetype>, %2.<Vetype>, #%3"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; -------------------------------------------------------------------------
 ;; ---- [INT] Ternary logic operations
 ;; -------------------------------------------------------------------------
 ;; Includes:
+;; - BCAX
 ;; - BSL
 ;; - BSL1N
 ;; - BSL2N
 ;; - NBSL
 ;; -------------------------------------------------------------------------
 
+;; Unpredicated exclusive OR of AND.
+(define_insn "@aarch64_sve2_bcax<mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
+       (xor:SVE_FULL_I
+         (and:SVE_FULL_I
+           (match_operand:SVE_FULL_I 2 "register_operand" "w, w")
+           (match_operand:SVE_FULL_I 3 "register_operand" "w, w"))
+         (match_operand:SVE_FULL_I 1 "register_operand" "0, w")))]
+  "TARGET_SVE2"
+  "@
+  bcax\t%0.d, %0.d, %2.d, %3.d
+  movprfx\t%0, %1\;bcax\t%0.d, %0.d, %2.d, %3.d"
+  [(set_attr "movprfx" "*,yes")]
+)
+
 ;; Unpredicated 3-way exclusive OR.
-(define_insn "*aarch64_sve2_eor3<mode>"
+(define_insn "@aarch64_sve2_eor3<mode>"
   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, w, w, ?&w")
        (xor:SVE_FULL_I
          (xor:SVE_FULL_I
 
 ;; Unpredicated bitwise select.
 ;; (op3 ? bsl_mov : bsl_dup) == (((bsl_mov ^ bsl_dup) & op3) ^ bsl_dup)
+(define_expand "@aarch64_sve2_bsl<mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand")
+       (xor:SVE_FULL_I
+         (and:SVE_FULL_I
+           (xor:SVE_FULL_I
+             (match_operand:SVE_FULL_I 1 "register_operand")
+             (match_operand:SVE_FULL_I 2 "register_operand"))
+           (match_operand:SVE_FULL_I 3 "register_operand"))
+         (match_dup 2)))]
+  "TARGET_SVE2"
+)
+
 (define_insn "*aarch64_sve2_bsl<mode>"
   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
        (xor:SVE_FULL_I
 
 ;; Unpredicated bitwise inverted select.
 ;; (~(op3 ? bsl_mov : bsl_dup)) == (~(((bsl_mov ^ bsl_dup) & op3) ^ bsl_dup))
+(define_expand "@aarch64_sve2_nbsl<mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand")
+       (unspec:SVE_FULL_I
+         [(match_dup 4)
+          (not:SVE_FULL_I
+            (xor:SVE_FULL_I
+              (and:SVE_FULL_I
+                (xor:SVE_FULL_I
+                  (match_operand:SVE_FULL_I 1 "register_operand")
+                  (match_operand:SVE_FULL_I 2 "register_operand"))
+                (match_operand:SVE_FULL_I 3 "register_operand"))
+              (match_dup 2)))]
+         UNSPEC_PRED_X))]
+  "TARGET_SVE2"
+  {
+    operands[4] = CONSTM1_RTX (<VPRED>mode);
+  }
+)
+
 (define_insn_and_rewrite "*aarch64_sve2_nbsl<mode>"
   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
        (unspec:SVE_FULL_I
 
 ;; Unpredicated bitwise select with inverted first operand.
 ;; (op3 ? ~bsl_mov : bsl_dup) == ((~(bsl_mov ^ bsl_dup) & op3) ^ bsl_dup)
+(define_expand "@aarch64_sve2_bsl1n<mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand")
+       (xor:SVE_FULL_I
+         (and:SVE_FULL_I
+           (unspec:SVE_FULL_I
+             [(match_dup 4)
+              (not:SVE_FULL_I
+                (xor:SVE_FULL_I
+                  (match_operand:SVE_FULL_I 1 "register_operand")
+                  (match_operand:SVE_FULL_I 2 "register_operand")))]
+             UNSPEC_PRED_X)
+           (match_operand:SVE_FULL_I 3 "register_operand"))
+         (match_dup 2)))]
+  "TARGET_SVE2"
+  {
+    operands[4] = CONSTM1_RTX (<VPRED>mode);
+  }
+)
+
 (define_insn_and_rewrite "*aarch64_sve2_bsl1n<mode>"
   [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
        (xor:SVE_FULL_I
 
 ;; Unpredicated bitwise select with inverted second operand.
 ;; (bsl_dup ? bsl_mov : ~op3) == ((bsl_dup & bsl_mov) | (~op3 & ~bsl_dup))
-(define_insn_and_rewrite "*aarch64_sve2_bsl2n<mode>"
-  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
+(define_expand "@aarch64_sve2_bsl2n<mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand")
        (ior:SVE_FULL_I
          (and:SVE_FULL_I
-           (match_operand:SVE_FULL_I 1 "register_operand" "<bsl_1st>, w")
-           (match_operand:SVE_FULL_I 2 "register_operand" "<bsl_2nd>, w"))
+           (match_operand:SVE_FULL_I 1 "register_operand")
+           (match_operand:SVE_FULL_I 3 "register_operand"))
          (unspec:SVE_FULL_I
-           [(match_operand 4)
+           [(match_dup 4)
             (and:SVE_FULL_I
               (not:SVE_FULL_I
-                (match_operand:SVE_FULL_I 3 "register_operand" "w, w"))
+                (match_operand:SVE_FULL_I 2 "register_operand"))
+              (not:SVE_FULL_I
+                (match_dup 3)))]
+           UNSPEC_PRED_X)))]
+  "TARGET_SVE2"
+  {
+    operands[4] = CONSTM1_RTX (<VPRED>mode);
+  }
+)
+
+(define_insn_and_rewrite "*aarch64_sve2_bsl2n<mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
+       (ior:SVE_FULL_I
+         (and:SVE_FULL_I
+           (match_operand:SVE_FULL_I 1 "register_operand" "<bsl_1st>, w")
+           (match_operand:SVE_FULL_I 2 "register_operand" "<bsl_2nd>, w"))
+         (unspec:SVE_FULL_I
+           [(match_operand 4)
+            (and:SVE_FULL_I
+              (not:SVE_FULL_I
+                (match_operand:SVE_FULL_I 3 "register_operand" "w, w"))
               (not:SVE_FULL_I
                 (match_dup BSL_DUP)))]
            UNSPEC_PRED_X)))]
 ;; ---- [INT] Shift-and-accumulate operations
 ;; -------------------------------------------------------------------------
 ;; Includes:
+;; - SRSRA
 ;; - SSRA
+;; - URSRA
 ;; - USRA
 ;; -------------------------------------------------------------------------
 
-;; Unpredicated signed / unsigned shift-right accumulate.
+;; Provide the natural unpredicated interface for SSRA and USRA.
+(define_expand "@aarch64_sve_add_<sve_int_op><mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand")
+       (plus:SVE_FULL_I
+         (unspec:SVE_FULL_I
+           [(match_dup 4)
+            (SHIFTRT:SVE_FULL_I
+              (match_operand:SVE_FULL_I 2 "register_operand")
+              (match_operand:SVE_FULL_I 3 "aarch64_simd_rshift_imm"))]
+           UNSPEC_PRED_X)
+        (match_operand:SVE_FULL_I 1 "register_operand")))]
+  "TARGET_SVE2"
+  {
+    operands[4] = CONSTM1_RTX (<VPRED>mode);
+  }
+)
+
+;; Pattern-match SSRA and USRA as a predicated operation whose predicate
+;; isn't needed.
 (define_insn_and_rewrite "*aarch64_sve2_sra<mode>"
-  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w")
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
        (plus:SVE_FULL_I
          (unspec:SVE_FULL_I
            [(match_operand 4)
             (SHIFTRT:SVE_FULL_I
-              (match_operand:SVE_FULL_I 2 "register_operand" "w")
-              (match_operand:SVE_FULL_I 3 "aarch64_simd_rshift_imm" "Dr"))]
+              (match_operand:SVE_FULL_I 2 "register_operand" "w, w")
+              (match_operand:SVE_FULL_I 3 "aarch64_simd_rshift_imm"))]
            UNSPEC_PRED_X)
-        (match_operand:SVE_FULL_I 1 "register_operand" "0")))]
+        (match_operand:SVE_FULL_I 1 "register_operand" "0, w")))]
   "TARGET_SVE2"
-  "<sra_op>sra\t%0.<Vetype>, %2.<Vetype>, #%3"
+  "@
+   <sra_op>sra\t%0.<Vetype>, %2.<Vetype>, #%3
+   movprfx\t%0, %1\;<sra_op>sra\t%0.<Vetype>, %2.<Vetype>, #%3"
   "&& !CONSTANT_P (operands[4])"
   {
     operands[4] = CONSTM1_RTX (<VPRED>mode);
   }
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; SRSRA and URSRA.
+(define_insn "@aarch64_sve_add_<sve_int_op><mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
+       (plus:SVE_FULL_I
+         (unspec:SVE_FULL_I
+           [(match_operand:SVE_FULL_I 2 "register_operand" "w, w")
+            (match_operand:SVE_FULL_I 3 "aarch64_simd_rshift_imm")]
+           VRSHR_N)
+        (match_operand:SVE_FULL_I 1 "register_operand" "0, w")))]
+  "TARGET_SVE2"
+  "@
+   <sur>sra\t%0.<Vetype>, %2.<Vetype>, #%3
+   movprfx\t%0, %1\;<sur>sra\t%0.<Vetype>, %2.<Vetype>, #%3"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; -------------------------------------------------------------------------
+;; ---- [INT] Shift-and-insert operations
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - SLI
+;; - SRI
+;; -------------------------------------------------------------------------
+
+;; These instructions do not take MOVPRFX.
+(define_insn "@aarch64_sve_<sve_int_op><mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w")
+       (unspec:SVE_FULL_I
+         [(match_operand:SVE_FULL_I 1 "register_operand" "0")
+          (match_operand:SVE_FULL_I 2 "register_operand" "w")
+          (match_operand:SVE_FULL_I 3 "aarch64_simd_<lr>shift_imm")]
+         SVE2_INT_SHIFT_INSERT))]
+  "TARGET_SVE2"
+  "<sve_int_op>\t%0.<Vetype>, %2.<Vetype>, #%3"
+)
+
+;; -------------------------------------------------------------------------
+;; ---- [INT] Sum of absolute differences
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - SABA
+;; - UABA
+;; -------------------------------------------------------------------------
+
+;; Provide the natural unpredicated interface for SABA and UABA.
+(define_expand "@aarch64_sve2_<su>aba<mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
+       (plus:SVE_FULL_I
+         (minus:SVE_FULL_I
+           (unspec:SVE_FULL_I
+             [(match_dup 4)
+              (USMAX:SVE_FULL_I
+                (match_operand:SVE_FULL_I 2 "register_operand" "w, w")
+                (match_operand:SVE_FULL_I 3 "register_operand" "w, w"))]
+             UNSPEC_PRED_X)
+           (unspec:SVE_FULL_I
+             [(match_dup 4)
+              (<max_opp>:SVE_FULL_I
+                (match_dup 2)
+                (match_dup 3))]
+             UNSPEC_PRED_X))
+         (match_operand:SVE_FULL_I 1 "register_operand" "0, w")))]
+  "TARGET_SVE2"
+  {
+    operands[4] = CONSTM1_RTX (<VPRED>mode);
+  }
+)
+
+;; Pattern-match SABA and UABA as an absolute-difference-and-accumulate
+;; operation whose predicates aren't needed.
+(define_insn "*aarch64_sve2_<su>aba<mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
+       (plus:SVE_FULL_I
+         (minus:SVE_FULL_I
+           (unspec:SVE_FULL_I
+             [(match_operand 4)
+              (USMAX:SVE_FULL_I
+                (match_operand:SVE_FULL_I 2 "register_operand" "w, w")
+                (match_operand:SVE_FULL_I 3 "register_operand" "w, w"))]
+             UNSPEC_PRED_X)
+           (unspec:SVE_FULL_I
+             [(match_operand 5)
+              (<max_opp>:SVE_FULL_I
+                (match_dup 2)
+                (match_dup 3))]
+             UNSPEC_PRED_X))
+         (match_operand:SVE_FULL_I 1 "register_operand" "0, w")))]
+  "TARGET_SVE2"
+  "@
+   <su>aba\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>
+   movprfx\t%0, %1\;<su>aba\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>"
+  [(set_attr "movprfx" "*,yes")]
 )
 
 ;; =========================================================================
 ;; =========================================================================
 
 ;; -------------------------------------------------------------------------
+;; ---- [INT] Wide binary arithmetic
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - SADDWB
+;; - SADDWT
+;; - SSUBWB
+;; - SSUBWT
+;; - UADDWB
+;; - UADDWT
+;; - USUBWB
+;; - USUBWT
+;; -------------------------------------------------------------------------
+
+(define_insn "@aarch64_sve_<sve_int_op><mode>"
+  [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w")
+       (unspec:SVE_FULL_HSDI
+         [(match_operand:SVE_FULL_HSDI 1 "register_operand" "w")
+          (match_operand:<VNARROW> 2 "register_operand" "w")]
+         SVE2_INT_BINARY_WIDE))]
+  "TARGET_SVE2"
+  "<sve_int_op>\t%0.<Vetype>, %1.<Vetype>, %2.<Ventype>"
+)
+
+;; -------------------------------------------------------------------------
 ;; ---- [INT] Long binary arithmetic
 ;; -------------------------------------------------------------------------
 ;; Includes:
+;; - SABDLB
+;; - SABDLT
+;; - SADDLB
+;; - SADDLBT
+;; - SADDLT
 ;; - SMULLB
 ;; - SMULLT
+;; - SQDMULLB
+;; - SQDMULLT
+;; - SSUBLB
+;; - SSUBLBT
+;; - SSUBLT
+;; - SSUBLTB
+;; - UABDLB
+;; - UABDLT
+;; - UADDLB
+;; - UADDLT
 ;; - UMULLB
 ;; - UMULLT
+;; - USUBLB
+;; - USUBLT
+;; -------------------------------------------------------------------------
+
+(define_insn "@aarch64_sve_<sve_int_op><mode>"
+  [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w")
+       (unspec:SVE_FULL_HSDI
+         [(match_operand:<VNARROW> 1 "register_operand" "w")
+          (match_operand:<VNARROW> 2 "register_operand" "w")]
+         SVE2_INT_BINARY_LONG))]
+  "TARGET_SVE2"
+  "<sve_int_op>\t%0.<Vetype>, %1.<Ventype>, %2.<Ventype>"
+)
+
+(define_insn "@aarch64_sve_<sve_int_op>_lane_<mode>"
+  [(set (match_operand:SVE_FULL_SDI 0 "register_operand" "=w")
+       (unspec:SVE_FULL_SDI
+         [(match_operand:<VNARROW> 1 "register_operand" "w")
+          (unspec:<VNARROW>
+            [(match_operand:<VNARROW> 2 "register_operand" "<sve_lane_con>")
+             (match_operand:SI 3 "const_int_operand")]
+            UNSPEC_SVE_LANE_SELECT)]
+         SVE2_INT_BINARY_LONG_LANE))]
+  "TARGET_SVE2"
+  "<sve_int_op>\t%0.<Vetype>, %1.<Ventype>, %2.<Ventype>[%3]"
+)
+
+;; -------------------------------------------------------------------------
+;; ---- [INT] Long left shifts
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - SSHLLB
+;; - SSHLLT
+;; - USHLLB
+;; - USHLLT
+;; -------------------------------------------------------------------------
+
+;; The immediate range is enforced before generating the instruction.
+(define_insn "@aarch64_sve_<sve_int_op><mode>"
+  [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w")
+       (unspec:SVE_FULL_HSDI
+         [(match_operand:<VNARROW> 1 "register_operand" "w")
+          (match_operand:DI 2 "const_int_operand")]
+         SVE2_INT_SHIFT_IMM_LONG))]
+  "TARGET_SVE2"
+  "<sve_int_op>\t%0.<Vetype>, %1.<Ventype>, #%2"
+)
+
+;; -------------------------------------------------------------------------
+;; ---- [INT] Long binary arithmetic with accumulation
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - SABALB
+;; - SABALT
+;; - SMLALB
+;; - SMLALT
+;; - SMLSLB
+;; - SMLSLT
+;; - SQDMLALB
+;; - SQDMLALBT
+;; - SQDMLALT
+;; - SQDMLSLB
+;; - SQDMLSLBT
+;; - SQDMLSLT
+;; - UABALB
+;; - UABALT
+;; - UMLALB
+;; - UMLALT
+;; - UMLSLB
+;; - UMLSLT
+;; -------------------------------------------------------------------------
+
+;; Non-saturating MLA operations.
+(define_insn "@aarch64_sve_add_<sve_int_op><mode>"
+  [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w, ?&w")
+       (plus:SVE_FULL_HSDI
+         (unspec:SVE_FULL_HSDI
+           [(match_operand:<VNARROW> 2 "register_operand" "w, w")
+            (match_operand:<VNARROW> 3 "register_operand" "w, w")]
+           SVE2_INT_ADD_BINARY_LONG)
+         (match_operand:SVE_FULL_HSDI 1 "register_operand" "0, w")))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_add_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>
+   movprfx\t%0, %1\;<sve_int_add_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; Non-saturating MLA operations with lane select.
+(define_insn "@aarch64_sve_add_<sve_int_op>_lane_<mode>"
+  [(set (match_operand:SVE_FULL_SDI 0 "register_operand" "=w, ?&w")
+       (plus:SVE_FULL_SDI
+         (unspec:SVE_FULL_SDI
+           [(match_operand:<VNARROW> 2 "register_operand" "w, w")
+            (unspec:<VNARROW>
+              [(match_operand:<VNARROW> 3 "register_operand" "<sve_lane_con>, <sve_lane_con>")
+               (match_operand:SI 4 "const_int_operand")]
+              UNSPEC_SVE_LANE_SELECT)]
+           SVE2_INT_ADD_BINARY_LONG_LANE)
+         (match_operand:SVE_FULL_SDI 1 "register_operand" "0, w")))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_add_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>[%4]
+   movprfx\t%0, %1\;<sve_int_add_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>[%4]"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; Saturating MLA operations.
+(define_insn "@aarch64_sve_qadd_<sve_int_op><mode>"
+  [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w, ?&w")
+       (ss_plus:SVE_FULL_HSDI
+         (unspec:SVE_FULL_HSDI
+           [(match_operand:<VNARROW> 2 "register_operand" "w, w")
+            (match_operand:<VNARROW> 3 "register_operand" "w, w")]
+           SVE2_INT_QADD_BINARY_LONG)
+         (match_operand:SVE_FULL_HSDI 1 "register_operand" "0, w")))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_qadd_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>
+   movprfx\t%0, %1\;<sve_int_qadd_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; Saturating MLA operations with lane select.
+(define_insn "@aarch64_sve_qadd_<sve_int_op>_lane_<mode>"
+  [(set (match_operand:SVE_FULL_SDI 0 "register_operand" "=w, ?&w")
+       (ss_plus:SVE_FULL_SDI
+         (unspec:SVE_FULL_SDI
+           [(match_operand:<VNARROW> 2 "register_operand" "w, w")
+            (unspec:<VNARROW>
+              [(match_operand:<VNARROW> 3 "register_operand" "<sve_lane_con>, <sve_lane_con>")
+               (match_operand:SI 4 "const_int_operand")]
+              UNSPEC_SVE_LANE_SELECT)]
+           SVE2_INT_QADD_BINARY_LONG_LANE)
+         (match_operand:SVE_FULL_SDI 1 "register_operand" "0, w")))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_qadd_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>[%4]
+   movprfx\t%0, %1\;<sve_int_qadd_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>[%4]"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; Non-saturating MLS operations.
+(define_insn "@aarch64_sve_sub_<sve_int_op><mode>"
+  [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w, ?&w")
+       (minus:SVE_FULL_HSDI
+         (match_operand:SVE_FULL_HSDI 1 "register_operand" "0, w")
+         (unspec:SVE_FULL_HSDI
+           [(match_operand:<VNARROW> 2 "register_operand" "w, w")
+            (match_operand:<VNARROW> 3 "register_operand" "w, w")]
+           SVE2_INT_SUB_BINARY_LONG)))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_sub_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>
+   movprfx\t%0, %1\;<sve_int_sub_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; Non-saturating MLS operations with lane select.
+(define_insn "@aarch64_sve_sub_<sve_int_op>_lane_<mode>"
+  [(set (match_operand:SVE_FULL_SDI 0 "register_operand" "=w, ?&w")
+       (minus:SVE_FULL_SDI
+         (match_operand:SVE_FULL_SDI 1 "register_operand" "0, w")
+         (unspec:SVE_FULL_SDI
+           [(match_operand:<VNARROW> 2 "register_operand" "w, w")
+            (unspec:<VNARROW>
+              [(match_operand:<VNARROW> 3 "register_operand" "<sve_lane_con>, <sve_lane_con>")
+               (match_operand:SI 4 "const_int_operand")]
+              UNSPEC_SVE_LANE_SELECT)]
+           SVE2_INT_SUB_BINARY_LONG_LANE)))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_sub_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>[%4]
+   movprfx\t%0, %1\;<sve_int_sub_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>[%4]"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; Saturating MLS operations.
+(define_insn "@aarch64_sve_qsub_<sve_int_op><mode>"
+  [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w, ?&w")
+       (ss_minus:SVE_FULL_HSDI
+         (match_operand:SVE_FULL_HSDI 1 "register_operand" "0, w")
+         (unspec:SVE_FULL_HSDI
+           [(match_operand:<VNARROW> 2 "register_operand" "w, w")
+            (match_operand:<VNARROW> 3 "register_operand" "w, w")]
+           SVE2_INT_QSUB_BINARY_LONG)))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_qsub_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>
+   movprfx\t%0, %1\;<sve_int_qsub_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; Saturating MLS operations with lane select.
+(define_insn "@aarch64_sve_qsub_<sve_int_op>_lane_<mode>"
+  [(set (match_operand:SVE_FULL_SDI 0 "register_operand" "=w, ?&w")
+       (ss_minus:SVE_FULL_SDI
+         (match_operand:SVE_FULL_SDI 1 "register_operand" "0, w")
+         (unspec:SVE_FULL_SDI
+           [(match_operand:<VNARROW> 2 "register_operand" "w, w")
+            (unspec:<VNARROW>
+              [(match_operand:<VNARROW> 3 "register_operand" "<sve_lane_con>, <sve_lane_con>")
+               (match_operand:SI 4 "const_int_operand")]
+              UNSPEC_SVE_LANE_SELECT)]
+           SVE2_INT_QSUB_BINARY_LONG_LANE)))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_qsub_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>[%4]
+   movprfx\t%0, %1\;<sve_int_qsub_op>\t%0.<Vetype>, %2.<Ventype>, %3.<Ventype>[%4]"
+  [(set_attr "movprfx" "*,yes")]
+)
+;; -------------------------------------------------------------------------
+;; ---- [FP] Long multiplication with accumulation
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - FMLALB
+;; - FMLALT
+;; - FMLSLB
+;; - FMLSLT
 ;; -------------------------------------------------------------------------
 
-;; Multiply long top / bottom.
-(define_insn "<su>mull<bt><Vwide>"
-  [(set (match_operand:<VWIDE> 0 "register_operand" "=w")
-       (unspec:<VWIDE>
-         [(match_operand:SVE_FULL_BHSI 1 "register_operand" "w")
-          (match_operand:SVE_FULL_BHSI 2 "register_operand" "w")]
-         MULLBT))]
+(define_insn "@aarch64_sve_<sve_fp_op><mode>"
+  [(set (match_operand:VNx4SF_ONLY 0 "register_operand" "=w, ?&w")
+       (unspec:VNx4SF_ONLY
+         [(match_operand:<VNARROW> 1 "register_operand" "w, w")
+          (match_operand:<VNARROW> 2 "register_operand" "w, w")
+          (match_operand:VNx4SF_ONLY 3 "register_operand" "0, w")]
+         SVE2_FP_TERNARY_LONG))]
   "TARGET_SVE2"
-  "<su>mull<bt>\t%0.<Vewtype>, %1.<Vetype>, %2.<Vetype>"
+  "@
+   <sve_fp_op>\t%0.<Vetype>, %1.<Ventype>, %2.<Ventype>
+   movprfx\t%0, %3\;<sve_fp_op>\t%0.<Vetype>, %1.<Ventype>, %2.<Ventype>"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+(define_insn "@aarch64_<sve_fp_op>_lane_<mode>"
+  [(set (match_operand:VNx4SF_ONLY 0 "register_operand" "=w, ?&w")
+       (unspec:VNx4SF_ONLY
+         [(match_operand:<VNARROW> 1 "register_operand" "w, w")
+          (unspec:<VNARROW>
+            [(match_operand:<VNARROW> 2 "register_operand" "<sve_lane_con>, <sve_lane_con>")
+             (match_operand:SI 3 "const_int_operand")]
+            UNSPEC_SVE_LANE_SELECT)
+          (match_operand:VNx4SF_ONLY 4 "register_operand" "0, w")]
+         SVE2_FP_TERNARY_LONG_LANE))]
+  "TARGET_SVE2"
+  "@
+   <sve_fp_op>\t%0.<Vetype>, %1.<Ventype>, %2.<Ventype>[%3]
+   movprfx\t%0, %4\;<sve_fp_op>\t%0.<Vetype>, %1.<Ventype>, %2.<Ventype>[%3]"
+  [(set_attr "movprfx" "*,yes")]
 )
 
 ;; =========================================================================
 ;; =========================================================================
 
 ;; -------------------------------------------------------------------------
+;; ---- [INT] Narrowing unary arithmetic
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - SQXTNB
+;; - SQXTNT
+;; - SQXTUNB
+;; - SQXTUNT
+;; - UQXTNB
+;; - UQXTNT
+;; -------------------------------------------------------------------------
+
+(define_insn "@aarch64_sve_<sve_int_op><mode>"
+  [(set (match_operand:<VNARROW> 0 "register_operand" "=w")
+       (unspec:<VNARROW>
+         [(match_operand:SVE_FULL_HSDI 1 "register_operand" "w")]
+         SVE2_INT_UNARY_NARROWB))]
+  "TARGET_SVE2"
+  "<sve_int_op>\t%0.<Ventype>, %1.<Vetype>"
+)
+
+;; These instructions do not take MOVPRFX.
+(define_insn "@aarch64_sve_<sve_int_op><mode>"
+  [(set (match_operand:<VNARROW> 0 "register_operand" "=w")
+       (unspec:<VNARROW>
+         [(match_operand:<VNARROW> 1 "register_operand" "0")
+          (match_operand:SVE_FULL_HSDI 2 "register_operand" "w")]
+         SVE2_INT_UNARY_NARROWT))]
+  "TARGET_SVE2"
+  "<sve_int_op>\t%0.<Ventype>, %2.<Vetype>"
+)
+
+;; -------------------------------------------------------------------------
+;; ---- [INT] Narrowing binary arithmetic
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - ADDHNB
+;; - ADDHNT
+;; - RADDHNB
+;; - RADDHNT
+;; - RSUBHNB
+;; - RSUBHNT
+;; - SUBHNB
+;; - SUBHNT
+;; -------------------------------------------------------------------------
+
+(define_insn "@aarch64_sve_<sve_int_op><mode>"
+  [(set (match_operand:<VNARROW> 0 "register_operand" "=w")
+       (unspec:<VNARROW>
+         [(match_operand:SVE_FULL_HSDI 1 "register_operand" "w")
+          (match_operand:SVE_FULL_HSDI 2 "register_operand" "w")]
+         SVE2_INT_BINARY_NARROWB))]
+  "TARGET_SVE2"
+  "<sve_int_op>\t%0.<Ventype>, %1.<Vetype>, %2.<Vetype>"
+)
+
+;; These instructions do not take MOVPRFX.
+(define_insn "@aarch64_sve_<sve_int_op><mode>"
+  [(set (match_operand:<VNARROW> 0 "register_operand" "=w")
+       (unspec:<VNARROW>
+         [(match_operand:<VNARROW> 1 "register_operand" "0")
+          (match_operand:SVE_FULL_HSDI 2 "register_operand" "w")
+          (match_operand:SVE_FULL_HSDI 3 "register_operand" "w")]
+         SVE2_INT_BINARY_NARROWT))]
+  "TARGET_SVE2"
+  "<sve_int_op>\t%0.<Ventype>, %2.<Vetype>, %3.<Vetype>"
+)
+
+;; -------------------------------------------------------------------------
 ;; ---- [INT] Narrowing right shifts
 ;; -------------------------------------------------------------------------
 ;; Includes:
 ;; - RSHRNT
 ;; - SHRNB
 ;; - SHRNT
+;; - SQRSHRNB
+;; - SQRSHRNT
+;; - SQRSHRUNB
+;; - SQRSHRUNT
+;; - SQSHRNB
+;; - SQSHRNT
+;; - SQSHRUNB
+;; - SQSHRUNT
+;; - UQRSHRNB
+;; - UQRSHRNT
+;; - UQSHRNB
+;; - UQSHRNT
 ;; -------------------------------------------------------------------------
 
-;; (Rounding) Right shift narrow bottom.
-(define_insn "<r>shrnb<mode>"
-  [(set (match_operand:SVE_FULL_BHSI 0 "register_operand" "=w")
-        (unspec:SVE_FULL_BHSI
-         [(match_operand:<VWIDE> 1 "register_operand" "w")
-          (match_operand 2 "aarch64_simd_shift_imm_offset_<Vel>" "")]
-         SHRNB))]
+;; The immediate range is enforced before generating the instruction.
+(define_insn "@aarch64_sve_<sve_int_op><mode>"
+  [(set (match_operand:<VNARROW> 0 "register_operand" "=w")
+       (unspec:<VNARROW>
+         [(match_operand:SVE_FULL_HSDI 1 "register_operand" "w")
+          (match_operand:DI 2 "const_int_operand")]
+         SVE2_INT_SHIFT_IMM_NARROWB))]
   "TARGET_SVE2"
-  "<r>shrnb\t%0.<Vetype>, %1.<Vewtype>, #%2"
+  "<sve_int_op>\t%0.<Ventype>, %1.<Vetype>, #%2"
 )
 
-;; (Rounding) Right shift narrow top.
-(define_insn "<r>shrnt<mode>"
-  [(set (match_operand:SVE_FULL_BHSI 0 "register_operand" "=w")
-       (unspec:SVE_FULL_BHSI
-         [(match_operand:SVE_FULL_BHSI 1 "register_operand" "0")
-          (match_operand:<VWIDE> 2 "register_operand" "w")
-          (match_operand 3 "aarch64_simd_shift_imm_offset_<Vel>" "i")]
-         SHRNT))]
+;; The immediate range is enforced before generating the instruction.
+;; These instructions do not take MOVPRFX.
+(define_insn "@aarch64_sve_<sve_int_op><mode>"
+  [(set (match_operand:<VNARROW> 0 "register_operand" "=w")
+       (unspec:<VNARROW>
+         [(match_operand:<VNARROW> 1 "register_operand" "0")
+          (match_operand:SVE_FULL_HSDI 2 "register_operand" "w")
+          (match_operand:DI 3 "const_int_operand")]
+         SVE2_INT_SHIFT_IMM_NARROWT))]
+  "TARGET_SVE2"
+  "<sve_int_op>\t%0.<Ventype>, %2.<Vetype>, #%3"
+)
+
+;; =========================================================================
+;; == Pairwise arithmetic
+;; =========================================================================
+
+;; -------------------------------------------------------------------------
+;; ---- [INT] Pairwise arithmetic
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - ADDP
+;; - SMAXP
+;; - SMINP
+;; - UMAXP
+;; - UMINP
+;; -------------------------------------------------------------------------
+
+(define_insn "@aarch64_pred_<sve_int_op><mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
+       (unspec:SVE_FULL_I
+         [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
+          (match_operand:SVE_FULL_I 2 "register_operand" "0, w")
+          (match_operand:SVE_FULL_I 3 "register_operand" "w, w")]
+         SVE2_INT_BINARY_PAIR))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
+   movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; -------------------------------------------------------------------------
+;; ---- [FP] Pairwise arithmetic
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - FADDP
+;; - FMAXP
+;; - FMAXNMP
+;; - FMINP
+;; - FMINNMP
+;; -------------------------------------------------------------------------
+
+(define_insn "@aarch64_pred_<sve_fp_op><mode>"
+  [(set (match_operand:SVE_FULL_F 0 "register_operand" "=w, ?&w")
+       (unspec:SVE_FULL_F
+         [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
+          (match_operand:SVE_FULL_F 2 "register_operand" "0, w")
+          (match_operand:SVE_FULL_F 3 "register_operand" "w, w")]
+         SVE2_FP_BINARY_PAIR))]
+  "TARGET_SVE2"
+  "@
+   <sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
+   movprfx\t%0, %2\;<sve_fp_op>\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; -------------------------------------------------------------------------
+;; ---- [INT] Pairwise arithmetic with accumulation
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - SADALP
+;; - UADALP
+;; -------------------------------------------------------------------------
+
+;; Predicated pairwise absolute difference and accumulate with merging.
+(define_expand "@cond_<sve_int_op><mode>"
+  [(set (match_operand:SVE_FULL_HSDI 0 "register_operand")
+       (unspec:SVE_FULL_HSDI
+         [(match_operand:<VPRED> 1 "register_operand")
+          (unspec:SVE_FULL_HSDI
+            [(match_dup 1)
+             (match_operand:SVE_FULL_HSDI 2 "register_operand")
+             (match_operand:<VNARROW> 3 "register_operand")]
+            SVE2_INT_BINARY_PAIR_LONG)
+          (match_operand:SVE_FULL_HSDI 4 "aarch64_simd_reg_or_zero")]
+         UNSPEC_SEL))]
+  "TARGET_SVE2"
+{
+  /* Only target code is aware of these operations, so we don't need
+     to handle the fully-general case.  */
+  gcc_assert (rtx_equal_p (operands[2], operands[4])
+             || CONSTANT_P (operands[4]));
+})
+
+;; Predicated pairwise absolute difference and accumulate, merging with
+;; the first input.
+(define_insn_and_rewrite "*cond_<sve_int_op><mode>_2"
+  [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=w, ?&w")
+       (unspec:SVE_FULL_HSDI
+         [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
+          (unspec:SVE_FULL_HSDI
+            [(match_operand 4)
+             (match_operand:SVE_FULL_HSDI 2 "register_operand" "0, w")
+             (match_operand:<VNARROW> 3 "register_operand" "w, w")]
+            SVE2_INT_BINARY_PAIR_LONG)
+          (match_dup 2)]
+         UNSPEC_SEL))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_op>\t%0.<Vetype>, %1/m, %3.<Ventype>
+   movprfx\t%0, %2\;<sve_int_op>\t%0.<Vetype>, %1/m, %3.<Ventype>"
+  "&& !CONSTANT_P (operands[4])"
+  {
+    operands[4] = CONSTM1_RTX (<VPRED>mode);
+  }
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; Predicated pairwise absolute difference and accumulate, merging with zero.
+(define_insn_and_rewrite "*cond_<sve_int_op><mode>_z"
+  [(set (match_operand:SVE_FULL_HSDI 0 "register_operand" "=&w, &w")
+       (unspec:SVE_FULL_HSDI
+         [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl")
+          (unspec:SVE_FULL_HSDI
+            [(match_operand 5)
+             (match_operand:SVE_FULL_HSDI 2 "register_operand" "0, w")
+             (match_operand:<VNARROW> 3 "register_operand" "w, w")]
+            SVE2_INT_BINARY_PAIR_LONG)
+          (match_operand:SVE_FULL_HSDI 4 "aarch64_simd_imm_zero")]
+         UNSPEC_SEL))]
   "TARGET_SVE2"
-  "<r>shrnt\t%0.<Vetype>, %2.<Vewtype>, #%3"
+  "@
+   movprfx\t%0.<Vetype>, %1/z, %0.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %3.<Ventype>
+   movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %3.<Ventype>"
+  "&& !CONSTANT_P (operands[5])"
+  {
+    operands[5] = CONSTM1_RTX (<VPRED>mode);
+  }
+  [(set_attr "movprfx" "yes")]
+)
+
+;; =========================================================================
+;; == Complex arithmetic
+;; =========================================================================
+
+;; -------------------------------------------------------------------------
+;; ---- [INT] Complex binary operations
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - CADD
+;; - SQCADD
+;; -------------------------------------------------------------------------
+
+(define_insn "@aarch64_sve_<optab><mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
+       (unspec:SVE_FULL_I
+         [(match_operand:SVE_FULL_I 1 "register_operand" "0, w")
+          (match_operand:SVE_FULL_I 2 "register_operand" "w, w")]
+         SVE2_INT_CADD))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_op>\t%0.<Vetype>, %0.<Vetype>, %2.<Vetype>, #<rot>
+   movprfx\t%0, %1\;<sve_int_op>\t%0.<Vetype>, %0.<Vetype>, %2.<Vetype>, #<rot>"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; -------------------------------------------------------------------------
+;; ---- [INT] Complex ternary operations
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - CMLA
+;; - SQRDCMLA
+;; -------------------------------------------------------------------------
+
+(define_insn "@aarch64_sve_<optab><mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w, ?&w")
+       (unspec:SVE_FULL_I
+         [(match_operand:SVE_FULL_I 1 "register_operand" "0, w")
+          (match_operand:SVE_FULL_I 2 "register_operand" "w, w")
+          (match_operand:SVE_FULL_I 3 "register_operand" "w, w")]
+         SVE2_INT_CMLA))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_op>\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>, #<rot>
+   movprfx\t%0, %1\;<sve_int_op>\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>, #<rot>"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+(define_insn "@aarch64_<optab>_lane_<mode>"
+  [(set (match_operand:SVE_FULL_HSI 0 "register_operand" "=w, ?&w")
+       (unspec:SVE_FULL_HSI
+         [(match_operand:SVE_FULL_HSI 1 "register_operand" "0, w")
+          (match_operand:SVE_FULL_HSI 2 "register_operand" "w, w")
+          (unspec:SVE_FULL_HSI
+            [(match_operand:SVE_FULL_HSI 3 "register_operand" "<sve_lane_con>, <sve_lane_con>")
+             (match_operand:SI 4 "const_int_operand")]
+            UNSPEC_SVE_LANE_SELECT)]
+         SVE2_INT_CMLA))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_op>\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>[%4], #<rot>
+   movprfx\t%0, %1\;<sve_int_op>\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>[%4], #<rot>"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; -------------------------------------------------------------------------
+;; ---- [INT] Complex dot product
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - CDOT
+;; -------------------------------------------------------------------------
+
+(define_insn "@aarch64_sve_<optab><mode>"
+  [(set (match_operand:SVE_FULL_SDI 0 "register_operand" "=w, ?&w")
+       (unspec:SVE_FULL_SDI
+         [(match_operand:SVE_FULL_SDI 1 "register_operand" "0, w")
+          (match_operand:<VSI2QI> 2 "register_operand" "w, w")
+          (match_operand:<VSI2QI> 3 "register_operand" "w, w")]
+         SVE2_INT_CDOT))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_op>\t%0.<Vetype>, %2.<Vetype_fourth>, %3.<Vetype_fourth>, #<rot>
+   movprfx\t%0, %1\;<sve_int_op>\t%0.<Vetype>, %2.<Vetype_fourth>, %3.<Vetype_fourth>, #<rot>"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+(define_insn "@aarch64_<optab>_lane_<mode>"
+  [(set (match_operand:SVE_FULL_SDI 0 "register_operand" "=w, ?&w")
+       (unspec:SVE_FULL_SDI
+         [(match_operand:SVE_FULL_SDI 1 "register_operand" "0, w")
+          (match_operand:<VSI2QI> 2 "register_operand" "w, w")
+          (unspec:<VSI2QI>
+            [(match_operand:<VSI2QI> 3 "register_operand" "<sve_lane_con>, <sve_lane_con>")
+             (match_operand:SI 4 "const_int_operand")]
+            UNSPEC_SVE_LANE_SELECT)]
+         SVE2_INT_CDOT))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_op>\t%0.<Vetype>, %2.<Vetype_fourth>, %3.<Vetype_fourth>[%4], #<rot>
+   movprfx\t%0, %1\;<sve_int_op>\t%0.<Vetype>, %2.<Vetype_fourth>, %3.<Vetype_fourth>[%4], #<rot>"
+  [(set_attr "movprfx" "*,yes")]
+)
+
+;; =========================================================================
+;; == Conversions
+;; =========================================================================
+
+;; -------------------------------------------------------------------------
+;; ---- [FP<-FP] Widening conversions
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - FCVTLT
+;; -------------------------------------------------------------------------
+
+;; Predicated convert long top.
+(define_insn "@aarch64_pred_<sve_fp_op><mode>"
+  [(set (match_operand:SVE_FULL_SDF 0 "register_operand" "=w")
+       (unspec:SVE_FULL_SDF
+         [(match_operand:<VPRED> 1 "register_operand" "Upl")
+          (match_operand:SI 3 "aarch64_sve_gp_strictness")
+          (match_operand:<VNARROW> 2 "register_operand" "w")]
+         SVE2_COND_FP_UNARY_LONG))]
+  "TARGET_SVE2"
+  "<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Ventype>"
+)
+
+;; Predicated convert long top with merging.
+(define_expand "@cond_<sve_fp_op><mode>"
+  [(set (match_operand:SVE_FULL_SDF 0 "register_operand")
+       (unspec:SVE_FULL_SDF
+         [(match_operand:<VPRED> 1 "register_operand")
+          (unspec:SVE_FULL_SDF
+            [(match_dup 1)
+             (const_int SVE_STRICT_GP)
+             (match_operand:<VNARROW> 2 "register_operand")]
+            SVE2_COND_FP_UNARY_LONG)
+          (match_operand:SVE_FULL_SDF 3 "register_operand")]
+         UNSPEC_SEL))]
+  "TARGET_SVE2"
+)
+
+;; These instructions do not take MOVPRFX.
+(define_insn_and_rewrite "*cond_<sve_fp_op><mode>"
+  [(set (match_operand:SVE_FULL_SDF 0 "register_operand" "=w")
+       (unspec:SVE_FULL_SDF
+         [(match_operand:<VPRED> 1 "register_operand" "Upl")
+          (unspec:SVE_FULL_SDF
+            [(match_operand 4)
+             (match_operand:SI 5 "aarch64_sve_gp_strictness")
+             (match_operand:<VNARROW> 2 "register_operand" "w")]
+            SVE2_COND_FP_UNARY_LONG)
+          (match_operand:SVE_FULL_SDF 3 "register_operand" "0")]
+         UNSPEC_SEL))]
+  "TARGET_SVE2 && aarch64_sve_pred_dominates_p (&operands[4], operands[1])"
+  "<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Ventype>"
+  "&& !rtx_equal_p (operands[1], operands[4])"
+  {
+    operands[4] = copy_rtx (operands[1]);
+  }
+)
+
+;; -------------------------------------------------------------------------
+;; ---- [FP<-FP] Narrowing conversions
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - FCVTNT
+;; - FCVTX
+;; - FCVTXNT
+;; -------------------------------------------------------------------------
+
+;; Predicated FCVTNT.  This doesn't give a natural aarch64_pred_*/cond_*
+;; pair because the even elements always have to be supplied for active
+;; elements, even if the inactive elements don't matter.
+;;
+;; These instructions do not take MOVPRFX.
+(define_insn "@aarch64_sve2_cvtnt<mode>"
+  [(set (match_operand:<VNARROW> 0 "register_operand" "=w")
+       (unspec:<VNARROW>
+         [(match_operand:<VPRED> 2 "register_operand" "Upl")
+          (const_int SVE_STRICT_GP)
+          (match_operand:<VNARROW> 1 "register_operand" "0")
+          (match_operand:SVE_FULL_SDF 3 "register_operand" "w")]
+         UNSPEC_COND_FCVTNT))]
+  "TARGET_SVE2"
+  "fcvtnt\t%0.<Ventype>, %2/m, %3.<Vetype>"
+)
+
+;; Predicated FCVTX (equivalent to what would be FCVTXNB, except that
+;; it supports MOVPRFX).
+(define_insn "@aarch64_pred_<sve_fp_op><mode>"
+  [(set (match_operand:VNx4SF_ONLY 0 "register_operand" "=w")
+       (unspec:VNx4SF_ONLY
+         [(match_operand:<VWIDE_PRED> 1 "register_operand" "Upl")
+          (match_operand:SI 3 "aarch64_sve_gp_strictness")
+          (match_operand:<VWIDE> 2 "register_operand" "w")]
+         SVE2_COND_FP_UNARY_NARROWB))]
+  "TARGET_SVE2"
+  "<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vewtype>"
+)
+
+;; Predicated FCVTX with merging.
+(define_expand "@cond_<sve_fp_op><mode>"
+  [(set (match_operand:VNx4SF_ONLY 0 "register_operand")
+       (unspec:VNx4SF_ONLY
+         [(match_operand:<VWIDE_PRED> 1 "register_operand")
+          (unspec:VNx4SF_ONLY
+            [(match_dup 1)
+             (const_int SVE_STRICT_GP)
+             (match_operand:<VWIDE> 2 "register_operand")]
+            SVE2_COND_FP_UNARY_NARROWB)
+          (match_operand:VNx4SF_ONLY 3 "aarch64_simd_reg_or_zero")]
+         UNSPEC_SEL))]
+  "TARGET_SVE2"
+)
+
+(define_insn_and_rewrite "*cond_<sve_fp_op><mode>_any"
+  [(set (match_operand:VNx4SF_ONLY 0 "register_operand" "=&w, &w, &w")
+       (unspec:VNx4SF_ONLY
+         [(match_operand:<VWIDE_PRED> 1 "register_operand" "Upl, Upl, Upl")
+          (unspec:VNx4SF_ONLY
+            [(match_operand 4)
+             (match_operand:SI 5 "aarch64_sve_gp_strictness")
+             (match_operand:<VWIDE> 2 "register_operand" "w, w, w")]
+            SVE2_COND_FP_UNARY_NARROWB)
+          (match_operand:VNx4SF_ONLY 3 "aarch64_simd_reg_or_zero" "0, Dz, w")]
+         UNSPEC_SEL))]
+  "TARGET_SVE2
+   && !rtx_equal_p (operands[2], operands[3])
+   && aarch64_sve_pred_dominates_p (&operands[4], operands[1])"
+  "@
+   <sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vewtype>
+   movprfx\t%0.<Vewtype>, %1/z, %2.<Vewtype>\;<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vewtype>
+   movprfx\t%0, %3\;<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vewtype>"
+  "&& !rtx_equal_p (operands[1], operands[4])"
+  {
+    operands[4] = copy_rtx (operands[1]);
+  }
+  [(set_attr "movprfx" "*,yes,yes")]
+)
+
+;; Predicated FCVTXNT.  This doesn't give a natural aarch64_pred_*/cond_*
+;; pair because the even elements always have to be supplied for active
+;; elements, even if the inactive elements don't matter.
+;;
+;; These instructions do not take MOVPRFX.
+(define_insn "@aarch64_sve2_cvtxnt<mode>"
+  [(set (match_operand:<VNARROW> 0 "register_operand" "=w")
+       (unspec:<VNARROW>
+         [(match_operand:<VPRED> 2 "register_operand" "Upl")
+          (const_int SVE_STRICT_GP)
+          (match_operand:<VNARROW> 1 "register_operand" "0")
+          (match_operand:VNx2DF_ONLY 3 "register_operand" "w")]
+         UNSPEC_COND_FCVTXNT))]
+  "TARGET_SVE2"
+  "fcvtxnt\t%0.<Ventype>, %2/m, %3.<Vetype>"
+)
+
+;; =========================================================================
+;; == Other arithmetic
+;; =========================================================================
+
+;; -------------------------------------------------------------------------
+;; ---- [INT] Reciprocal approximation
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - URECPE
+;; - URSQRTE
+;; -------------------------------------------------------------------------
+
+;; Predicated integer unary operations.
+(define_insn "@aarch64_pred_<sve_int_op><mode>"
+  [(set (match_operand:VNx4SI_ONLY 0 "register_operand" "=w")
+       (unspec:VNx4SI_ONLY
+         [(match_operand:<VPRED> 1 "register_operand" "Upl")
+          (unspec:VNx4SI_ONLY
+            [(match_operand:VNx4SI_ONLY 2 "register_operand" "w")]
+            SVE2_U32_UNARY)]
+         UNSPEC_PRED_X))]
+  "TARGET_SVE2"
+  "<sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>"
+)
+
+;; Predicated integer unary operations with merging.
+(define_expand "@cond_<sve_int_op><mode>"
+  [(set (match_operand:VNx4SI_ONLY 0 "register_operand")
+       (unspec:VNx4SI_ONLY
+         [(match_operand:<VPRED> 1 "register_operand")
+          (unspec:VNx4SI_ONLY
+            [(match_dup 4)
+             (unspec:VNx4SI_ONLY
+               [(match_operand:VNx4SI_ONLY 2 "register_operand")]
+               SVE2_U32_UNARY)]
+            UNSPEC_PRED_X)
+          (match_operand:VNx4SI_ONLY 3 "aarch64_simd_reg_or_zero")]
+         UNSPEC_SEL))]
+  "TARGET_SVE2"
+  {
+    operands[4] = CONSTM1_RTX (<MODE>mode);
+  }
+)
+
+(define_insn_and_rewrite "*cond_<sve_int_op><mode>"
+  [(set (match_operand:VNx4SI_ONLY 0 "register_operand" "=w, ?&w, ?&w")
+       (unspec:VNx4SI_ONLY
+         [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl, Upl")
+          (unspec:VNx4SI_ONLY
+            [(match_operand 4)
+             (unspec:VNx4SI_ONLY
+               [(match_operand:VNx4SI_ONLY 2 "register_operand" "w, w, w")]
+               SVE2_U32_UNARY)]
+            UNSPEC_PRED_X)
+          (match_operand:VNx4SI_ONLY 3 "aarch64_simd_reg_or_zero" "0, Dz, w")]
+         UNSPEC_SEL))]
+  "TARGET_SVE2"
+  "@
+   <sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>
+   movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>
+   movprfx\t%0, %3\;<sve_int_op>\t%0.<Vetype>, %1/m, %2.<Vetype>"
+  "&& !CONSTANT_P (operands[4])"
+  {
+    operands[4] = CONSTM1_RTX (<VPRED>mode);
+  }
+  [(set_attr "movprfx" "*,yes,yes")]
+)
+
+;; -------------------------------------------------------------------------
+;; ---- [INT<-FP] Base-2 logarithm
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - FLOGB
+;; -------------------------------------------------------------------------
+
+;; Predicated FLOGB.
+(define_insn "@aarch64_pred_<sve_fp_op><mode>"
+  [(set (match_operand:<V_INT_EQUIV> 0 "register_operand" "=w")
+       (unspec:<V_INT_EQUIV>
+         [(match_operand:<VPRED> 1 "register_operand" "Upl")
+          (match_operand:SI 3 "aarch64_sve_gp_strictness")
+          (match_operand:SVE_FULL_F 2 "register_operand" "w")]
+         SVE2_COND_INT_UNARY_FP))]
+  "TARGET_SVE2"
+  "<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vetype>"
+)
+
+;; Predicated FLOGB with merging.
+(define_expand "@cond_<sve_fp_op><mode>"
+  [(set (match_operand:<V_INT_EQUIV> 0 "register_operand")
+       (unspec:<V_INT_EQUIV>
+         [(match_operand:<VPRED> 1 "register_operand")
+          (unspec:<V_INT_EQUIV>
+            [(match_dup 1)
+             (const_int SVE_STRICT_GP)
+             (match_operand:SVE_FULL_F 2 "register_operand")]
+            SVE2_COND_INT_UNARY_FP)
+          (match_operand:<V_INT_EQUIV> 3 "aarch64_simd_reg_or_zero")]
+         UNSPEC_SEL))]
+  "TARGET_SVE2"
+)
+
+(define_insn_and_rewrite "*cond_<sve_fp_op><mode>"
+  [(set (match_operand:<V_INT_EQUIV> 0 "register_operand" "=&w, ?&w, ?&w")
+       (unspec:<V_INT_EQUIV>
+         [(match_operand:<VPRED> 1 "register_operand" "Upl, Upl, Upl")
+          (unspec:<V_INT_EQUIV>
+            [(match_operand 4)
+             (match_operand:SI 5 "aarch64_sve_gp_strictness")
+             (match_operand:SVE_FULL_F 2 "register_operand" "w, w, w")]
+            SVE2_COND_INT_UNARY_FP)
+          (match_operand:<V_INT_EQUIV> 3 "aarch64_simd_reg_or_zero" "0, Dz, w")]
+         UNSPEC_SEL))]
+  "TARGET_SVE2
+   && !rtx_equal_p (operands[2], operands[3])
+   && aarch64_sve_pred_dominates_p (&operands[4], operands[1])"
+  "@
+   <sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vetype>
+   movprfx\t%0.<Vetype>, %1/z, %2.<Vetype>\;<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vetype>
+   movprfx\t%0, %3\;<sve_fp_op>\t%0.<Vetype>, %1/m, %2.<Vetype>"
+  "&& !rtx_equal_p (operands[1], operands[4])"
+  {
+    operands[4] = copy_rtx (operands[1]);
+  }
+  [(set_attr "movprfx" "*,yes,yes")]
+)
+
+;; -------------------------------------------------------------------------
+;; ---- [INT] Polynomial multiplication
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - PMUL
+;; - PMULLB
+;; - PMULLT
+;; -------------------------------------------------------------------------
+
+;; Uniform PMUL.
+(define_insn "@aarch64_sve2_pmul<mode>"
+  [(set (match_operand:VNx16QI_ONLY 0 "register_operand" "=w")
+       (unspec:VNx16QI_ONLY
+         [(match_operand:VNx16QI_ONLY 1 "register_operand" "w")
+          (match_operand:VNx16QI_ONLY 2 "register_operand" "w")]
+         UNSPEC_PMUL))]
+  "TARGET_SVE2"
+  "pmul\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>"
+)
+
+;; Extending PMUL, with the results modeled as wider vectors.
+;; This representation is only possible for .H and .D, not .Q.
+(define_insn "@aarch64_sve_<optab><mode>"
+  [(set (match_operand:SVE_FULL_HDI 0 "register_operand" "=w")
+       (unspec:SVE_FULL_HDI
+         [(match_operand:<VNARROW> 1 "register_operand" "w")
+          (match_operand:<VNARROW> 2 "register_operand" "w")]
+         SVE2_PMULL))]
+  "TARGET_SVE2"
+  "<sve_int_op>\t%0.<Vetype>, %1.<Ventype>, %2.<Ventype>"
+)
+
+;; Extending PMUL, with the results modeled as pairs of values.
+;; This representation works for .H, .D and .Q, with .Q requiring
+;; the AES extension.  (This is enforced by the mode iterator.)
+(define_insn "@aarch64_sve_<optab><mode>"
+  [(set (match_operand:SVE2_PMULL_PAIR_I 0 "register_operand" "=w")
+       (unspec:SVE2_PMULL_PAIR_I
+         [(match_operand:SVE2_PMULL_PAIR_I 1 "register_operand" "w")
+          (match_operand:SVE2_PMULL_PAIR_I 2 "register_operand" "w")]
+         SVE2_PMULL_PAIR))]
+  "TARGET_SVE2"
+  "<sve_int_op>\t%0.<Vewtype>, %1.<Vetype>, %2.<Vetype>"
+)
+
+;; =========================================================================
+;; == Permutation
+;; =========================================================================
+
+;; -------------------------------------------------------------------------
+;; ---- [INT,FP] General permutes
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - TBL (vector pair form)
+;; - TBX
+;; -------------------------------------------------------------------------
+
+;; TBL on a pair of data vectors.
+(define_insn "@aarch64_sve2_tbl2<mode>"
+  [(set (match_operand:SVE_FULL 0 "register_operand" "=w")
+       (unspec:SVE_FULL
+         [(match_operand:<VDOUBLE> 1 "register_operand" "w")
+          (match_operand:<V_INT_EQUIV> 2 "register_operand" "w")]
+         UNSPEC_TBL2))]
+  "TARGET_SVE2"
+  "tbl\t%0.<Vetype>, %1, %2.<Vetype>"
+)
+
+;; TBX.  These instructions do not take MOVPRFX.
+(define_insn "@aarch64_sve2_tbx<mode>"
+  [(set (match_operand:SVE_FULL 0 "register_operand" "=w")
+       (unspec:SVE_FULL
+         [(match_operand:SVE_FULL 1 "register_operand" "0")
+          (match_operand:SVE_FULL 2 "register_operand" "w")
+          (match_operand:<V_INT_EQUIV> 3 "register_operand" "w")]
+         UNSPEC_TBX))]
+  "TARGET_SVE2"
+  "tbx\t%0.<Vetype>, %2.<Vetype>, %3.<Vetype>"
+)
+
+;; -------------------------------------------------------------------------
+;; ---- [INT] Optional bit-permute extensions
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - BDEP
+;; - BEXT
+;; - BGRP
+;; -------------------------------------------------------------------------
+
+(define_insn "@aarch64_sve_<sve_int_op><mode>"
+  [(set (match_operand:SVE_FULL_I 0 "register_operand" "=w")
+       (unspec:SVE_FULL_I
+         [(match_operand:SVE_FULL_I 1 "register_operand" "w")
+          (match_operand:SVE_FULL_I 2 "register_operand" "w")]
+         SVE2_INT_BITPERM))]
+  "TARGET_SVE2_BITPERM"
+  "<sve_int_op>\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>"
 )
 
 ;; =========================================================================
   emit_insn (gen_aarch64_cstore<mode> (operands[0], cmp, cc_reg));
   DONE;
 })
+
+;; -------------------------------------------------------------------------
+;; ---- Histogram processing
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - HISTCNT
+;; - HISTSEG
+;; -------------------------------------------------------------------------
+
+(define_insn "@aarch64_sve2_histcnt<mode>"
+  [(set (match_operand:SVE_FULL_SDI 0 "register_operand" "=w")
+       (unspec:SVE_FULL_SDI
+         [(match_operand:<VPRED> 1 "register_operand" "Upl")
+          (match_operand:SVE_FULL_SDI 2 "register_operand" "w")
+          (match_operand:SVE_FULL_SDI 3 "register_operand" "w")]
+         UNSPEC_HISTCNT))]
+  "TARGET_SVE2"
+  "histcnt\t%0.<Vetype>, %1/z, %2.<Vetype>, %3.<Vetype>"
+)
+
+(define_insn "@aarch64_sve2_histseg<mode>"
+  [(set (match_operand:VNx16QI_ONLY 0 "register_operand" "=w")
+       (unspec:VNx16QI_ONLY
+         [(match_operand:VNx16QI_ONLY 1 "register_operand" "w")
+          (match_operand:VNx16QI_ONLY 2 "register_operand" "w")]
+         UNSPEC_HISTSEG))]
+  "TARGET_SVE2"
+  "histseg\t%0.<Vetype>, %1.<Vetype>, %2.<Vetype>"
+)
+
+;; -------------------------------------------------------------------------
+;; ---- String matching
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - MATCH
+;; - NMATCH
+;; -------------------------------------------------------------------------
+
+;; Predicated string matching.
+(define_insn "@aarch64_pred_<sve_int_op><mode>"
+  [(set (match_operand:<VPRED> 0 "register_operand" "=Upa")
+       (unspec:<VPRED>
+         [(match_operand:<VPRED> 1 "register_operand" "Upl")
+          (match_operand:SI 2 "aarch64_sve_ptrue_flag")
+          (unspec:<VPRED>
+            [(match_operand:SVE_FULL_BHI 3 "register_operand" "w")
+             (match_operand:SVE_FULL_BHI 4 "register_operand" "w")]
+            SVE2_MATCH)]
+         UNSPEC_PRED_Z))
+   (clobber (reg:CC_NZC CC_REGNUM))]
+  "TARGET_SVE2"
+  "<sve_int_op>\t%0.<Vetype>, %1/z, %3.<Vetype>, %4.<Vetype>"
+)
+
+;; Predicated string matching in which both the flag and predicate results
+;; are interesting.
+(define_insn_and_rewrite "*aarch64_pred_<sve_int_op><mode>_cc"
+  [(set (reg:CC_NZC CC_REGNUM)
+       (unspec:CC_NZC
+         [(match_operand:VNx16BI 1 "register_operand" "Upl")
+          (match_operand 4)
+          (match_operand:SI 5 "aarch64_sve_ptrue_flag")
+          (unspec:<VPRED>
+            [(match_operand 6)
+             (match_operand:SI 7 "aarch64_sve_ptrue_flag")
+             (unspec:<VPRED>
+               [(match_operand:SVE_FULL_BHI 2 "register_operand" "w")
+                (match_operand:SVE_FULL_BHI 3 "register_operand" "w")]
+               SVE2_MATCH)]
+            UNSPEC_PRED_Z)]
+         UNSPEC_PTEST))
+   (set (match_operand:<VPRED> 0 "register_operand" "=Upa")
+       (unspec:<VPRED>
+         [(match_dup 6)
+          (match_dup 7)
+          (unspec:<VPRED>
+            [(match_dup 2)
+             (match_dup 3)]
+            SVE2_MATCH)]
+         UNSPEC_PRED_Z))]
+  "TARGET_SVE2
+   && aarch64_sve_same_pred_for_ptest_p (&operands[4], &operands[6])"
+  "<sve_int_op>\t%0.<Vetype>, %1/z, %2.<Vetype>, %3.<Vetype>"
+  "&& !rtx_equal_p (operands[4], operands[6])"
+  {
+    operands[6] = copy_rtx (operands[4]);
+    operands[7] = operands[5];
+  }
+)
+
+;; Predicated string matching in which only the flags result is interesting.
+(define_insn_and_rewrite "*aarch64_pred_<sve_int_op><mode>_ptest"
+  [(set (reg:CC_NZC CC_REGNUM)
+       (unspec:CC_NZC
+         [(match_operand:VNx16BI 1 "register_operand" "Upl")
+          (match_operand 4)
+          (match_operand:SI 5 "aarch64_sve_ptrue_flag")
+          (unspec:<VPRED>
+            [(match_operand 6)
+             (match_operand:SI 7 "aarch64_sve_ptrue_flag")
+             (unspec:<VPRED>
+               [(match_operand:SVE_FULL_BHI 2 "register_operand" "w")
+                (match_operand:SVE_FULL_BHI 3 "register_operand" "w")]
+               SVE2_MATCH)]
+            UNSPEC_PRED_Z)]
+         UNSPEC_PTEST))
+   (clobber (match_scratch:<VPRED> 0 "=Upa"))]
+  "TARGET_SVE2
+   && aarch64_sve_same_pred_for_ptest_p (&operands[4], &operands[6])"
+  "<sve_int_op>\t%0.<Vetype>, %1/z, %2.<Vetype>, %3.<Vetype>"
+  "&& !rtx_equal_p (operands[4], operands[6])"
+  {
+    operands[6] = copy_rtx (operands[4]);
+    operands[7] = operands[5];
+  }
+)
+
+;; =========================================================================
+;; == Crypotographic extensions
+;; =========================================================================
+
+;; -------------------------------------------------------------------------
+;; ---- Optional AES extensions
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - AESD
+;; - AESE
+;; - AESIMC
+;; - AESMC
+;; -------------------------------------------------------------------------
+
+;; AESD and AESE.
+(define_insn "aarch64_sve2_aes<aes_op>"
+  [(set (match_operand:VNx16QI 0 "register_operand" "=w")
+       (unspec:VNx16QI
+         [(xor:VNx16QI
+            (match_operand:VNx16QI 1 "register_operand" "%0")
+            (match_operand:VNx16QI 2 "register_operand" "w"))]
+          CRYPTO_AES))]
+  "TARGET_SVE2_AES"
+  "aes<aes_op>\t%0.b, %0.b, %2.b"
+  [(set_attr "type" "crypto_aese")]
+)
+
+;; AESMC and AESIMC.  These instructions do not take MOVPRFX.
+(define_insn "aarch64_sve2_aes<aesmc_op>"
+  [(set (match_operand:VNx16QI 0 "register_operand" "=w")
+       (unspec:VNx16QI
+         [(match_operand:VNx16QI 1 "register_operand" "0")]
+         CRYPTO_AESMC))]
+  "TARGET_SVE2_AES"
+  "aes<aesmc_op>\t%0.b, %0.b"
+  [(set_attr "type" "crypto_aesmc")]
+)
+
+;; When AESE/AESMC and AESD/AESIMC fusion is enabled, we really want
+;; to keep the two together and enforce the register dependency without
+;; scheduling or register allocation messing up the order or introducing
+;; moves inbetween.  Mash the two together during combine.
+
+(define_insn "*aarch64_sve2_aese_fused"
+  [(set (match_operand:VNx16QI 0 "register_operand" "=w")
+       (unspec:VNx16QI
+         [(unspec:VNx16QI
+            [(xor:VNx16QI
+               (match_operand:VNx16QI 1 "register_operand" "%0")
+               (match_operand:VNx16QI 2 "register_operand" "w"))]
+            UNSPEC_AESE)]
+         UNSPEC_AESMC))]
+  "TARGET_SVE2_AES && aarch64_fusion_enabled_p (AARCH64_FUSE_AES_AESMC)"
+  "aese\t%0.b, %0.b, %2.b\;aesmc\t%0.b, %0.b"
+  [(set_attr "type" "crypto_aese")
+   (set_attr "length" "8")]
+)
+
+(define_insn "*aarch64_sve2_aesd_fused"
+  [(set (match_operand:VNx16QI 0 "register_operand" "=w")
+       (unspec:VNx16QI
+         [(unspec:VNx16QI
+            [(xor:VNx16QI
+               (match_operand:VNx16QI 1 "register_operand" "%0")
+               (match_operand:VNx16QI 2 "register_operand" "w"))]
+            UNSPEC_AESD)]
+         UNSPEC_AESIMC))]
+  "TARGET_SVE2_AES && aarch64_fusion_enabled_p (AARCH64_FUSE_AES_AESMC)"
+  "aesd\t%0.b, %0.b, %2.b\;aesimc\t%0.b, %0.b"
+  [(set_attr "type" "crypto_aese")
+   (set_attr "length" "8")]
+)
+
+;; -------------------------------------------------------------------------
+;; ---- Optional SHA-3 extensions
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - RAX1
+;; -------------------------------------------------------------------------
+
+(define_insn "aarch64_sve2_rax1"
+  [(set (match_operand:VNx2DI 0 "register_operand" "=w")
+       (xor:VNx2DI
+         (rotate:VNx2DI
+           (match_operand:VNx2DI 2 "register_operand" "w")
+           (const_int 1))
+         (match_operand:VNx2DI 1 "register_operand" "w")))]
+  "TARGET_SVE2_SHA3"
+  "rax1\t%0.d, %1.d, %2.d"
+  [(set_attr "type" "crypto_sha3")]
+)
+
+;; -------------------------------------------------------------------------
+;; ---- Optional SM4 extensions
+;; -------------------------------------------------------------------------
+;; Includes:
+;; - SM4E
+;; - SM4EKEY
+;; -------------------------------------------------------------------------
+
+;; These instructions do not take MOVPRFX.
+(define_insn "aarch64_sve2_sm4e"
+  [(set (match_operand:VNx4SI 0 "register_operand" "=w")
+       (unspec:VNx4SI
+         [(match_operand:VNx4SI 1 "register_operand" "0")
+          (match_operand:VNx4SI 2 "register_operand" "w")]
+         UNSPEC_SM4E))]
+  "TARGET_SVE2_SM4"
+  "sm4e\t%0.s, %0.s, %2.s"
+  [(set_attr "type" "crypto_sm4")]
+)
+
+(define_insn "aarch64_sve2_sm4ekey"
+  [(set (match_operand:VNx4SI 0 "register_operand" "=w")
+       (unspec:VNx4SI
+         [(match_operand:VNx4SI 1 "register_operand" "w")
+          (match_operand:VNx4SI 2 "register_operand" "w")]
+         UNSPEC_SM4EKEY))]
+  "TARGET_SVE2_SM4"
+  "sm4ekey\t%0.s, %1.s, %2.s"
+  [(set_attr "type" "crypto_sm4")]
+)
index 04dabd4..af5b00c 100644 (file)
@@ -248,6 +248,10 @@ extern unsigned aarch64_architecture_version;
 #define AARCH64_ISA_F16                   (aarch64_isa_flags & AARCH64_FL_F16)
 #define AARCH64_ISA_SVE            (aarch64_isa_flags & AARCH64_FL_SVE)
 #define AARCH64_ISA_SVE2          (aarch64_isa_flags & AARCH64_FL_SVE2)
+#define AARCH64_ISA_SVE2_AES      (aarch64_isa_flags & AARCH64_FL_SVE2_AES)
+#define AARCH64_ISA_SVE2_BITPERM  (aarch64_isa_flags & AARCH64_FL_SVE2_BITPERM)
+#define AARCH64_ISA_SVE2_SHA3     (aarch64_isa_flags & AARCH64_FL_SVE2_SHA3)
+#define AARCH64_ISA_SVE2_SM4      (aarch64_isa_flags & AARCH64_FL_SVE2_SM4)
 #define AARCH64_ISA_V8_3          (aarch64_isa_flags & AARCH64_FL_V8_3)
 #define AARCH64_ISA_DOTPROD       (aarch64_isa_flags & AARCH64_FL_DOTPROD)
 #define AARCH64_ISA_AES                   (aarch64_isa_flags & AARCH64_FL_AES)
@@ -302,6 +306,18 @@ extern unsigned aarch64_architecture_version;
 /* SVE2 instructions, enabled through +sve2.  */
 #define TARGET_SVE2 (AARCH64_ISA_SVE2)
 
+/* SVE2 AES instructions, enabled through +sve2-aes.  */
+#define TARGET_SVE2_AES (AARCH64_ISA_SVE2_AES)
+
+/* SVE2 BITPERM instructions, enabled through +sve2-bitperm.  */
+#define TARGET_SVE2_BITPERM (AARCH64_ISA_SVE2_BITPERM)
+
+/* SVE2 SHA3 instructions, enabled through +sve2-sha3.  */
+#define TARGET_SVE2_SHA3 (AARCH64_ISA_SVE2_SHA3)
+
+/* SVE2 SM4 instructions, enabled through +sve2-sm4.  */
+#define TARGET_SVE2_SM4 (AARCH64_ISA_SVE2_SM4)
+
 /* ARMv8.3-A features.  */
 #define TARGET_ARMV8_3 (AARCH64_ISA_V8_3)
 
index 509b9e5..a144e24 100644 (file)
     UNSPEC_LD1RQ
     UNSPEC_LD1_GATHER
     UNSPEC_LDFF1_GATHER
+    UNSPEC_LDNT1_GATHER
     UNSPEC_ST1_SCATTER
+    UNSPEC_STNT1_SCATTER
     UNSPEC_PRED_X
     UNSPEC_PRED_Z
     UNSPEC_PTEST
     UNSPEC_UNPACKSLO
     UNSPEC_UNPACKULO
     UNSPEC_PACK
+    UNSPEC_WHILEGE
+    UNSPEC_WHILEGT
+    UNSPEC_WHILEHI
+    UNSPEC_WHILEHS
     UNSPEC_WHILELE
     UNSPEC_WHILELO
     UNSPEC_WHILELS
index c6b71a6..058c6bc 100644 (file)
 (define_mode_iterator VMUL_CHANGE_NLANES [V4HI V8HI V2SI V4SI V2SF V4SF])
 
 ;; Iterators for single modes, for "@" patterns.
+(define_mode_iterator VNx16QI_ONLY [VNx16QI])
 (define_mode_iterator VNx8HI_ONLY [VNx8HI])
 (define_mode_iterator VNx4SI_ONLY [VNx4SI])
+(define_mode_iterator VNx4SF_ONLY [VNx4SF])
 (define_mode_iterator VNx2DI_ONLY [VNx2DI])
 (define_mode_iterator VNx2DF_ONLY [VNx2DF])
 
                                  VNx64QI VNx32HI VNx16SI VNx8DI
                                  VNx32HF VNx16SF VNx8DF])
 
+;; SVE_STRUCT restricted to 2-vector tuples.
+(define_mode_iterator SVE_STRUCT2 [VNx32QI VNx16HI VNx8SI VNx4DI
+                                  VNx16HF VNx8SF VNx4DF])
+
 ;; All fully-packed SVE vector modes.
 (define_mode_iterator SVE_FULL [VNx16QI VNx8HI VNx4SI VNx2DI
                                VNx8HF VNx4SF VNx2DF])
 ;; All fully-packed SVE floating-point vector modes.
 (define_mode_iterator SVE_FULL_F [VNx8HF VNx4SF VNx2DF])
 
+;; Fully-packed SVE integer vector modes that have 8-bit or 16-bit elements.
+(define_mode_iterator SVE_FULL_BHI [VNx16QI VNx8HI])
+
 ;; Fully-packed SVE integer vector modes that have 8-bit, 16-bit or 32-bit
 ;; elements.
 (define_mode_iterator SVE_FULL_BHSI [VNx16QI VNx8HI VNx4SI])
 ;; elements.
 (define_mode_iterator SVE_FULL_HSDI [VNx8HI VNx4SI VNx2DI])
 
+;; Fully-packed SVE integer vector modes that have 16-bit or 32-bit
+;; elements.
+(define_mode_iterator SVE_FULL_HSI [VNx8HI VNx4SI])
+
 ;; Fully-packed SVE floating-point vector modes that have 16-bit or 32-bit
 ;; elements.
 (define_mode_iterator SVE_FULL_HSF [VNx8HF VNx4SF])
 
+;; Fully-packed SVE integer vector modes that have 16-bit or 64-bit elements.
+(define_mode_iterator SVE_FULL_HDI [VNx8HI VNx2DI])
+
 ;; Fully-packed SVE vector modes that have 32-bit or 64-bit elements.
 (define_mode_iterator SVE_FULL_SD [VNx4SI VNx2DI VNx4SF VNx2DF])
 
 ;; SVE integer modes with 4 elements, excluding the narrowest element.
 (define_mode_iterator SVE_4HSI [VNx4HI VNx4SI])
 
+;; SVE integer modes that can form the input to an SVE2 PMULL[BT] instruction.
+(define_mode_iterator SVE2_PMULL_PAIR_I [VNx16QI VNx4SI
+                                        (VNx2DI "TARGET_SVE2_AES")])
+
 ;; Modes involved in extending or truncating SVE data, for 8 elements per
 ;; 128-bit block.
 (define_mode_iterator VNx8_NARROW [VNx8QI])
     UNSPEC_RSUBHN2     ; Used in aarch64-simd.md.
     UNSPEC_SQDMULH     ; Used in aarch64-simd.md.
     UNSPEC_SQRDMULH    ; Used in aarch64-simd.md.
-    UNSPEC_SMULLB      ; Used in aarch64-sve2.md.
-    UNSPEC_SMULLT      ; Used in aarch64-sve2.md.
-    UNSPEC_UMULLB      ; Used in aarch64-sve2.md.
-    UNSPEC_UMULLT      ; Used in aarch64-sve2.md.
     UNSPEC_PMUL                ; Used in aarch64-simd.md.
     UNSPEC_FMULX       ; Used in aarch64-simd.md.
     UNSPEC_USQADD      ; Used in aarch64-simd.md.
     UNSPEC_UQSHRN      ; Used in aarch64-simd.md.
     UNSPEC_SQRSHRN     ; Used in aarch64-simd.md.
     UNSPEC_UQRSHRN     ; Used in aarch64-simd.md.
-    UNSPEC_SHRNB       ; Used in aarch64-sve2.md.
-    UNSPEC_SHRNT       ; Used in aarch64-sve2.md.
-    UNSPEC_RSHRNB      ; Used in aarch64-sve2.md.
-    UNSPEC_RSHRNT      ; Used in aarch64-sve2.md.
     UNSPEC_SSHL                ; Used in aarch64-simd.md.
     UNSPEC_USHL                ; Used in aarch64-simd.md.
     UNSPEC_SRSHL       ; Used in aarch64-simd.md.
     UNSPEC_FCMLA90     ; Used in aarch64-simd.md.
     UNSPEC_FCMLA180    ; Used in aarch64-simd.md.
     UNSPEC_FCMLA270    ; Used in aarch64-simd.md.
-    UNSPEC_SMULHS      ; Used in aarch64-sve2.md.
+    UNSPEC_ASRD                ; Used in aarch64-sve.md.
+    UNSPEC_ADCLB       ; Used in aarch64-sve2.md.
+    UNSPEC_ADCLT       ; Used in aarch64-sve2.md.
+    UNSPEC_ADDHNB      ; Used in aarch64-sve2.md.
+    UNSPEC_ADDHNT      ; Used in aarch64-sve2.md.
+    UNSPEC_BDEP                ; Used in aarch64-sve2.md.
+    UNSPEC_BEXT                ; Used in aarch64-sve2.md.
+    UNSPEC_BGRP                ; Used in aarch64-sve2.md.
+    UNSPEC_CADD270     ; Used in aarch64-sve2.md.
+    UNSPEC_CADD90      ; Used in aarch64-sve2.md.
+    UNSPEC_CDOT                ; Used in aarch64-sve2.md.
+    UNSPEC_CDOT180     ; Used in aarch64-sve2.md.
+    UNSPEC_CDOT270     ; Used in aarch64-sve2.md.
+    UNSPEC_CDOT90      ; Used in aarch64-sve2.md.
+    UNSPEC_CMLA                ; Used in aarch64-sve2.md.
+    UNSPEC_CMLA180     ; Used in aarch64-sve2.md.
+    UNSPEC_CMLA270     ; Used in aarch64-sve2.md.
+    UNSPEC_CMLA90      ; Used in aarch64-sve2.md.
+    UNSPEC_COND_FCVTLT ; Used in aarch64-sve2.md.
+    UNSPEC_COND_FCVTNT ; Used in aarch64-sve2.md.
+    UNSPEC_COND_FCVTX  ; Used in aarch64-sve2.md.
+    UNSPEC_COND_FCVTXNT        ; Used in aarch64-sve2.md.
+    UNSPEC_COND_FLOGB  ; Used in aarch64-sve2.md.
+    UNSPEC_EORBT       ; Used in aarch64-sve2.md.
+    UNSPEC_EORTB       ; Used in aarch64-sve2.md.
+    UNSPEC_FADDP       ; Used in aarch64-sve2.md.
+    UNSPEC_FMAXNMP     ; Used in aarch64-sve2.md.
+    UNSPEC_FMAXP       ; Used in aarch64-sve2.md.
+    UNSPEC_FMINNMP     ; Used in aarch64-sve2.md.
+    UNSPEC_FMINP       ; Used in aarch64-sve2.md.
+    UNSPEC_FMLALB      ; Used in aarch64-sve2.md.
+    UNSPEC_FMLALT      ; Used in aarch64-sve2.md.
+    UNSPEC_FMLSLB      ; Used in aarch64-sve2.md.
+    UNSPEC_FMLSLT      ; Used in aarch64-sve2.md.
+    UNSPEC_HISTCNT     ; Used in aarch64-sve2.md.
+    UNSPEC_HISTSEG     ; Used in aarch64-sve2.md.
+    UNSPEC_MATCH       ; Used in aarch64-sve2.md.
+    UNSPEC_NMATCH      ; Used in aarch64-sve2.md.
+    UNSPEC_PMULLB      ; Used in aarch64-sve2.md.
+    UNSPEC_PMULLB_PAIR ; Used in aarch64-sve2.md.
+    UNSPEC_PMULLT      ; Used in aarch64-sve2.md.
+    UNSPEC_PMULLT_PAIR ; Used in aarch64-sve2.md.
+    UNSPEC_RADDHNB     ; Used in aarch64-sve2.md.
+    UNSPEC_RADDHNT     ; Used in aarch64-sve2.md.
+    UNSPEC_RSHRNB      ; Used in aarch64-sve2.md.
+    UNSPEC_RSHRNT      ; Used in aarch64-sve2.md.
+    UNSPEC_RSUBHNB     ; Used in aarch64-sve2.md.
+    UNSPEC_RSUBHNT     ; Used in aarch64-sve2.md.
+    UNSPEC_SABDLB      ; Used in aarch64-sve2.md.
+    UNSPEC_SABDLT      ; Used in aarch64-sve2.md.
+    UNSPEC_SADDLB      ; Used in aarch64-sve2.md.
+    UNSPEC_SADDLBT     ; Used in aarch64-sve2.md.
+    UNSPEC_SADDLT      ; Used in aarch64-sve2.md.
+    UNSPEC_SADDWB      ; Used in aarch64-sve2.md.
+    UNSPEC_SADDWT      ; Used in aarch64-sve2.md.
+    UNSPEC_SBCLB       ; Used in aarch64-sve2.md.
+    UNSPEC_SBCLT       ; Used in aarch64-sve2.md.
+    UNSPEC_SHRNB       ; Used in aarch64-sve2.md.
+    UNSPEC_SHRNT       ; Used in aarch64-sve2.md.
+    UNSPEC_SLI         ; Used in aarch64-sve2.md.
+    UNSPEC_SMAXP       ; Used in aarch64-sve2.md.
+    UNSPEC_SMINP       ; Used in aarch64-sve2.md.
     UNSPEC_SMULHRS     ; Used in aarch64-sve2.md.
-    UNSPEC_UMULHS      ; Used in aarch64-sve2.md.
+    UNSPEC_SMULHS      ; Used in aarch64-sve2.md.
+    UNSPEC_SMULLB      ; Used in aarch64-sve2.md.
+    UNSPEC_SMULLT      ; Used in aarch64-sve2.md.
+    UNSPEC_SQCADD270   ; Used in aarch64-sve2.md.
+    UNSPEC_SQCADD90    ; Used in aarch64-sve2.md.
+    UNSPEC_SQDMULLB    ; Used in aarch64-sve2.md.
+    UNSPEC_SQDMULLBT   ; Used in aarch64-sve2.md.
+    UNSPEC_SQDMULLT    ; Used in aarch64-sve2.md.
+    UNSPEC_SQRDCMLAH   ; Used in aarch64-sve2.md.
+    UNSPEC_SQRDCMLAH180        ; Used in aarch64-sve2.md.
+    UNSPEC_SQRDCMLAH270        ; Used in aarch64-sve2.md.
+    UNSPEC_SQRDCMLAH90 ; Used in aarch64-sve2.md.
+    UNSPEC_SQRSHRNB    ; Used in aarch64-sve2.md.
+    UNSPEC_SQRSHRNT    ; Used in aarch64-sve2.md.
+    UNSPEC_SQRSHRUNB   ; Used in aarch64-sve2.md.
+    UNSPEC_SQRSHRUNT   ; Used in aarch64-sve2.md.
+    UNSPEC_SQSHRNB     ; Used in aarch64-sve2.md.
+    UNSPEC_SQSHRNT     ; Used in aarch64-sve2.md.
+    UNSPEC_SQSHRUNB    ; Used in aarch64-sve2.md.
+    UNSPEC_SQSHRUNT    ; Used in aarch64-sve2.md.
+    UNSPEC_SQXTNB      ; Used in aarch64-sve2.md.
+    UNSPEC_SQXTNT      ; Used in aarch64-sve2.md.
+    UNSPEC_SQXTUNB     ; Used in aarch64-sve2.md.
+    UNSPEC_SQXTUNT     ; Used in aarch64-sve2.md.
+    UNSPEC_SRI         ; Used in aarch64-sve2.md.
+    UNSPEC_SSHLLB      ; Used in aarch64-sve2.md.
+    UNSPEC_SSHLLT      ; Used in aarch64-sve2.md.
+    UNSPEC_SSUBLB      ; Used in aarch64-sve2.md.
+    UNSPEC_SSUBLBT     ; Used in aarch64-sve2.md.
+    UNSPEC_SSUBLT      ; Used in aarch64-sve2.md.
+    UNSPEC_SSUBLTB     ; Used in aarch64-sve2.md.
+    UNSPEC_SSUBWB      ; Used in aarch64-sve2.md.
+    UNSPEC_SSUBWT      ; Used in aarch64-sve2.md.
+    UNSPEC_SUBHNB      ; Used in aarch64-sve2.md.
+    UNSPEC_SUBHNT      ; Used in aarch64-sve2.md.
+    UNSPEC_TBL2                ; Used in aarch64-sve2.md.
+    UNSPEC_UABDLB      ; Used in aarch64-sve2.md.
+    UNSPEC_UABDLT      ; Used in aarch64-sve2.md.
+    UNSPEC_UADDLB      ; Used in aarch64-sve2.md.
+    UNSPEC_UADDLT      ; Used in aarch64-sve2.md.
+    UNSPEC_UADDWB      ; Used in aarch64-sve2.md.
+    UNSPEC_UADDWT      ; Used in aarch64-sve2.md.
+    UNSPEC_UMAXP       ; Used in aarch64-sve2.md.
+    UNSPEC_UMINP       ; Used in aarch64-sve2.md.
     UNSPEC_UMULHRS     ; Used in aarch64-sve2.md.
-    UNSPEC_ASRD                ; Used in aarch64-sve.md.
+    UNSPEC_UMULHS      ; Used in aarch64-sve2.md.
+    UNSPEC_UMULLB      ; Used in aarch64-sve2.md.
+    UNSPEC_UMULLT      ; Used in aarch64-sve2.md.
+    UNSPEC_UQRSHRNB    ; Used in aarch64-sve2.md.
+    UNSPEC_UQRSHRNT    ; Used in aarch64-sve2.md.
+    UNSPEC_UQSHRNB     ; Used in aarch64-sve2.md.
+    UNSPEC_UQSHRNT     ; Used in aarch64-sve2.md.
+    UNSPEC_UQXTNB      ; Used in aarch64-sve2.md.
+    UNSPEC_UQXTNT      ; Used in aarch64-sve2.md.
+    UNSPEC_USHLLB      ; Used in aarch64-sve2.md.
+    UNSPEC_USHLLT      ; Used in aarch64-sve2.md.
+    UNSPEC_USUBLB      ; Used in aarch64-sve2.md.
+    UNSPEC_USUBLT      ; Used in aarch64-sve2.md.
+    UNSPEC_USUBWB      ; Used in aarch64-sve2.md.
+    UNSPEC_USUBWT      ; Used in aarch64-sve2.md.
 ])
 
 ;; ------------------------------------------------------------------
 (define_mode_attr VNARROWQ2 [(V8HI "V16QI") (V4SI "V8HI")
                             (V2DI "V4SI")])
 
+;; Narrowed modes of vector modes.
+(define_mode_attr VNARROW [(VNx8HI "VNx16QI")
+                          (VNx4SI "VNx8HI") (VNx4SF "VNx8HF")
+                          (VNx2DI "VNx4SI") (VNx2DF "VNx4SF")])
+
 ;; Register suffix narrowed modes for VQN.
 (define_mode_attr Vntype [(V8HI "8b") (V4SI "4h")
                          (V2DI "2s")])
                          (V8HI "4s") (V4SI "2d")
                          (V8HF "4s") (V4SF "2d")])
 
-;; SVE vector after widening
+;; SVE vector after narrowing.
+(define_mode_attr Ventype [(VNx8HI "b")
+                          (VNx4SI "h") (VNx4SF "h")
+                          (VNx2DI "s") (VNx2DF "s")])
+
+;; SVE vector after widening.
 (define_mode_attr Vewtype [(VNx16QI "h")
                           (VNx8HI  "s") (VNx8HF "s")
-                          (VNx4SI  "d") (VNx4SF "d")])
+                          (VNx4SI  "d") (VNx4SF "d")
+                          (VNx2DI  "q")])
 
 ;; Widened mode register suffixes for VDW/VQW.
 (define_mode_attr Vmwtype [(V8QI ".8h") (V4HI ".4s")
                         (VNx16SI "vnx4bi") (VNx16SF "vnx4bi")
                         (VNx8DI "vnx2bi") (VNx8DF "vnx2bi")])
 
+(define_mode_attr VDOUBLE [(VNx16QI "VNx32QI")
+                          (VNx8HI "VNx16HI") (VNx8HF "VNx16HF")
+                          (VNx4SI "VNx8SI") (VNx4SF "VNx8SF")
+                          (VNx2DI "VNx4DI") (VNx2DF "VNx4DF")])
+
 ;; On AArch64 the By element instruction doesn't have a 2S variant.
 ;; However because the instruction always selects a pair of values
 ;; The normal 3SAME instruction can be used here instead.
                                 (VNx2DI "0x27")])
 
 ;; The constraint to use for an SVE [SU]DOT, FMUL, FMLA or FMLS lane index.
-(define_mode_attr sve_lane_con [(VNx4SI "y") (VNx2DI "x")
+(define_mode_attr sve_lane_con [(VNx8HI "y") (VNx4SI "y") (VNx2DI "x")
                                (VNx8HF "y") (VNx4SF "y") (VNx2DF "x")])
 
 ;; The constraint to use for an SVE FCMLA lane index.
 (define_code_iterator FAC_COMPARISONS [lt le ge gt])
 
 ;; SVE integer unary operations.
-(define_code_iterator SVE_INT_UNARY [abs neg not clrsb clz popcount])
+(define_code_iterator SVE_INT_UNARY [abs neg not clrsb clz popcount
+                                    (ss_abs "TARGET_SVE2")
+                                    (ss_neg "TARGET_SVE2")])
 
 ;; SVE integer binary operations.
 (define_code_iterator SVE_INT_BINARY [plus minus mult smax umax smin umin
                                      ashift ashiftrt lshiftrt
-                                     and ior xor])
+                                     and ior xor
+                                     (ss_plus "TARGET_SVE2")
+                                     (us_plus "TARGET_SVE2")
+                                     (ss_minus "TARGET_SVE2")
+                                     (us_minus "TARGET_SVE2")])
 
 ;; SVE integer binary division operations.
 (define_code_iterator SVE_INT_BINARY_SD [div udiv])
                              (not "not")
                              (clrsb "cls")
                              (clz "clz")
-                             (popcount "cnt")])
+                             (popcount "cnt")
+                             (ss_plus "sqadd")
+                             (us_plus "uqadd")
+                             (ss_minus "sqsub")
+                             (us_minus "uqsub")
+                             (ss_neg "sqneg")
+                             (ss_abs "sqabs")])
 
 (define_code_attr sve_int_op_rev [(plus "add")
                                  (minus "subr")
                                  (lshiftrt "lsrr")
                                  (and "and")
                                  (ior "orr")
-                                 (xor "eor")])
+                                 (xor "eor")
+                                 (ss_plus "sqadd")
+                                 (us_plus "uqadd")
+                                 (ss_minus "sqsubr")
+                                 (us_minus "uqsubr")])
 
 ;; The floating-point SVE instruction that implements an rtx code.
 (define_code_attr sve_fp_op [(plus "fadd")
    (lshiftrt "aarch64_sve_rshift_operand")
    (and "aarch64_sve_pred_and_operand")
    (ior "register_operand")
-   (xor "register_operand")])
+   (xor "register_operand")
+   (ss_plus "register_operand")
+   (us_plus "register_operand")
+   (ss_minus "register_operand")
+   (us_minus "register_operand")])
 
 (define_code_attr inc_dec [(minus "dec") (ss_minus "sqdec") (us_minus "uqdec")
                           (plus "inc") (ss_plus "sqinc") (us_plus "uqinc")])
 
 (define_int_iterator RHADD [UNSPEC_SRHADD UNSPEC_URHADD])
 
-(define_int_iterator MULLBT [UNSPEC_SMULLB UNSPEC_UMULLB
-                             UNSPEC_SMULLT UNSPEC_UMULLT])
-
-(define_int_iterator SHRNB [UNSPEC_SHRNB UNSPEC_RSHRNB])
-
-(define_int_iterator SHRNT [UNSPEC_SHRNT UNSPEC_RSHRNT])
-
 (define_int_iterator BSL_DUP [1 2])
 
 (define_int_iterator DOTPROD [UNSPEC_SDOT UNSPEC_UDOT])
 
 (define_int_iterator SVE_FP_UNARY_INT [UNSPEC_FEXPA])
 
+(define_int_iterator SVE_INT_SHIFT_IMM [UNSPEC_ASRD
+                                       (UNSPEC_SQSHLU "TARGET_SVE2")
+                                       (UNSPEC_SRSHR "TARGET_SVE2")
+                                       (UNSPEC_URSHR "TARGET_SVE2")])
+
 (define_int_iterator SVE_FP_BINARY [UNSPEC_FRECPS UNSPEC_RSQRTS])
 
 (define_int_iterator SVE_FP_BINARY_INT [UNSPEC_FTSMUL UNSPEC_FTSSEL])
 
 (define_int_iterator SVE_WHILE [UNSPEC_WHILELE UNSPEC_WHILELO
                                UNSPEC_WHILELS UNSPEC_WHILELT
+                               (UNSPEC_WHILEGE "TARGET_SVE2")
+                               (UNSPEC_WHILEGT "TARGET_SVE2")
+                               (UNSPEC_WHILEHI "TARGET_SVE2")
+                               (UNSPEC_WHILEHS "TARGET_SVE2")
                                (UNSPEC_WHILERW "TARGET_SVE2")
                                (UNSPEC_WHILEWR "TARGET_SVE2")])
 
 
 (define_int_iterator SVE_LDFF1_LDNF1 [UNSPEC_LDFF1 UNSPEC_LDNF1])
 
+(define_int_iterator SVE2_U32_UNARY [UNSPEC_URECPE UNSPEC_RSQRTE])
+
+(define_int_iterator SVE2_INT_UNARY_NARROWB [UNSPEC_SQXTNB
+                                            UNSPEC_SQXTUNB
+                                            UNSPEC_UQXTNB])
+
+(define_int_iterator SVE2_INT_UNARY_NARROWT [UNSPEC_SQXTNT
+                                            UNSPEC_SQXTUNT
+                                            UNSPEC_UQXTNT])
+
+(define_int_iterator SVE2_INT_BINARY [UNSPEC_SQDMULH
+                                     UNSPEC_SQRDMULH])
+
+(define_int_iterator SVE2_INT_BINARY_LANE [UNSPEC_SQDMULH
+                                          UNSPEC_SQRDMULH])
+
+(define_int_iterator SVE2_INT_BINARY_LONG [UNSPEC_SABDLB
+                                          UNSPEC_SABDLT
+                                          UNSPEC_SADDLB
+                                          UNSPEC_SADDLBT
+                                          UNSPEC_SADDLT
+                                          UNSPEC_SMULLB
+                                          UNSPEC_SMULLT
+                                          UNSPEC_SQDMULLB
+                                          UNSPEC_SQDMULLT
+                                          UNSPEC_SSUBLB
+                                          UNSPEC_SSUBLBT
+                                          UNSPEC_SSUBLT
+                                          UNSPEC_SSUBLTB
+                                          UNSPEC_UABDLB
+                                          UNSPEC_UABDLT
+                                          UNSPEC_UADDLB
+                                          UNSPEC_UADDLT
+                                          UNSPEC_UMULLB
+                                          UNSPEC_UMULLT
+                                          UNSPEC_USUBLB
+                                          UNSPEC_USUBLT])
+
+(define_int_iterator SVE2_INT_BINARY_LONG_LANE [UNSPEC_SMULLB
+                                               UNSPEC_SMULLT
+                                               UNSPEC_SQDMULLB
+                                               UNSPEC_SQDMULLT
+                                               UNSPEC_UMULLB
+                                               UNSPEC_UMULLT])
+
+(define_int_iterator SVE2_INT_BINARY_NARROWB [UNSPEC_ADDHNB
+                                             UNSPEC_RADDHNB
+                                             UNSPEC_RSUBHNB
+                                             UNSPEC_SUBHNB])
+
+(define_int_iterator SVE2_INT_BINARY_NARROWT [UNSPEC_ADDHNT
+                                             UNSPEC_RADDHNT
+                                             UNSPEC_RSUBHNT
+                                             UNSPEC_SUBHNT])
+
+(define_int_iterator SVE2_INT_BINARY_PAIR [UNSPEC_ADDP
+                                          UNSPEC_SMAXP
+                                          UNSPEC_SMINP
+                                          UNSPEC_UMAXP
+                                          UNSPEC_UMINP])
+
+(define_int_iterator SVE2_FP_BINARY_PAIR [UNSPEC_FADDP
+                                         UNSPEC_FMAXP
+                                         UNSPEC_FMAXNMP
+                                         UNSPEC_FMINP
+                                         UNSPEC_FMINNMP])
+
+(define_int_iterator SVE2_INT_BINARY_PAIR_LONG [UNSPEC_SADALP UNSPEC_UADALP])
+
+(define_int_iterator SVE2_INT_BINARY_WIDE [UNSPEC_SADDWB
+                                          UNSPEC_SADDWT
+                                          UNSPEC_SSUBWB
+                                          UNSPEC_SSUBWT
+                                          UNSPEC_UADDWB
+                                          UNSPEC_UADDWT
+                                          UNSPEC_USUBWB
+                                          UNSPEC_USUBWT])
+
+(define_int_iterator SVE2_INT_SHIFT_IMM_LONG [UNSPEC_SSHLLB
+                                             UNSPEC_SSHLLT
+                                             UNSPEC_USHLLB
+                                             UNSPEC_USHLLT])
+
+(define_int_iterator SVE2_INT_SHIFT_IMM_NARROWB [UNSPEC_RSHRNB
+                                                UNSPEC_SHRNB
+                                                UNSPEC_SQRSHRNB
+                                                UNSPEC_SQRSHRUNB
+                                                UNSPEC_SQSHRNB
+                                                UNSPEC_SQSHRUNB
+                                                UNSPEC_UQRSHRNB
+                                                UNSPEC_UQSHRNB])
+
+(define_int_iterator SVE2_INT_SHIFT_IMM_NARROWT [UNSPEC_RSHRNT
+                                                UNSPEC_SHRNT
+                                                UNSPEC_SQRSHRNT
+                                                UNSPEC_SQRSHRUNT
+                                                UNSPEC_SQSHRNT
+                                                UNSPEC_SQSHRUNT
+                                                UNSPEC_UQRSHRNT
+                                                UNSPEC_UQSHRNT])
+
+(define_int_iterator SVE2_INT_SHIFT_INSERT [UNSPEC_SLI UNSPEC_SRI])
+
+(define_int_iterator SVE2_INT_CADD [UNSPEC_CADD90
+                                   UNSPEC_CADD270
+                                   UNSPEC_SQCADD90
+                                   UNSPEC_SQCADD270])
+
+(define_int_iterator SVE2_INT_BITPERM [UNSPEC_BDEP UNSPEC_BEXT UNSPEC_BGRP])
+
+(define_int_iterator SVE2_INT_TERNARY [UNSPEC_ADCLB
+                                      UNSPEC_ADCLT
+                                      UNSPEC_EORBT
+                                      UNSPEC_EORTB
+                                      UNSPEC_SBCLB
+                                      UNSPEC_SBCLT
+                                      UNSPEC_SQRDMLAH
+                                      UNSPEC_SQRDMLSH])
+
+(define_int_iterator SVE2_INT_TERNARY_LANE [UNSPEC_SQRDMLAH
+                                           UNSPEC_SQRDMLSH])
+
+(define_int_iterator SVE2_FP_TERNARY_LONG [UNSPEC_FMLALB
+                                          UNSPEC_FMLALT
+                                          UNSPEC_FMLSLB
+                                          UNSPEC_FMLSLT])
+
+(define_int_iterator SVE2_FP_TERNARY_LONG_LANE [UNSPEC_FMLALB
+                                               UNSPEC_FMLALT
+                                               UNSPEC_FMLSLB
+                                               UNSPEC_FMLSLT])
+
+(define_int_iterator SVE2_INT_CMLA [UNSPEC_CMLA
+                                   UNSPEC_CMLA90
+                                   UNSPEC_CMLA180
+                                   UNSPEC_CMLA270
+                                   UNSPEC_SQRDCMLAH
+                                   UNSPEC_SQRDCMLAH90
+                                   UNSPEC_SQRDCMLAH180
+                                   UNSPEC_SQRDCMLAH270])
+
+(define_int_iterator SVE2_INT_CDOT [UNSPEC_CDOT
+                                   UNSPEC_CDOT90
+                                   UNSPEC_CDOT180
+                                   UNSPEC_CDOT270])
+
+(define_int_iterator SVE2_INT_ADD_BINARY_LONG [UNSPEC_SABDLB
+                                              UNSPEC_SABDLT
+                                              UNSPEC_SMULLB
+                                              UNSPEC_SMULLT
+                                              UNSPEC_UABDLB
+                                              UNSPEC_UABDLT
+                                              UNSPEC_UMULLB
+                                              UNSPEC_UMULLT])
+
+(define_int_iterator SVE2_INT_QADD_BINARY_LONG [UNSPEC_SQDMULLB
+                                               UNSPEC_SQDMULLBT
+                                               UNSPEC_SQDMULLT])
+
+(define_int_iterator SVE2_INT_SUB_BINARY_LONG [UNSPEC_SMULLB
+                                              UNSPEC_SMULLT
+                                              UNSPEC_UMULLB
+                                              UNSPEC_UMULLT])
+
+(define_int_iterator SVE2_INT_QSUB_BINARY_LONG [UNSPEC_SQDMULLB
+                                               UNSPEC_SQDMULLBT
+                                               UNSPEC_SQDMULLT])
+
+(define_int_iterator SVE2_INT_ADD_BINARY_LONG_LANE [UNSPEC_SMULLB
+                                                   UNSPEC_SMULLT
+                                                   UNSPEC_UMULLB
+                                                   UNSPEC_UMULLT])
+
+(define_int_iterator SVE2_INT_QADD_BINARY_LONG_LANE [UNSPEC_SQDMULLB
+                                                    UNSPEC_SQDMULLT])
+
+(define_int_iterator SVE2_INT_SUB_BINARY_LONG_LANE [UNSPEC_SMULLB
+                                                   UNSPEC_SMULLT
+                                                   UNSPEC_UMULLB
+                                                   UNSPEC_UMULLT])
+
+(define_int_iterator SVE2_INT_QSUB_BINARY_LONG_LANE [UNSPEC_SQDMULLB
+                                                    UNSPEC_SQDMULLT])
+
+(define_int_iterator SVE2_COND_INT_UNARY_FP [UNSPEC_COND_FLOGB])
+
+(define_int_iterator SVE2_COND_FP_UNARY_LONG [UNSPEC_COND_FCVTLT])
+
+(define_int_iterator SVE2_COND_FP_UNARY_NARROWB [UNSPEC_COND_FCVTX])
+
+(define_int_iterator SVE2_COND_INT_BINARY [UNSPEC_SHADD
+                                          UNSPEC_SHSUB
+                                          UNSPEC_SQRSHL
+                                          UNSPEC_SRHADD
+                                          UNSPEC_SRSHL
+                                          UNSPEC_SUQADD
+                                          UNSPEC_UHADD
+                                          UNSPEC_UHSUB
+                                          UNSPEC_UQRSHL
+                                          UNSPEC_URHADD
+                                          UNSPEC_URSHL
+                                          UNSPEC_USQADD])
+
+(define_int_iterator SVE2_COND_INT_BINARY_NOREV [UNSPEC_SUQADD
+                                                UNSPEC_USQADD])
+
+(define_int_iterator SVE2_COND_INT_BINARY_REV [UNSPEC_SHADD
+                                              UNSPEC_SHSUB
+                                              UNSPEC_SQRSHL
+                                              UNSPEC_SRHADD
+                                              UNSPEC_SRSHL
+                                              UNSPEC_UHADD
+                                              UNSPEC_UHSUB
+                                              UNSPEC_UQRSHL
+                                              UNSPEC_URHADD
+                                              UNSPEC_URSHL])
+
+(define_int_iterator SVE2_COND_INT_SHIFT [UNSPEC_SQSHL
+                                         UNSPEC_UQSHL])
+
+(define_int_iterator SVE2_MATCH [UNSPEC_MATCH UNSPEC_NMATCH])
+
+(define_int_iterator SVE2_PMULL [UNSPEC_PMULLB UNSPEC_PMULLT])
+
+(define_int_iterator SVE2_PMULL_PAIR [UNSPEC_PMULLB_PAIR UNSPEC_PMULLT_PAIR])
+
 (define_int_iterator FCADD [UNSPEC_FCADD90
                            UNSPEC_FCADD270])
 
                        (UNSPEC_UMINV "umin")
                        (UNSPEC_SMAXV "smax")
                        (UNSPEC_SMINV "smin")
+                       (UNSPEC_CADD90 "cadd90")
+                       (UNSPEC_CADD270 "cadd270")
+                       (UNSPEC_CDOT "cdot")
+                       (UNSPEC_CDOT90 "cdot90")
+                       (UNSPEC_CDOT180 "cdot180")
+                       (UNSPEC_CDOT270 "cdot270")
+                       (UNSPEC_CMLA "cmla")
+                       (UNSPEC_CMLA90 "cmla90")
+                       (UNSPEC_CMLA180 "cmla180")
+                       (UNSPEC_CMLA270 "cmla270")
                        (UNSPEC_FADDV "plus")
                        (UNSPEC_FMAXNMV "smax")
                        (UNSPEC_FMAXV "smax_nan")
                        (UNSPEC_FEXPA "fexpa")
                        (UNSPEC_FTSMUL "ftsmul")
                        (UNSPEC_FTSSEL "ftssel")
+                       (UNSPEC_PMULLB "pmullb")
+                       (UNSPEC_PMULLB_PAIR "pmullb_pair")
+                       (UNSPEC_PMULLT "pmullt")
+                       (UNSPEC_PMULLT_PAIR "pmullt_pair")
+                       (UNSPEC_SQCADD90 "sqcadd90")
+                       (UNSPEC_SQCADD270 "sqcadd270")
+                       (UNSPEC_SQRDCMLAH "sqrdcmlah")
+                       (UNSPEC_SQRDCMLAH90 "sqrdcmlah90")
+                       (UNSPEC_SQRDCMLAH180 "sqrdcmlah180")
+                       (UNSPEC_SQRDCMLAH270 "sqrdcmlah270")
                        (UNSPEC_WHILERW "vec_check_raw_alias")
                        (UNSPEC_WHILEWR "vec_check_war_alias")
                        (UNSPEC_COND_FABS "abs")
                     (UNSPEC_COND_FCVTZU "u")
                     (UNSPEC_COND_SCVTF "s")
                     (UNSPEC_COND_UCVTF "u")
-                    (UNSPEC_SMULLB "s") (UNSPEC_UMULLB "u")
-                    (UNSPEC_SMULLT "s") (UNSPEC_UMULLT "u")
                     (UNSPEC_SMULHS "s") (UNSPEC_UMULHS "u")
                     (UNSPEC_SMULHRS "s") (UNSPEC_UMULHRS "u")])
 
                     (UNSPEC_SQRSHRN "r") (UNSPEC_UQRSHRN "r")
                     (UNSPEC_SQSHL   "")  (UNSPEC_UQSHL  "")
                     (UNSPEC_SQRSHL   "r")(UNSPEC_UQRSHL  "r")
-                   (UNSPEC_SHRNB "") (UNSPEC_SHRNT "")
-                   (UNSPEC_RSHRNB "r") (UNSPEC_RSHRNT "r")
                    (UNSPEC_SMULHS "") (UNSPEC_UMULHS "")
                    (UNSPEC_SMULHRS "r") (UNSPEC_UMULHRS "r")
 ])
 
 (define_int_attr lr [(UNSPEC_SSLI  "l") (UNSPEC_USLI  "l")
-                    (UNSPEC_SSRI  "r") (UNSPEC_USRI  "r")])
+                    (UNSPEC_SSRI  "r") (UNSPEC_USRI  "r")
+                    (UNSPEC_SQSHL "l") (UNSPEC_UQSHL "l")
+                    (UNSPEC_SQSHLU "l")
+                    (UNSPEC_SRSHR "r") (UNSPEC_URSHR "r")
+                    (UNSPEC_ASRD  "r")
+                    (UNSPEC_SLI   "l") (UNSPEC_SRI   "r")])
 
 (define_int_attr u [(UNSPEC_SQSHLU "u") (UNSPEC_SQSHL "") (UNSPEC_UQSHL "")
                    (UNSPEC_SQSHRUN "u") (UNSPEC_SQRSHRUN "u")
                    (UNSPEC_SHADD "") (UNSPEC_UHADD "u")
                    (UNSPEC_SRHADD "") (UNSPEC_URHADD "u")])
 
-(define_int_attr bt [(UNSPEC_SMULLB "b") (UNSPEC_UMULLB "b")
-                    (UNSPEC_SMULLT "t") (UNSPEC_UMULLT "t")])
-
 (define_int_attr fn [(UNSPEC_LDFF1 "f") (UNSPEC_LDNF1 "n")])
 
 (define_int_attr ab [(UNSPEC_CLASTA "a") (UNSPEC_CLASTB "b")
                         (UNSPEC_COND_FCMLE "le")
                         (UNSPEC_COND_FCMLT "lt")
                         (UNSPEC_COND_FCMNE "ne")
+                        (UNSPEC_WHILEGE "ge")
+                        (UNSPEC_WHILEGT "gt")
+                        (UNSPEC_WHILEHI "hi")
+                        (UNSPEC_WHILEHS "hs")
                         (UNSPEC_WHILELE "le")
                         (UNSPEC_WHILELO "lo")
                         (UNSPEC_WHILELS "ls")
                         (UNSPEC_WHILERW "rw")
                         (UNSPEC_WHILEWR "wr")])
 
-(define_int_attr while_optab_cmp [(UNSPEC_WHILELE "le")
+(define_int_attr while_optab_cmp [(UNSPEC_WHILEGE "ge")
+                                 (UNSPEC_WHILEGT "gt")
+                                 (UNSPEC_WHILEHI "ugt")
+                                 (UNSPEC_WHILEHS "uge")
+                                 (UNSPEC_WHILELE "le")
                                  (UNSPEC_WHILELO "ult")
                                  (UNSPEC_WHILELS "ule")
                                  (UNSPEC_WHILELT "lt")
 
 (define_int_attr sve_pred_op [(UNSPEC_PFIRST "pfirst") (UNSPEC_PNEXT "pnext")])
 
-(define_int_attr sve_int_op [(UNSPEC_ANDV "andv")
-                            (UNSPEC_IORV "orv")
-                            (UNSPEC_XORV "eorv")
-                            (UNSPEC_UMAXV "umaxv")
-                            (UNSPEC_UMINV "uminv")
-                            (UNSPEC_SMAXV "smaxv")
-                            (UNSPEC_SMINV "sminv")
-                            (UNSPEC_SMUL_HIGHPART "smulh")
-                            (UNSPEC_UMUL_HIGHPART "umulh")
-                            (UNSPEC_ASHIFT_WIDE "lsl")
+(define_int_attr sve_int_op [(UNSPEC_ADCLB "adclb")
+                            (UNSPEC_ADCLT "adclt")
+                            (UNSPEC_ADDHNB "addhnb")
+                            (UNSPEC_ADDHNT "addhnt")
+                            (UNSPEC_ADDP "addp")
+                            (UNSPEC_ANDV "andv")
                             (UNSPEC_ASHIFTRT_WIDE "asr")
+                            (UNSPEC_ASHIFT_WIDE "lsl")
+                            (UNSPEC_ASRD "asrd")
+                            (UNSPEC_BDEP "bdep")
+                            (UNSPEC_BEXT "bext")
+                            (UNSPEC_BGRP "bgrp")
+                            (UNSPEC_CADD90 "cadd")
+                            (UNSPEC_CADD270 "cadd")
+                            (UNSPEC_CDOT "cdot")
+                            (UNSPEC_CDOT90 "cdot")
+                            (UNSPEC_CDOT180 "cdot")
+                            (UNSPEC_CDOT270 "cdot")
+                            (UNSPEC_CMLA "cmla")
+                            (UNSPEC_CMLA90 "cmla")
+                            (UNSPEC_CMLA180 "cmla")
+                            (UNSPEC_CMLA270 "cmla")
+                            (UNSPEC_EORBT "eorbt")
+                            (UNSPEC_EORTB "eortb")
+                            (UNSPEC_IORV "orv")
                             (UNSPEC_LSHIFTRT_WIDE "lsr")
+                            (UNSPEC_MATCH "match")
+                            (UNSPEC_NMATCH "nmatch")
+                            (UNSPEC_PMULLB "pmullb")
+                            (UNSPEC_PMULLB_PAIR "pmullb")
+                            (UNSPEC_PMULLT "pmullt")
+                            (UNSPEC_PMULLT_PAIR "pmullt")
+                            (UNSPEC_RADDHNB "raddhnb")
+                            (UNSPEC_RADDHNT "raddhnt")
                             (UNSPEC_RBIT "rbit")
                             (UNSPEC_REVB "revb")
                             (UNSPEC_REVH "revh")
-                            (UNSPEC_REVW "revw")])
+                            (UNSPEC_REVW "revw")
+                            (UNSPEC_RSHRNB "rshrnb")
+                            (UNSPEC_RSHRNT "rshrnt")
+                            (UNSPEC_RSQRTE "ursqrte")
+                            (UNSPEC_RSUBHNB "rsubhnb")
+                            (UNSPEC_RSUBHNT "rsubhnt")
+                            (UNSPEC_SABDLB "sabdlb")
+                            (UNSPEC_SABDLT "sabdlt")
+                            (UNSPEC_SADALP "sadalp")
+                            (UNSPEC_SADDLB "saddlb")
+                            (UNSPEC_SADDLBT "saddlbt")
+                            (UNSPEC_SADDLT "saddlt")
+                            (UNSPEC_SADDWB "saddwb")
+                            (UNSPEC_SADDWT "saddwt")
+                            (UNSPEC_SBCLB "sbclb")
+                            (UNSPEC_SBCLT "sbclt")
+                            (UNSPEC_SHADD "shadd")
+                            (UNSPEC_SHRNB "shrnb")
+                            (UNSPEC_SHRNT "shrnt")
+                            (UNSPEC_SHSUB "shsub")
+                            (UNSPEC_SLI "sli")
+                            (UNSPEC_SMAXP "smaxp")
+                            (UNSPEC_SMAXV "smaxv")
+                            (UNSPEC_SMINP "sminp")
+                            (UNSPEC_SMINV "sminv")
+                            (UNSPEC_SMUL_HIGHPART "smulh")
+                            (UNSPEC_SMULLB "smullb")
+                            (UNSPEC_SMULLT "smullt")
+                            (UNSPEC_SQCADD90 "sqcadd")
+                            (UNSPEC_SQCADD270 "sqcadd")
+                            (UNSPEC_SQDMULH "sqdmulh")
+                            (UNSPEC_SQDMULLB "sqdmullb")
+                            (UNSPEC_SQDMULLBT "sqdmullbt")
+                            (UNSPEC_SQDMULLT "sqdmullt")
+                            (UNSPEC_SQRDCMLAH "sqrdcmlah")
+                            (UNSPEC_SQRDCMLAH90 "sqrdcmlah")
+                            (UNSPEC_SQRDCMLAH180 "sqrdcmlah")
+                            (UNSPEC_SQRDCMLAH270 "sqrdcmlah")
+                            (UNSPEC_SQRDMLAH "sqrdmlah")
+                            (UNSPEC_SQRDMLSH "sqrdmlsh")
+                            (UNSPEC_SQRDMULH "sqrdmulh")
+                            (UNSPEC_SQRSHL "sqrshl")
+                            (UNSPEC_SQRSHRNB "sqrshrnb")
+                            (UNSPEC_SQRSHRNT "sqrshrnt")
+                            (UNSPEC_SQRSHRUNB "sqrshrunb")
+                            (UNSPEC_SQRSHRUNT "sqrshrunt")
+                            (UNSPEC_SQSHL "sqshl")
+                            (UNSPEC_SQSHLU "sqshlu")
+                            (UNSPEC_SQSHRNB "sqshrnb")
+                            (UNSPEC_SQSHRNT "sqshrnt")
+                            (UNSPEC_SQSHRUNB "sqshrunb")
+                            (UNSPEC_SQSHRUNT "sqshrunt")
+                            (UNSPEC_SQXTNB "sqxtnb")
+                            (UNSPEC_SQXTNT "sqxtnt")
+                            (UNSPEC_SQXTUNB "sqxtunb")
+                            (UNSPEC_SQXTUNT "sqxtunt")
+                            (UNSPEC_SRHADD "srhadd")
+                            (UNSPEC_SRI "sri")
+                            (UNSPEC_SRSHL "srshl")
+                            (UNSPEC_SRSHR "srshr")
+                            (UNSPEC_SSHLLB "sshllb")
+                            (UNSPEC_SSHLLT "sshllt")
+                            (UNSPEC_SSUBLB "ssublb")
+                            (UNSPEC_SSUBLBT "ssublbt")
+                            (UNSPEC_SSUBLT "ssublt")
+                            (UNSPEC_SSUBLTB "ssubltb")
+                            (UNSPEC_SSUBWB "ssubwb")
+                            (UNSPEC_SSUBWT "ssubwt")
+                            (UNSPEC_SUBHNB "subhnb")
+                            (UNSPEC_SUBHNT "subhnt")
+                            (UNSPEC_SUQADD "suqadd")
+                            (UNSPEC_UABDLB "uabdlb")
+                            (UNSPEC_UABDLT "uabdlt")
+                            (UNSPEC_UADALP "uadalp")
+                            (UNSPEC_UADDLB "uaddlb")
+                            (UNSPEC_UADDLT "uaddlt")
+                            (UNSPEC_UADDWB "uaddwb")
+                            (UNSPEC_UADDWT "uaddwt")
+                            (UNSPEC_UHADD "uhadd")
+                            (UNSPEC_UHSUB "uhsub")
+                            (UNSPEC_UMAXP "umaxp")
+                            (UNSPEC_UMAXV "umaxv")
+                            (UNSPEC_UMINP "uminp")
+                            (UNSPEC_UMINV "uminv")
+                            (UNSPEC_UMUL_HIGHPART "umulh")
+                            (UNSPEC_UMULLB "umullb")
+                            (UNSPEC_UMULLT "umullt")
+                            (UNSPEC_UQRSHL "uqrshl")
+                            (UNSPEC_UQRSHRNB "uqrshrnb")
+                            (UNSPEC_UQRSHRNT "uqrshrnt")
+                            (UNSPEC_UQSHL "uqshl")
+                            (UNSPEC_UQSHRNB "uqshrnb")
+                            (UNSPEC_UQSHRNT "uqshrnt")
+                            (UNSPEC_UQXTNB "uqxtnb")
+                            (UNSPEC_UQXTNT "uqxtnt")
+                            (UNSPEC_URECPE "urecpe")
+                            (UNSPEC_URHADD "urhadd")
+                            (UNSPEC_URSHL "urshl")
+                            (UNSPEC_URSHR "urshr")
+                            (UNSPEC_USHLLB "ushllb")
+                            (UNSPEC_USHLLT "ushllt")
+                            (UNSPEC_USQADD "usqadd")
+                            (UNSPEC_USUBLB "usublb")
+                            (UNSPEC_USUBLT "usublt")
+                            (UNSPEC_USUBWB "usubwb")
+                            (UNSPEC_USUBWT "usubwt")
+                            (UNSPEC_XORV "eorv")])
+
+(define_int_attr sve_int_op_rev [(UNSPEC_SHADD "shadd")
+                                (UNSPEC_SHSUB "shsubr")
+                                (UNSPEC_SQRSHL "sqrshlr")
+                                (UNSPEC_SRHADD "srhadd")
+                                (UNSPEC_SRSHL "srshlr")
+                                (UNSPEC_UHADD "uhadd")
+                                (UNSPEC_UHSUB "uhsubr")
+                                (UNSPEC_UQRSHL "uqrshlr")
+                                (UNSPEC_URHADD "urhadd")
+                                (UNSPEC_URSHL "urshlr")])
+
+(define_int_attr sve_int_add_op [(UNSPEC_SABDLB "sabalb")
+                                (UNSPEC_SABDLT "sabalt")
+                                (UNSPEC_SMULLB "smlalb")
+                                (UNSPEC_SMULLT "smlalt")
+                                (UNSPEC_UABDLB "uabalb")
+                                (UNSPEC_UABDLT "uabalt")
+                                (UNSPEC_UMULLB "umlalb")
+                                (UNSPEC_UMULLT "umlalt")])
+
+(define_int_attr sve_int_qadd_op [(UNSPEC_SQDMULLB "sqdmlalb")
+                                 (UNSPEC_SQDMULLBT "sqdmlalbt")
+                                 (UNSPEC_SQDMULLT "sqdmlalt")])
+
+(define_int_attr sve_int_sub_op [(UNSPEC_SMULLB "smlslb")
+                                (UNSPEC_SMULLT "smlslt")
+                                (UNSPEC_UMULLB "umlslb")
+                                (UNSPEC_UMULLT "umlslt")])
+
+(define_int_attr sve_int_qsub_op [(UNSPEC_SQDMULLB "sqdmlslb")
+                                 (UNSPEC_SQDMULLBT "sqdmlslbt")
+                                 (UNSPEC_SQDMULLT "sqdmlslt")])
 
 (define_int_attr sve_fp_op [(UNSPEC_FRECPE "frecpe")
                            (UNSPEC_FRECPS "frecps")
                            (UNSPEC_RSQRTE "frsqrte")
                            (UNSPEC_RSQRTS "frsqrts")
+                           (UNSPEC_FADDP "faddp")
                            (UNSPEC_FADDV "faddv")
+                           (UNSPEC_FMAXNMP "fmaxnmp")
                            (UNSPEC_FMAXNMV "fmaxnmv")
+                           (UNSPEC_FMAXP "fmaxp")
                            (UNSPEC_FMAXV "fmaxv")
+                           (UNSPEC_FMINNMP "fminnmp")
                            (UNSPEC_FMINNMV "fminnmv")
+                           (UNSPEC_FMINP "fminp")
                            (UNSPEC_FMINV "fminv")
                            (UNSPEC_FMLA "fmla")
+                           (UNSPEC_FMLALB "fmlalb")
+                           (UNSPEC_FMLALT "fmlalt")
                            (UNSPEC_FMLS "fmls")
+                           (UNSPEC_FMLSLB "fmlslb")
+                           (UNSPEC_FMLSLT "fmlslt")
                            (UNSPEC_FEXPA "fexpa")
                            (UNSPEC_FTSMUL "ftsmul")
                            (UNSPEC_FTSSEL "ftssel")
                            (UNSPEC_COND_FABS "fabs")
                            (UNSPEC_COND_FADD "fadd")
+                           (UNSPEC_COND_FCVTLT "fcvtlt")
+                           (UNSPEC_COND_FCVTX "fcvtx")
                            (UNSPEC_COND_FDIV "fdiv")
+                           (UNSPEC_COND_FLOGB "flogb")
                            (UNSPEC_COND_FMAX "fmax")
                            (UNSPEC_COND_FMAXNM "fmaxnm")
                            (UNSPEC_COND_FMIN "fmin")
                                (UNSPEC_COND_FMULX "fmulx")
                                (UNSPEC_COND_FSUB "fsubr")])
 
-(define_int_attr rot [(UNSPEC_FCADD90 "90")
+(define_int_attr rot [(UNSPEC_CADD90 "90")
+                     (UNSPEC_CADD270 "270")
+                     (UNSPEC_CDOT "0")
+                     (UNSPEC_CDOT90 "90")
+                     (UNSPEC_CDOT180 "180")
+                     (UNSPEC_CDOT270 "270")
+                     (UNSPEC_CMLA "0")
+                     (UNSPEC_CMLA90 "90")
+                     (UNSPEC_CMLA180 "180")
+                     (UNSPEC_CMLA270 "270")
+                     (UNSPEC_FCADD90 "90")
                      (UNSPEC_FCADD270 "270")
                      (UNSPEC_FCMLA "0")
                      (UNSPEC_FCMLA90 "90")
                      (UNSPEC_FCMLA180 "180")
                      (UNSPEC_FCMLA270 "270")
+                     (UNSPEC_SQCADD90 "90")
+                     (UNSPEC_SQCADD270 "270")
+                     (UNSPEC_SQRDCMLAH "0")
+                     (UNSPEC_SQRDCMLAH90 "90")
+                     (UNSPEC_SQRDCMLAH180 "180")
+                     (UNSPEC_SQRDCMLAH270 "270")
                      (UNSPEC_COND_FCADD90 "90")
                      (UNSPEC_COND_FCADD270 "270")
                      (UNSPEC_COND_FCMLA "0")
index 2bdb4a9..11d20b7 100644 (file)
@@ -46,6 +46,8 @@ aarch64-builtins.o: $(srcdir)/config/aarch64/aarch64-builtins.c $(CONFIG_H) \
 
 aarch64-sve-builtins.o: $(srcdir)/config/aarch64/aarch64-sve-builtins.cc \
   $(srcdir)/config/aarch64/aarch64-sve-builtins.def \
+  $(srcdir)/config/aarch64/aarch64-sve-builtins-base.def \
+  $(srcdir)/config/aarch64/aarch64-sve-builtins-sve2.def \
   $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(RTL_H) \
   $(TM_P_H) memmodel.h insn-codes.h $(OPTABS_H) $(RECOG_H) $(DIAGNOSTIC_H) \
   $(EXPR_H) $(BASIC_BLOCK_H) $(FUNCTION_H) fold-const.h $(GIMPLE_H) \
@@ -54,7 +56,8 @@ aarch64-sve-builtins.o: $(srcdir)/config/aarch64/aarch64-sve-builtins.cc \
   stringpool.h \
   $(srcdir)/config/aarch64/aarch64-sve-builtins.h \
   $(srcdir)/config/aarch64/aarch64-sve-builtins-shapes.h \
-  $(srcdir)/config/aarch64/aarch64-sve-builtins-base.h
+  $(srcdir)/config/aarch64/aarch64-sve-builtins-base.h \
+  $(srcdir)/config/aarch64/aarch64-sve-builtins-sve2.h
        $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
                $(srcdir)/config/aarch64/aarch64-sve-builtins.cc
 
@@ -81,6 +84,20 @@ aarch64-sve-builtins-base.o: \
        $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
                $(srcdir)/config/aarch64/aarch64-sve-builtins-base.cc
 
+aarch64-sve-builtins-sve2.o: \
+  $(srcdir)/config/aarch64/aarch64-sve-builtins-sve2.cc \
+  $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(RTL_H) \
+  $(TM_P_H) memmodel.h insn-codes.h $(OPTABS_H) $(RECOG_H) \
+  $(EXPR_H) $(BASIC_BLOCK_H) $(FUNCTION_H) fold-const.h $(GIMPLE_H) \
+  gimple-iterator.h gimplify.h explow.h $(EMIT_RTL_H) tree-vector-builder.h \
+  rtx-vector-builder.h vec-perm-indices.h \
+  $(srcdir)/config/aarch64/aarch64-sve-builtins.h \
+  $(srcdir)/config/aarch64/aarch64-sve-builtins-shapes.h \
+  $(srcdir)/config/aarch64/aarch64-sve-builtins-sve2.h \
+  $(srcdir)/config/aarch64/aarch64-sve-builtins-functions.h
+       $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
+               $(srcdir)/config/aarch64/aarch64-sve-builtins-sve2.cc
+
 aarch64-builtin-iterators.h: $(srcdir)/config/aarch64/geniterators.sh \
        $(srcdir)/config/aarch64/iterators.md
        $(SHELL) $(srcdir)/config/aarch64/geniterators.sh \
index 943b632..0cf4394 100644 (file)
@@ -1,5 +1,61 @@
 2020-01-09  Richard Sandiford  <richard.sandiford@arm.com>
 
+       * g++.target/aarch64/sve/acle/general-c++/mul_lane_1.c: New test.
+       * g++.target/aarch64/sve2/acle: New directory.
+       * gcc.target/aarch64/pragma_cpp_predefs_3.c: New test.
+       * gcc.target/aarch64/sve/acle/asm/test_sve_acle.h (TEST_TYPE_CHANGE_Z)
+       (TEST_DUAL_ZD, TEST_TYPE_CHANGE_ZX, TEST_TBL2, TEST_TBL2_REV): New
+       macros.
+       * gcc.target/aarch64/sve/acle/general-c/binary_lane_1.c: Do not
+       expect an error saying that the function has no f32 form, but instead
+       expect an error about SVE2 being required if the current target
+       doesn't support SVE2.
+       * gcc.target/aarch64/sve/acle/general-c/ternary_lane_1.c: Likewise.
+       * gcc.target/aarch64/sve/acle/general-c/ternary_lane_rotate_1.c Likewise.
+       * gcc.target/aarch64/sve/acle/general-c/binary_long_lane_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/binary_long_opt_n_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/binary_narrowb_opt_n_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/binary_narrowt_opt_n_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/binary_to_uint_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/binary_wide_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/binary_wide_opt_n_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/compare_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/compare_ptr_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_index_restricted_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_2.c,
+       * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_3.c,
+       * gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_4.c,
+       * gcc.target/aarch64/sve/acle/general-c/load_gather_sv_restricted_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/load_gather_sv_restricted_2.c,
+       * gcc.target/aarch64/sve/acle/general-c/mul_lane_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/shift_left_imm_long_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/shift_left_imm_to_uint_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/shift_left_imm_to_uint_2.c,
+       * gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowb_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowb_to_uint_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowt_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowt_to_uint_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/store_scatter_index_restricted_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/store_scatter_offset_restricted_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/tbl_tuple_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/ternary_long_lane_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/ternary_long_opt_n_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/ternary_qq_lane_rotate_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/ternary_qq_rotate_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/ternary_shift_right_imm_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/ternary_uint_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/unary_convert_narrowt_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/unary_narrowb_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/unary_narrowb_to_uint_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/unary_narrowt_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/unary_narrowt_to_uint_1.c,
+       * gcc.target/aarch64/sve/acle/general-c/unary_to_int_1.c: New tests.
+       * gcc.target/aarch64/sve2/bcax_1.c: Likewise.
+       * gcc.target/aarch64/sve2/acle: New directory.
+
+2020-01-09  Richard Sandiford  <richard.sandiford@arm.com>
+
        * gcc.target/aarch64/sve/acle/general-c/unary_count_1.c: Rename to...
        * gcc.target/aarch64/sve/acle/general-c/unary_to_uint_1.c: ...this.
        * gcc.target/aarch64/sve/acle/general-c/unary_count_2.c: Rename to...
diff --git a/gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mul_lane_1.c b/gcc/testsuite/g++.target/aarch64/sve/acle/general-c++/mul_lane_1.c
new file mode 100644 (file)
index 0000000..ea4d01e
--- /dev/null
@@ -0,0 +1,32 @@
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f2 (svint8_t s8, svuint8_t u8,
+    svint16_t s16, svuint16_t u16, svfloat16_t f16,
+    svint32_t s32, svuint32_t u32, svfloat32_t f32,
+    svint64_t s64, svuint64_t u64, svfloat64_t f64)
+{
+  s8 = svmul_lane (s8, s8, 1); /* { dg-error {no matching function} } */
+  u8 = svmul_lane (u8, u8, 1); /* { dg-error {no matching function} } */
+  s16 = svmul_lane (s16, s16, 1);
+  u16 = svmul_lane (u16, u16, 1);
+  f16 = svmul_lane (f16, f16, 1);
+  s32 = svmul_lane (s32, s32, 1);
+  u32 = svmul_lane (u32, u32, 1);
+  f32 = svmul_lane (f32, f32, 1);
+  s64 = svmul_lane (s64, s64, 1);
+  u64 = svmul_lane (u64, u64, 1);
+  f64 = svmul_lane (f64, f64, 1);
+}
+
+#pragma GCC target ("arch=armv8-a+sve")
+
+void
+f1 (svint8_t s8, svuint8_t u8, svint16_t s16)
+{
+  s8 = svmul_lane (s8, s8, 1); /* { dg-error {no matching function} } */
+  u8 = svmul_lane (u8, u8, 1); /* { dg-error {no matching function} } */
+  s16 = svmul_lane (s16, s16, 1); /* { dg-error {ACLE function 'svint16_t svmul_lane[^']*' requires ISA extension 'sve2'} } */
+}
diff --git a/gcc/testsuite/g++.target/aarch64/sve2/acle/aarch64-sve2-acle-asm.exp b/gcc/testsuite/g++.target/aarch64/sve2/acle/aarch64-sve2-acle-asm.exp
new file mode 100644 (file)
index 0000000..304cdad
--- /dev/null
@@ -0,0 +1,85 @@
+#  Assembly-based regression-test driver for the SVE ACLE
+#  Copyright (C) 2009-2020 Free Software Foundation, Inc.
+#
+#  This file is part of GCC.
+#
+#  GCC is free software; you can redistribute it and/or modify it
+#  under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 3, or (at your option)
+#  any later version.
+#
+#  GCC is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with GCC; see the file COPYING3.  If not see
+#  <http://www.gnu.org/licenses/>.  */
+
+# GCC testsuite that uses the `dg.exp' driver.
+
+# Exit immediately if this isn't an AArch64 target.
+if { ![istarget aarch64*-*-*] } {
+    return
+}
+
+# Load support procs.
+load_lib g++-dg.exp
+
+# Initialize `dg'.
+dg-init
+
+# Force SVE if we're not testing it already.
+if { [check_effective_target_aarch64_sve2] } {
+    set sve2_flags ""
+} else {
+    set sve2_flags "-march=armv8.5-a+sve2"
+}
+
+set gcc_subdir [string replace $subdir 0 2 gcc]
+lappend extra_flags "-fno-ipa-icf" "-I$srcdir/$gcc_subdir/../../sve/acle/asm"
+
+global gcc_runtest_parallelize_limit_minor
+if { [info exists gcc_runtest_parallelize_limit_minor] } {
+    set old_limit_minor $gcc_runtest_parallelize_limit_minor
+    set gcc_runtest_parallelize_limit_minor 1
+}
+
+torture-init
+set-torture-options {
+    "-std=c++98 -O0 -g"
+    "-std=c++98 -O1 -g"
+    "-std=c++11 -O2 -g"
+    "-std=c++14 -O3 -g"
+    "-std=c++17 -Og -g"
+    "-std=c++2a -Os -g"
+    "-std=gnu++98 -O2 -fno-schedule-insns -DCHECK_ASM --save-temps"
+    "-std=gnu++11 -Ofast -g"
+    "-std=gnu++17 -O3 -g"
+    "-std=gnu++2a -O0 -g"
+} {
+    "-DTEST_FULL"
+    "-DTEST_OVERLOADS"
+}
+
+# Main loop.
+set files [glob -nocomplain $srcdir/$gcc_subdir/asm/*.c]
+set save-dg-do-what-default ${dg-do-what-default}
+if { [check_effective_target_aarch64_asm_sve_ok]
+     && [check_effective_target_aarch64_variant_pcs] } {
+    set dg-do-what-default assemble
+} else {
+    set dg-do-what-default compile
+}
+gcc-dg-runtest [lsort $files] "" "$sve2_flags $extra_flags"
+set dg-do-what-default ${save-dg-do-what-default}
+
+torture-finish
+
+if { [info exists gcc_runtest_parallelize_limit_minor] } {
+    set gcc_runtest_parallelize_limit_minor $old_limit_minor
+}
+
+# All done.
+dg-finish
diff --git a/gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_3.c b/gcc/testsuite/gcc.target/aarch64/pragma_cpp_predefs_3.c
new file mode 100644 (file)
index 0000000..34aa6e1
--- /dev/null
@@ -0,0 +1,221 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#pragma GCC push_options
+#pragma GCC target ("arch=armv8-a")
+
+#ifdef __ARM_FEATURE_SVE
+#error "__ARM_FEATURE_SVE is defined but should not be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2
+#error "__ARM_FEATURE_SVE2 is defined but should not be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_AES
+#error "__ARM_FEATURE_SVE2_AES is defined but should not be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_BITPERM
+#error "__ARM_FEATURE_SVE2_BITPERM is defined but should not be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_SHA3
+#error "__ARM_FEATURE_SVE2_SHA3 is defined but should not be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_SM4
+#error "__ARM_FEATURE_SVE2_SM4 is defined but should not be!"
+#endif
+
+#pragma GCC push_options
+#pragma GCC target ("arch=armv8.2-a+sve")
+
+#ifndef __ARM_FEATURE_SVE
+#error "__ARM_FEATURE_SVE is not defined but should be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2
+#error "__ARM_FEATURE_SVE2 is defined but should not be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_AES
+#error "__ARM_FEATURE_SVE2_AES is defined but should not be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_BITPERM
+#error "__ARM_FEATURE_SVE2_BITPERM is defined but should not be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_SHA3
+#error "__ARM_FEATURE_SVE2_SHA3 is defined but should not be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_SM4
+#error "__ARM_FEATURE_SVE2_SM4 is defined but should not be!"
+#endif
+
+#pragma GCC pop_options
+
+#pragma GCC push_options
+#pragma GCC target ("arch=armv8.5-a+sve2")
+
+#ifndef __ARM_FEATURE_SVE
+#error "__ARM_FEATURE_SVE is not defined but should be!"
+#endif
+
+#ifndef __ARM_FEATURE_SVE2
+#error "__ARM_FEATURE_SVE2 is not defined but should be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_AES
+#error "__ARM_FEATURE_SVE2_AES is defined but should not be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_BITPERM
+#error "__ARM_FEATURE_SVE2_BITPERM is defined but should not be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_SHA3
+#error "__ARM_FEATURE_SVE2_SHA3 is defined but should not be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_SM4
+#error "__ARM_FEATURE_SVE2_SM4 is defined but should not be!"
+#endif
+
+#pragma GCC pop_options
+
+#pragma GCC push_options
+#pragma GCC target ("arch=armv8.5-a+sve2-aes")
+
+#ifndef __ARM_FEATURE_SVE
+#error "__ARM_FEATURE_SVE is not defined but should be!"
+#endif
+
+#ifndef __ARM_FEATURE_SVE2
+#error "__ARM_FEATURE_SVE2 is not defined but should be!"
+#endif
+
+#ifndef __ARM_FEATURE_AES
+#error "__ARM_FEATURE_AES is not defined but should be!"
+#endif
+
+#ifndef __ARM_FEATURE_SVE2_AES
+#error "__ARM_FEATURE_SVE2_AES is not defined but should be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_BITPERM
+#error "__ARM_FEATURE_SVE2_BITPERM is defined but should not be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_SHA3
+#error "__ARM_FEATURE_SVE2_SHA3 is defined but should not be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_SM4
+#error "__ARM_FEATURE_SVE2_SM4 is defined but should not be!"
+#endif
+
+#pragma GCC pop_options
+
+#pragma GCC push_options
+#pragma GCC target ("arch=armv8.5-a+sve2-bitperm")
+
+#ifndef __ARM_FEATURE_SVE
+#error "__ARM_FEATURE_SVE is not defined but should be!"
+#endif
+
+#ifndef __ARM_FEATURE_SVE2
+#error "__ARM_FEATURE_SVE2 is not defined but should be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_AES
+#error "__ARM_FEATURE_SVE2_AES is defined but should not be!"
+#endif
+
+#ifndef __ARM_FEATURE_SVE2_BITPERM
+#error "__ARM_FEATURE_SVE2_BITPERM is not defined but should be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_SHA3
+#error "__ARM_FEATURE_SVE2_SHA3 is defined but should not be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_SM4
+#error "__ARM_FEATURE_SVE2_SM4 is defined but should not be!"
+#endif
+
+#pragma GCC pop_options
+
+#pragma GCC push_options
+#pragma GCC target ("arch=armv8.5-a+sve2-sha3")
+
+#ifndef __ARM_FEATURE_SVE
+#error "__ARM_FEATURE_SVE is not defined but should be!"
+#endif
+
+#ifndef __ARM_FEATURE_SVE2
+#error "__ARM_FEATURE_SVE2 is not defined but should be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_AES
+#error "__ARM_FEATURE_SVE2_AES is defined but should not be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_BITPERM
+#error "__ARM_FEATURE_SVE2_BITPERM is defined but should not be!"
+#endif
+
+#ifndef __ARM_FEATURE_SHA3
+#error "__ARM_FEATURE_SHA3 is not defined but should be!"
+#endif
+
+#ifndef __ARM_FEATURE_SVE2_SHA3
+#error "__ARM_FEATURE_SVE2_SHA3 is not defined but should be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_SM4
+#error "__ARM_FEATURE_SVE2_SM4 is defined but should not be!"
+#endif
+
+#pragma GCC pop_options
+
+#pragma GCC push_options
+#pragma GCC target ("arch=armv8.5-a+sve2-sm4")
+
+#ifndef __ARM_FEATURE_SVE
+#error "__ARM_FEATURE_SVE is not defined but should be!"
+#endif
+
+#ifndef __ARM_FEATURE_SVE2
+#error "__ARM_FEATURE_SVE2 is not defined but should be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_AES
+#error "__ARM_FEATURE_SVE2_AES is defined but should not be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_BITPERM
+#error "__ARM_FEATURE_SVE2_BITPERM is defined but should not be!"
+#endif
+
+#ifdef __ARM_FEATURE_SVE2_SHA3
+#error "__ARM_FEATURE_SVE2_SHA3 is defined but should not be!"
+#endif
+
+#ifndef __ARM_FEATURE_SM4
+#error "__ARM_FEATURE_SM4 is not defined but should be!"
+#endif
+
+#ifndef __ARM_FEATURE_SVE2_SM4
+#error "__ARM_FEATURE_SVE2_SM4 is not defined but should be!"
+#endif
+
+#pragma GCC pop_options
+
+int
+foo (int a)
+{
+  return a;
+}
index 8cc7291..f088455 100644 (file)
     __asm volatile ("" :: "w" (z0));                           \
   }
 
+#define TEST_TYPE_CHANGE_Z(NAME, TYPE1, TYPE2, CODE1, CODE2)   \
+  PROTO (NAME, TYPE1, (TYPE2 z0, TYPE2 z1, TYPE2 z2, TYPE2 z3, \
+                      svbool_t p0, svbool_t p1))               \
+  {                                                            \
+    TYPE1 z0_res;                                              \
+    INVOKE (CODE1, CODE2);                                     \
+    return z0_res;                                             \
+  }
+
 #define TEST_UNIFORM_ZX(NAME, ZTYPE, STYPE, CODE1, CODE2)      \
   PROTO (NAME, ZTYPE, (ZTYPE z0, ZTYPE z1, ZTYPE z2, ZTYPE z3, \
                       svbool_t p0, STYPE x0))                  \
     return p0;                                                 \
   }
 
+#define TEST_DUAL_ZD(NAME, ZTYPE1, ZTYPE2, STYPE, CODE1, CODE2)        \
+  PROTO (NAME, ZTYPE1, (ZTYPE1 z0, ZTYPE1 z1, ZTYPE1 z2,       \
+                       ZTYPE1 z3, ZTYPE2 z4, ZTYPE2 z5,        \
+                       ZTYPE2 z6, STYPE d7, svbool_t p0,       \
+                       svbool_t p1))                           \
+  {                                                            \
+    INVOKE (CODE1, CODE2);                                     \
+    return z0;                                                 \
+  }
+
 #define TEST_DUAL_ZX(NAME, ZTYPE1, ZTYPE2, STYPE, CODE1, CODE2)        \
   PROTO (NAME, ZTYPE1, (ZTYPE1 z0, ZTYPE1 z1, ZTYPE1 z2,       \
                        ZTYPE1 z3, ZTYPE2 z4, ZTYPE2 z5,        \
     return z0;                                                 \
   }
 
+#define TEST_TYPE_CHANGE_ZX(NAME, ZTYPE1, ZTYPE2, STYPE, CODE1, CODE2) \
+  PROTO (NAME, ZTYPE1, (ZTYPE2 z0, ZTYPE2 z1, ZTYPE2 z2,       \
+                       ZTYPE2 z3, svbool_t p0, svbool_t p1,    \
+                       STYPE x0))                              \
+  {                                                            \
+    ZTYPE1 z0_res;                                             \
+    INVOKE (CODE1, CODE2);                                     \
+    return z0_res;                                             \
+  }
+
 #define TEST_LOAD(NAME, ZTYPE, STYPE, CODE1, CODE2)    \
   PROTO (NAME, ZTYPE, (svbool_t p0, const STYPE *x0,   \
                       intptr_t x1))                    \
     __asm volatile ("" :: "w" (z4), "w" (z24));                        \
   }
 
+#define TEST_TBL2(NAME, TTYPE, ZTYPE, UTYPE, CODE1, CODE2)     \
+  PROTO (NAME, ZTYPE, (TTYPE z0, TTYPE z2, UTYPE z4))          \
+  {                                                            \
+    register ZTYPE z0_res __asm ("z0");                                \
+    INVOKE (CODE1, CODE2);                                     \
+    return z0_res;                                             \
+  }
+
+#define TEST_TBL2_REV(NAME, TTYPE, ZTYPE, UTYPE, CODE1, CODE2) \
+  PROTO (NAME, ZTYPE, (UTYPE z0, TTYPE z1, TTYPE z3))          \
+  {                                                            \
+    register ZTYPE z0_res __asm ("z0");                                \
+    INVOKE (CODE1, CODE2);                                     \
+    return z0_res;                                             \
+  }
+
 #endif
index f1879ca..3913ff6 100644 (file)
@@ -9,7 +9,7 @@ f1 (svbool_t pg, svfloat16_t f16, svfloat32_t f32, svfloat64_t f64,
   svmul_lane (f32, f32); /* { dg-error {too few arguments to function 'svmul_lane'} } */
   svmul_lane (f32, f32, 0, 0); /* { dg-error {too many arguments to function 'svmul_lane'} } */
   svmul_lane (pg, pg, 0); /* { dg-error {'svmul_lane' has no form that takes 'svbool_t' arguments} } */
-  svmul_lane (s32, s32, 0); /* { dg-error {'svmul_lane' has no form that takes 'svint32_t' arguments} } */
+  svmul_lane (s32, s32, 0); /* { dg-error {ACLE function 'svmul_lane_s32' requires ISA extension 'sve2'} "" { xfail aarch64_sve2 } } */
   svmul_lane (1, f32, 0); /* { dg-error {passing 'int' to argument 1 of 'svmul_lane', which expects an SVE vector type} } */
   svmul_lane (f32, 1, 0); /* { dg-error {passing 'int' to argument 2 of 'svmul_lane', which expects an SVE vector type} } */
   svmul_lane (f32, f64, 0); /* { dg-error {passing 'svfloat64_t' to argument 2 of 'svmul_lane', but previous arguments had type 'svfloat32_t'} } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_long_lane_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_long_lane_1.c
new file mode 100644 (file)
index 0000000..bfe7808
--- /dev/null
@@ -0,0 +1,47 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8, svint16_t s16, svuint16_t u16,
+    svint32_t s32, svuint32_t u32, svint64_t s64, svuint64_t u64,
+    svfloat16_t f16, svfloat32_t f32, svfloat64_t f64, int i)
+{
+  svmullb_lane (u32, u32); /* { dg-error {too few arguments to function 'svmullb_lane'} } */
+  svmullb_lane (u32, u32, 0, 0); /* { dg-error {too many arguments to function 'svmullb_lane'} } */
+  svmullb_lane (pg, pg, 0); /* { dg-error {'svmullb_lane' has no form that takes 'svbool_t' arguments} } */
+  svmullb_lane (s8, s8, 0); /* { dg-error {'svmullb_lane' has no form that takes 'svint8_t' arguments} } */
+  svmullb_lane (u8, u8, 0); /* { dg-error {'svmullb_lane' has no form that takes 'svuint8_t' arguments} } */
+  svmullb_lane (s64, s64, 0); /* { dg-error {'svmullb_lane' has no form that takes 'svint64_t' arguments} } */
+  svmullb_lane (u64, u64, 0); /* { dg-error {'svmullb_lane' has no form that takes 'svuint64_t' arguments} } */
+  svmullb_lane (f16, f16, 0); /* { dg-error {'svmullb_lane' has no form that takes 'svfloat16_t' arguments} } */
+  svmullb_lane (f32, f32, 0); /* { dg-error {'svmullb_lane' has no form that takes 'svfloat32_t' arguments} } */
+  svmullb_lane (f64, f64, 0); /* { dg-error {'svmullb_lane' has no form that takes 'svfloat64_t' arguments} } */
+  svmullb_lane (1, u32, 0); /* { dg-error {passing 'int' to argument 1 of 'svmullb_lane', which expects an SVE vector type} } */
+  svmullb_lane (u32, 1, 0); /* { dg-error {passing 'int' to argument 2 of 'svmullb_lane', which expects an SVE vector type} } */
+  svmullb_lane (u32, s32, 0); /* { dg-error {passing 'svint32_t' to argument 2 of 'svmullb_lane', but previous arguments had type 'svuint32_t'} } */
+  svmullb_lane (u32, u32, s32); /* { dg-error {argument 3 of 'svmullb_lane' must be an integer constant expression} } */
+  svmullb_lane (u32, u32, i); /* { dg-error {argument 3 of 'svmullb_lane' must be an integer constant expression} } */
+
+  svmullb_lane (s16, s16, 0);
+  svmullb_lane (s16, s16, 7);
+  svmullb_lane (s16, s16, 8); /* { dg-error {passing 8 to argument 3 of 'svmullb_lane', which expects a value in the range \[0, 7\]} } */
+  svmullb_lane (s16, s16, -1); /* { dg-error {passing -1 to argument 3 of 'svmullb_lane', which expects a value in the range \[0, 7\]} } */
+
+  svmullb_lane (u16, u16, 0);
+  svmullb_lane (u16, u16, 7);
+  svmullb_lane (u16, u16, 8); /* { dg-error {passing 8 to argument 3 of 'svmullb_lane', which expects a value in the range \[0, 7\]} } */
+  svmullb_lane (u16, u16, -1); /* { dg-error {passing -1 to argument 3 of 'svmullb_lane', which expects a value in the range \[0, 7\]} } */
+
+  svmullb_lane (s32, s32, 0);
+  svmullb_lane (s32, s32, 3);
+  svmullb_lane (s32, s32, 4); /* { dg-error {passing 4 to argument 3 of 'svmullb_lane', which expects a value in the range \[0, 3\]} } */
+  svmullb_lane (s32, s32, -1); /* { dg-error {passing -1 to argument 3 of 'svmullb_lane', which expects a value in the range \[0, 3\]} } */
+
+  svmullb_lane (u32, u32, 0);
+  svmullb_lane (u32, u32, 3);
+  svmullb_lane (u32, u32, 4); /* { dg-error {passing 4 to argument 3 of 'svmullb_lane', which expects a value in the range \[0, 3\]} } */
+  svmullb_lane (u32, u32, -1); /* { dg-error {passing -1 to argument 3 of 'svmullb_lane', which expects a value in the range \[0, 3\]} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_long_opt_n_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_long_opt_n_1.c
new file mode 100644 (file)
index 0000000..27893c6
--- /dev/null
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8,
+    svint16_t s16, svuint16_t u16,
+    svint32_t s32, svuint32_t u32,
+    svint64_t s64, svuint64_t u64,
+    svfloat16_t f16)
+{
+  svaddlb (u16); /* { dg-error {too few arguments to function 'svaddlb'} } */
+  svaddlb (u16, u16, u16); /* { dg-error {too many arguments to function 'svaddlb'} } */
+  svaddlb (pg, pg); /* { dg-error {'svaddlb' has no form that takes 'svbool_t' arguments} } */
+  svaddlb (u8, u8);
+  svaddlb (s8, s8);
+  svaddlb (u16, u16);
+  svaddlb (s16, s16);
+  svaddlb (u32, u32);
+  svaddlb (s32, s32);
+  svaddlb (u64, u64); /* { dg-error {'svaddlb' has no form that takes 'svuint64_t' arguments} } */
+  svaddlb (s64, s64); /* { dg-error {'svaddlb' has no form that takes 'svint64_t' arguments} } */
+  svaddlb (f16, f16); /* { dg-error {'svaddlb' has no form that takes 'svfloat16_t' arguments} } */
+  svaddlb (1, u8); /* { dg-error {passing 'int' to argument 1 of 'svaddlb', which expects an SVE vector type} } */
+  svaddlb (u8, s8); /* { dg-error {passing 'svint8_t' to argument 2 of 'svaddlb', but previous arguments had type 'svuint8_t'} } */
+  svaddlb (u8, s16); /* { dg-error {passing 'svint16_t' to argument 2 of 'svaddlb', but previous arguments had type 'svuint8_t'} } */
+  svaddlb (u8, u16); /* { dg-error {passing 'svuint16_t' to argument 2 of 'svaddlb', but previous arguments had type 'svuint8_t'} } */
+  svaddlb (u16, pg); /* { dg-error {passing 'svbool_t' to argument 2 of 'svaddlb', but previous arguments had type 'svuint16_t'} } */
+  svaddlb (u8, 0);
+  svaddlb (u16, 0);
+  svaddlb (u32, 0);
+  svaddlb (u64, 0); /* { dg-error {'svaddlb' has no form that takes 'svuint64_t' arguments} } */
+  svaddlb (pg, 0); /* { dg-error {'svaddlb' has no form that takes 'svbool_t' arguments} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_narrowb_opt_n_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_narrowb_opt_n_1.c
new file mode 100644 (file)
index 0000000..920cbd1
--- /dev/null
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8,
+    svint16_t s16, svuint16_t u16,
+    svint32_t s32, svuint32_t u32,
+    svint64_t s64, svuint64_t u64,
+    svfloat32_t f32)
+{
+  svaddhnb (u16); /* { dg-error {too few arguments to function 'svaddhnb'} } */
+  svaddhnb (u16, u16, u16); /* { dg-error {too many arguments to function 'svaddhnb'} } */
+  svaddhnb (pg, pg); /* { dg-error {'svaddhnb' has no form that takes 'svbool_t' arguments} } */
+  svaddhnb (u8, u8); /* { dg-error {'svaddhnb' has no form that takes 'svuint8_t' arguments} } */
+  svaddhnb (s8, s8); /* { dg-error {'svaddhnb' has no form that takes 'svint8_t' arguments} } */
+  svaddhnb (u16, u16);
+  svaddhnb (s16, s16);
+  svaddhnb (u32, u32);
+  svaddhnb (s32, s32);
+  svaddhnb (u64, u64);
+  svaddhnb (s64, s64);
+  svaddhnb (f32, f32); /* { dg-error {'svaddhnb' has no form that takes 'svfloat32_t' arguments} } */
+  svaddhnb (1, u16); /* { dg-error {passing 'int' to argument 1 of 'svaddhnb', which expects an SVE vector type} } */
+  svaddhnb (u16, s8); /* { dg-error {passing 'svint8_t' to argument 2 of 'svaddhnb', but previous arguments had type 'svuint16_t'} } */
+  svaddhnb (u16, s16); /* { dg-error {passing 'svint16_t' to argument 2 of 'svaddhnb', but previous arguments had type 'svuint16_t'} } */
+  svaddhnb (u16, u32); /* { dg-error {passing 'svuint32_t' to argument 2 of 'svaddhnb', but previous arguments had type 'svuint16_t'} } */
+  svaddhnb (u16, pg); /* { dg-error {passing 'svbool_t' to argument 2 of 'svaddhnb', but previous arguments had type 'svuint16_t'} } */
+  svaddhnb (u8, 0); /* { dg-error {'svaddhnb' has no form that takes 'svuint8_t' arguments} } */
+  svaddhnb (u16, 0);
+  svaddhnb (u32, 0);
+  svaddhnb (u64, 0);
+  svaddhnb (pg, 0); /* { dg-error {'svaddhnb' has no form that takes 'svbool_t' arguments} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_narrowt_opt_n_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_narrowt_opt_n_1.c
new file mode 100644 (file)
index 0000000..eb70d05
--- /dev/null
@@ -0,0 +1,43 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8,
+    svint16_t s16, svuint16_t u16,
+    svint32_t s32, svuint32_t u32,
+    svint64_t s64, svuint64_t u64,
+    svfloat16_t f16, svfloat32_t f32)
+{
+  svaddhnt (u32, u16); /* { dg-error {too few arguments to function 'svaddhnt'} } */
+  svaddhnt (u32, u16, u16, u16); /* { dg-error {too many arguments to function 'svaddhnt'} } */
+  svaddhnt (pg, pg, pg); /* { dg-error {'svaddhnt' has no form that takes 'svbool_t' arguments} } */
+  svaddhnt (u8, u8, u8); /* { dg-error {'svaddhnt' has no form that takes 'svuint8_t' arguments} } */
+  svaddhnt (s8, s8, s8); /* { dg-error {'svaddhnt' has no form that takes 'svint8_t' arguments} } */
+  svaddhnt (u16, u16, u16); /* { dg-error {passing 'svuint16_t' instead of the expected 'svuint8_t' to argument 1 of 'svaddhnt', after passing 'svuint16_t' to argument 2} } */
+  svaddhnt (s8, u16, u16); /* { dg-error {arguments 1 and 2 of 'svaddhnt' must have the same signedness, but the values passed here have type 'svint8_t' and 'svuint16_t' respectively} } */
+  svaddhnt (pg, u16, u16); /* { dg-error {passing 'svbool_t' instead of the expected 'svuint8_t' to argument 1 of 'svaddhnt', after passing 'svuint16_t' to argument 2} } */
+  svaddhnt (u8, u16, u16);
+  svaddhnt (s8, s16, s16);
+  svaddhnt (u16, u32, u32);
+  svaddhnt (s16, s32, s32);
+  svaddhnt (u32, u64, u64);
+  svaddhnt (s32, s64, s64);
+  svaddhnt (f16, f32, f32); /* { dg-error {'svaddhnt' has no form that takes 'svfloat32_t' arguments} } */
+  svaddhnt (1, u16, u16); /* { dg-error {passing 'int' to argument 1 of 'svaddhnt', which expects an SVE vector type} } */
+  svaddhnt (u8, 1, u16); /* { dg-error {passing 'int' to argument 2 of 'svaddhnt', which expects an SVE vector type} } */
+  svaddhnt (u8, u16, s8); /* { dg-error {passing 'svint8_t' to argument 3 of 'svaddhnt', but previous arguments had type 'svuint16_t'} } */
+  svaddhnt (u8, u16, s16); /* { dg-error {passing 'svint16_t' to argument 3 of 'svaddhnt', but previous arguments had type 'svuint16_t'} } */
+  svaddhnt (u8, u16, u32); /* { dg-error {passing 'svuint32_t' to argument 3 of 'svaddhnt', but previous arguments had type 'svuint16_t'} } */
+  svaddhnt (u8, u16, pg); /* { dg-error {passing 'svbool_t' to argument 3 of 'svaddhnt', but previous arguments had type 'svuint16_t'} } */
+  svaddhnt (u8, u8, 0); /* { dg-error {'svaddhnt' has no form that takes 'svuint8_t' arguments} } */
+  svaddhnt (u16, u16, 0); /* { dg-error {passing 'svuint16_t' instead of the expected 'svuint8_t' to argument 1 of 'svaddhnt', after passing 'svuint16_t' to argument 2} } */
+  svaddhnt (s8, u16, 0); /* { dg-error {arguments 1 and 2 of 'svaddhnt' must have the same signedness, but the values passed here have type 'svint8_t' and 'svuint16_t' respectively} } */
+  svaddhnt (pg, u16, 0); /* { dg-error {passing 'svbool_t' instead of the expected 'svuint8_t' to argument 1 of 'svaddhnt', after passing 'svuint16_t' to argument 2} } */
+  svaddhnt (u8, u16, 0);
+  svaddhnt (u16, u32, 0);
+  svaddhnt (u32, u64, 0);
+  svaddhnt (pg, pg, 0); /* { dg-error {'svaddhnt' has no form that takes 'svbool_t' arguments} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_to_uint_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_to_uint_1.c
new file mode 100644 (file)
index 0000000..213defc
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+svuint8_t
+f1 (svbool_t pg, svint32_t s32, svuint32_t u32)
+{
+  svhistcnt_z (pg, s32); /* { dg-error {too few arguments to function 'svhistcnt_z'} } */
+  svhistcnt_z (pg, s32, s32, 0); /* { dg-error {too many arguments to function 'svhistcnt_z'} } */
+  svhistcnt_z (0, s32, s32); /* { dg-error {passing 'int' to argument 1 of 'svhistcnt_z', which expects 'svbool_t'} } */
+  svhistcnt_z (s32, s32, s32); /* { dg-error {passing 'svint32_t' to argument 1 of 'svhistcnt_z', which expects 'svbool_t'} } */
+  svhistcnt_z (pg, 0, s32); /* { dg-error {passing 'int' to argument 2 of 'svhistcnt_z', which expects an SVE vector type} } */
+  svhistcnt_z (pg, pg, s32); /* { dg-error {passing 'svint32_t' to argument 3 of 'svhistcnt_z', but previous arguments had type 'svbool_t'} } */
+  svhistcnt_z (pg, s32, u32); /* { dg-error {passing 'svuint32_t' to argument 3 of 'svhistcnt_z', but previous arguments had type 'svint32_t'} } */
+  svhistcnt_z (pg, s32, 0); /* { dg-error {passing 'int' to argument 3 of 'svhistcnt_z', which expects an SVE vector type} } */
+  svhistcnt_z (pg, pg, pg); /* { dg-error {'svhistcnt_z' has no form that takes 'svbool_t' arguments} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_wide_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_wide_1.c
new file mode 100644 (file)
index 0000000..f58ab75
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8,
+    svint16_t s16, svuint16_t u16,
+    svint32_t s32, svuint32_t u32,
+    svint64_t s64, svuint64_t u64,
+    svfloat16_t f16, svfloat32_t f32)
+{
+  svadalp_m (pg, u16); /* { dg-error {too few arguments to function 'svadalp_m'} } */
+  svadalp_m (pg, u16, u8, u8); /* { dg-error {too many arguments to function 'svadalp_m'} } */
+  svadalp_m (0, pg, pg); /* { dg-error {passing 'int' to argument 1 of 'svadalp_m', which expects 'svbool_t'} } */
+  svadalp_m (u16, u8, u8); /* { dg-error {passing 'svuint16_t' to argument 1 of 'svadalp_m', which expects 'svbool_t'} } */
+  svadalp_m (u32, u32, u16); /* { dg-error {passing 'svuint32_t' to argument 1 of 'svadalp_m', which expects 'svbool_t'} } */
+  svadalp_m (pg, pg, pg); /* { dg-error {'svadalp_m' has no form that takes 'svbool_t' arguments} } */
+  svadalp_m (pg, u8, u8); /* { dg-error {'svadalp_m' has no form that takes 'svuint8_t' arguments} } */
+  svadalp_m (pg, s8, s8); /* { dg-error {'svadalp_m' has no form that takes 'svint8_t' arguments} } */
+  svadalp_m (pg, u16, u16); /* { dg-error {passing 'svuint16_t' instead of the expected 'svuint8_t' to argument 3 of 'svadalp_m', after passing 'svuint16_t' to argument 2} } */
+  svadalp_m (pg, u16, s16); /* { dg-error {passing 'svint16_t' instead of the expected 'svuint8_t' to argument 3 of 'svadalp_m', after passing 'svuint16_t' to argument 2} } */
+  svadalp_m (pg, u16, u8);
+  svadalp_m (pg, u16, s8); /* { dg-error {arguments 2 and 3 of 'svadalp_m' must have the same signedness, but the values passed here have type 'svuint16_t' and 'svint8_t' respectively} } */
+  svadalp_m (pg, u16, pg); /* { dg-error {passing 'svbool_t' instead of the expected 'svuint8_t' to argument 3 of 'svadalp_m', after passing 'svuint16_t' to argument 2} } */
+  svadalp_m (pg, s16, u16); /* { dg-error {passing 'svuint16_t' instead of the expected 'svint8_t' to argument 3 of 'svadalp_m', after passing 'svint16_t' to argument 2} } */
+  svadalp_m (pg, s16, s16); /* { dg-error {passing 'svint16_t' instead of the expected 'svint8_t' to argument 3 of 'svadalp_m', after passing 'svint16_t' to argument 2} } */
+  svadalp_m (pg, s16, u8); /* { dg-error {arguments 2 and 3 of 'svadalp_m' must have the same signedness, but the values passed here have type 'svint16_t' and 'svuint8_t' respectively} } */
+  svadalp_m (pg, s16, s8);
+  svadalp_m (pg, f32, f16); /* { dg-error {'svadalp_m' has no form that takes 'svfloat32_t' arguments} } */
+  svadalp_m (pg, f16, f32); /* { dg-error {'svadalp_m' has no form that takes 'svfloat16_t' arguments} } */
+  svadalp_m (pg, 0, u32); /* { dg-error {passing 'int' to argument 2 of 'svadalp_m', which expects an SVE vector type} } */
+  svadalp_m (pg, 0, u64); /* { dg-error {passing 'int' to argument 2 of 'svadalp_m', which expects an SVE vector type} } */
+  svadalp_m (pg, u8, 0); /* { dg-error {passing 'int' to argument 3 of 'svadalp_m', which expects an SVE vector type} } */
+  svadalp_m (pg, u16, 0); /* { dg-error {passing 'int' to argument 3 of 'svadalp_m', which expects an SVE vector type} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_wide_opt_n_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/binary_wide_opt_n_1.c
new file mode 100644 (file)
index 0000000..5a58211
--- /dev/null
@@ -0,0 +1,38 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8,
+    svint16_t s16, svuint16_t u16,
+    svint32_t s32, svuint32_t u32,
+    svint64_t s64, svuint64_t u64,
+    svfloat16_t f16, svfloat32_t f32)
+{
+  svaddwb (u16); /* { dg-error {too few arguments to function 'svaddwb'} } */
+  svaddwb (u16, u8, u8); /* { dg-error {too many arguments to function 'svaddwb'} } */
+  svaddwb (pg, pg); /* { dg-error {'svaddwb' has no form that takes 'svbool_t' arguments} } */
+  svaddwb (u8, u8); /* { dg-error {'svaddwb' has no form that takes 'svuint8_t' arguments} } */
+  svaddwb (s8, s8); /* { dg-error {'svaddwb' has no form that takes 'svint8_t' arguments} } */
+  svaddwb (u16, u16); /* { dg-error {passing 'svuint16_t' instead of the expected 'svuint8_t' to argument 2 of 'svaddwb', after passing 'svuint16_t' to argument 1} } */
+  svaddwb (u16, s16); /* { dg-error {passing 'svint16_t' instead of the expected 'svuint8_t' to argument 2 of 'svaddwb', after passing 'svuint16_t' to argument 1} } */
+  svaddwb (u16, u8);
+  svaddwb (u16, s8); /* { dg-error {arguments 1 and 2 of 'svaddwb' must have the same signedness, but the values passed here have type 'svuint16_t' and 'svint8_t' respectively} } */
+  svaddwb (u16, pg); /* { dg-error {passing 'svbool_t' instead of the expected 'svuint8_t' to argument 2 of 'svaddwb', after passing 'svuint16_t' to argument 1} } */
+  svaddwb (s16, u16); /* { dg-error {passing 'svuint16_t' instead of the expected 'svint8_t' to argument 2 of 'svaddwb', after passing 'svint16_t' to argument 1} } */
+  svaddwb (s16, s16); /* { dg-error {passing 'svint16_t' instead of the expected 'svint8_t' to argument 2 of 'svaddwb', after passing 'svint16_t' to argument 1} } */
+  svaddwb (s16, u8); /* { dg-error {arguments 1 and 2 of 'svaddwb' must have the same signedness, but the values passed here have type 'svint16_t' and 'svuint8_t' respectively} } */
+  svaddwb (s16, s8);
+  svaddwb (f32, f16); /* { dg-error {'svaddwb' has no form that takes 'svfloat32_t' arguments} } */
+  svaddwb (f16, f32); /* { dg-error {'svaddwb' has no form that takes 'svfloat16_t' arguments} } */
+  svaddwb (0, u32); /* { dg-error {passing 'int' to argument 1 of 'svaddwb', which expects an SVE vector type} } */
+  svaddwb (0, u64); /* { dg-error {passing 'int' to argument 1 of 'svaddwb', which expects an SVE vector type} } */
+  svaddwb (u8, 0); /* { dg-error {'svaddwb' has no form that takes 'svuint8_t' arguments} } */
+  svaddwb (u16, 0);
+  svaddwb (u32, 0);
+  svaddwb (u64, 0);
+  svaddwb (pg, 0); /* { dg-error {'svaddwb' has no form that takes 'svbool_t' arguments} } */
+  svaddwb (f32, 0); /* { dg-error {'svaddwb' has no form that takes 'svfloat32_t' arguments} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/compare_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/compare_1.c
new file mode 100644 (file)
index 0000000..12511a8
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8,
+    svint16_t s16, svuint16_t u16, svfloat16_t f16)
+{
+  svmatch (pg, u8); /* { dg-error {too few arguments to function 'svmatch'} } */
+  svmatch (pg, u8, u8, u8); /* { dg-error {too many arguments to function 'svmatch'} } */
+  svmatch (u8, u8, u8); /* { dg-error {passing 'svuint8_t' to argument 1 of 'svmatch', which expects 'svbool_t'} } */
+  svmatch (pg, pg, pg); /* { dg-error {'svmatch' has no form that takes 'svbool_t' arguments} } */
+  svmatch (pg, 1, u8); /* { dg-error {passing 'int' to argument 2 of 'svmatch', which expects an SVE vector type} } */
+  svmatch (pg, u8, s8); /* { dg-error {passing 'svint8_t' to argument 3 of 'svmatch', but previous arguments had type 'svuint8_t'} } */
+  svmatch (pg, u8, u8);
+  svmatch (pg, u8, s16); /* { dg-error {passing 'svint16_t' to argument 3 of 'svmatch', but previous arguments had type 'svuint8_t'} } */
+  svmatch (pg, u8, u16); /* { dg-error {passing 'svuint16_t' to argument 3 of 'svmatch', but previous arguments had type 'svuint8_t'} } */
+  svmatch (pg, u8, f16); /* { dg-error {passing 'svfloat16_t' to argument 3 of 'svmatch', but previous arguments had type 'svuint8_t'} } */
+  svmatch (pg, u8, pg); /* { dg-error {passing 'svbool_t' to argument 3 of 'svmatch', but previous arguments had type 'svuint8_t'} } */
+  svmatch (pg, u8, 0); /* { dg-error {passing 'int' to argument 3 of 'svmatch', which expects an SVE vector type} } */
+
+  svmatch (pg, f16, s16); /* { dg-error {passing 'svint16_t' to argument 3 of 'svmatch', but previous arguments had type 'svfloat16_t'} } */
+  svmatch (pg, f16, u16); /* { dg-error {passing 'svuint16_t' to argument 3 of 'svmatch', but previous arguments had type 'svfloat16_t'} } */
+  svmatch (pg, f16, f16); /* { dg-error {'svmatch' has no form that takes 'svfloat16_t' arguments} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/compare_ptr_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/compare_ptr_1.c
new file mode 100644 (file)
index 0000000..d184e34
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+struct foo;
+
+void
+f1 (svbool_t pg, svint8_t s8, int8_t *s8_ptr, uint8_t *u8_ptr,
+    uint16_t *u16_ptr, svbool_t *pg_ptr, const struct foo *foo_ptr)
+{
+  svwhilerw (u8_ptr); /* { dg-error {too few arguments to function 'svwhilerw'} } */
+  svwhilerw (u8_ptr, u8_ptr, u8_ptr); /* { dg-error {too many arguments to function 'svwhilerw'} } */
+  svwhilerw (pg, u8_ptr); /* { dg-error {passing 'svbool_t' to argument 1 of 'svwhilerw', which expects a pointer type} } */
+  svwhilerw (0, u8_ptr); /* { dg-error {passing 'int' to argument 1 of 'svwhilerw', which expects a pointer type} } */
+  svwhilerw (s8, u8_ptr); /* { dg-error {passing 'svint8_t' to argument 1 of 'svwhilerw', which expects a pointer type} } */
+  svwhilerw (1, u8_ptr); /* { dg-error {passing 'int' to argument 1 of 'svwhilerw', which expects a pointer type} } */
+  svwhilerw (pg_ptr, u8_ptr); /* { dg-error {passing 'svbool_t \*' to argument 1 of 'svwhilerw', but 'svbool_t' is not a valid SVE element type} } */
+  svwhilerw (foo_ptr, u8_ptr); /* { dg-error {passing 'const struct foo \*' to argument 1 of 'svwhilerw', but 'struct foo' is not a valid SVE element type} } */
+  svwhilerw (u8_ptr, 0); /* { dg-error {passing 'int' to argument 2 of 'svwhilerw', which expects a pointer type} } */
+  svwhilerw (u8_ptr, s8); /* { dg-error {passing 'svint8_t' to argument 2 of 'svwhilerw', which expects a pointer type} } */
+  svwhilerw (u8_ptr, u8_ptr);
+  svwhilerw (u8_ptr, s8_ptr); /* { dg-error {passing 'int8_t \*'[^\n]* to argument 2 of 'svwhilerw', but argument 1 had type 'uint8_t \*'} } */
+  svwhilerw (u8_ptr, u16_ptr); /* { dg-error {passing 'uint16_t \*'[^\n]* to argument 2 of 'svwhilerw', but argument 1 had type 'uint8_t \*'} } */
+  svwhilerw (s8_ptr, u8_ptr); /* { dg-error {passing 'uint8_t \*'[^\n]* to argument 2 of 'svwhilerw', but argument 1 had type 'int8_t \*'} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_index_restricted_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_index_restricted_1.c
new file mode 100644 (file)
index 0000000..c47e541
--- /dev/null
@@ -0,0 +1,43 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c99 -Wpointer-sign" } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+struct s { int i; };
+
+void
+f1 (svbool_t pg, short *s16_ptr, unsigned short *u16_ptr,
+    svint8_t s8, svint16_t s16,
+    svint32_t s32, svuint32_t u32, svfloat32_t f32,
+    svint64_t s64, svuint64_t u64, svfloat64_t f64, struct s s)
+{
+  svldnt1sh_gather_index (pg, s16_ptr, s64); /* { dg-warning {implicit declaration of function 'svldnt1sh_gather_index'; did you mean 'svldnt1_gather_index'} } */
+  svldnt1sh_gather_index_u64 (pg, s16_ptr); /* { dg-error {too few arguments to function 'svldnt1sh_gather_index_u64'} } */
+  svldnt1sh_gather_index_u64 (pg, s16_ptr, s64, 0); /* { dg-error {too many arguments to function 'svldnt1sh_gather_index_u64'} } */
+  svldnt1sh_gather_index_u64 (pg, u16_ptr, s64); /* { dg-warning {pointer targets in passing argument 2 of 'svldnt1sh_gather_s64index_u64' differ in signedness} } */
+  svldnt1sh_gather_index_u64 (pg, s16_ptr, pg); /* { dg-error {passing 'svbool_t' to argument 3 of 'svldnt1sh_gather_index_u64', which expects a vector of 64-bit integers} } */
+  svldnt1sh_gather_index_u64 (pg, s16_ptr, s8); /* { dg-error {passing 'svint8_t' to argument 3 of 'svldnt1sh_gather_index_u64', which expects a vector of 64-bit integers} } */
+  svldnt1sh_gather_index_u64 (pg, s16_ptr, s16); /* { dg-error {passing 'svint16_t' to argument 3 of 'svldnt1sh_gather_index_u64', which expects a vector of 64-bit integers} } */
+  svldnt1sh_gather_index_u64 (pg, s16_ptr, s64);
+  svldnt1sh_gather_index_u64 (pg, s16_ptr, u64);
+  svldnt1sh_gather_index_u64 (pg, s16_ptr, f64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svldnt1sh_gather_index_u64', which expects a vector of 64-bit integers} } */
+  svldnt1sh_gather_index_u64 (pg, s16_ptr, s32); /* { dg-error {passing 'svint32_t' to argument 3 of 'svldnt1sh_gather_index_u64', which expects a vector of 64-bit integers} } */
+  svldnt1sh_gather_index_u64 (pg, s16_ptr, u32); /* { dg-error {passing 'svuint32_t' to argument 3 of 'svldnt1sh_gather_index_u64', which expects a vector of 64-bit integers} } */
+  svldnt1sh_gather_index_u64 (pg, s16_ptr, f32); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svldnt1sh_gather_index_u64', which expects a vector of 64-bit integers} } */
+
+  svldnt1sh_gather_index_u64 (pg, 0, s64);
+  svldnt1sh_gather_index_u64 (pg, s, s64); /* { dg-error {'struct s' to argument 2 of 'svldnt1sh_gather_index_u64', which expects a vector or pointer base address} } */
+
+  svldnt1sh_gather_index_u64 (pg, pg, 0); /* { dg-error {passing 'svbool_t' to argument 2 of 'svldnt1sh_gather_index_u64', which expects 'svuint64_t'} } */
+  svldnt1sh_gather_index_u64 (pg, s64, 0); /* { dg-error {passing 'svint64_t' to argument 2 of 'svldnt1sh_gather_index_u64', which expects 'svuint64_t'} } */
+  svldnt1sh_gather_index_u64 (pg, u64, 0);
+  svldnt1sh_gather_index_u64 (pg, u32, 0); /* { dg-error {passing 'svuint32_t' to argument 2 of 'svldnt1sh_gather_index_u64', which expects 'svuint64_t'} } */
+
+  svldnt1sh_gather_index_u32 (pg, u16_ptr, s32); /* { dg-error {'svldnt1sh_gather_index_u32' requires a vector base and a scalar index} } */
+  svldnt1sh_gather_index_u32 (pg, s16_ptr, pg); /* { dg-error {'svldnt1sh_gather_index_u32' requires a vector base and a scalar index} } */
+  svldnt1sh_gather_index_u32 (pg, s16_ptr, s8); /* { dg-error {'svldnt1sh_gather_index_u32' requires a vector base and a scalar index} } */
+  svldnt1sh_gather_index_u32 (pg, s16_ptr, s16); /* { dg-error {'svldnt1sh_gather_index_u32' requires a vector base and a scalar index} } */
+  svldnt1sh_gather_index_u32 (pg, s16_ptr, 0); /* { dg-error {'svldnt1sh_gather_index_u32' requires a vector base and a scalar index} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_1.c
new file mode 100644 (file)
index 0000000..353fec2
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c99" } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+struct s { int i; };
+
+void
+f1 (svbool_t pg, signed char *s8_ptr, short *s16_ptr,
+    svint8_t s8, svint16_t s16,
+    svint32_t s32, svuint32_t u32, svfloat32_t f32,
+    svint64_t s64, svuint64_t u64, svfloat64_t f64, struct s s)
+{
+  svldnt1sb_gather_offset (pg, s8_ptr, s32); /* { dg-warning {implicit declaration of function 'svldnt1sb_gather_offset'; did you mean 'svldnt1_gather_offset'} } */
+  svldnt1sb_gather_offset_s32 (pg, s8_ptr); /* { dg-error {too few arguments to function 'svldnt1sb_gather_offset_s32'} } */
+  svldnt1sb_gather_offset_s32 (pg, s8_ptr, u32, 0); /* { dg-error {too many arguments to function 'svldnt1sb_gather_offset_s32'} } */
+  svldnt1sb_gather_offset_s32 (pg, s16_ptr, u32); /* { dg-warning {passing argument 2 of 'svldnt1sb_gather_u32offset_s32' from incompatible pointer type} } */
+  svldnt1sb_gather_offset_s32 (pg, s8_ptr, pg); /* { dg-error {passing 'svbool_t' to argument 3 of 'svldnt1sb_gather_offset_s32', which expects a vector of 32-bit integers} } */
+  svldnt1sb_gather_offset_s32 (pg, s8_ptr, s8); /* { dg-error {passing 'svint8_t' to argument 3 of 'svldnt1sb_gather_offset_s32', which expects a vector of 32-bit integers} } */
+  svldnt1sb_gather_offset_s32 (pg, s8_ptr, s16); /* { dg-error {passing 'svint16_t' to argument 3 of 'svldnt1sb_gather_offset_s32', which expects a vector of 32-bit integers} } */
+  svldnt1sb_gather_offset_s32 (pg, s8_ptr, s32); /* { dg-error {'svldnt1sb_gather_offset_s32' does not support sign-extended offsets} } */
+  svldnt1sb_gather_offset_s32 (pg, s8_ptr, u32);
+  svldnt1sb_gather_offset_s32 (pg, s8_ptr, f32); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svldnt1sb_gather_offset_s32', which expects a vector of 32-bit integers} } */
+  svldnt1sb_gather_offset_s32 (pg, s8_ptr, s64); /* { dg-error {passing 'svint64_t' to argument 3 of 'svldnt1sb_gather_offset_s32', which expects a vector of 32-bit integers} } */
+  svldnt1sb_gather_offset_s32 (pg, s8_ptr, u64); /* { dg-error {passing 'svuint64_t' to argument 3 of 'svldnt1sb_gather_offset_s32', which expects a vector of 32-bit integers} } */
+  svldnt1sb_gather_offset_s32 (pg, s8_ptr, f64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svldnt1sb_gather_offset_s32', which expects a vector of 32-bit integers} } */
+
+  svldnt1sb_gather_offset_s32 (pg, 0, u32);
+  svldnt1sb_gather_offset_s32 (pg, s, u32); /* { dg-error {'struct s' to argument 2 of 'svldnt1sb_gather_offset_s32', which expects a vector or pointer base address} } */
+
+  svldnt1sb_gather_offset_s32 (pg, pg, 0); /* { dg-error {passing 'svbool_t' to argument 2 of 'svldnt1sb_gather_offset_s32', which expects 'svuint32_t'} } */
+  svldnt1sb_gather_offset_s32 (pg, s32, 0); /* { dg-error {passing 'svint32_t' to argument 2 of 'svldnt1sb_gather_offset_s32', which expects 'svuint32_t'} } */
+  svldnt1sb_gather_offset_s32 (pg, u32, 0);
+  svldnt1sb_gather_offset_s32 (pg, u64, 0); /* { dg-error {passing 'svuint64_t' to argument 2 of 'svldnt1sb_gather_offset_s32', which expects 'svuint32_t'} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_2.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_2.c
new file mode 100644 (file)
index 0000000..e22b3dd
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c99" } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+struct s { int i; };
+
+void
+f1 (svbool_t pg, signed char *s8_ptr, short *s16_ptr,
+    svint8_t s8, svint16_t s16,
+    svint32_t s32, svuint32_t u32, svfloat32_t f32,
+    svint64_t s64, svuint64_t u64, svfloat64_t f64, struct s s)
+{
+  svldnt1sb_gather_offset (pg, s8_ptr, s32); /* { dg-warning {implicit declaration of function 'svldnt1sb_gather_offset'; did you mean 'svldnt1_gather_offset'} } */
+  svldnt1sb_gather_offset_u32 (pg, s8_ptr); /* { dg-error {too few arguments to function 'svldnt1sb_gather_offset_u32'} } */
+  svldnt1sb_gather_offset_u32 (pg, s8_ptr, u32, 0); /* { dg-error {too many arguments to function 'svldnt1sb_gather_offset_u32'} } */
+  svldnt1sb_gather_offset_u32 (pg, s16_ptr, u32); /* { dg-warning {passing argument 2 of 'svldnt1sb_gather_u32offset_u32' from incompatible pointer type} } */
+  svldnt1sb_gather_offset_u32 (pg, s8_ptr, pg); /* { dg-error {passing 'svbool_t' to argument 3 of 'svldnt1sb_gather_offset_u32', which expects a vector of 32-bit integers} } */
+  svldnt1sb_gather_offset_u32 (pg, s8_ptr, s8); /* { dg-error {passing 'svint8_t' to argument 3 of 'svldnt1sb_gather_offset_u32', which expects a vector of 32-bit integers} } */
+  svldnt1sb_gather_offset_u32 (pg, s8_ptr, s16); /* { dg-error {passing 'svint16_t' to argument 3 of 'svldnt1sb_gather_offset_u32', which expects a vector of 32-bit integers} } */
+  svldnt1sb_gather_offset_u32 (pg, s8_ptr, s32); /* { dg-error {'svldnt1sb_gather_offset_u32' does not support sign-extended offsets} } */
+  svldnt1sb_gather_offset_u32 (pg, s8_ptr, u32);
+  svldnt1sb_gather_offset_u32 (pg, s8_ptr, f32); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svldnt1sb_gather_offset_u32', which expects a vector of 32-bit integers} } */
+  svldnt1sb_gather_offset_u32 (pg, s8_ptr, s64); /* { dg-error {passing 'svint64_t' to argument 3 of 'svldnt1sb_gather_offset_u32', which expects a vector of 32-bit integers} } */
+  svldnt1sb_gather_offset_u32 (pg, s8_ptr, u64); /* { dg-error {passing 'svuint64_t' to argument 3 of 'svldnt1sb_gather_offset_u32', which expects a vector of 32-bit integers} } */
+  svldnt1sb_gather_offset_u32 (pg, s8_ptr, f64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svldnt1sb_gather_offset_u32', which expects a vector of 32-bit integers} } */
+
+  svldnt1sb_gather_offset_u32 (pg, 0, u32);
+  svldnt1sb_gather_offset_u32 (pg, s, u32); /* { dg-error {'struct s' to argument 2 of 'svldnt1sb_gather_offset_u32', which expects a vector or pointer base address} } */
+
+  svldnt1sb_gather_offset_u32 (pg, pg, 0); /* { dg-error {passing 'svbool_t' to argument 2 of 'svldnt1sb_gather_offset_u32', which expects 'svuint32_t'} } */
+  svldnt1sb_gather_offset_u32 (pg, s32, 0); /* { dg-error {passing 'svint32_t' to argument 2 of 'svldnt1sb_gather_offset_u32', which expects 'svuint32_t'} } */
+  svldnt1sb_gather_offset_u32 (pg, u32, 0);
+  svldnt1sb_gather_offset_u32 (pg, u64, 0); /* { dg-error {passing 'svuint64_t' to argument 2 of 'svldnt1sb_gather_offset_u32', which expects 'svuint32_t'} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_3.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_3.c
new file mode 100644 (file)
index 0000000..73b5715
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c99" } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+struct s { int i; };
+
+void
+f1 (svbool_t pg, signed char *s8_ptr, short *s16_ptr,
+    svint8_t s8, svint16_t s16,
+    svint32_t s32, svuint32_t u32, svfloat32_t f32,
+    svint64_t s64, svuint64_t u64, svfloat64_t f64, struct s s)
+{
+  svldnt1sb_gather_offset (pg, s8_ptr, s64); /* { dg-warning {implicit declaration of function 'svldnt1sb_gather_offset'; did you mean 'svldnt1_gather_offset'} } */
+  svldnt1sb_gather_offset_s64 (pg, s8_ptr); /* { dg-error {too few arguments to function 'svldnt1sb_gather_offset_s64'} } */
+  svldnt1sb_gather_offset_s64 (pg, s8_ptr, s64, 0); /* { dg-error {too many arguments to function 'svldnt1sb_gather_offset_s64'} } */
+  svldnt1sb_gather_offset_s64 (pg, s16_ptr, s64); /* { dg-warning {passing argument 2 of 'svldnt1sb_gather_s64offset_s64' from incompatible pointer type} } */
+  svldnt1sb_gather_offset_s64 (pg, s8_ptr, pg); /* { dg-error {passing 'svbool_t' to argument 3 of 'svldnt1sb_gather_offset_s64', which expects a vector of 64-bit integers} } */
+  svldnt1sb_gather_offset_s64 (pg, s8_ptr, s8); /* { dg-error {passing 'svint8_t' to argument 3 of 'svldnt1sb_gather_offset_s64', which expects a vector of 64-bit integers} } */
+  svldnt1sb_gather_offset_s64 (pg, s8_ptr, s16); /* { dg-error {passing 'svint16_t' to argument 3 of 'svldnt1sb_gather_offset_s64', which expects a vector of 64-bit integers} } */
+  svldnt1sb_gather_offset_s64 (pg, s8_ptr, s32); /* { dg-error {passing 'svint32_t' to argument 3 of 'svldnt1sb_gather_offset_s64', which expects a vector of 64-bit integers} } */
+  svldnt1sb_gather_offset_s64 (pg, s8_ptr, u32); /* { dg-error {passing 'svuint32_t' to argument 3 of 'svldnt1sb_gather_offset_s64', which expects a vector of 64-bit integers} } */
+  svldnt1sb_gather_offset_s64 (pg, s8_ptr, f32); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svldnt1sb_gather_offset_s64', which expects a vector of 64-bit integers} } */
+  svldnt1sb_gather_offset_s64 (pg, s8_ptr, s64);
+  svldnt1sb_gather_offset_s64 (pg, s8_ptr, u64);
+  svldnt1sb_gather_offset_s64 (pg, s8_ptr, f64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svldnt1sb_gather_offset_s64', which expects a vector of 64-bit integers} } */
+
+  svldnt1sb_gather_offset_s64 (pg, 0, s64);
+  svldnt1sb_gather_offset_s64 (pg, s, s64); /* { dg-error {'struct s' to argument 2 of 'svldnt1sb_gather_offset_s64', which expects a vector or pointer base address} } */
+
+  svldnt1sb_gather_offset_s64 (pg, pg, 0); /* { dg-error {passing 'svbool_t' to argument 2 of 'svldnt1sb_gather_offset_s64', which expects 'svuint64_t'} } */
+  svldnt1sb_gather_offset_s64 (pg, s32, 0); /* { dg-error {passing 'svint32_t' to argument 2 of 'svldnt1sb_gather_offset_s64', which expects 'svuint64_t'} } */
+  svldnt1sb_gather_offset_s64 (pg, u32, 0); /* { dg-error {passing 'svuint32_t' to argument 2 of 'svldnt1sb_gather_offset_s64', which expects 'svuint64_t'} } */
+  svldnt1sb_gather_offset_s64 (pg, u64, 0);
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_4.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_ext_gather_offset_restricted_4.c
new file mode 100644 (file)
index 0000000..e2ceb18
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c99" } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+struct s { int i; };
+
+void
+f1 (svbool_t pg, signed char *s8_ptr, short *s16_ptr,
+    svint8_t s8, svint16_t s16,
+    svint32_t s32, svuint32_t u32, svfloat32_t f32,
+    svint64_t s64, svuint64_t u64, svfloat64_t f64, struct s s)
+{
+  svldnt1sb_gather_offset (pg, s8_ptr, s64); /* { dg-warning {implicit declaration of function 'svldnt1sb_gather_offset'; did you mean 'svldnt1_gather_offset'} } */
+  svldnt1sb_gather_offset_u64 (pg, s8_ptr); /* { dg-error {too few arguments to function 'svldnt1sb_gather_offset_u64'} } */
+  svldnt1sb_gather_offset_u64 (pg, s8_ptr, s64, 0); /* { dg-error {too many arguments to function 'svldnt1sb_gather_offset_u64'} } */
+  svldnt1sb_gather_offset_u64 (pg, s16_ptr, s64); /* { dg-warning {passing argument 2 of 'svldnt1sb_gather_s64offset_u64' from incompatible pointer type} } */
+  svldnt1sb_gather_offset_u64 (pg, s8_ptr, pg); /* { dg-error {passing 'svbool_t' to argument 3 of 'svldnt1sb_gather_offset_u64', which expects a vector of 64-bit integers} } */
+  svldnt1sb_gather_offset_u64 (pg, s8_ptr, s8); /* { dg-error {passing 'svint8_t' to argument 3 of 'svldnt1sb_gather_offset_u64', which expects a vector of 64-bit integers} } */
+  svldnt1sb_gather_offset_u64 (pg, s8_ptr, s16); /* { dg-error {passing 'svint16_t' to argument 3 of 'svldnt1sb_gather_offset_u64', which expects a vector of 64-bit integers} } */
+  svldnt1sb_gather_offset_u64 (pg, s8_ptr, s32); /* { dg-error {passing 'svint32_t' to argument 3 of 'svldnt1sb_gather_offset_u64', which expects a vector of 64-bit integers} } */
+  svldnt1sb_gather_offset_u64 (pg, s8_ptr, u32); /* { dg-error {passing 'svuint32_t' to argument 3 of 'svldnt1sb_gather_offset_u64', which expects a vector of 64-bit integers} } */
+  svldnt1sb_gather_offset_u64 (pg, s8_ptr, f32); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svldnt1sb_gather_offset_u64', which expects a vector of 64-bit integers} } */
+  svldnt1sb_gather_offset_u64 (pg, s8_ptr, s64);
+  svldnt1sb_gather_offset_u64 (pg, s8_ptr, u64);
+  svldnt1sb_gather_offset_u64 (pg, s8_ptr, f64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svldnt1sb_gather_offset_u64', which expects a vector of 64-bit integers} } */
+
+  svldnt1sb_gather_offset_u64 (pg, 0, s64);
+  svldnt1sb_gather_offset_u64 (pg, s, s64); /* { dg-error {'struct s' to argument 2 of 'svldnt1sb_gather_offset_u64', which expects a vector or pointer base address} } */
+
+  svldnt1sb_gather_offset_u64 (pg, pg, 0); /* { dg-error {passing 'svbool_t' to argument 2 of 'svldnt1sb_gather_offset_u64', which expects 'svuint64_t'} } */
+  svldnt1sb_gather_offset_u64 (pg, s32, 0); /* { dg-error {passing 'svint32_t' to argument 2 of 'svldnt1sb_gather_offset_u64', which expects 'svuint64_t'} } */
+  svldnt1sb_gather_offset_u64 (pg, u32, 0); /* { dg-error {passing 'svuint32_t' to argument 2 of 'svldnt1sb_gather_offset_u64', which expects 'svuint64_t'} } */
+  svldnt1sb_gather_offset_u64 (pg, u64, 0);
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_gather_sv_restricted_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_gather_sv_restricted_1.c
new file mode 100644 (file)
index 0000000..b12faad
--- /dev/null
@@ -0,0 +1,82 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c99" } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+struct s { signed char x; };
+
+svuint32_t
+f1 (svbool_t pg, signed char *s8_ptr, short *s16_ptr,
+    int32_t *s32_ptr, uint32_t *u32_ptr, float *f32_ptr,
+    int64_t *s64_ptr, uint64_t *u64_ptr, double *f64_ptr,
+    void *void_ptr, struct s *s_ptr, _Complex float *cf32_ptr, int **ptr_ptr,
+    svuint8_t u8, svuint16_t u16,
+    svint32_t s32, svuint32_t u32, svfloat32_t f32,
+    svint64_t s64, svuint64_t u64, svfloat64_t f64)
+{
+  svldnt1_gather_offset (pg, s32_ptr); /* { dg-error {too few arguments to function 'svldnt1_gather_offset'} } */
+  svldnt1_gather_offset (pg, s32_ptr, s32, 0); /* { dg-error {too many arguments to function 'svldnt1_gather_offset'} } */
+  svldnt1_gather_offset (0, s32_ptr, u32); /* { dg-error {passing 'int' to argument 1 of 'svldnt1_gather_offset', which expects 'svbool_t'} } */
+  svldnt1_gather_offset (pg, 0, s32); /* { dg-error {passing 'int' to argument 2 of 'svldnt1_gather_offset', which expects a pointer type} } */
+  svldnt1_gather_offset (pg, (int *) 0, u32);
+  svldnt1_gather_offset (pg, void_ptr, u32); /* { dg-error {passing 'void \*' to argument 2 of 'svldnt1_gather_offset', but 'void' is not a valid SVE element type} } */
+  svldnt1_gather_offset (pg, s_ptr, u32); /* { dg-error {passing 'struct s \*' to argument 2 of 'svldnt1_gather_offset', but 'struct s' is not a valid SVE element type} } */
+  svldnt1_gather_offset (pg, f32_ptr, u32);
+  svldnt1_gather_offset (pg, cf32_ptr, u32); /* { dg-error {passing '_Complex float \*' to argument 2 of 'svldnt1_gather_offset', but 'complex float' is not a valid SVE element type} } */
+  svldnt1_gather_offset (pg, ptr_ptr, u64); /* { dg-error {passing 'int \*\*' to argument 2 of 'svldnt1_gather_offset', but 'int \*' is not a valid SVE element type} } */
+  svldnt1_gather_offset (pg, u32, 0); /* { dg-error {passing 'svuint32_t' to argument 2 of 'svldnt1_gather_offset', which expects a pointer type} } */
+  /* { dg-message {an explicit type suffix is needed when using a vector of base addresses} "" { target *-*-* } .-1 } */
+  svldnt1_gather_offset (pg, u64, 0); /* { dg-error {passing 'svuint64_t' to argument 2 of 'svldnt1_gather_offset', which expects a pointer type} } */
+  /* { dg-message {an explicit type suffix is needed when using a vector of base addresses} "" { target *-*-* } .-1 } */
+
+  svldnt1_gather_offset (pg, s8_ptr, u8); /* { dg-error {passing 'signed char \*' to argument 2 of 'svldnt1_gather_offset', which expects a pointer to 32-bit or 64-bit elements} } */
+  svldnt1_gather_offset (pg, s8_ptr, u32); /* { dg-error {passing 'signed char \*' to argument 2 of 'svldnt1_gather_offset', which expects a pointer to 32-bit or 64-bit elements} } */
+  svldnt1_gather_offset (pg, s16_ptr, u16); /* { dg-error {passing 'short( int)? \*' to argument 2 of 'svldnt1_gather_offset', which expects a pointer to 32-bit or 64-bit elements} } */
+  svldnt1_gather_offset (pg, s16_ptr, u32); /* { dg-error {passing 'short( int)? \*' to argument 2 of 'svldnt1_gather_offset', which expects a pointer to 32-bit or 64-bit elements} } */
+
+  svldnt1_gather_offset (pg, s32_ptr, s32); /* { dg-error {'svldnt1_gather_offset' does not support 32-bit sign-extended offsets} } */
+  svldnt1_gather_offset (pg, s32_ptr, u32);
+  svldnt1_gather_offset (pg, s32_ptr, f32); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svint32_t' expects a vector of 32-bit integers} } */
+  svldnt1_gather_offset (pg, s32_ptr, s64); /* { dg-error {passing 'svint64_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svint32_t' expects a vector of 32-bit integers} } */
+  svldnt1_gather_offset (pg, s32_ptr, u64); /* { dg-error {passing 'svuint64_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svint32_t' expects a vector of 32-bit integers} } */
+  svldnt1_gather_offset (pg, s32_ptr, f64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svint32_t' expects a vector of 32-bit integers} } */
+
+  svldnt1_gather_offset (pg, u32_ptr, s32); /* { dg-error {'svldnt1_gather_offset' does not support 32-bit sign-extended offsets} } */
+  svldnt1_gather_offset (pg, u32_ptr, u32);
+  svldnt1_gather_offset (pg, u32_ptr, f32); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svuint32_t' expects a vector of 32-bit integers} } */
+  svldnt1_gather_offset (pg, u32_ptr, s64); /* { dg-error {passing 'svint64_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svuint32_t' expects a vector of 32-bit integers} } */
+  svldnt1_gather_offset (pg, u32_ptr, u64); /* { dg-error {passing 'svuint64_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svuint32_t' expects a vector of 32-bit integers} } */
+  svldnt1_gather_offset (pg, u32_ptr, f64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svuint32_t' expects a vector of 32-bit integers} } */
+
+  svldnt1_gather_offset (pg, f32_ptr, s32); /* { dg-error {'svldnt1_gather_offset' does not support 32-bit sign-extended offsets} } */
+  svldnt1_gather_offset (pg, f32_ptr, u32);
+  svldnt1_gather_offset (pg, f32_ptr, f32); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svfloat32_t' expects a vector of 32-bit integers} } */
+  svldnt1_gather_offset (pg, f32_ptr, s64); /* { dg-error {passing 'svint64_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svfloat32_t' expects a vector of 32-bit integers} } */
+  svldnt1_gather_offset (pg, f32_ptr, u64); /* { dg-error {passing 'svuint64_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svfloat32_t' expects a vector of 32-bit integers} } */
+  svldnt1_gather_offset (pg, f32_ptr, f64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svfloat32_t' expects a vector of 32-bit integers} } */
+
+  svldnt1_gather_offset (pg, s64_ptr, s32); /* { dg-error {passing 'svint32_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svint64_t' expects a vector of 64-bit integers} } */
+  svldnt1_gather_offset (pg, s64_ptr, u32); /* { dg-error {passing 'svuint32_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svint64_t' expects a vector of 64-bit integers} } */
+  svldnt1_gather_offset (pg, s64_ptr, f32); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svint64_t' expects a vector of 64-bit integers} } */
+  svldnt1_gather_offset (pg, s64_ptr, s64);
+  svldnt1_gather_offset (pg, s64_ptr, u64);
+  svldnt1_gather_offset (pg, s64_ptr, f64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svint64_t' expects a vector of 64-bit integers} } */
+
+  svldnt1_gather_offset (pg, u64_ptr, s32); /* { dg-error {passing 'svint32_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svuint64_t' expects a vector of 64-bit integers} } */
+  svldnt1_gather_offset (pg, u64_ptr, u32); /* { dg-error {passing 'svuint32_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svuint64_t' expects a vector of 64-bit integers} } */
+  svldnt1_gather_offset (pg, u64_ptr, f32); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svuint64_t' expects a vector of 64-bit integers} } */
+  svldnt1_gather_offset (pg, u64_ptr, s64);
+  svldnt1_gather_offset (pg, u64_ptr, u64);
+  svldnt1_gather_offset (pg, u64_ptr, f64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svuint64_t' expects a vector of 64-bit integers} } */
+
+  svldnt1_gather_offset (pg, f64_ptr, s32); /* { dg-error {passing 'svint32_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svfloat64_t' expects a vector of 64-bit integers} } */
+  svldnt1_gather_offset (pg, f64_ptr, u32); /* { dg-error {passing 'svuint32_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svfloat64_t' expects a vector of 64-bit integers} } */
+  svldnt1_gather_offset (pg, f64_ptr, f32); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svfloat64_t' expects a vector of 64-bit integers} } */
+  svldnt1_gather_offset (pg, f64_ptr, s64);
+  svldnt1_gather_offset (pg, f64_ptr, u64);
+  svldnt1_gather_offset (pg, f64_ptr, f64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svldnt1_gather_offset', which when loading 'svfloat64_t' expects a vector of 64-bit integers} } */
+
+  return svldnt1_gather_offset (pg, s32_ptr, u32); /* { dg-error {incompatible types when returning type 'svint32_t' but 'svuint32_t' was expected} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_gather_sv_restricted_2.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/load_gather_sv_restricted_2.c
new file mode 100644 (file)
index 0000000..6bb9b7f
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c99" } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+struct s { signed char x; };
+
+svuint64_t
+f1 (svbool_t pg, signed char *s8_ptr, short *s16_ptr,
+    int32_t *s32_ptr, uint32_t *u32_ptr, float *f32_ptr,
+    int64_t *s64_ptr, uint64_t *u64_ptr, double *f64_ptr,
+    void *void_ptr, struct s *s_ptr, _Complex float *cf32_ptr, int **ptr_ptr,
+    svint8_t s8, svint16_t s16,
+    svint32_t s32, svuint32_t u32, svfloat32_t f32,
+    svint64_t s64, svuint64_t u64, svfloat64_t f64)
+{
+  svldnt1_gather_index (pg, s64_ptr); /* { dg-error {too few arguments to function 'svldnt1_gather_index'} } */
+  svldnt1_gather_index (pg, s64_ptr, s64, 0); /* { dg-error {too many arguments to function 'svldnt1_gather_index'} } */
+  svldnt1_gather_index (0, s64_ptr, s64); /* { dg-error {passing 'int' to argument 1 of 'svldnt1_gather_index', which expects 'svbool_t'} } */
+  svldnt1_gather_index (pg, 0, s64); /* { dg-error {passing 'int' to argument 2 of 'svldnt1_gather_index', which expects a pointer type} } */
+  svldnt1_gather_index (pg, (uint64_t *) 0, s64);
+  svldnt1_gather_index (pg, void_ptr, s64); /* { dg-error {passing 'void \*' to argument 2 of 'svldnt1_gather_index', but 'void' is not a valid SVE element type} } */
+  svldnt1_gather_index (pg, s_ptr, s64); /* { dg-error {passing 'struct s \*' to argument 2 of 'svldnt1_gather_index', but 'struct s' is not a valid SVE element type} } */
+  svldnt1_gather_index (pg, cf32_ptr, s32); /* { dg-error {passing '_Complex float \*' to argument 2 of 'svldnt1_gather_index', but 'complex float' is not a valid SVE element type} } */
+  svldnt1_gather_index (pg, ptr_ptr, u64); /* { dg-error {passing 'int \*\*' to argument 2 of 'svldnt1_gather_index', but 'int \*' is not a valid SVE element type} } */
+  svldnt1_gather_index (pg, u32, 0); /* { dg-error {passing 'svuint32_t' to argument 2 of 'svldnt1_gather_index', which expects a pointer type} } */
+  /* { dg-message {an explicit type suffix is needed when using a vector of base addresses} "" { target *-*-* } .-1 } */
+  svldnt1_gather_index (pg, u64, 0); /* { dg-error {passing 'svuint64_t' to argument 2 of 'svldnt1_gather_index', which expects a pointer type} } */
+  /* { dg-message {an explicit type suffix is needed when using a vector of base addresses} "" { target *-*-* } .-1 } */
+
+  svldnt1_gather_index (pg, s8_ptr, s8); /* { dg-error {passing 'signed char \*' to argument 2 of 'svldnt1_gather_index', which expects a pointer to 32-bit or 64-bit elements} } */
+  svldnt1_gather_index (pg, s8_ptr, s64); /* { dg-error {passing 'signed char \*' to argument 2 of 'svldnt1_gather_index', which expects a pointer to 32-bit or 64-bit elements} } */
+  svldnt1_gather_index (pg, s16_ptr, s16); /* { dg-error {passing 'short( int)? \*' to argument 2 of 'svldnt1_gather_index', which expects a pointer to 32-bit or 64-bit elements} } */
+  svldnt1_gather_index (pg, s16_ptr, s64); /* { dg-error {passing 'short( int)? \*' to argument 2 of 'svldnt1_gather_index', which expects a pointer to 32-bit or 64-bit elements} } */
+
+  svldnt1_gather_index (pg, s32_ptr, s32); /* { dg-error {'svldnt1_gather_index' does not support 32-bit vector type 'svint32_t'} } */
+  svldnt1_gather_index (pg, s32_ptr, u32); /* { dg-error {'svldnt1_gather_index' does not support 32-bit vector type 'svint32_t'} } */
+  svldnt1_gather_index (pg, s32_ptr, f32); /* { dg-error {'svldnt1_gather_index' does not support 32-bit vector type 'svint32_t'} } */
+  svldnt1_gather_index (pg, s32_ptr, s64); /* { dg-error {'svldnt1_gather_index' does not support 32-bit vector type 'svint32_t'} } */
+
+  svldnt1_gather_index (pg, u32_ptr, s32); /* { dg-error {'svldnt1_gather_index' does not support 32-bit vector type 'svuint32_t'} } */
+  svldnt1_gather_index (pg, u32_ptr, u32); /* { dg-error {'svldnt1_gather_index' does not support 32-bit vector type 'svuint32_t'} } */
+  svldnt1_gather_index (pg, u32_ptr, f32); /* { dg-error {'svldnt1_gather_index' does not support 32-bit vector type 'svuint32_t'} } */
+  svldnt1_gather_index (pg, u32_ptr, s64); /* { dg-error {'svldnt1_gather_index' does not support 32-bit vector type 'svuint32_t'} } */
+
+  svldnt1_gather_index (pg, f32_ptr, s32); /* { dg-error {'svldnt1_gather_index' does not support 32-bit vector type 'svfloat32_t'} } */
+  svldnt1_gather_index (pg, f32_ptr, u32); /* { dg-error {'svldnt1_gather_index' does not support 32-bit vector type 'svfloat32_t'} } */
+  svldnt1_gather_index (pg, f32_ptr, f32); /* { dg-error {'svldnt1_gather_index' does not support 32-bit vector type 'svfloat32_t'} } */
+  svldnt1_gather_index (pg, f32_ptr, s64); /* { dg-error {'svldnt1_gather_index' does not support 32-bit vector type 'svfloat32_t'} } */
+
+  svldnt1_gather_index (pg, s64_ptr, s32); /* { dg-error {passing 'svint32_t' to argument 3 of 'svldnt1_gather_index', which when loading 'svint64_t' expects a vector of 64-bit integers} } */
+  svldnt1_gather_index (pg, s64_ptr, u32); /* { dg-error {passing 'svuint32_t' to argument 3 of 'svldnt1_gather_index', which when loading 'svint64_t' expects a vector of 64-bit integers} } */
+  svldnt1_gather_index (pg, s64_ptr, f32); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svldnt1_gather_index', which when loading 'svint64_t' expects a vector of 64-bit integers} } */
+  svldnt1_gather_index (pg, s64_ptr, s64);
+  svldnt1_gather_index (pg, s64_ptr, u64);
+  svldnt1_gather_index (pg, s64_ptr, f64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svldnt1_gather_index', which when loading 'svint64_t' expects a vector of 64-bit integers} } */
+
+  svldnt1_gather_index (pg, u64_ptr, s32); /* { dg-error {passing 'svint32_t' to argument 3 of 'svldnt1_gather_index', which when loading 'svuint64_t' expects a vector of 64-bit integers} } */
+  svldnt1_gather_index (pg, u64_ptr, u32); /* { dg-error {passing 'svuint32_t' to argument 3 of 'svldnt1_gather_index', which when loading 'svuint64_t' expects a vector of 64-bit integers} } */
+  svldnt1_gather_index (pg, u64_ptr, f32); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svldnt1_gather_index', which when loading 'svuint64_t' expects a vector of 64-bit integers} } */
+  svldnt1_gather_index (pg, u64_ptr, s64);
+  svldnt1_gather_index (pg, u64_ptr, u64);
+  svldnt1_gather_index (pg, u64_ptr, f64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svldnt1_gather_index', which when loading 'svuint64_t' expects a vector of 64-bit integers} } */
+
+  svldnt1_gather_index (pg, f64_ptr, s32); /* { dg-error {passing 'svint32_t' to argument 3 of 'svldnt1_gather_index', which when loading 'svfloat64_t' expects a vector of 64-bit integers} } */
+  svldnt1_gather_index (pg, f64_ptr, u32); /* { dg-error {passing 'svuint32_t' to argument 3 of 'svldnt1_gather_index', which when loading 'svfloat64_t' expects a vector of 64-bit integers} } */
+  svldnt1_gather_index (pg, f64_ptr, f32); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svldnt1_gather_index', which when loading 'svfloat64_t' expects a vector of 64-bit integers} } */
+  svldnt1_gather_index (pg, f64_ptr, s64);
+  svldnt1_gather_index (pg, f64_ptr, u64);
+  svldnt1_gather_index (pg, f64_ptr, f64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svldnt1_gather_index', which when loading 'svfloat64_t' expects a vector of 64-bit integers} } */
+
+  return svldnt1_gather_index (pg, s64_ptr, s64); /* { dg-error {incompatible types when returning type 'svint64_t' but 'svuint64_t' was expected} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mul_lane_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/mul_lane_1.c
new file mode 100644 (file)
index 0000000..ac57546
--- /dev/null
@@ -0,0 +1,32 @@
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f2 (svint8_t s8, svuint8_t u8,
+    svint16_t s16, svuint16_t u16, svfloat16_t f16,
+    svint32_t s32, svuint32_t u32, svfloat32_t f32,
+    svint64_t s64, svuint64_t u64, svfloat64_t f64)
+{
+  s8 = svmul_lane (s8, s8, 1); /* { dg-error {'svmul_lane' has no form that takes 'svint8_t' arguments} } */
+  u8 = svmul_lane (u8, u8, 1); /* { dg-error {'svmul_lane' has no form that takes 'svuint8_t' arguments} } */
+  s16 = svmul_lane (s16, s16, 1);
+  u16 = svmul_lane (u16, u16, 1);
+  f16 = svmul_lane (f16, f16, 1);
+  s32 = svmul_lane (s32, s32, 1);
+  u32 = svmul_lane (u32, u32, 1);
+  f32 = svmul_lane (f32, f32, 1);
+  s64 = svmul_lane (s64, s64, 1);
+  u64 = svmul_lane (u64, u64, 1);
+  f64 = svmul_lane (f64, f64, 1);
+}
+
+#pragma GCC target ("arch=armv8-a+sve")
+
+void
+f1 (svint8_t s8, svuint8_t u8, svint16_t s16)
+{
+  s8 = svmul_lane (s8, s8, 1); /* { dg-error {'svmul_lane' has no form that takes 'svint8_t' arguments} } */
+  u8 = svmul_lane (u8, u8, 1); /* { dg-error {'svmul_lane' has no form that takes 'svuint8_t' arguments} } */
+  s16 = svmul_lane (s16, s16, 1); /* { dg-error {ACLE function 'svmul_lane_s16' requires ISA extension 'sve2'} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_left_imm_long_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_left_imm_long_1.c
new file mode 100644 (file)
index 0000000..9b92d75
--- /dev/null
@@ -0,0 +1,57 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-std=c99 -Wall -Wextra" } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8, svint16_t s16, svuint16_t u16,
+    svint32_t s32, svuint32_t u32, svint64_t s64, svuint64_t u64,
+    svfloat16_t f16, svfloat32_t f32, svfloat64_t f64, int x)
+{
+  const int one = 1;
+  s16 = svshllb (s8, x); /* { dg-error {argument 2 of 'svshllb' must be an integer constant expression} } */
+  s16 = svshllb (s8, one); /* { dg-error {argument 2 of 'svshllb' must be an integer constant expression} } */
+  s16 = svshllb (s8, -1); /* { dg-error {passing -1 to argument 2 of 'svshllb', which expects a value in the range \[0, 7\]} } */
+  s16 = svshllb (s8, 0.0);
+  s16 = svshllb (s8, 0);
+  s16 = svshllb (s8, 1);
+  s16 = svshllb (s8, 1 + 1);
+  s16 = svshllb (s8, 7);
+  s16 = svshllb (s8, 7.2);
+  s16 = svshllb (s8, 8); /* { dg-error {passing 8 to argument 2 of 'svshllb', which expects a value in the range \[0, 7\]} } */
+  s16 = svshllb (s8, 8.2); /* { dg-error {passing 8 to argument 2 of 'svshllb', which expects a value in the range \[0, 7\]} } */
+  s16 = svshllb (s8, (1ULL << 62) + 1); /* { dg-error {passing [^ ]* to argument 2 of 'svshllb', which expects a value in the range \[0, 7\]} } */
+  u16 = svshllb (u8, -1); /* { dg-error {passing -1 to argument 2 of 'svshllb', which expects a value in the range \[0, 7\]} } */
+  u16 = svshllb (u8, 0);
+  u16 = svshllb (u8, 1);
+  u16 = svshllb (u8, 7);
+  u16 = svshllb (u8, 8); /* { dg-error {passing 8 to argument 2 of 'svshllb', which expects a value in the range \[0, 7\]} } */
+  s32 = svshllb (s16, -1); /* { dg-error {passing -1 to argument 2 of 'svshllb', which expects a value in the range \[0, 15\]} } */
+  s32 = svshllb (s16, 0);
+  s32 = svshllb (s16, 1);
+  s32 = svshllb (s16, 15);
+  s32 = svshllb (s16, 16); /* { dg-error {passing 16 to argument 2 of 'svshllb', which expects a value in the range \[0, 15\]} } */
+  u32 = svshllb (u16, -1); /* { dg-error {passing -1 to argument 2 of 'svshllb', which expects a value in the range \[0, 15\]} } */
+  u32 = svshllb (u16, 0);
+  u32 = svshllb (u16, 1);
+  u32 = svshllb (u16, 15);
+  u32 = svshllb (u16, 16); /* { dg-error {passing 16 to argument 2 of 'svshllb', which expects a value in the range \[0, 15\]} } */
+  s64 = svshllb (s32, -1); /* { dg-error {passing -1 to argument 2 of 'svshllb', which expects a value in the range \[0, 31\]} } */
+  s64 = svshllb (s32, 0);
+  s64 = svshllb (s32, 1);
+  s64 = svshllb (s32, 31);
+  s64 = svshllb (s32, 32); /* { dg-error {passing 32 to argument 2 of 'svshllb', which expects a value in the range \[0, 31\]} } */
+  u64 = svshllb (u32, -1); /* { dg-error {passing -1 to argument 2 of 'svshllb', which expects a value in the range \[0, 31\]} } */
+  u64 = svshllb (u32, 0);
+  u64 = svshllb (u32, 1);
+  u64 = svshllb (u32, 31);
+  u64 = svshllb (u32, 32); /* { dg-error {passing 32 to argument 2 of 'svshllb', which expects a value in the range \[0, 31\]} } */
+  svshllb (s64, -1); /* { dg-error {'svshllb' has no form that takes 'svint64_t' arguments} } */
+  svshllb (u64, -1); /* { dg-error {'svshllb' has no form that takes 'svuint64_t' arguments} } */
+  svshllb (pg, -1); /* { dg-error {'svshllb' has no form that takes 'svbool_t' arguments} } */
+  svshllb (f16, -1); /* { dg-error {'svshllb' has no form that takes 'svfloat16_t' arguments} } */
+  svshllb (f32, -1); /* { dg-error {'svshllb' has no form that takes 'svfloat32_t' arguments} } */
+  svshllb (f64, -1); /* { dg-error {'svshllb' has no form that takes 'svfloat64_t' arguments} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_left_imm_to_uint_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_left_imm_to_uint_1.c
new file mode 100644 (file)
index 0000000..e5ca2e8
--- /dev/null
@@ -0,0 +1,44 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-std=c99 -Wall -Wextra" } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svuint8_t u8, svint8_t s8, svint16_t s16, svint32_t s32,
+    svint64_t s64, int x)
+{
+  const int one = 1;
+  svuint16_t u16 __attribute__((unused));
+  svuint32_t u32 __attribute__((unused));
+  svuint64_t u64 __attribute__((unused));
+  u8 = svqshlu_x (pg, u8, 1); /* { dg-error {'svqshlu_x' has no form that takes 'svuint8_t' arguments} } */
+  u8 = svqshlu_x (pg, s8, x); /* { dg-error {argument 3 of 'svqshlu_x' must be an integer constant expression} } */
+  u8 = svqshlu_x (pg, s8, one); /* { dg-error {argument 3 of 'svqshlu_x' must be an integer constant expression} } */
+  u8 = svqshlu_x (pg, s8, -1); /* { dg-error {passing -1 to argument 3 of 'svqshlu_x', which expects a value in the range \[0, 7\]} } */
+  u8 = svqshlu_x (pg, s8, 0.0);
+  u8 = svqshlu_x (pg, s8, 0);
+  u8 = svqshlu_x (pg, s8, 1);
+  u8 = svqshlu_x (pg, s8, 1 + 1);
+  u8 = svqshlu_x (pg, s8, 7);
+  u8 = svqshlu_x (pg, s8, 7.2);
+  u8 = svqshlu_x (pg, s8, 8); /* { dg-error {passing 8 to argument 3 of 'svqshlu_x', which expects a value in the range \[0, 7\]} } */
+  u8 = svqshlu_x (pg, s8, 8.2); /* { dg-error {passing 8 to argument 3 of 'svqshlu_x', which expects a value in the range \[0, 7\]} } */
+  u8 = svqshlu_x (pg, s8, (1ULL << 62) + 1); /* { dg-error {passing [^ ]* to argument 3 of 'svqshlu_x', which expects a value in the range \[0, 7\]} } */
+  u16 = svqshlu_x (pg, s16, -1); /* { dg-error {passing -1 to argument 3 of 'svqshlu_x', which expects a value in the range \[0, 15\]} } */
+  u16 = svqshlu_x (pg, s16, 0);
+  u16 = svqshlu_x (pg, s16, 1);
+  u16 = svqshlu_x (pg, s16, 15);
+  u16 = svqshlu_x (pg, s16, 16); /* { dg-error {passing 16 to argument 3 of 'svqshlu_x', which expects a value in the range \[0, 15\]} } */
+  u32 = svqshlu_x (pg, s32, -1); /* { dg-error {passing -1 to argument 3 of 'svqshlu_x', which expects a value in the range \[0, 31\]} } */
+  u32 = svqshlu_x (pg, s32, 0);
+  u32 = svqshlu_x (pg, s32, 1);
+  u32 = svqshlu_x (pg, s32, 31);
+  u32 = svqshlu_x (pg, s32, 32); /* { dg-error {passing 32 to argument 3 of 'svqshlu_x', which expects a value in the range \[0, 31\]} } */
+  u64 = svqshlu_x (pg, s64, -1); /* { dg-error {passing -1 to argument 3 of 'svqshlu_x', which expects a value in the range \[0, 63\]} } */
+  u64 = svqshlu_x (pg, s64, 0);
+  u64 = svqshlu_x (pg, s64, 1);
+  u64 = svqshlu_x (pg, s64, 63);
+  u64 = svqshlu_x (pg, s64, 64); /* { dg-error {passing 64 to argument 3 of 'svqshlu_x', which expects a value in the range \[0, 63\]} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_left_imm_to_uint_2.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_left_imm_to_uint_2.c
new file mode 100644 (file)
index 0000000..765380b
--- /dev/null
@@ -0,0 +1,44 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-std=c99 -Wall -Wextra" } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svint16_t s16, svint32_t s32, svint64_t s64,
+    int x)
+{
+  const int one = 1;
+  svuint8_t u8 __attribute__((unused));
+  svuint16_t u16 __attribute__((unused));
+  svuint32_t u32 __attribute__((unused));
+  svuint64_t u64 __attribute__((unused));
+  u8 = svqshlu_n_s8_x (pg, s8, x); /* { dg-error {argument 3 of 'svqshlu_n_s8_x' must be an integer constant expression} } */
+  u8 = svqshlu_n_s8_x (pg, s8, one); /* { dg-error {argument 3 of 'svqshlu_n_s8_x' must be an integer constant expression} } */
+  u8 = svqshlu_n_s8_x (pg, s8, -1); /* { dg-error {passing -1 to argument 3 of 'svqshlu_n_s8_x', which expects a value in the range \[0, 7\]} } */
+  u8 = svqshlu_n_s8_x (pg, s8, 0.0);
+  u8 = svqshlu_n_s8_x (pg, s8, 0);
+  u8 = svqshlu_n_s8_x (pg, s8, 1);
+  u8 = svqshlu_n_s8_x (pg, s8, 1 + 1);
+  u8 = svqshlu_n_s8_x (pg, s8, 7);
+  u8 = svqshlu_n_s8_x (pg, s8, 7.2);
+  u8 = svqshlu_n_s8_x (pg, s8, 8); /* { dg-error {passing 8 to argument 3 of 'svqshlu_n_s8_x', which expects a value in the range \[0, 7\]} } */
+  u8 = svqshlu_n_s8_x (pg, s8, 8.2); /* { dg-error {passing 8 to argument 3 of 'svqshlu_n_s8_x', which expects a value in the range \[0, 7\]} } */
+  u8 = svqshlu_n_s8_x (pg, s8, (1ULL << 62) + 1); /* { dg-error {passing [^ ]* to argument 3 of 'svqshlu_n_s8_x', which expects a value in the range \[0, 7\]} } */
+  u16 = svqshlu_n_s16_x (pg, s16, -1); /* { dg-error {passing -1 to argument 3 of 'svqshlu_n_s16_x', which expects a value in the range \[0, 15\]} } */
+  u16 = svqshlu_n_s16_x (pg, s16, 0);
+  u16 = svqshlu_n_s16_x (pg, s16, 1);
+  u16 = svqshlu_n_s16_x (pg, s16, 15);
+  u16 = svqshlu_n_s16_x (pg, s16, 16); /* { dg-error {passing 16 to argument 3 of 'svqshlu_n_s16_x', which expects a value in the range \[0, 15\]} } */
+  u32 = svqshlu_n_s32_x (pg, s32, -1); /* { dg-error {passing -1 to argument 3 of 'svqshlu_n_s32_x', which expects a value in the range \[0, 31\]} } */
+  u32 = svqshlu_n_s32_x (pg, s32, 0);
+  u32 = svqshlu_n_s32_x (pg, s32, 1);
+  u32 = svqshlu_n_s32_x (pg, s32, 31);
+  u32 = svqshlu_n_s32_x (pg, s32, 32); /* { dg-error {passing 32 to argument 3 of 'svqshlu_n_s32_x', which expects a value in the range \[0, 31\]} } */
+  u64 = svqshlu_n_s64_x (pg, s64, -1); /* { dg-error {passing -1 to argument 3 of 'svqshlu_n_s64_x', which expects a value in the range \[0, 63\]} } */
+  u64 = svqshlu_n_s64_x (pg, s64, 0);
+  u64 = svqshlu_n_s64_x (pg, s64, 1);
+  u64 = svqshlu_n_s64_x (pg, s64, 63);
+  u64 = svqshlu_n_s64_x (pg, s64, 64); /* { dg-error {passing 64 to argument 3 of 'svqshlu_n_s64_x', which expects a value in the range \[0, 63\]} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowb_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowb_1.c
new file mode 100644 (file)
index 0000000..6536679
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8,
+    svint16_t s16, svuint16_t u16,
+    svint32_t s32, svuint32_t u32,
+    svint64_t s64, svuint64_t u64,
+    svfloat32_t f32, int x)
+{
+  const int one = 1;
+  svshrnb (u16); /* { dg-error {too few arguments to function 'svshrnb'} } */
+  svshrnb (u16, u16, 1); /* { dg-error {too many arguments to function 'svshrnb'} } */
+
+  svshrnb (u16, x); /* { dg-error {argument 2 of 'svshrnb' must be an integer constant expression} } */
+  svshrnb (u16, one); /* { dg-error {argument 2 of 'svshrnb' must be an integer constant expression} } */
+  svshrnb (u16, 0.4); /* { dg-error {passing 0 to argument 2 of 'svshrnb', which expects a value in the range \[1, 8\]} } */
+  svshrnb (u16, 1.0);
+
+  svshrnb (pg, 1); /* { dg-error {'svshrnb' has no form that takes 'svbool_t' arguments} } */
+
+  svshrnb (u8, -1); /* { dg-error {'svshrnb' has no form that takes 'svuint8_t' arguments} } */
+  svshrnb (u8, 1); /* { dg-error {'svshrnb' has no form that takes 'svuint8_t' arguments} } */
+  svshrnb (u8, 100); /* { dg-error {'svshrnb' has no form that takes 'svuint8_t' arguments} } */
+
+  svshrnb (s8, 1); /* { dg-error {'svshrnb' has no form that takes 'svint8_t' arguments} } */
+
+  svshrnb (u16, -1); /* { dg-error {passing -1 to argument 2 of 'svshrnb', which expects a value in the range \[1, 8\]} } */
+  svshrnb (u16, 0); /* { dg-error {passing 0 to argument 2 of 'svshrnb', which expects a value in the range \[1, 8\]} } */
+  svshrnb (u16, 1);
+  svshrnb (u16, 8);
+  svshrnb (u16, 9); /* { dg-error {passing 9 to argument 2 of 'svshrnb', which expects a value in the range \[1, 8\]} } */
+
+  svshrnb (s16, -1); /* { dg-error {passing -1 to argument 2 of 'svshrnb', which expects a value in the range \[1, 8\]} } */
+  svshrnb (s16, 0); /* { dg-error {passing 0 to argument 2 of 'svshrnb', which expects a value in the range \[1, 8\]} } */
+  svshrnb (s16, 1);
+  svshrnb (s16, 8);
+  svshrnb (s16, 9); /* { dg-error {passing 9 to argument 2 of 'svshrnb', which expects a value in the range \[1, 8\]} } */
+
+  svshrnb (u32, -1); /* { dg-error {passing -1 to argument 2 of 'svshrnb', which expects a value in the range \[1, 16\]} } */
+  svshrnb (u32, 0); /* { dg-error {passing 0 to argument 2 of 'svshrnb', which expects a value in the range \[1, 16\]} } */
+  svshrnb (u32, 1);
+  svshrnb (u32, 16);
+  svshrnb (u32, 17); /* { dg-error {passing 17 to argument 2 of 'svshrnb', which expects a value in the range \[1, 16\]} } */
+
+  svshrnb (s32, -1); /* { dg-error {passing -1 to argument 2 of 'svshrnb', which expects a value in the range \[1, 16\]} } */
+  svshrnb (s32, 0); /* { dg-error {passing 0 to argument 2 of 'svshrnb', which expects a value in the range \[1, 16\]} } */
+  svshrnb (s32, 1);
+  svshrnb (s32, 16);
+  svshrnb (s32, 17); /* { dg-error {passing 17 to argument 2 of 'svshrnb', which expects a value in the range \[1, 16\]} } */
+
+  svshrnb (u64, -1); /* { dg-error {passing -1 to argument 2 of 'svshrnb', which expects a value in the range \[1, 32\]} } */
+  svshrnb (u64, 0); /* { dg-error {passing 0 to argument 2 of 'svshrnb', which expects a value in the range \[1, 32\]} } */
+  svshrnb (u64, 1);
+  svshrnb (u64, 32);
+  svshrnb (u64, 33); /* { dg-error {passing 33 to argument 2 of 'svshrnb', which expects a value in the range \[1, 32\]} } */
+
+  svshrnb (s64, -1); /* { dg-error {passing -1 to argument 2 of 'svshrnb', which expects a value in the range \[1, 32\]} } */
+  svshrnb (s64, 0); /* { dg-error {passing 0 to argument 2 of 'svshrnb', which expects a value in the range \[1, 32\]} } */
+  svshrnb (s64, 1);
+  svshrnb (s64, 32);
+  svshrnb (s64, 33); /* { dg-error {passing 33 to argument 2 of 'svshrnb', which expects a value in the range \[1, 32\]} } */
+
+  svshrnb (f32, 1); /* { dg-error {'svshrnb' has no form that takes 'svfloat32_t' arguments} } */
+
+  svshrnb (1, 1); /* { dg-error {passing 'int' to argument 1 of 'svshrnb', which expects an SVE vector type} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowb_to_uint_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowb_to_uint_1.c
new file mode 100644 (file)
index 0000000..51f9388
--- /dev/null
@@ -0,0 +1,58 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8,
+    svint16_t s16, svuint16_t u16,
+    svint32_t s32, svuint32_t u32,
+    svint64_t s64, svuint64_t u64,
+    svfloat32_t f32, int x)
+{
+  const int one = 1;
+  svqshrunb (s16); /* { dg-error {too few arguments to function 'svqshrunb'} } */
+  svqshrunb (s16, s16, 1); /* { dg-error {too many arguments to function 'svqshrunb'} } */
+
+  svqshrunb (s16, x); /* { dg-error {argument 2 of 'svqshrunb' must be an integer constant expression} } */
+  svqshrunb (s16, one); /* { dg-error {argument 2 of 'svqshrunb' must be an integer constant expression} } */
+  svqshrunb (s16, 0.4); /* { dg-error {passing 0 to argument 2 of 'svqshrunb', which expects a value in the range \[1, 8\]} } */
+  svqshrunb (s16, 1.0);
+
+  svqshrunb (pg, 1); /* { dg-error {'svqshrunb' has no form that takes 'svbool_t' arguments} } */
+
+  svqshrunb (u8, -1); /* { dg-error {'svqshrunb' has no form that takes 'svuint8_t' arguments} } */
+  svqshrunb (u8, 1); /* { dg-error {'svqshrunb' has no form that takes 'svuint8_t' arguments} } */
+  svqshrunb (u8, 100); /* { dg-error {'svqshrunb' has no form that takes 'svuint8_t' arguments} } */
+
+  svqshrunb (s8, 1); /* { dg-error {'svqshrunb' has no form that takes 'svint8_t' arguments} } */
+
+  svqshrunb (u16, 1); /* { dg-error {'svqshrunb' has no form that takes 'svuint16_t' arguments} } */
+
+  svqshrunb (s16, -1); /* { dg-error {passing -1 to argument 2 of 'svqshrunb', which expects a value in the range \[1, 8\]} } */
+  svqshrunb (s16, 0); /* { dg-error {passing 0 to argument 2 of 'svqshrunb', which expects a value in the range \[1, 8\]} } */
+  svqshrunb (s16, 1);
+  svqshrunb (s16, 8);
+  svqshrunb (s16, 9); /* { dg-error {passing 9 to argument 2 of 'svqshrunb', which expects a value in the range \[1, 8\]} } */
+
+  svqshrunb (u32, 1); /* { dg-error {'svqshrunb' has no form that takes 'svuint32_t' arguments} } */
+
+  svqshrunb (s32, -1); /* { dg-error {passing -1 to argument 2 of 'svqshrunb', which expects a value in the range \[1, 16\]} } */
+  svqshrunb (s32, 0); /* { dg-error {passing 0 to argument 2 of 'svqshrunb', which expects a value in the range \[1, 16\]} } */
+  svqshrunb (s32, 1);
+  svqshrunb (s32, 16);
+  svqshrunb (s32, 17); /* { dg-error {passing 17 to argument 2 of 'svqshrunb', which expects a value in the range \[1, 16\]} } */
+
+  svqshrunb (u64, 1); /* { dg-error {'svqshrunb' has no form that takes 'svuint64_t' arguments} } */
+
+  svqshrunb (s64, -1); /* { dg-error {passing -1 to argument 2 of 'svqshrunb', which expects a value in the range \[1, 32\]} } */
+  svqshrunb (s64, 0); /* { dg-error {passing 0 to argument 2 of 'svqshrunb', which expects a value in the range \[1, 32\]} } */
+  svqshrunb (s64, 1);
+  svqshrunb (s64, 32);
+  svqshrunb (s64, 33); /* { dg-error {passing 33 to argument 2 of 'svqshrunb', which expects a value in the range \[1, 32\]} } */
+
+  svqshrunb (f32, 1); /* { dg-error {'svqshrunb' has no form that takes 'svfloat32_t' arguments} } */
+
+  svqshrunb (1, 1); /* { dg-error {passing 'int' to argument 1 of 'svqshrunb', which expects an SVE vector type} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowt_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowt_1.c
new file mode 100644 (file)
index 0000000..6c31cf8
--- /dev/null
@@ -0,0 +1,81 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8,
+    svint16_t s16, svuint16_t u16,
+    svint32_t s32, svuint32_t u32,
+    svint64_t s64, svuint64_t u64,
+    svfloat32_t f32, int x)
+{
+  const int one = 1;
+  svshrnt (u8, u16); /* { dg-error {too few arguments to function 'svshrnt'} } */
+  svshrnt (u8, u16, u16, 1); /* { dg-error {too many arguments to function 'svshrnt'} } */
+
+  svshrnt (u16, u16, 1); /* { dg-error {passing 'svuint16_t' instead of the expected 'svuint8_t' to argument 1 of 'svshrnt', after passing 'svuint16_t' to argument 2} } */
+  svshrnt (s16, u16, 1); /* { dg-error {passing 'svint16_t' instead of the expected 'svuint8_t' to argument 1 of 'svshrnt', after passing 'svuint16_t' to argument 2} } */
+  svshrnt (s8, u16, 1); /* { dg-error {arguments 1 and 2 of 'svshrnt' must have the same signedness, but the values passed here have type 'svint8_t' and 'svuint16_t' respectively} } */
+  svshrnt (pg, u16, 1); /* { dg-error {passing 'svbool_t' instead of the expected 'svuint8_t' to argument 1 of 'svshrnt', after passing 'svuint16_t' to argument 2} } */
+
+  svshrnt (s16, s16, 1); /* { dg-error {passing 'svint16_t' instead of the expected 'svint8_t' to argument 1 of 'svshrnt', after passing 'svint16_t' to argument 2} } */
+  svshrnt (u16, s16, 1); /* { dg-error {passing 'svuint16_t' instead of the expected 'svint8_t' to argument 1 of 'svshrnt', after passing 'svint16_t' to argument 2} } */
+  svshrnt (u8, s16, 1); /* { dg-error {arguments 1 and 2 of 'svshrnt' must have the same signedness, but the values passed here have type 'svuint8_t' and 'svint16_t' respectively} } */
+  svshrnt (pg, s16, 1); /* { dg-error {passing 'svbool_t' instead of the expected 'svint8_t' to argument 1 of 'svshrnt', after passing 'svint16_t' to argument 2} } */
+
+  svshrnt (u8, u16, x); /* { dg-error {argument 3 of 'svshrnt' must be an integer constant expression} } */
+  svshrnt (u8, u16, one); /* { dg-error {argument 3 of 'svshrnt' must be an integer constant expression} } */
+  svshrnt (u8, u16, 0.4); /* { dg-error {passing 0 to argument 3 of 'svshrnt', which expects a value in the range \[1, 8\]} } */
+  svshrnt (u8, u16, 1.0);
+
+  svshrnt (pg, pg, 1); /* { dg-error {'svshrnt' has no form that takes 'svbool_t' arguments} } */
+
+  svshrnt (u8, u8, -1); /* { dg-error {'svshrnt' has no form that takes 'svuint8_t' arguments} } */
+  svshrnt (u8, u8, 1); /* { dg-error {'svshrnt' has no form that takes 'svuint8_t' arguments} } */
+  svshrnt (u8, u8, 100); /* { dg-error {'svshrnt' has no form that takes 'svuint8_t' arguments} } */
+
+  svshrnt (s8, s8, 1); /* { dg-error {'svshrnt' has no form that takes 'svint8_t' arguments} } */
+
+  svshrnt (u8, u16, -1); /* { dg-error {passing -1 to argument 3 of 'svshrnt', which expects a value in the range \[1, 8\]} } */
+  svshrnt (u8, u16, 0); /* { dg-error {passing 0 to argument 3 of 'svshrnt', which expects a value in the range \[1, 8\]} } */
+  svshrnt (u8, u16, 1);
+  svshrnt (u8, u16, 8);
+  svshrnt (u8, u16, 9); /* { dg-error {passing 9 to argument 3 of 'svshrnt', which expects a value in the range \[1, 8\]} } */
+
+  svshrnt (s8, s16, -1); /* { dg-error {passing -1 to argument 3 of 'svshrnt', which expects a value in the range \[1, 8\]} } */
+  svshrnt (s8, s16, 0); /* { dg-error {passing 0 to argument 3 of 'svshrnt', which expects a value in the range \[1, 8\]} } */
+  svshrnt (s8, s16, 1);
+  svshrnt (s8, s16, 8);
+  svshrnt (s8, s16, 9); /* { dg-error {passing 9 to argument 3 of 'svshrnt', which expects a value in the range \[1, 8\]} } */
+
+  svshrnt (u16, u32, -1); /* { dg-error {passing -1 to argument 3 of 'svshrnt', which expects a value in the range \[1, 16\]} } */
+  svshrnt (u16, u32, 0); /* { dg-error {passing 0 to argument 3 of 'svshrnt', which expects a value in the range \[1, 16\]} } */
+  svshrnt (u16, u32, 1);
+  svshrnt (u16, u32, 16);
+  svshrnt (u16, u32, 17); /* { dg-error {passing 17 to argument 3 of 'svshrnt', which expects a value in the range \[1, 16\]} } */
+
+  svshrnt (s16, s32, -1); /* { dg-error {passing -1 to argument 3 of 'svshrnt', which expects a value in the range \[1, 16\]} } */
+  svshrnt (s16, s32, 0); /* { dg-error {passing 0 to argument 3 of 'svshrnt', which expects a value in the range \[1, 16\]} } */
+  svshrnt (s16, s32, 1);
+  svshrnt (s16, s32, 16);
+  svshrnt (s16, s32, 17); /* { dg-error {passing 17 to argument 3 of 'svshrnt', which expects a value in the range \[1, 16\]} } */
+
+  svshrnt (u32, u64, -1); /* { dg-error {passing -1 to argument 3 of 'svshrnt', which expects a value in the range \[1, 32\]} } */
+  svshrnt (u32, u64, 0); /* { dg-error {passing 0 to argument 3 of 'svshrnt', which expects a value in the range \[1, 32\]} } */
+  svshrnt (u32, u64, 1);
+  svshrnt (u32, u64, 32);
+  svshrnt (u32, u64, 33); /* { dg-error {passing 33 to argument 3 of 'svshrnt', which expects a value in the range \[1, 32\]} } */
+
+  svshrnt (s32, s64, -1); /* { dg-error {passing -1 to argument 3 of 'svshrnt', which expects a value in the range \[1, 32\]} } */
+  svshrnt (s32, s64, 0); /* { dg-error {passing 0 to argument 3 of 'svshrnt', which expects a value in the range \[1, 32\]} } */
+  svshrnt (s32, s64, 1);
+  svshrnt (s32, s64, 32);
+  svshrnt (s32, s64, 33); /* { dg-error {passing 33 to argument 3 of 'svshrnt', which expects a value in the range \[1, 32\]} } */
+
+  svshrnt (f32, f32, 1); /* { dg-error {'svshrnt' has no form that takes 'svfloat32_t' arguments} } */
+
+  svshrnt (1, s32, 1); /* { dg-error {passing 'int' to argument 1 of 'svshrnt', which expects an SVE vector type} } */
+  svshrnt (s32, 1, 1); /* { dg-error {passing 'int' to argument 2 of 'svshrnt', which expects an SVE vector type} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowt_to_uint_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/shift_right_imm_narrowt_to_uint_1.c
new file mode 100644 (file)
index 0000000..2e35ad3
--- /dev/null
@@ -0,0 +1,64 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8,
+    svint16_t s16, svuint16_t u16,
+    svint32_t s32, svuint32_t u32,
+    svint64_t s64, svuint64_t u64,
+    svfloat32_t f32, int x)
+{
+  const int one = 1;
+  svqshrunt (u8, s16); /* { dg-error {too few arguments to function 'svqshrunt'} } */
+  svqshrunt (u8, s16, s16, 1); /* { dg-error {too many arguments to function 'svqshrunt'} } */
+
+  svqshrunt (u16, s16, 1); /* { dg-error {passing 'svuint16_t' instead of the expected 'svuint8_t' to argument 1 of 'svqshrunt', after passing 'svint16_t' to argument 2} } */
+  svqshrunt (s16, s16, 1); /* { dg-error {passing 'svint16_t' to argument 1 of 'svqshrunt', which expects a vector of unsigned integers} } */
+  svqshrunt (s8, s16, 1); /* { dg-error {passing 'svint8_t' to argument 1 of 'svqshrunt', which expects a vector of unsigned integers} } */
+  svqshrunt (pg, s16, 1); /* { dg-error {passing 'svbool_t' to argument 1 of 'svqshrunt', which expects a vector of unsigned integers} } */
+
+  svqshrunt (u8, s16, x); /* { dg-error {argument 3 of 'svqshrunt' must be an integer constant expression} } */
+  svqshrunt (u8, s16, one); /* { dg-error {argument 3 of 'svqshrunt' must be an integer constant expression} } */
+  svqshrunt (u8, s16, 0.4); /* { dg-error {passing 0 to argument 3 of 'svqshrunt', which expects a value in the range \[1, 8\]} } */
+  svqshrunt (u8, s16, 1.0);
+
+  svqshrunt (u8, pg, 1); /* { dg-error {'svqshrunt' has no form that takes 'svbool_t' arguments} } */
+
+  svqshrunt (u8, u8, -1); /* { dg-error {'svqshrunt' has no form that takes 'svuint8_t' arguments} } */
+  svqshrunt (u8, u8, 1); /* { dg-error {'svqshrunt' has no form that takes 'svuint8_t' arguments} } */
+  svqshrunt (u8, u8, 100); /* { dg-error {'svqshrunt' has no form that takes 'svuint8_t' arguments} } */
+
+  svqshrunt (u8, s8, 1); /* { dg-error {'svqshrunt' has no form that takes 'svint8_t' arguments} } */
+
+  svqshrunt (u8, u16, 1); /* { dg-error {'svqshrunt' has no form that takes 'svuint16_t' arguments} } */
+
+  svqshrunt (u8, s16, -1); /* { dg-error {passing -1 to argument 3 of 'svqshrunt', which expects a value in the range \[1, 8\]} } */
+  svqshrunt (u8, s16, 0); /* { dg-error {passing 0 to argument 3 of 'svqshrunt', which expects a value in the range \[1, 8\]} } */
+  svqshrunt (u8, s16, 1);
+  svqshrunt (u8, s16, 8);
+  svqshrunt (u8, s16, 9); /* { dg-error {passing 9 to argument 3 of 'svqshrunt', which expects a value in the range \[1, 8\]} } */
+
+  svqshrunt (u16, u32, 1); /* { dg-error {'svqshrunt' has no form that takes 'svuint32_t' arguments} } */
+
+  svqshrunt (u16, s32, -1); /* { dg-error {passing -1 to argument 3 of 'svqshrunt', which expects a value in the range \[1, 16\]} } */
+  svqshrunt (u16, s32, 0); /* { dg-error {passing 0 to argument 3 of 'svqshrunt', which expects a value in the range \[1, 16\]} } */
+  svqshrunt (u16, s32, 1);
+  svqshrunt (u16, s32, 16);
+  svqshrunt (u16, s32, 17); /* { dg-error {passing 17 to argument 3 of 'svqshrunt', which expects a value in the range \[1, 16\]} } */
+
+  svqshrunt (u32, u64, 1); /* { dg-error {'svqshrunt' has no form that takes 'svuint64_t' arguments} } */
+
+  svqshrunt (u32, s64, -1); /* { dg-error {passing -1 to argument 3 of 'svqshrunt', which expects a value in the range \[1, 32\]} } */
+  svqshrunt (u32, s64, 0); /* { dg-error {passing 0 to argument 3 of 'svqshrunt', which expects a value in the range \[1, 32\]} } */
+  svqshrunt (u32, s64, 1);
+  svqshrunt (u32, s64, 32);
+  svqshrunt (u32, s64, 33); /* { dg-error {passing 33 to argument 3 of 'svqshrunt', which expects a value in the range \[1, 32\]} } */
+
+  svqshrunt (u16, f32, 1); /* { dg-error {'svqshrunt' has no form that takes 'svfloat32_t' arguments} } */
+
+  svqshrunt (1, u32, 1); /* { dg-error {passing 'int' to argument 1 of 'svqshrunt', which expects an SVE vector type} } */
+  svqshrunt (u32, 1, 1); /* { dg-error {passing 'int' to argument 2 of 'svqshrunt', which expects an SVE vector type} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/store_scatter_index_restricted_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/store_scatter_index_restricted_1.c
new file mode 100644 (file)
index 0000000..5e31362
--- /dev/null
@@ -0,0 +1,94 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c99" } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+struct s { signed char x; };
+
+svuint32_t
+f1 (svbool_t pg, signed char *s8_ptr, short *s16_ptr,
+    int32_t *s32_ptr, uint32_t *u32_ptr, float *f32_ptr,
+    int64_t *s64_ptr, uint64_t *u64_ptr, double *f64_ptr,
+    void *void_ptr, struct s *s_ptr, _Complex float *cf64_ptr,
+    svint8_t s8, svuint8_t u8, svint16_t s16, svuint16_t u16, svfloat16_t f16,
+    svint32_t s32, svuint32_t u32, svfloat32_t f32,
+    svint64_t s64, svuint64_t u64, svfloat64_t f64, struct s s)
+{
+  svstnt1_scatter_index (pg, s64_ptr, s64); /* { dg-error {too few arguments to function 'svstnt1_scatter_index'} } */
+  svstnt1_scatter_index (pg, s64_ptr, s64, s64, 0); /* { dg-error {too many arguments to function 'svstnt1_scatter_index'} } */
+  svstnt1_scatter_index (0, s64_ptr, s64, s64); /* { dg-error {passing 'int' to argument 1 of 'svstnt1_scatter_index', which expects 'svbool_t'} } */
+  svstnt1_scatter_index (pg, 0, s64, s64);
+  svstnt1_scatter_index (pg, (int64_t *) 0, s64, s64);
+  svstnt1_scatter_index (pg, void_ptr, s64, s64);
+  svstnt1_scatter_index (pg, s_ptr, s64, s64); /* { dg-warning "passing argument 2 of 'svstnt1_scatter_s64index_s64' from incompatible pointer type" } */
+  svstnt1_scatter_index (pg, f32_ptr, s64, s64); /* { dg-warning "passing argument 2 of 'svstnt1_scatter_s64index_s64' from incompatible pointer type" } */
+  svstnt1_scatter_index (pg, f64_ptr, s64, f64);
+  svstnt1_scatter_index (pg, cf64_ptr, s64, f64); /* { dg-warning "passing argument 2 of 'svstnt1_scatter_s64index_f64' from incompatible pointer type" } */
+  svstnt1_scatter_index (pg, s, s64, s64); /* { dg-error {passing 'struct s' to argument 2 of 'svstnt1_scatter_index', which expects a vector or pointer base address} } */
+
+  svstnt1_scatter_index (pg, u32, void_ptr, s32); /* { dg-warning "passing argument 3 of 'svstnt1_scatter_u32base_index_s32' makes integer from pointer without a cast" } */
+  svstnt1_scatter_index (pg, u32, pg, s32); /* { dg-error {passing 'svbool_t' to argument 3 of 'svstnt1_scatter_index', which expects 'int64_t'} } */
+  svstnt1_scatter_index (pg, u32, s32, s32); /* { dg-error {passing 'svint32_t' to argument 3 of 'svstnt1_scatter_index', which expects 'int64_t'} } */
+
+  svstnt1_scatter_index (pg, void_ptr, u64, pg); /* { dg-error {passing 'svbool_t' to argument 4 of 'svstnt1_scatter_index', which expects a vector of 32-bit or 64-bit elements} } */
+
+  svstnt1_scatter_index (pg, s8_ptr, u64, s8); /* { dg-error {passing 'svint8_t' to argument 4 of 'svstnt1_scatter_index', which expects a vector of 32-bit or 64-bit elements} } */
+  svstnt1_scatter_index (pg, s8_ptr, u64, u8); /* { dg-error {passing 'svuint8_t' to argument 4 of 'svstnt1_scatter_index', which expects a vector of 32-bit or 64-bit elements} } */
+
+  svstnt1_scatter_index (pg, s16_ptr, u64, s16); /* { dg-error {passing 'svint16_t' to argument 4 of 'svstnt1_scatter_index', which expects a vector of 32-bit or 64-bit elements} } */
+  svstnt1_scatter_index (pg, s16_ptr, u64, u16); /* { dg-error {passing 'svuint16_t' to argument 4 of 'svstnt1_scatter_index', which expects a vector of 32-bit or 64-bit elements} } */
+  svstnt1_scatter_index (pg, s16_ptr, u64, f16); /* { dg-error {passing 'svfloat16_t' to argument 4 of 'svstnt1_scatter_index', which expects a vector of 32-bit or 64-bit elements} } */
+
+  svstnt1_scatter_index (pg, u32, 0, s32);
+  svstnt1_scatter_index (pg, s32, 0, s32); /* { dg-error {passing 'svint32_t' to argument 2 of 'svstnt1_scatter_index', which expects 'svuint32_t'} } */
+
+  svstnt1_scatter_index (pg, u32, 0, u32);
+  svstnt1_scatter_index (pg, s32, 0, u32); /* { dg-error {passing 'svint32_t' to argument 2 of 'svstnt1_scatter_index', which expects 'svuint32_t'} } */
+
+  svstnt1_scatter_index (pg, u32, 0, f32);
+  svstnt1_scatter_index (pg, s32, 0, f32); /* { dg-error {passing 'svint32_t' to argument 2 of 'svstnt1_scatter_index', which expects 'svuint32_t'} } */
+
+  svstnt1_scatter_index (pg, u64, 0, s64);
+  svstnt1_scatter_index (pg, s64, 0, s64); /* { dg-error {passing 'svint64_t' to argument 2 of 'svstnt1_scatter_index', which expects 'svuint64_t'} } */
+
+  svstnt1_scatter_index (pg, u64, 0, u64);
+  svstnt1_scatter_index (pg, s64, 0, u64); /* { dg-error {passing 'svint64_t' to argument 2 of 'svstnt1_scatter_index', which expects 'svuint64_t'} } */
+
+  svstnt1_scatter_index (pg, u64, 0, f64);
+  svstnt1_scatter_index (pg, s64, 0, f64); /* { dg-error {passing 'svint64_t' to argument 2 of 'svstnt1_scatter_index', which expects 'svuint64_t'} } */
+
+  svstnt1_scatter_index (pg, s32_ptr, s32, s32); /* { dg-error {when storing 'svint32_t', 'svstnt1_scatter_index' requires a vector base and a scalar index} } */
+  svstnt1_scatter_index (pg, s32_ptr, u32, s32); /* { dg-error {when storing 'svint32_t', 'svstnt1_scatter_index' requires a vector base and a scalar index} } */
+  svstnt1_scatter_index (pg, s32_ptr, f32, s32); /* { dg-error {when storing 'svint32_t', 'svstnt1_scatter_index' requires a vector base and a scalar index} } */
+
+  svstnt1_scatter_index (pg, u32_ptr, s32, u32); /* { dg-error {when storing 'svuint32_t', 'svstnt1_scatter_index' requires a vector base and a scalar index} } */
+  svstnt1_scatter_index (pg, u32_ptr, u32, u32); /* { dg-error {when storing 'svuint32_t', 'svstnt1_scatter_index' requires a vector base and a scalar index} } */
+  svstnt1_scatter_index (pg, u32_ptr, f32, u32); /* { dg-error {when storing 'svuint32_t', 'svstnt1_scatter_index' requires a vector base and a scalar index} } */
+
+  svstnt1_scatter_index (pg, f32_ptr, s32, f32); /* { dg-error {when storing 'svfloat32_t', 'svstnt1_scatter_index' requires a vector base and a scalar index} } */
+  svstnt1_scatter_index (pg, f32_ptr, u32, f32); /* { dg-error {when storing 'svfloat32_t', 'svstnt1_scatter_index' requires a vector base and a scalar index} } */
+  svstnt1_scatter_index (pg, f32_ptr, f32, f32);  /* { dg-error {when storing 'svfloat32_t', 'svstnt1_scatter_index' requires a vector base and a scalar index} } */
+
+  svstnt1_scatter_index (pg, s64_ptr, s32, s64); /* { dg-error {passing 'svint32_t' to argument 3 of 'svstnt1_scatter_index', which when storing 'svint64_t' expects a vector of 64-bit integers} } */
+  svstnt1_scatter_index (pg, s64_ptr, u32, s64); /* { dg-error {passing 'svuint32_t' to argument 3 of 'svstnt1_scatter_index', which when storing 'svint64_t' expects a vector of 64-bit integers} } */
+  svstnt1_scatter_index (pg, s64_ptr, f32, s64); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svstnt1_scatter_index', which when storing 'svint64_t' expects a vector of 64-bit integers} } */
+  svstnt1_scatter_index (pg, s64_ptr, s64, s64);
+  svstnt1_scatter_index (pg, s64_ptr, u64, s64);
+  svstnt1_scatter_index (pg, s64_ptr, f64, s64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svstnt1_scatter_index', which when storing 'svint64_t' expects a vector of 64-bit integers} } */
+
+  svstnt1_scatter_index (pg, u64_ptr, s32, u64); /* { dg-error {passing 'svint32_t' to argument 3 of 'svstnt1_scatter_index', which when storing 'svuint64_t' expects a vector of 64-bit integers} } */
+  svstnt1_scatter_index (pg, u64_ptr, u32, u64); /* { dg-error {passing 'svuint32_t' to argument 3 of 'svstnt1_scatter_index', which when storing 'svuint64_t' expects a vector of 64-bit integers} } */
+  svstnt1_scatter_index (pg, u64_ptr, f32, u64); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svstnt1_scatter_index', which when storing 'svuint64_t' expects a vector of 64-bit integers} } */
+  svstnt1_scatter_index (pg, u64_ptr, s64, u64);
+  svstnt1_scatter_index (pg, u64_ptr, u64, u64);
+  svstnt1_scatter_index (pg, u64_ptr, f64, u64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svstnt1_scatter_index', which when storing 'svuint64_t' expects a vector of 64-bit integers} } */
+
+  svstnt1_scatter_index (pg, f64_ptr, s32, f64); /* { dg-error {passing 'svint32_t' to argument 3 of 'svstnt1_scatter_index', which when storing 'svfloat64_t' expects a vector of 64-bit integers} } */
+  svstnt1_scatter_index (pg, f64_ptr, u32, f64); /* { dg-error {passing 'svuint32_t' to argument 3 of 'svstnt1_scatter_index', which when storing 'svfloat64_t' expects a vector of 64-bit integers} } */
+  svstnt1_scatter_index (pg, f64_ptr, f32, f64); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svstnt1_scatter_index', which when storing 'svfloat64_t' expects a vector of 64-bit integers} } */
+  svstnt1_scatter_index (pg, f64_ptr, s64, f64);
+  svstnt1_scatter_index (pg, f64_ptr, u64, f64);
+  svstnt1_scatter_index (pg, f64_ptr, f64, f64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svstnt1_scatter_index', which when storing 'svfloat64_t' expects a vector of 64-bit integers} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/store_scatter_offset_restricted_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/store_scatter_offset_restricted_1.c
new file mode 100644 (file)
index 0000000..aef152a
--- /dev/null
@@ -0,0 +1,103 @@
+/* { dg-do compile } */
+/* { dg-options "-std=c99" } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+struct s { signed char x; };
+
+svuint32_t
+f1 (svbool_t pg, signed char *s8_ptr, short *s16_ptr,
+    int32_t *s32_ptr, uint32_t *u32_ptr, float *f32_ptr,
+    int64_t *s64_ptr, uint64_t *u64_ptr, double *f64_ptr,
+    void *void_ptr, struct s *s_ptr, _Complex float *cf32_ptr,
+    svint8_t s8, svuint8_t u8, svint16_t s16, svuint16_t u16, svfloat16_t f16,
+    svint32_t s32, svuint32_t u32, svfloat32_t f32,
+    svint64_t s64, svuint64_t u64, svfloat64_t f64, struct s s)
+{
+  svstnt1_scatter_offset (pg, s32_ptr, u32); /* { dg-error {too few arguments to function 'svstnt1_scatter_offset'} } */
+  svstnt1_scatter_offset (pg, s32_ptr, u32, s32, 0); /* { dg-error {too many arguments to function 'svstnt1_scatter_offset'} } */
+  svstnt1_scatter_offset (0, s32_ptr, u32, s32); /* { dg-error {passing 'int' to argument 1 of 'svstnt1_scatter_offset', which expects 'svbool_t'} } */
+  svstnt1_scatter_offset (pg, 0, u32, s32);
+  svstnt1_scatter_offset (pg, (int *) 0, u32, s32);
+  svstnt1_scatter_offset (pg, void_ptr, u32, s32);
+  svstnt1_scatter_offset (pg, s_ptr, u32, s32); /* { dg-warning "passing argument 2 of 'svstnt1_scatter_u32offset_s32' from incompatible pointer type" } */
+  svstnt1_scatter_offset (pg, f32_ptr, u32, s32); /* { dg-warning "passing argument 2 of 'svstnt1_scatter_u32offset_s32' from incompatible pointer type" } */
+  svstnt1_scatter_offset (pg, f32_ptr, u32, f32);
+  svstnt1_scatter_offset (pg, cf32_ptr, u32, f32); /* { dg-warning "passing argument 2 of 'svstnt1_scatter_u32offset_f32' from incompatible pointer type" } */
+  svstnt1_scatter_offset (pg, s, u32, s32); /* { dg-error {passing 'struct s' to argument 2 of 'svstnt1_scatter_offset', which expects a vector or pointer base address} } */
+
+  svstnt1_scatter_offset (pg, u32, void_ptr, s32); /* { dg-warning "passing argument 3 of 'svstnt1_scatter_u32base_offset_s32' makes integer from pointer without a cast" } */
+  svstnt1_scatter_offset (pg, u32, pg, s32); /* { dg-error {passing 'svbool_t' to argument 3 of 'svstnt1_scatter_offset', which expects 'int64_t'} } */
+  svstnt1_scatter_offset (pg, u32, s32, s32); /* { dg-error {passing 'svint32_t' to argument 3 of 'svstnt1_scatter_offset', which expects 'int64_t'} } */
+
+  svstnt1_scatter_offset (pg, void_ptr, u32, pg); /* { dg-error {passing 'svbool_t' to argument 4 of 'svstnt1_scatter_offset', which expects a vector of 32-bit or 64-bit elements} } */
+
+  svstnt1_scatter_offset (pg, s8_ptr, u32, s8); /* { dg-error {passing 'svint8_t' to argument 4 of 'svstnt1_scatter_offset', which expects a vector of 32-bit or 64-bit elements} } */
+  svstnt1_scatter_offset (pg, s8_ptr, u32, u8); /* { dg-error {passing 'svuint8_t' to argument 4 of 'svstnt1_scatter_offset', which expects a vector of 32-bit or 64-bit elements} } */
+
+  svstnt1_scatter_offset (pg, s16_ptr, u32, s16); /* { dg-error {passing 'svint16_t' to argument 4 of 'svstnt1_scatter_offset', which expects a vector of 32-bit or 64-bit elements} } */
+  svstnt1_scatter_offset (pg, s16_ptr, u32, u16); /* { dg-error {passing 'svuint16_t' to argument 4 of 'svstnt1_scatter_offset', which expects a vector of 32-bit or 64-bit elements} } */
+  svstnt1_scatter_offset (pg, s16_ptr, u32, f16); /* { dg-error {passing 'svfloat16_t' to argument 4 of 'svstnt1_scatter_offset', which expects a vector of 32-bit or 64-bit elements} } */
+
+  svstnt1_scatter_offset (pg, u32, 0, s32);
+  svstnt1_scatter_offset (pg, s32, 0, s32); /* { dg-error {passing 'svint32_t' to argument 2 of 'svstnt1_scatter_offset', which expects 'svuint32_t'} } */
+
+  svstnt1_scatter_offset (pg, u32, 0, u32);
+  svstnt1_scatter_offset (pg, s32, 0, u32); /* { dg-error {passing 'svint32_t' to argument 2 of 'svstnt1_scatter_offset', which expects 'svuint32_t'} } */
+
+  svstnt1_scatter_offset (pg, u32, 0, f32);
+  svstnt1_scatter_offset (pg, s32, 0, f32); /* { dg-error {passing 'svint32_t' to argument 2 of 'svstnt1_scatter_offset', which expects 'svuint32_t'} } */
+
+  svstnt1_scatter_offset (pg, u64, 0, s64);
+  svstnt1_scatter_offset (pg, s64, 0, s64); /* { dg-error {passing 'svint64_t' to argument 2 of 'svstnt1_scatter_offset', which expects 'svuint64_t'} } */
+
+  svstnt1_scatter_offset (pg, u64, 0, u64);
+  svstnt1_scatter_offset (pg, s64, 0, u64); /* { dg-error {passing 'svint64_t' to argument 2 of 'svstnt1_scatter_offset', which expects 'svuint64_t'} } */
+
+  svstnt1_scatter_offset (pg, u64, 0, f64);
+  svstnt1_scatter_offset (pg, s64, 0, f64); /* { dg-error {passing 'svint64_t' to argument 2 of 'svstnt1_scatter_offset', which expects 'svuint64_t'} } */
+
+  svstnt1_scatter_offset (pg, s32_ptr, s32, s32); /* { dg-error {'svstnt1_scatter_offset' does not support 32-bit sign-extended offsets} } */
+  svstnt1_scatter_offset (pg, s32_ptr, u32, s32);
+  svstnt1_scatter_offset (pg, s32_ptr, f32, s32); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svint32_t' expects a vector of 32-bit integers} } */
+  svstnt1_scatter_offset (pg, s32_ptr, s64, s32); /* { dg-error {passing 'svint64_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svint32_t' expects a vector of 32-bit integers} } */
+  svstnt1_scatter_offset (pg, s32_ptr, u64, s32); /* { dg-error {passing 'svuint64_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svint32_t' expects a vector of 32-bit integers} } */
+  svstnt1_scatter_offset (pg, s32_ptr, f64, s32); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svint32_t' expects a vector of 32-bit integers} } */
+
+  svstnt1_scatter_offset (pg, u32_ptr, s32, u32); /* { dg-error {'svstnt1_scatter_offset' does not support 32-bit sign-extended offsets} } */
+  svstnt1_scatter_offset (pg, u32_ptr, u32, u32);
+  svstnt1_scatter_offset (pg, u32_ptr, f32, u32); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svuint32_t' expects a vector of 32-bit integers} } */
+  svstnt1_scatter_offset (pg, u32_ptr, s64, u32); /* { dg-error {passing 'svint64_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svuint32_t' expects a vector of 32-bit integers} } */
+  svstnt1_scatter_offset (pg, u32_ptr, u64, u32); /* { dg-error {passing 'svuint64_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svuint32_t' expects a vector of 32-bit integers} } */
+  svstnt1_scatter_offset (pg, u32_ptr, f64, u32); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svuint32_t' expects a vector of 32-bit integers} } */
+
+  svstnt1_scatter_offset (pg, f32_ptr, s32, f32); /* { dg-error {'svstnt1_scatter_offset' does not support 32-bit sign-extended offsets} } */
+  svstnt1_scatter_offset (pg, f32_ptr, u32, f32);
+  svstnt1_scatter_offset (pg, f32_ptr, f32, f32); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svfloat32_t' expects a vector of 32-bit integers} } */
+  svstnt1_scatter_offset (pg, f32_ptr, s64, f32); /* { dg-error {passing 'svint64_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svfloat32_t' expects a vector of 32-bit integers} } */
+  svstnt1_scatter_offset (pg, f32_ptr, u64, f32); /* { dg-error {passing 'svuint64_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svfloat32_t' expects a vector of 32-bit integers} } */
+  svstnt1_scatter_offset (pg, f32_ptr, f64, f32); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svfloat32_t' expects a vector of 32-bit integers} } */
+
+  svstnt1_scatter_offset (pg, s64_ptr, s32, s64); /* { dg-error {passing 'svint32_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svint64_t' expects a vector of 64-bit integers} } */
+  svstnt1_scatter_offset (pg, s64_ptr, u32, s64); /* { dg-error {passing 'svuint32_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svint64_t' expects a vector of 64-bit integers} } */
+  svstnt1_scatter_offset (pg, s64_ptr, f32, s64); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svint64_t' expects a vector of 64-bit integers} } */
+  svstnt1_scatter_offset (pg, s64_ptr, s64, s64);
+  svstnt1_scatter_offset (pg, s64_ptr, u64, s64);
+  svstnt1_scatter_offset (pg, s64_ptr, f64, s64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svint64_t' expects a vector of 64-bit integers} } */
+
+  svstnt1_scatter_offset (pg, u64_ptr, s32, u64); /* { dg-error {passing 'svint32_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svuint64_t' expects a vector of 64-bit integers} } */
+  svstnt1_scatter_offset (pg, u64_ptr, u32, u64); /* { dg-error {passing 'svuint32_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svuint64_t' expects a vector of 64-bit integers} } */
+  svstnt1_scatter_offset (pg, u64_ptr, f32, u64); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svuint64_t' expects a vector of 64-bit integers} } */
+  svstnt1_scatter_offset (pg, u64_ptr, s64, u64);
+  svstnt1_scatter_offset (pg, u64_ptr, u64, u64);
+  svstnt1_scatter_offset (pg, u64_ptr, f64, u64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svuint64_t' expects a vector of 64-bit integers} } */
+
+  svstnt1_scatter_offset (pg, f64_ptr, s32, f64); /* { dg-error {passing 'svint32_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svfloat64_t' expects a vector of 64-bit integers} } */
+  svstnt1_scatter_offset (pg, f64_ptr, u32, f64); /* { dg-error {passing 'svuint32_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svfloat64_t' expects a vector of 64-bit integers} } */
+  svstnt1_scatter_offset (pg, f64_ptr, f32, f64); /* { dg-error {passing 'svfloat32_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svfloat64_t' expects a vector of 64-bit integers} } */
+  svstnt1_scatter_offset (pg, f64_ptr, s64, f64);
+  svstnt1_scatter_offset (pg, f64_ptr, u64, f64);
+  svstnt1_scatter_offset (pg, f64_ptr, f64, f64); /* { dg-error {passing 'svfloat64_t' to argument 3 of 'svstnt1_scatter_offset', which when storing 'svfloat64_t' expects a vector of 64-bit integers} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/tbl_tuple_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/tbl_tuple_1.c
new file mode 100644 (file)
index 0000000..9c22af4
--- /dev/null
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-std=c99 -Wall -Wextra" } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+svfloat64_t
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8,
+    svint8x2_t s8x2, svuint8x2_t u8x2, svuint8x3_t u8x3)
+{
+  svfloat64_t f64;
+
+  u8 = svtbl2 (u8x2); /* { dg-error {too few arguments to function 'svtbl2'} } */
+  u8 = svtbl2 (u8x2); /* { dg-error {too few arguments to function 'svtbl2'} } */
+  u8 = svtbl2 (u8x2, u8, 3); /* { dg-error {too many arguments to function 'svtbl2'} } */
+  u8 = svtbl2 (u8, u8); /* { dg-error {passing single vector 'svuint8_t' to argument 1 of 'svtbl2', which expects a tuple of 2 vectors} } */
+  u8 = svtbl2 (u8x3, u8); /* { dg-error {passing 'svuint8x3_t' to argument 1 of 'svtbl2', which expects a tuple of 2 vectors} } */
+  u8 = svtbl2 (pg, u8); /* { dg-error {passing 'svbool_t' to argument 1 of 'svtbl2', which expects a tuple of 2 vectors} } */
+  u8 = svtbl2 (u8x2, u8x2); /* { dg-error {passing 'svuint8x2_t' to argument 2 of 'svtbl2', which expects a single SVE vector rather than a tuple} } */
+  u8 = svtbl2 (u8x2, f64); /* { dg-error {passing 'svfloat64_t' to argument 2 of 'svtbl2', which expects a vector of unsigned integers} } */
+  u8 = svtbl2 (u8x2, pg); /* { dg-error {passing 'svbool_t' to argument 2 of 'svtbl2', which expects a vector of unsigned integers} } */
+  u8 = svtbl2 (u8x2, u8);
+  u8 = svtbl2 (u8x2, s8); /* { dg-error {passing 'svint8_t' to argument 2 of 'svtbl2', which expects a vector of unsigned integers} } */
+  s8 = svtbl2 (s8x2, f64); /* { dg-error {passing 'svfloat64_t' to argument 2 of 'svtbl2', which expects a vector of unsigned integers} } */
+  s8 = svtbl2 (s8x2, pg); /* { dg-error {passing 'svbool_t' to argument 2 of 'svtbl2', which expects a vector of unsigned integers} } */
+  s8 = svtbl2 (s8x2, u8);
+  s8 = svtbl2 (s8x2, s8); /* { dg-error {passing 'svint8_t' to argument 2 of 'svtbl2', which expects a vector of unsigned integers} } */
+
+  return f64;
+}
index bbd1f91..d59ffab 100644 (file)
@@ -9,7 +9,7 @@ f1 (svbool_t pg, svfloat16_t f16, svfloat32_t f32, svfloat64_t f64,
   svmla_lane (f32, f32, f32); /* { dg-error {too few arguments to function 'svmla_lane'} } */
   svmla_lane (f32, f32, f32, 0, 0); /* { dg-error {too many arguments to function 'svmla_lane'} } */
   svmla_lane (pg, pg, pg, 0); /* { dg-error {'svmla_lane' has no form that takes 'svbool_t' arguments} } */
-  svmla_lane (s32, s32, s32, 0); /* { dg-error {'svmla_lane' has no form that takes 'svint32_t' arguments} } */
+  svmla_lane (s32, s32, s32, 0); /* { dg-error {ACLE function 'svmla_lane_s32' requires ISA extension 'sve2'} "" { xfail aarch64_sve2 } } */
   svmla_lane (1, f32, f32, 0); /* { dg-error {passing 'int' to argument 1 of 'svmla_lane', which expects an SVE vector type} } */
   svmla_lane (f32, 1, f32, 0); /* { dg-error {passing 'int' to argument 2 of 'svmla_lane', which expects an SVE vector type} } */
   svmla_lane (f32, f32, 1, 0); /* { dg-error {passing 'int' to argument 3 of 'svmla_lane', which expects an SVE vector type} } */
index bccc6c7..68e5172 100644 (file)
@@ -9,7 +9,7 @@ f1 (svbool_t pg, svfloat16_t f16, svfloat32_t f32, svfloat64_t f64,
   svcmla_lane (f32, f32, f32, 0); /* { dg-error {too few arguments to function 'svcmla_lane'} } */
   svcmla_lane (f32, f32, f32, 0, 90, 90); /* { dg-error {too many arguments to function 'svcmla_lane'} } */
   svcmla_lane (pg, pg, pg, 0, 90); /* { dg-error {'svcmla_lane' has no form that takes 'svbool_t' arguments} } */
-  svcmla_lane (s32, s32, s32, 0, 90); /* { dg-error {'svcmla_lane' has no form that takes 'svint32_t' arguments} } */
+  svcmla_lane (s32, s32, s32, 0, 90); /* { dg-error {ACLE function 'svcmla_lane_s32' requires ISA extension 'sve2'} "" { xfail aarch64_sve2 } } */
   svcmla_lane (f64, f64, f64, 0, 90); /* { dg-error {'svcmla_lane' has no form that takes 'svfloat64_t' arguments} } */
   svcmla_lane (1, f32, f32, 0, 90); /* { dg-error {passing 'int' to argument 1 of 'svcmla_lane', which expects an SVE vector type} } */
   svcmla_lane (f32, 1, f32, 0, 90); /* { dg-error {passing 'int' to argument 2 of 'svcmla_lane', which expects an SVE vector type} } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_long_lane_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_long_lane_1.c
new file mode 100644 (file)
index 0000000..e20e1a1
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8, svint16_t s16, svuint16_t u16,
+    svint32_t s32, svuint32_t u32, svint64_t s64, svuint64_t u64,
+    svfloat16_t f16, svfloat32_t f32, svfloat64_t f64, int i)
+{
+  svmlalb_lane (u64, u32, u32); /* { dg-error {too few arguments to function 'svmlalb_lane'} } */
+  svmlalb_lane (u64, u32, u32, 0, 0); /* { dg-error {too many arguments to function 'svmlalb_lane'} } */
+  svmlalb_lane (0, u16, u16, 0); /* { dg-error {passing 'int' to argument 1 of 'svmlalb_lane', which expects an SVE vector type} } */
+  svmlalb_lane (pg, u16, u16, 0); /* { dg-error {'svmlalb_lane' has no form that takes 'svbool_t' arguments} } */
+  svmlalb_lane (u8, u8, u8, 0); /* { dg-error {'svmlalb_lane' has no form that takes 'svuint8_t' arguments} } */
+  svmlalb_lane (u16, u8, u8, 0); /* { dg-error {'svmlalb_lane' has no form that takes 'svuint16_t' arguments} } */
+  svmlalb_lane (f16, u16, u16, 0); /* { dg-error {'svmlalb_lane' has no form that takes 'svfloat16_t' arguments} } */
+  svmlalb_lane (f32, f16, f16, 0);
+  svmlalb_lane (u32, u16, u16, 0);
+  svmlalb_lane (u32, 0, u16, 0); /* { dg-error {passing 'int' to argument 2 of 'svmlalb_lane', which expects an SVE vector type} } */
+  svmlalb_lane (u32, s16, u16, 0); /* { dg-error {arguments 1 and 2 of 'svmlalb_lane' must have the same signedness, but the values passed here have type 'svuint32_t' and 'svint16_t' respectively} } */
+  svmlalb_lane (u32, u16, 0, 0); /* { dg-error {passing 'int' to argument 3 of 'svmlalb_lane', which expects an SVE vector type} } */
+  svmlalb_lane (u32, u16, s16, 0); /* { dg-error {arguments 1 and 3 of 'svmlalb_lane' must have the same signedness, but the values passed here have type 'svuint32_t' and 'svint16_t' respectively} } */
+  svmlalb_lane (u32, u32, u32, 0); /* { dg-error {passing 'svuint32_t' instead of the expected 'svuint16_t' to argument 2 of 'svmlalb_lane', after passing 'svuint32_t' to argument 1} } */
+  svmlalb_lane (u32, u8, u16, 0); /* { dg-error {passing 'svuint8_t' instead of the expected 'svuint16_t' to argument 2 of 'svmlalb_lane', after passing 'svuint32_t' to argument 1} } */
+  svmlalb_lane (u32, u16, u8, 0); /* { dg-error {passing 'svuint8_t' instead of the expected 'svuint16_t' to argument 3 of 'svmlalb_lane', after passing 'svuint32_t' to argument 1} } */
+  svmlalb_lane (u64, u32, u32, s32); /* { dg-error {argument 4 of 'svmlalb_lane' must be an integer constant expression} } */
+  svmlalb_lane (u64, u32, u32, i); /* { dg-error {argument 4 of 'svmlalb_lane' must be an integer constant expression} } */
+
+  svmlalb_lane (s32, s16, s16, 0);
+  svmlalb_lane (s32, s16, s16, 7);
+  svmlalb_lane (s32, s16, s16, 8); /* { dg-error {passing 8 to argument 4 of 'svmlalb_lane', which expects a value in the range \[0, 7\]} } */
+  svmlalb_lane (s32, s16, s16, -1); /* { dg-error {passing -1 to argument 4 of 'svmlalb_lane', which expects a value in the range \[0, 7\]} } */
+
+  svmlalb_lane (u32, u16, u16, 0);
+  svmlalb_lane (u32, u16, u16, 7);
+  svmlalb_lane (u32, u16, u16, 8); /* { dg-error {passing 8 to argument 4 of 'svmlalb_lane', which expects a value in the range \[0, 7\]} } */
+  svmlalb_lane (u32, u16, u16, -1); /* { dg-error {passing -1 to argument 4 of 'svmlalb_lane', which expects a value in the range \[0, 7\]} } */
+
+  svmlalb_lane (s64, s32, s32, 0);
+  svmlalb_lane (s64, s32, s32, 3);
+  svmlalb_lane (s64, s32, s32, 4); /* { dg-error {passing 4 to argument 4 of 'svmlalb_lane', which expects a value in the range \[0, 3\]} } */
+  svmlalb_lane (s64, s32, s32, -1); /* { dg-error {passing -1 to argument 4 of 'svmlalb_lane', which expects a value in the range \[0, 3\]} } */
+
+  svmlalb_lane (u64, u32, u32, 0);
+  svmlalb_lane (u64, u32, u32, 3);
+  svmlalb_lane (u64, u32, u32, 4); /* { dg-error {passing 4 to argument 4 of 'svmlalb_lane', which expects a value in the range \[0, 3\]} } */
+  svmlalb_lane (u64, u32, u32, -1); /* { dg-error {passing -1 to argument 4 of 'svmlalb_lane', which expects a value in the range \[0, 3\]} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_long_opt_n_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_long_opt_n_1.c
new file mode 100644 (file)
index 0000000..c6718cf
--- /dev/null
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8, svuint16_t u16, svuint32_t u32,
+    svfloat16_t f16, svfloat32_t f32)
+{
+  svabalb (u16, u8); /* { dg-error {too few arguments to function 'svabalb'} } */
+  svabalb (u16, u8, u8, u8); /* { dg-error {too many arguments to function 'svabalb'} } */
+  svabalb (0, u8, u8); /* { dg-error {passing 'int' to argument 1 of 'svabalb', which expects an SVE vector type} } */
+  svabalb (pg, u8, u8); /* { dg-error {'svabalb' has no form that takes 'svbool_t' arguments} } */
+  svabalb (u8, u8, u8); /* { dg-error {'svabalb' has no form that takes 'svuint8_t' arguments} } */
+  svabalb (f16, u8, u8); /* { dg-error {'svabalb' has no form that takes 'svfloat16_t' arguments} } */
+  svabalb (f32, f16, f16); /* { dg-error {'svabalb' has no form that takes 'svfloat32_t' arguments} } */
+  svabalb (u16, u8, u8);
+  svabalb (u16, 0, u8); /* { dg-error {passing 'int' to argument 2 of 'svabalb', which expects an SVE vector type} } */
+  svabalb (u16, s8, u8); /* { dg-error {arguments 1 and 2 of 'svabalb' must have the same signedness, but the values passed here have type 'svuint16_t' and 'svint8_t' respectively} } */
+  svabalb (u16, u8, 0);
+  svabalb (u16, u8, s8); /* { dg-error {arguments 1 and 3 of 'svabalb' must have the same signedness, but the values passed here have type 'svuint16_t' and 'svint8_t' respectively} } */
+  svabalb (u16, u16, u16); /* { dg-error {passing 'svuint16_t' instead of the expected 'svuint8_t' to argument 2 of 'svabalb', after passing 'svuint16_t' to argument 1} } */
+  svabalb (u32, u8, u16); /* { dg-error {passing 'svuint8_t' instead of the expected 'svuint16_t' to argument 2 of 'svabalb', after passing 'svuint32_t' to argument 1} } */
+  svabalb (u32, u16, u8); /* { dg-error {passing 'svuint8_t' instead of the expected 'svuint16_t' to argument 3 of 'svabalb', after passing 'svuint32_t' to argument 1} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_qq_lane_rotate_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_qq_lane_rotate_1.c
new file mode 100644 (file)
index 0000000..a748a86
--- /dev/null
@@ -0,0 +1,57 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8, svint16_t s16, svuint16_t u16,
+    svint32_t s32, svuint32_t u32, svint64_t s64, svuint64_t u64,
+    svfloat32_t f32, int i)
+{
+  svcdot_lane (u32, u8, u8, 0); /* { dg-error {too few arguments to function 'svcdot_lane'} } */
+  svcdot_lane (u32, u8, u8, 0, 0, 0); /* { dg-error {too many arguments to function 'svcdot_lane'} } */
+  svcdot_lane (0, u8, u8, 0, 0); /* { dg-error {passing 'int' to argument 1 of 'svcdot_lane', which expects an SVE vector type} } */
+  svcdot_lane (pg, u8, u8, 0, 0); /* { dg-error {'svcdot_lane' has no form that takes 'svbool_t' arguments} } */
+  svcdot_lane (s8, s8, s8, 0, 0); /* { dg-error {'svcdot_lane' has no form that takes 'svint8_t' arguments} } */
+  svcdot_lane (f32, s8, s8, 0, 0); /* { dg-error {'svcdot_lane' has no form that takes 'svfloat32_t' arguments} } */
+  svcdot_lane (s32, s8, s8, 0, 0);
+  svcdot_lane (s32, 0, s8, 0, 0); /* { dg-error {passing 'int' to argument 2 of 'svcdot_lane', which expects an SVE vector type} } */
+  svcdot_lane (s32, s8, 0, 0, 0); /* { dg-error {passing 'int' to argument 3 of 'svcdot_lane', which expects an SVE vector type} } */
+
+  svcdot_lane (s32, s8, s8, 0, 0);
+  svcdot_lane (s32, u8, s8, 0, 0); /* { dg-error {arguments 1 and 2 of 'svcdot_lane' must have the same signedness, but the values passed here have type 'svint32_t' and 'svuint8_t' respectively} } */
+  svcdot_lane (s32, s8, u8, 0, 0); /* { dg-error {arguments 1 and 3 of 'svcdot_lane' must have the same signedness, but the values passed here have type 'svint32_t' and 'svuint8_t' respectively} } */
+  svcdot_lane (s32, s32, s8, 0, 0); /* { dg-error {passing 'svint32_t' instead of the expected 'svint8_t' to argument 2 of 'svcdot_lane', after passing 'svint32_t' to argument 1} } */
+  svcdot_lane (s32, s8, s32, 0, 0); /* { dg-error {passing 'svint32_t' instead of the expected 'svint8_t' to argument 3 of 'svcdot_lane', after passing 'svint32_t' to argument 1} } */
+
+  svcdot_lane (u32, u8, u8, 0, 0); /* { dg-error {'svcdot_lane' has no form that takes 'svuint32_t' arguments} } */
+
+  svcdot_lane (s64, s16, s16, 0, 0);
+  svcdot_lane (s64, u16, s16, 0, 0); /* { dg-error {arguments 1 and 2 of 'svcdot_lane' must have the same signedness, but the values passed here have type 'svint64_t' and 'svuint16_t' respectively} } */
+  svcdot_lane (s64, s16, u16, 0, 0); /* { dg-error {arguments 1 and 3 of 'svcdot_lane' must have the same signedness, but the values passed here have type 'svint64_t' and 'svuint16_t' respectively} } */
+  svcdot_lane (s64, s64, s16, 0, 0); /* { dg-error {passing 'svint64_t' instead of the expected 'svint16_t' to argument 2 of 'svcdot_lane', after passing 'svint64_t' to argument 1} } */
+  svcdot_lane (s64, s16, s64, 0, 0); /* { dg-error {passing 'svint64_t' instead of the expected 'svint16_t' to argument 3 of 'svcdot_lane', after passing 'svint64_t' to argument 1} } */
+
+  svcdot_lane (u64, u16, u16, 0, 0); /* { dg-error {'svcdot_lane' has no form that takes 'svuint64_t' arguments} } */
+
+  svcdot_lane (s32, s8, s8, i, 0); /* { dg-error {argument 4 of 'svcdot_lane' must be an integer constant expression} } */
+  svcdot_lane (s32, s8, s8, -1, 0); /* { dg-error {passing -1 to argument 4 of 'svcdot_lane', which expects a value in the range \[0, 3\]} } */
+  svcdot_lane (s32, s8, s8, 0, 0);
+  svcdot_lane (s32, s8, s8, 3, 0);
+  svcdot_lane (s32, s8, s8, 4, 0); /* { dg-error {passing 4 to argument 4 of 'svcdot_lane', which expects a value in the range \[0, 3\]} } */
+
+  svcdot_lane (s64, s16, s16, i, 0); /* { dg-error {argument 4 of 'svcdot_lane' must be an integer constant expression} } */
+  svcdot_lane (s64, s16, s16, -1, 0); /* { dg-error {passing -1 to argument 4 of 'svcdot_lane', which expects a value in the range \[0, 1\]} } */
+  svcdot_lane (s64, s16, s16, 0, 0);
+  svcdot_lane (s64, s16, s16, 1, 0);
+  svcdot_lane (s64, s16, s16, 2, 0); /* { dg-error {passing 2 to argument 4 of 'svcdot_lane', which expects a value in the range \[0, 1\]} } */
+
+  svcdot_lane (s32, s8, s8, 0, i); /* { dg-error {argument 5 of 'svcdot_lane' must be an integer constant expression} } */
+  svcdot_lane (s32, s8, s8, 0, -90); /* { dg-error {passing -90 to argument 5 of 'svcdot_lane', which expects 0, 90, 180 or 270} } */
+  svcdot_lane (s32, s8, s8, 0, 0);
+  svcdot_lane (s32, s8, s8, 0, 3); /* { dg-error {passing 3 to argument 5 of 'svcdot_lane', which expects 0, 90, 180 or 270} } */
+  svcdot_lane (s32, s8, s8, 0, 90);
+  svcdot_lane (s32, s8, s8, 0, 180);
+  svcdot_lane (s32, s8, s8, 0, 270);
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_qq_rotate_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_qq_rotate_1.c
new file mode 100644 (file)
index 0000000..65e749b
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8, svint16_t s16, svuint16_t u16,
+    svint32_t s32, svuint32_t u32, svint64_t s64, svuint64_t u64,
+    svfloat32_t f32, int i)
+{
+  svcdot (u32, u8, u8); /* { dg-error {too few arguments to function 'svcdot'} } */
+  svcdot (u32, u8, u8, 0, 0); /* { dg-error {too many arguments to function 'svcdot'} } */
+  svcdot (0, u8, u8, 0); /* { dg-error {passing 'int' to argument 1 of 'svcdot', which expects an SVE vector type} } */
+  svcdot (pg, u8, u8, 0); /* { dg-error {'svcdot' has no form that takes 'svbool_t' arguments} } */
+  svcdot (s8, s8, s8, 0); /* { dg-error {'svcdot' has no form that takes 'svint8_t' arguments} } */
+  svcdot (f32, s8, s8, 0); /* { dg-error {'svcdot' has no form that takes 'svfloat32_t' arguments} } */
+  svcdot (s32, s8, s8, 0);
+  svcdot (s32, 0, s8, 0); /* { dg-error {passing 'int' to argument 2 of 'svcdot', which expects an SVE vector type} } */
+  svcdot (s32, s8, 0, 0); /* { dg-error {passing 'int' to argument 3 of 'svcdot', which expects an SVE vector type} } */
+
+  svcdot (s32, s8, s8, 0);
+  svcdot (s32, u8, s8, 0); /* { dg-error {arguments 1 and 2 of 'svcdot' must have the same signedness, but the values passed here have type 'svint32_t' and 'svuint8_t' respectively} } */
+  svcdot (s32, s8, u8, 0); /* { dg-error {arguments 1 and 3 of 'svcdot' must have the same signedness, but the values passed here have type 'svint32_t' and 'svuint8_t' respectively} } */
+  svcdot (s32, s32, s8, 0); /* { dg-error {passing 'svint32_t' instead of the expected 'svint8_t' to argument 2 of 'svcdot', after passing 'svint32_t' to argument 1} } */
+  svcdot (s32, s8, s32, 0); /* { dg-error {passing 'svint32_t' instead of the expected 'svint8_t' to argument 3 of 'svcdot', after passing 'svint32_t' to argument 1} } */
+
+  svcdot (u32, u8, u8, 0); /* { dg-error {'svcdot' has no form that takes 'svuint32_t' arguments} } */
+
+  svcdot (s64, s16, s16, 0);
+  svcdot (s64, u16, s16, 0); /* { dg-error {arguments 1 and 2 of 'svcdot' must have the same signedness, but the values passed here have type 'svint64_t' and 'svuint16_t' respectively} } */
+  svcdot (s64, s16, u16, 0); /* { dg-error {arguments 1 and 3 of 'svcdot' must have the same signedness, but the values passed here have type 'svint64_t' and 'svuint16_t' respectively} } */
+  svcdot (s64, s64, s16, 0); /* { dg-error {passing 'svint64_t' instead of the expected 'svint16_t' to argument 2 of 'svcdot', after passing 'svint64_t' to argument 1} } */
+  svcdot (s64, s16, s64, 0); /* { dg-error {passing 'svint64_t' instead of the expected 'svint16_t' to argument 3 of 'svcdot', after passing 'svint64_t' to argument 1} } */
+
+  svcdot (u64, u16, u16, 0); /* { dg-error {'svcdot' has no form that takes 'svuint64_t' arguments} } */
+
+  svcdot (s32, s8, s8, i); /* { dg-error {argument 4 of 'svcdot' must be an integer constant expression} } */
+  svcdot (s32, s8, s8, -90); /* { dg-error {passing -90 to argument 4 of 'svcdot', which expects 0, 90, 180 or 270} } */
+  svcdot (s32, s8, s8, 0);
+  svcdot (s32, s8, s8, 3); /* { dg-error {passing 3 to argument 4 of 'svcdot', which expects 0, 90, 180 or 270} } */
+  svcdot (s32, s8, s8, 90);
+  svcdot (s32, s8, s8, 180);
+  svcdot (s32, s8, s8, 270);
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_shift_right_imm_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_shift_right_imm_1.c
new file mode 100644 (file)
index 0000000..2811137
--- /dev/null
@@ -0,0 +1,41 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-std=c99 -Wall -Wextra" } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svuint8_t u8, svint8_t s8, svint16_t s16,
+    svint32_t s32, svint64_t s64, int x)
+{
+  const int one = 1;
+  pg = svsra (pg, pg, 1); /* { dg-error {'svsra' has no form that takes 'svbool_t' arguments} } */
+  pg = svsra (pg, s8, 1); /* { dg-error {passing 'svint8_t' to argument 2 of 'svsra', but previous arguments had type 'svbool_t'} } */
+  s8 = svsra (1, s8, 1); /* { dg-error {passing 'int' to argument 1 of 'svsra', which expects an SVE vector type} } */
+  s8 = svsra (s8, u8, 1); /* { dg-error {passing 'svuint8_t' to argument 2 of 'svsra', but previous arguments had type 'svint8_t'} } */
+  s8 = svsra (s8, pg, 1); /* { dg-error {passing 'svbool_t' to argument 2 of 'svsra', but previous arguments had type 'svint8_t'} } */
+  s8 = svsra (s8, 1, 1); /* { dg-error {passing 'int' to argument 2 of 'svsra', which expects an SVE vector type} } */
+  s8 = svsra (s8, s8, x); /* { dg-error {argument 3 of 'svsra' must be an integer constant expression} } */
+  s8 = svsra (s8, s8, one); /* { dg-error {argument 3 of 'svsra' must be an integer constant expression} } */
+  s8 = svsra (s8, s8, 0.4); /* { dg-error {passing 0 to argument 3 of 'svsra', which expects a value in the range \[1, 8\]} } */
+  s8 = svsra (s8, s8, 1.0);
+  s8 = svsra (s8, s8, 0); /* { dg-error {passing 0 to argument 3 of 'svsra', which expects a value in the range \[1, 8\]} } */
+  s8 = svsra (s8, s8, 1);
+  s8 = svsra (s8, s8, 1 + 1);
+  s8 = svsra (s8, s8, 8);
+  s8 = svsra (s8, s8, 9); /* { dg-error {passing 9 to argument 3 of 'svsra', which expects a value in the range \[1, 8\]} } */
+  s8 = svsra (s8, s8, (1ULL << 62) + 1); /* { dg-error {passing [^ ]* to argument 3 of 'svsra', which expects a value in the range \[1, 8\]} } */
+  s16 = svsra (s16, s16, 0); /* { dg-error {passing 0 to argument 3 of 'svsra', which expects a value in the range \[1, 16\]} } */
+  s16 = svsra (s16, s16, 1);
+  s16 = svsra (s16, s16, 16);
+  s16 = svsra (s16, s16, 17); /* { dg-error {passing 17 to argument 3 of 'svsra', which expects a value in the range \[1, 16\]} } */
+  s32 = svsra (s32, s32, 0); /* { dg-error {passing 0 to argument 3 of 'svsra', which expects a value in the range \[1, 32\]} } */
+  s32 = svsra (s32, s32, 1);
+  s32 = svsra (s32, s32, 32);
+  s32 = svsra (s32, s32, 33); /* { dg-error {passing 33 to argument 3 of 'svsra', which expects a value in the range \[1, 32\]} } */
+  s64 = svsra (s64, s64, 0); /* { dg-error {passing 0 to argument 3 of 'svsra', which expects a value in the range \[1, 64\]} } */
+  s64 = svsra (s64, s64, 1);
+  s64 = svsra (s64, s64, 64);
+  s64 = svsra (s64, s64, 65); /* { dg-error {passing 65 to argument 3 of 'svsra', which expects a value in the range \[1, 64\]} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_uint_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/ternary_uint_1.c
new file mode 100644 (file)
index 0000000..711b6a1
--- /dev/null
@@ -0,0 +1,51 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svuint8_t u8, svint8_t s8, svuint16_t u16, svint16_t s16,
+    svfloat16_t f16)
+{
+  svtbx (u8, u8); /* { dg-error {too few arguments to function 'svtbx'} } */
+  svtbx (u8, u8, u8, u8); /* { dg-error {too many arguments to function 'svtbx'} } */
+  svtbx (pg, pg, pg); /* { dg-error {passing 'svbool_t' to argument 3 of 'svtbx', which expects a vector of unsigned integers} } */
+  svtbx (pg, pg, u8); /* { dg-error {'svtbx' has no form that takes 'svbool_t' arguments} } */
+
+  svtbx (u8, 0, u8); /* { dg-error {passing 'int' to argument 2 of 'svtbx', which expects an SVE vector type} } */
+  svtbx (u8, u8, 0); /* { dg-error {passing 'int' to argument 3 of 'svtbx', which expects an SVE vector type} } */
+  svtbx (u8, s8, u8); /* { dg-error {passing 'svint8_t' to argument 2 of 'svtbx', but previous arguments had type 'svuint8_t'} } */
+  svtbx (u8, u8, u8);
+  svtbx (u8, u8, s8); /* { dg-error {passing 'svint8_t' to argument 3 of 'svtbx', which expects a vector of unsigned integers} } */
+  svtbx (u8, u8, u16); /* { dg-error {arguments 1 and 3 of 'svtbx' must have the same element size, but the values passed here have type 'svuint8_t' and 'svuint16_t' respectively} } */
+  svtbx (u8, u8, s16); /* { dg-error {passing 'svint16_t' to argument 3 of 'svtbx', which expects a vector of unsigned integers} } */
+  svtbx (u8, u8, pg); /* { dg-error {passing 'svbool_t' to argument 3 of 'svtbx', which expects a vector of unsigned integers} } */
+
+  svtbx (s8, u8, u8); /* { dg-error {passing 'svuint8_t' to argument 2 of 'svtbx', but previous arguments had type 'svint8_t'} } */
+  svtbx (s8, s8, u8);
+  svtbx (s8, s8, s8); /* { dg-error {passing 'svint8_t' to argument 3 of 'svtbx', which expects a vector of unsigned integers} } */
+  svtbx (s8, s8, u16); /* { dg-error {arguments 1 and 3 of 'svtbx' must have the same element size, but the values passed here have type 'svint8_t' and 'svuint16_t' respectively} } */
+  svtbx (s8, s8, s16); /* { dg-error {passing 'svint16_t' to argument 3 of 'svtbx', which expects a vector of unsigned integers} } */
+  svtbx (s8, s8, pg); /* { dg-error {passing 'svbool_t' to argument 3 of 'svtbx', which expects a vector of unsigned integers} } */
+
+  svtbx (u16, 0, u16); /* { dg-error {passing 'int' to argument 2 of 'svtbx', which expects an SVE vector type} } */
+  svtbx (u16, u16, u8); /* { dg-error {arguments 1 and 3 of 'svtbx' must have the same element size, but the values passed here have type 'svuint16_t' and 'svuint8_t' respectively} } */
+  svtbx (u16, u16, s8); /* { dg-error {passing 'svint8_t' to argument 3 of 'svtbx', which expects a vector of unsigned integers} } */
+  svtbx (u16, u16, u16);
+  svtbx (u16, u16, s16); /* { dg-error {passing 'svint16_t' to argument 3 of 'svtbx', which expects a vector of unsigned integers} } */
+  svtbx (u16, u16, f16); /* { dg-error {passing 'svfloat16_t' to argument 3 of 'svtbx', which expects a vector of unsigned integers} } */
+
+  svtbx (s16, u16, u16); /* { dg-error {passing 'svuint16_t' to argument 2 of 'svtbx', but previous arguments had type 'svint16_t'} } */
+  svtbx (s16, s16, u8); /* { dg-error {arguments 1 and 3 of 'svtbx' must have the same element size, but the values passed here have type 'svint16_t' and 'svuint8_t' respectively} } */
+  svtbx (s16, s16, s8); /* { dg-error {passing 'svint8_t' to argument 3 of 'svtbx', which expects a vector of unsigned integers} } */
+  svtbx (s16, s16, u16);
+  svtbx (s16, s16, s16); /* { dg-error {passing 'svint16_t' to argument 3 of 'svtbx', which expects a vector of unsigned integers} } */
+  svtbx (s16, s16, f16); /* { dg-error {passing 'svfloat16_t' to argument 3 of 'svtbx', which expects a vector of unsigned integers} } */
+
+  svtbx (f16, f16, u8); /* { dg-error {arguments 1 and 3 of 'svtbx' must have the same element size, but the values passed here have type 'svfloat16_t' and 'svuint8_t' respectively} } */
+  svtbx (f16, f16, s8); /* { dg-error {passing 'svint8_t' to argument 3 of 'svtbx', which expects a vector of unsigned integers} } */
+  svtbx (f16, f16, u16);
+  svtbx (f16, f16, s16); /* { dg-error {passing 'svint16_t' to argument 3 of 'svtbx', which expects a vector of unsigned integers} } */
+  svtbx (f16, f16, f16); /* { dg-error {passing 'svfloat16_t' to argument 3 of 'svtbx', which expects a vector of unsigned integers} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/unary_convert_narrowt_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/unary_convert_narrowt_1.c
new file mode 100644 (file)
index 0000000..92c07b8
--- /dev/null
@@ -0,0 +1,30 @@
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+test (svbool_t pg, svint8_t s8, svuint8_t u8,
+      svint16_t s16, svuint16_t u16, svint32_t s32, svuint32_t u32,
+      svint64_t s64, svuint64_t u64, svfloat16_t f16, svfloat32_t f32,
+      svfloat64_t f64)
+{
+  svcvtnt_f32_m (f32, pg); /* { dg-error {too few arguments to function 'svcvtnt_f32_m'} } */
+  svcvtnt_f32_m (f32, pg, f64, 0); /* { dg-error {too many arguments to function 'svcvtnt_f32_m'} } */
+  svcvtnt_f32_m (f16, pg, f64); /* { dg-error {passing 'svfloat16_t' to argument 1 of 'svcvtnt_f32_m', which expects 'svfloat32_t'} } */
+  svcvtnt_f32_m (0, pg, f64); /* { dg-error {passing 'int' to argument 1 of 'svcvtnt_f32_m', which expects 'svfloat32_t'} } */
+  svcvtnt_f32_m (pg, pg, f64); /* { dg-error {passing 'svbool_t' to argument 1 of 'svcvtnt_f32_m', which expects 'svfloat32_t'} } */
+  svcvtnt_f32_m (f32, s32, f64); /* { dg-error {passing 'svint32_t' to argument 2 of 'svcvtnt_f32_m', which expects 'svbool_t'} } */
+  svcvtnt_f32_m (f32, pg, 0); /* { dg-error {passing 'int' to argument 3 of 'svcvtnt_f32_m', which expects an SVE vector type} } */
+
+  svcvtnt_f32_m (f32, pg, s8); /* { dg-error {'svcvtnt_f32_m' has no form that takes 'svint8_t' arguments} } */
+  svcvtnt_f32_m (f32, pg, s16); /* { dg-error {'svcvtnt_f32_m' has no form that takes 'svint16_t' arguments} } */
+  svcvtnt_f32_m (f32, pg, s32); /* { dg-error {'svcvtnt_f32_m' has no form that takes 'svint32_t' arguments} } */
+  svcvtnt_f32_m (f32, pg, s64); /* { dg-error {'svcvtnt_f32_m' has no form that takes 'svint64_t' arguments} } */
+  svcvtnt_f32_m (f32, pg, u8); /* { dg-error {'svcvtnt_f32_m' has no form that takes 'svuint8_t' arguments} } */
+  svcvtnt_f32_m (f32, pg, u16); /* { dg-error {'svcvtnt_f32_m' has no form that takes 'svuint16_t' arguments} } */
+  svcvtnt_f32_m (f32, pg, u32); /* { dg-error {'svcvtnt_f32_m' has no form that takes 'svuint32_t' arguments} } */
+  svcvtnt_f32_m (f32, pg, u64); /* { dg-error {'svcvtnt_f32_m' has no form that takes 'svuint64_t' arguments} } */
+  svcvtnt_f32_m (f32, pg, f16); /* { dg-error {'svcvtnt_f32_m' has no form that takes 'svfloat16_t' arguments} } */
+  svcvtnt_f32_m (f32, pg, f32); /* { dg-error {'svcvtnt_f32_m' has no form that takes 'svfloat32_t' arguments} } */
+  svcvtnt_f32_m (f32, pg, f64);
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/unary_narrowb_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/unary_narrowb_1.c
new file mode 100644 (file)
index 0000000..c03d644
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8,
+    svint16_t s16, svuint16_t u16,
+    svint32_t s32, svuint32_t u32,
+    svint64_t s64, svuint64_t u64,
+    svfloat32_t f32)
+{
+  svqxtnb (); /* { dg-error {too few arguments to function 'svqxtnb'} } */
+  svqxtnb (u16, u16); /* { dg-error {too many arguments to function 'svqxtnb'} } */
+  svqxtnb (pg); /* { dg-error {'svqxtnb' has no form that takes 'svbool_t' arguments} } */
+  svqxtnb (u8); /* { dg-error {'svqxtnb' has no form that takes 'svuint8_t' arguments} } */
+  svqxtnb (s8); /* { dg-error {'svqxtnb' has no form that takes 'svint8_t' arguments} } */
+  svqxtnb (u16);
+  svqxtnb (s16);
+  svqxtnb (u32);
+  svqxtnb (s32);
+  svqxtnb (u64);
+  svqxtnb (s64);
+  svqxtnb (f32); /* { dg-error {'svqxtnb' has no form that takes 'svfloat32_t' arguments} } */
+  svqxtnb (1); /* { dg-error {passing 'int' to argument 1 of 'svqxtnb', which expects an SVE vector type} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/unary_narrowb_to_uint_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/unary_narrowb_to_uint_1.c
new file mode 100644 (file)
index 0000000..c3e2103
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8,
+    svint16_t s16, svuint16_t u16,
+    svint32_t s32, svuint32_t u32,
+    svint64_t s64, svuint64_t u64,
+    svfloat32_t f32)
+{
+  svqxtunb (); /* { dg-error {too few arguments to function 'svqxtunb'} } */
+  svqxtunb (u16, u16); /* { dg-error {too many arguments to function 'svqxtunb'} } */
+  svqxtunb (pg); /* { dg-error {'svqxtunb' has no form that takes 'svbool_t' arguments} } */
+  svqxtunb (u8); /* { dg-error {'svqxtunb' has no form that takes 'svuint8_t' arguments} } */
+  svqxtunb (s8); /* { dg-error {'svqxtunb' has no form that takes 'svint8_t' arguments} } */
+  svqxtunb (u16); /* { dg-error {'svqxtunb' has no form that takes 'svuint16_t' arguments} } */
+  svqxtunb (s16);
+  svqxtunb (u32); /* { dg-error {'svqxtunb' has no form that takes 'svuint32_t' arguments} } */
+  svqxtunb (s32);
+  svqxtunb (u64); /* { dg-error {'svqxtunb' has no form that takes 'svuint64_t' arguments} } */
+  svqxtunb (s64);
+  svqxtunb (f32); /* { dg-error {'svqxtunb' has no form that takes 'svfloat32_t' arguments} } */
+  svqxtunb (1); /* { dg-error {passing 'int' to argument 1 of 'svqxtunb', which expects an SVE vector type} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/unary_narrowt_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/unary_narrowt_1.c
new file mode 100644 (file)
index 0000000..4ed179c
--- /dev/null
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8,
+    svint16_t s16, svuint16_t u16,
+    svint32_t s32, svuint32_t u32,
+    svint64_t s64, svuint64_t u64,
+    svfloat16_t f16, svfloat32_t f32)
+{
+  svqxtnt (u32); /* { dg-error {too few arguments to function 'svqxtnt'} } */
+  svqxtnt (u32, u16, u16); /* { dg-error {too many arguments to function 'svqxtnt'} } */
+  svqxtnt (pg, pg); /* { dg-error {'svqxtnt' has no form that takes 'svbool_t' arguments} } */
+  svqxtnt (u8, u8); /* { dg-error {'svqxtnt' has no form that takes 'svuint8_t' arguments} } */
+  svqxtnt (s8, s8); /* { dg-error {'svqxtnt' has no form that takes 'svint8_t' arguments} } */
+  svqxtnt (u16, u16); /* { dg-error {passing 'svuint16_t' instead of the expected 'svuint8_t' to argument 1 of 'svqxtnt', after passing 'svuint16_t' to argument 2} } */
+  svqxtnt (s8, u16); /* { dg-error {arguments 1 and 2 of 'svqxtnt' must have the same signedness, but the values passed here have type 'svint8_t' and 'svuint16_t' respectively} } */
+  svqxtnt (pg, u16); /* { dg-error {passing 'svbool_t' instead of the expected 'svuint8_t' to argument 1 of 'svqxtnt', after passing 'svuint16_t' to argument 2} } */
+  svqxtnt (u8, u16);
+  svqxtnt (s8, s16);
+  svqxtnt (u16, u32);
+  svqxtnt (s16, s32);
+  svqxtnt (u32, u64);
+  svqxtnt (s32, s64);
+  svqxtnt (f16, f32); /* { dg-error {'svqxtnt' has no form that takes 'svfloat32_t' arguments} } */
+  svqxtnt (1, u16); /* { dg-error {passing 'int' to argument 1 of 'svqxtnt', which expects an SVE vector type} } */
+  svqxtnt (u8, 1); /* { dg-error {passing 'int' to argument 2 of 'svqxtnt', which expects an SVE vector type} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/unary_narrowt_to_uint_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/unary_narrowt_to_uint_1.c
new file mode 100644 (file)
index 0000000..acaa546
--- /dev/null
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint8_t s8, svuint8_t u8,
+    svint16_t s16, svuint16_t u16,
+    svint32_t s32, svuint32_t u32,
+    svint64_t s64, svuint64_t u64,
+    svfloat16_t f16, svfloat32_t f32)
+{
+  svqxtunt (u32); /* { dg-error {too few arguments to function 'svqxtunt'} } */
+  svqxtunt (u32, s16, s16); /* { dg-error {too many arguments to function 'svqxtunt'} } */
+  svqxtunt (u8, pg); /* { dg-error {'svqxtunt' has no form that takes 'svbool_t' arguments} } */
+  svqxtunt (u8, u8); /* { dg-error {'svqxtunt' has no form that takes 'svuint8_t' arguments} } */
+  svqxtunt (u8, s8); /* { dg-error {'svqxtunt' has no form that takes 'svint8_t' arguments} } */
+  svqxtunt (u16, s16); /* { dg-error {passing 'svuint16_t' instead of the expected 'svuint8_t' to argument 1 of 'svqxtunt', after passing 'svint16_t' to argument 2} } */
+  svqxtunt (s8, s16); /* { dg-error {passing 'svint8_t' to argument 1 of 'svqxtunt', which expects a vector of unsigned integers} } */
+  svqxtunt (pg, s16); /* { dg-error {passing 'svbool_t' to argument 1 of 'svqxtunt', which expects a vector of unsigned integers} } */
+  svqxtunt (u8, u16); /* { dg-error {'svqxtunt' has no form that takes 'svuint16_t' arguments} } */
+  svqxtunt (u8, s16);
+  svqxtunt (u16, u32); /* { dg-error {'svqxtunt' has no form that takes 'svuint32_t' arguments} } */
+  svqxtunt (u16, s32);
+  svqxtunt (u32, u64); /* { dg-error {'svqxtunt' has no form that takes 'svuint64_t' arguments} } */
+  svqxtunt (u32, s64);
+  svqxtunt (u16, f32); /* { dg-error {'svqxtunt' has no form that takes 'svfloat32_t' arguments} } */
+  svqxtunt (1, u16); /* { dg-error {passing 'int' to argument 1 of 'svqxtunt', which expects an SVE vector type} } */
+  svqxtunt (u8, 1); /* { dg-error {passing 'int' to argument 2 of 'svqxtunt', which expects an SVE vector type} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/unary_to_int_1.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/general-c/unary_to_int_1.c
new file mode 100644 (file)
index 0000000..517d11f
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+
+#include <arm_sve.h>
+
+#pragma GCC target ("arch=armv8.2-a+sve2")
+
+void
+f1 (svbool_t pg, svint32_t s32, svuint32_t u32, svfloat32_t f32,
+    svint64_t s64, svuint64_t u64, svfloat64_t f64)
+{
+  svlogb_m (s32, pg); /* { dg-error {too few arguments to function 'svlogb_m'} } */
+  svlogb_m (s32, pg, f32, s32); /* { dg-error {too many arguments to function 'svlogb_m'} } */
+  svlogb_m (0, pg, f32); /* { dg-error {passing 'int' to argument 1 of 'svlogb_m', which expects an SVE vector type} } */
+  svlogb_m (s32, u32, f32); /* { dg-error {passing 'svuint32_t' to argument 2 of 'svlogb_m', which expects 'svbool_t'} } */
+  svlogb_m (s32, 0, f32); /* { dg-error {passing 'int' to argument 2 of 'svlogb_m', which expects 'svbool_t'} } */
+  svlogb_m (s32, pg, s32); /* { dg-error {'svlogb_m' has no form that takes 'svint32_t' arguments} } */
+  svlogb_m (s32, pg, u32); /* { dg-error {'svlogb_m' has no form that takes 'svuint32_t' arguments} } */
+  svlogb_m (s32, pg, f32);
+  svlogb_m (s32, pg, pg); /* { dg-error {'svlogb_m' has no form that takes 'svbool_t' arguments} } */
+
+  svlogb_m (pg, pg, f32); /* { dg-error {passing 'svbool_t' to argument 1 of 'svlogb_m', which expects a vector of signed integers} } */
+  svlogb_m (u32, pg, f32); /* { dg-error {passing 'svuint32_t' to argument 1 of 'svlogb_m', which expects a vector of signed integers} } */
+  svlogb_m (f32, pg, f32); /* { dg-error {passing 'svfloat32_t' to argument 1 of 'svlogb_m', which expects a vector of signed integers} } */
+  svlogb_m (u64, pg, f32); /* { dg-error {passing 'svuint64_t' to argument 1 of 'svlogb_m', which expects a vector of signed integers} } */
+  svlogb_m (s64, pg, f32); /* { dg-error {arguments 1 and 3 of 'svlogb_m' must have the same element size, but the values passed here have type 'svint64_t' and 'svfloat32_t' respectively} } */
+  svlogb_m (s32, pg, f64); /* { dg-error {arguments 1 and 3 of 'svlogb_m' must have the same element size, but the values passed here have type 'svint32_t' and 'svfloat64_t' respectively} } */
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/aarch64-sve2-acle-asm.exp b/gcc/testsuite/gcc.target/aarch64/sve2/acle/aarch64-sve2-acle-asm.exp
new file mode 100644 (file)
index 0000000..b3189fe
--- /dev/null
@@ -0,0 +1,81 @@
+#  Assembly-based regression-test driver for the SVE ACLE
+#  Copyright (C) 2009-2020 Free Software Foundation, Inc.
+#
+#  This file is part of GCC.
+#
+#  GCC is free software; you can redistribute it and/or modify it
+#  under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 3, or (at your option)
+#  any later version.
+#
+#  GCC is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with GCC; see the file COPYING3.  If not see
+#  <http://www.gnu.org/licenses/>.  */
+
+# GCC testsuite that uses the `dg.exp' driver.
+
+# Exit immediately if this isn't an AArch64 target.
+if {![istarget aarch64*-*-*] } {
+    return
+}
+
+# Load support procs.
+load_lib gcc-dg.exp
+
+# Initialize `dg'.
+dg-init
+
+# Force SVE if we're not testing it already.
+if { [check_effective_target_aarch64_sve2] } {
+    set sve2_flags ""
+} else {
+    set sve2_flags "-march=armv8.5-a+sve2"
+}
+
+lappend extra_flags "-fno-ipa-icf"
+
+global gcc_runtest_parallelize_limit_minor
+if { [info exists gcc_runtest_parallelize_limit_minor] } {
+    set old_limit_minor $gcc_runtest_parallelize_limit_minor
+    set gcc_runtest_parallelize_limit_minor 1
+}
+
+torture-init
+set-torture-options {
+    "-std=c90 -O0 -g"
+    "-std=c90 -O1 -g"
+    "-std=c99 -O2 -g"
+    "-std=c11 -O3 -g"
+    "-std=gnu90 -O2 -fno-schedule-insns -DCHECK_ASM --save-temps"
+    "-std=gnu99 -Ofast -g"
+    "-std=gnu11 -Os -g"
+} {
+    "-DTEST_FULL"
+    "-DTEST_OVERLOADS"
+}
+
+# Main loop.
+set files [glob -nocomplain $srcdir/$subdir/asm/*.c]
+set save-dg-do-what-default ${dg-do-what-default}
+if { [check_effective_target_aarch64_asm_sve_ok]
+     && [check_effective_target_aarch64_variant_pcs] } {
+    set dg-do-what-default assemble
+} else {
+    set dg-do-what-default compile
+}
+gcc-dg-runtest [lsort $files] "" "$sve2_flags $extra_flags"
+set dg-do-what-default ${save-dg-do-what-default}
+
+torture-finish
+
+if { [info exists gcc_runtest_parallelize_limit_minor] } {
+    set gcc_runtest_parallelize_limit_minor $old_limit_minor
+}
+
+# All done.
+dg-finish
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/aarch64-sve2-acle.exp b/gcc/testsuite/gcc.target/aarch64/sve2/acle/aarch64-sve2-acle.exp
new file mode 100644 (file)
index 0000000..0fbaae5
--- /dev/null
@@ -0,0 +1,52 @@
+#  Specific regression driver for AArch64 SVE.
+#  Copyright (C) 2009-2020 Free Software Foundation, Inc.
+#  Contributed by ARM Ltd.
+#
+#  This file is part of GCC.
+#
+#  GCC is free software; you can redistribute it and/or modify it
+#  under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 3, or (at your option)
+#  any later version.
+#
+#  GCC is distributed in the hope that it will be useful, but
+#  WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with GCC; see the file COPYING3.  If not see
+#  <http://www.gnu.org/licenses/>.  */
+
+# GCC testsuite that uses the `dg.exp' driver.
+
+# Exit immediately if this isn't an AArch64 target.
+if {![istarget aarch64*-*-*] } {
+    return
+}
+
+# Load support procs.
+load_lib gcc-dg.exp
+
+# If a testcase doesn't have special options, use these.
+global DEFAULT_CFLAGS
+if ![info exists DEFAULT_CFLAGS] then {
+    set DEFAULT_CFLAGS " -ansi -pedantic-errors"
+}
+
+# Initialize `dg'.
+dg-init
+
+# Force SVE if we're not testing it already.
+if { [check_effective_target_aarch64_sve2] } {
+    set sve2_flags ""
+} else {
+    set sve2_flags "-march=armv8.5-a+sve2"
+}
+
+# Main loop.
+set files [glob -nocomplain "$srcdir/$subdir/general/*.c"]
+dg-runtest [lsort $files] "$sve2_flags" $DEFAULT_CFLAGS
+
+# All done.
+dg-finish
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_s16.c
new file mode 100644 (file)
index 0000000..ee18ec8
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** aba_s16_tied1:
+**     saba    z0\.h, z1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (aba_s16_tied1, svint16_t,
+               z0 = svaba_s16 (z0, z1, z2),
+               z0 = svaba (z0, z1, z2))
+
+/*
+** aba_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     saba    z0\.h, \1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (aba_s16_tied2, svint16_t,
+               z0 = svaba_s16 (z1, z0, z2),
+               z0 = svaba (z1, z0, z2))
+
+/*
+** aba_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     saba    z0\.h, z2\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (aba_s16_tied3, svint16_t,
+               z0 = svaba_s16 (z1, z2, z0),
+               z0 = svaba (z1, z2, z0))
+
+/*
+** aba_s16_untied:
+**     movprfx z0, z1
+**     saba    z0\.h, z2\.h, z3\.h
+**     ret
+*/
+TEST_UNIFORM_Z (aba_s16_untied, svint16_t,
+               z0 = svaba_s16 (z1, z2, z3),
+               z0 = svaba (z1, z2, z3))
+
+/*
+** aba_w0_s16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     saba    z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_w0_s16_tied1, svint16_t, int16_t,
+                z0 = svaba_n_s16 (z0, z1, x0),
+                z0 = svaba (z0, z1, x0))
+
+/*
+** aba_w0_s16_tied2:
+**     mov     (z[0-9]+\.h), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     saba    z0\.h, \2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_w0_s16_tied2, svint16_t, int16_t,
+                z0 = svaba_n_s16 (z1, z0, x0),
+                z0 = svaba (z1, z0, x0))
+
+/*
+** aba_w0_s16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     saba    z0\.h, z2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_w0_s16_untied, svint16_t, int16_t,
+                z0 = svaba_n_s16 (z1, z2, x0),
+                z0 = svaba (z1, z2, x0))
+
+/*
+** aba_11_s16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     saba    z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_s16_tied1, svint16_t,
+               z0 = svaba_n_s16 (z0, z1, 11),
+               z0 = svaba (z0, z1, 11))
+
+/*
+** aba_11_s16_tied2:
+**     mov     (z[0-9]+\.h), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     saba    z0\.h, \2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_s16_tied2, svint16_t,
+               z0 = svaba_n_s16 (z1, z0, 11),
+               z0 = svaba (z1, z0, 11))
+
+/*
+** aba_11_s16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     saba    z0\.h, z2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_s16_untied, svint16_t,
+               z0 = svaba_n_s16 (z1, z2, 11),
+               z0 = svaba (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_s32.c
new file mode 100644 (file)
index 0000000..73c0028
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** aba_s32_tied1:
+**     saba    z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (aba_s32_tied1, svint32_t,
+               z0 = svaba_s32 (z0, z1, z2),
+               z0 = svaba (z0, z1, z2))
+
+/*
+** aba_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     saba    z0\.s, \1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (aba_s32_tied2, svint32_t,
+               z0 = svaba_s32 (z1, z0, z2),
+               z0 = svaba (z1, z0, z2))
+
+/*
+** aba_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     saba    z0\.s, z2\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (aba_s32_tied3, svint32_t,
+               z0 = svaba_s32 (z1, z2, z0),
+               z0 = svaba (z1, z2, z0))
+
+/*
+** aba_s32_untied:
+**     movprfx z0, z1
+**     saba    z0\.s, z2\.s, z3\.s
+**     ret
+*/
+TEST_UNIFORM_Z (aba_s32_untied, svint32_t,
+               z0 = svaba_s32 (z1, z2, z3),
+               z0 = svaba (z1, z2, z3))
+
+/*
+** aba_w0_s32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     saba    z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_w0_s32_tied1, svint32_t, int32_t,
+                z0 = svaba_n_s32 (z0, z1, x0),
+                z0 = svaba (z0, z1, x0))
+
+/*
+** aba_w0_s32_tied2:
+**     mov     (z[0-9]+\.s), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     saba    z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_w0_s32_tied2, svint32_t, int32_t,
+                z0 = svaba_n_s32 (z1, z0, x0),
+                z0 = svaba (z1, z0, x0))
+
+/*
+** aba_w0_s32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     saba    z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_w0_s32_untied, svint32_t, int32_t,
+                z0 = svaba_n_s32 (z1, z2, x0),
+                z0 = svaba (z1, z2, x0))
+
+/*
+** aba_11_s32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     saba    z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_s32_tied1, svint32_t,
+               z0 = svaba_n_s32 (z0, z1, 11),
+               z0 = svaba (z0, z1, 11))
+
+/*
+** aba_11_s32_tied2:
+**     mov     (z[0-9]+\.s), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     saba    z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_s32_tied2, svint32_t,
+               z0 = svaba_n_s32 (z1, z0, 11),
+               z0 = svaba (z1, z0, 11))
+
+/*
+** aba_11_s32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     saba    z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_s32_untied, svint32_t,
+               z0 = svaba_n_s32 (z1, z2, 11),
+               z0 = svaba (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_s64.c
new file mode 100644 (file)
index 0000000..0c169db
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** aba_s64_tied1:
+**     saba    z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (aba_s64_tied1, svint64_t,
+               z0 = svaba_s64 (z0, z1, z2),
+               z0 = svaba (z0, z1, z2))
+
+/*
+** aba_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     saba    z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (aba_s64_tied2, svint64_t,
+               z0 = svaba_s64 (z1, z0, z2),
+               z0 = svaba (z1, z0, z2))
+
+/*
+** aba_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     saba    z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_s64_tied3, svint64_t,
+               z0 = svaba_s64 (z1, z2, z0),
+               z0 = svaba (z1, z2, z0))
+
+/*
+** aba_s64_untied:
+**     movprfx z0, z1
+**     saba    z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (aba_s64_untied, svint64_t,
+               z0 = svaba_s64 (z1, z2, z3),
+               z0 = svaba (z1, z2, z3))
+
+/*
+** aba_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     saba    z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_x0_s64_tied1, svint64_t, int64_t,
+                z0 = svaba_n_s64 (z0, z1, x0),
+                z0 = svaba (z0, z1, x0))
+
+/*
+** aba_x0_s64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     saba    z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_x0_s64_tied2, svint64_t, int64_t,
+                z0 = svaba_n_s64 (z1, z0, x0),
+                z0 = svaba (z1, z0, x0))
+
+/*
+** aba_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     saba    z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_x0_s64_untied, svint64_t, int64_t,
+                z0 = svaba_n_s64 (z1, z2, x0),
+                z0 = svaba (z1, z2, x0))
+
+/*
+** aba_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     saba    z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_s64_tied1, svint64_t,
+               z0 = svaba_n_s64 (z0, z1, 11),
+               z0 = svaba (z0, z1, 11))
+
+/*
+** aba_11_s64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     saba    z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_s64_tied2, svint64_t,
+               z0 = svaba_n_s64 (z1, z0, 11),
+               z0 = svaba (z1, z0, 11))
+
+/*
+** aba_11_s64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     saba    z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_s64_untied, svint64_t,
+               z0 = svaba_n_s64 (z1, z2, 11),
+               z0 = svaba (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_s8.c
new file mode 100644 (file)
index 0000000..8e442d7
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** aba_s8_tied1:
+**     saba    z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (aba_s8_tied1, svint8_t,
+               z0 = svaba_s8 (z0, z1, z2),
+               z0 = svaba (z0, z1, z2))
+
+/*
+** aba_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     saba    z0\.b, \1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (aba_s8_tied2, svint8_t,
+               z0 = svaba_s8 (z1, z0, z2),
+               z0 = svaba (z1, z0, z2))
+
+/*
+** aba_s8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     saba    z0\.b, z2\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (aba_s8_tied3, svint8_t,
+               z0 = svaba_s8 (z1, z2, z0),
+               z0 = svaba (z1, z2, z0))
+
+/*
+** aba_s8_untied:
+**     movprfx z0, z1
+**     saba    z0\.b, z2\.b, z3\.b
+**     ret
+*/
+TEST_UNIFORM_Z (aba_s8_untied, svint8_t,
+               z0 = svaba_s8 (z1, z2, z3),
+               z0 = svaba (z1, z2, z3))
+
+/*
+** aba_w0_s8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     saba    z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_w0_s8_tied1, svint8_t, int8_t,
+                z0 = svaba_n_s8 (z0, z1, x0),
+                z0 = svaba (z0, z1, x0))
+
+/*
+** aba_w0_s8_tied2:
+**     mov     (z[0-9]+\.b), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     saba    z0\.b, \2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_w0_s8_tied2, svint8_t, int8_t,
+                z0 = svaba_n_s8 (z1, z0, x0),
+                z0 = svaba (z1, z0, x0))
+
+/*
+** aba_w0_s8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     saba    z0\.b, z2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_w0_s8_untied, svint8_t, int8_t,
+                z0 = svaba_n_s8 (z1, z2, x0),
+                z0 = svaba (z1, z2, x0))
+
+/*
+** aba_11_s8_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     saba    z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_s8_tied1, svint8_t,
+               z0 = svaba_n_s8 (z0, z1, 11),
+               z0 = svaba (z0, z1, 11))
+
+/*
+** aba_11_s8_tied2:
+**     mov     (z[0-9]+\.b), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     saba    z0\.b, \2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_s8_tied2, svint8_t,
+               z0 = svaba_n_s8 (z1, z0, 11),
+               z0 = svaba (z1, z0, 11))
+
+/*
+** aba_11_s8_untied:
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     saba    z0\.b, z2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_s8_untied, svint8_t,
+               z0 = svaba_n_s8 (z1, z2, 11),
+               z0 = svaba (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_u16.c
new file mode 100644 (file)
index 0000000..7198001
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** aba_u16_tied1:
+**     uaba    z0\.h, z1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (aba_u16_tied1, svuint16_t,
+               z0 = svaba_u16 (z0, z1, z2),
+               z0 = svaba (z0, z1, z2))
+
+/*
+** aba_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uaba    z0\.h, \1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (aba_u16_tied2, svuint16_t,
+               z0 = svaba_u16 (z1, z0, z2),
+               z0 = svaba (z1, z0, z2))
+
+/*
+** aba_u16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uaba    z0\.h, z2\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (aba_u16_tied3, svuint16_t,
+               z0 = svaba_u16 (z1, z2, z0),
+               z0 = svaba (z1, z2, z0))
+
+/*
+** aba_u16_untied:
+**     movprfx z0, z1
+**     uaba    z0\.h, z2\.h, z3\.h
+**     ret
+*/
+TEST_UNIFORM_Z (aba_u16_untied, svuint16_t,
+               z0 = svaba_u16 (z1, z2, z3),
+               z0 = svaba (z1, z2, z3))
+
+/*
+** aba_w0_u16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uaba    z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_w0_u16_tied1, svuint16_t, uint16_t,
+                z0 = svaba_n_u16 (z0, z1, x0),
+                z0 = svaba (z0, z1, x0))
+
+/*
+** aba_w0_u16_tied2:
+**     mov     (z[0-9]+\.h), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uaba    z0\.h, \2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_w0_u16_tied2, svuint16_t, uint16_t,
+                z0 = svaba_n_u16 (z1, z0, x0),
+                z0 = svaba (z1, z0, x0))
+
+/*
+** aba_w0_u16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     uaba    z0\.h, z2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_w0_u16_untied, svuint16_t, uint16_t,
+                z0 = svaba_n_u16 (z1, z2, x0),
+                z0 = svaba (z1, z2, x0))
+
+/*
+** aba_11_u16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     uaba    z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_u16_tied1, svuint16_t,
+               z0 = svaba_n_u16 (z0, z1, 11),
+               z0 = svaba (z0, z1, 11))
+
+/*
+** aba_11_u16_tied2:
+**     mov     (z[0-9]+\.h), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uaba    z0\.h, \2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_u16_tied2, svuint16_t,
+               z0 = svaba_n_u16 (z1, z0, 11),
+               z0 = svaba (z1, z0, 11))
+
+/*
+** aba_11_u16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     uaba    z0\.h, z2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_u16_untied, svuint16_t,
+               z0 = svaba_n_u16 (z1, z2, 11),
+               z0 = svaba (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_u32.c
new file mode 100644 (file)
index 0000000..2ba8f41
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** aba_u32_tied1:
+**     uaba    z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (aba_u32_tied1, svuint32_t,
+               z0 = svaba_u32 (z0, z1, z2),
+               z0 = svaba (z0, z1, z2))
+
+/*
+** aba_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uaba    z0\.s, \1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (aba_u32_tied2, svuint32_t,
+               z0 = svaba_u32 (z1, z0, z2),
+               z0 = svaba (z1, z0, z2))
+
+/*
+** aba_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uaba    z0\.s, z2\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (aba_u32_tied3, svuint32_t,
+               z0 = svaba_u32 (z1, z2, z0),
+               z0 = svaba (z1, z2, z0))
+
+/*
+** aba_u32_untied:
+**     movprfx z0, z1
+**     uaba    z0\.s, z2\.s, z3\.s
+**     ret
+*/
+TEST_UNIFORM_Z (aba_u32_untied, svuint32_t,
+               z0 = svaba_u32 (z1, z2, z3),
+               z0 = svaba (z1, z2, z3))
+
+/*
+** aba_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uaba    z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = svaba_n_u32 (z0, z1, x0),
+                z0 = svaba (z0, z1, x0))
+
+/*
+** aba_w0_u32_tied2:
+**     mov     (z[0-9]+\.s), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uaba    z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_w0_u32_tied2, svuint32_t, uint32_t,
+                z0 = svaba_n_u32 (z1, z0, x0),
+                z0 = svaba (z1, z0, x0))
+
+/*
+** aba_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     uaba    z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = svaba_n_u32 (z1, z2, x0),
+                z0 = svaba (z1, z2, x0))
+
+/*
+** aba_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     uaba    z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_u32_tied1, svuint32_t,
+               z0 = svaba_n_u32 (z0, z1, 11),
+               z0 = svaba (z0, z1, 11))
+
+/*
+** aba_11_u32_tied2:
+**     mov     (z[0-9]+\.s), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uaba    z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_u32_tied2, svuint32_t,
+               z0 = svaba_n_u32 (z1, z0, 11),
+               z0 = svaba (z1, z0, 11))
+
+/*
+** aba_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     uaba    z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_u32_untied, svuint32_t,
+               z0 = svaba_n_u32 (z1, z2, 11),
+               z0 = svaba (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_u64.c
new file mode 100644 (file)
index 0000000..8c6bef0
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** aba_u64_tied1:
+**     uaba    z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (aba_u64_tied1, svuint64_t,
+               z0 = svaba_u64 (z0, z1, z2),
+               z0 = svaba (z0, z1, z2))
+
+/*
+** aba_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     uaba    z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (aba_u64_tied2, svuint64_t,
+               z0 = svaba_u64 (z1, z0, z2),
+               z0 = svaba (z1, z0, z2))
+
+/*
+** aba_u64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     uaba    z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_u64_tied3, svuint64_t,
+               z0 = svaba_u64 (z1, z2, z0),
+               z0 = svaba (z1, z2, z0))
+
+/*
+** aba_u64_untied:
+**     movprfx z0, z1
+**     uaba    z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (aba_u64_untied, svuint64_t,
+               z0 = svaba_u64 (z1, z2, z3),
+               z0 = svaba (z1, z2, z3))
+
+/*
+** aba_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     uaba    z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = svaba_n_u64 (z0, z1, x0),
+                z0 = svaba (z0, z1, x0))
+
+/*
+** aba_x0_u64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     uaba    z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_x0_u64_tied2, svuint64_t, uint64_t,
+                z0 = svaba_n_u64 (z1, z0, x0),
+                z0 = svaba (z1, z0, x0))
+
+/*
+** aba_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     uaba    z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = svaba_n_u64 (z1, z2, x0),
+                z0 = svaba (z1, z2, x0))
+
+/*
+** aba_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     uaba    z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_u64_tied1, svuint64_t,
+               z0 = svaba_n_u64 (z0, z1, 11),
+               z0 = svaba (z0, z1, 11))
+
+/*
+** aba_11_u64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     uaba    z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_u64_tied2, svuint64_t,
+               z0 = svaba_n_u64 (z1, z0, 11),
+               z0 = svaba (z1, z0, 11))
+
+/*
+** aba_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     uaba    z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_u64_untied, svuint64_t,
+               z0 = svaba_n_u64 (z1, z2, 11),
+               z0 = svaba (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aba_u8.c
new file mode 100644 (file)
index 0000000..2c3e879
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** aba_u8_tied1:
+**     uaba    z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (aba_u8_tied1, svuint8_t,
+               z0 = svaba_u8 (z0, z1, z2),
+               z0 = svaba (z0, z1, z2))
+
+/*
+** aba_u8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uaba    z0\.b, \1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (aba_u8_tied2, svuint8_t,
+               z0 = svaba_u8 (z1, z0, z2),
+               z0 = svaba (z1, z0, z2))
+
+/*
+** aba_u8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uaba    z0\.b, z2\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (aba_u8_tied3, svuint8_t,
+               z0 = svaba_u8 (z1, z2, z0),
+               z0 = svaba (z1, z2, z0))
+
+/*
+** aba_u8_untied:
+**     movprfx z0, z1
+**     uaba    z0\.b, z2\.b, z3\.b
+**     ret
+*/
+TEST_UNIFORM_Z (aba_u8_untied, svuint8_t,
+               z0 = svaba_u8 (z1, z2, z3),
+               z0 = svaba (z1, z2, z3))
+
+/*
+** aba_w0_u8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uaba    z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_w0_u8_tied1, svuint8_t, uint8_t,
+                z0 = svaba_n_u8 (z0, z1, x0),
+                z0 = svaba (z0, z1, x0))
+
+/*
+** aba_w0_u8_tied2:
+**     mov     (z[0-9]+\.b), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uaba    z0\.b, \2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_w0_u8_tied2, svuint8_t, uint8_t,
+                z0 = svaba_n_u8 (z1, z0, x0),
+                z0 = svaba (z1, z0, x0))
+
+/*
+** aba_w0_u8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     uaba    z0\.b, z2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (aba_w0_u8_untied, svuint8_t, uint8_t,
+                z0 = svaba_n_u8 (z1, z2, x0),
+                z0 = svaba (z1, z2, x0))
+
+/*
+** aba_11_u8_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     uaba    z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_u8_tied1, svuint8_t,
+               z0 = svaba_n_u8 (z0, z1, 11),
+               z0 = svaba (z0, z1, 11))
+
+/*
+** aba_11_u8_tied2:
+**     mov     (z[0-9]+\.b), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uaba    z0\.b, \2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_u8_tied2, svuint8_t,
+               z0 = svaba_n_u8 (z1, z0, 11),
+               z0 = svaba (z1, z0, 11))
+
+/*
+** aba_11_u8_untied:
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     uaba    z0\.b, z2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (aba_11_u8_untied, svuint8_t,
+               z0 = svaba_n_u8 (z1, z2, 11),
+               z0 = svaba (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalb_s16.c
new file mode 100644 (file)
index 0000000..39668e6
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abalb_s16_tied1:
+**     sabalb  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (abalb_s16_tied1, svint16_t, svint8_t,
+            z0 = svabalb_s16 (z0, z4, z5),
+            z0 = svabalb (z0, z4, z5))
+
+/*
+** abalb_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sabalb  z0\.h, \1\.b, z1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (abalb_s16_tied2, svint16_t, svint8_t,
+                z0_res = svabalb_s16 (z4, z0, z1),
+                z0_res = svabalb (z4, z0, z1))
+
+/*
+** abalb_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sabalb  z0\.h, z1\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (abalb_s16_tied3, svint16_t, svint8_t,
+                z0_res = svabalb_s16 (z4, z1, z0),
+                z0_res = svabalb (z4, z1, z0))
+
+/*
+** abalb_s16_untied:
+**     movprfx z0, z1
+**     sabalb  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (abalb_s16_untied, svint16_t, svint8_t,
+            z0 = svabalb_s16 (z1, z4, z5),
+            z0 = svabalb (z1, z4, z5))
+
+/*
+** abalb_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sabalb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalb_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+             z0 = svabalb_n_s16 (z0, z4, x0),
+             z0 = svabalb (z0, z4, x0))
+
+/*
+** abalb_w0_s16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     sabalb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalb_w0_s16_untied, svint16_t, svint8_t, int8_t,
+             z0 = svabalb_n_s16 (z1, z4, x0),
+             z0 = svabalb (z1, z4, x0))
+
+/*
+** abalb_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     sabalb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (abalb_11_s16_tied1, svint16_t, svint8_t,
+            z0 = svabalb_n_s16 (z0, z4, 11),
+            z0 = svabalb (z0, z4, 11))
+
+/*
+** abalb_11_s16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     sabalb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (abalb_11_s16_untied, svint16_t, svint8_t,
+            z0 = svabalb_n_s16 (z1, z4, 11),
+            z0 = svabalb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalb_s32.c
new file mode 100644 (file)
index 0000000..2068bf7
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abalb_s32_tied1:
+**     sabalb  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (abalb_s32_tied1, svint32_t, svint16_t,
+            z0 = svabalb_s32 (z0, z4, z5),
+            z0 = svabalb (z0, z4, z5))
+
+/*
+** abalb_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sabalb  z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (abalb_s32_tied2, svint32_t, svint16_t,
+                z0_res = svabalb_s32 (z4, z0, z1),
+                z0_res = svabalb (z4, z0, z1))
+
+/*
+** abalb_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sabalb  z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (abalb_s32_tied3, svint32_t, svint16_t,
+                z0_res = svabalb_s32 (z4, z1, z0),
+                z0_res = svabalb (z4, z1, z0))
+
+/*
+** abalb_s32_untied:
+**     movprfx z0, z1
+**     sabalb  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (abalb_s32_untied, svint32_t, svint16_t,
+            z0 = svabalb_s32 (z1, z4, z5),
+            z0 = svabalb (z1, z4, z5))
+
+/*
+** abalb_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sabalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalb_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+             z0 = svabalb_n_s32 (z0, z4, x0),
+             z0 = svabalb (z0, z4, x0))
+
+/*
+** abalb_w0_s32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     sabalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalb_w0_s32_untied, svint32_t, svint16_t, int16_t,
+             z0 = svabalb_n_s32 (z1, z4, x0),
+             z0 = svabalb (z1, z4, x0))
+
+/*
+** abalb_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     sabalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (abalb_11_s32_tied1, svint32_t, svint16_t,
+            z0 = svabalb_n_s32 (z0, z4, 11),
+            z0 = svabalb (z0, z4, 11))
+
+/*
+** abalb_11_s32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     sabalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (abalb_11_s32_untied, svint32_t, svint16_t,
+            z0 = svabalb_n_s32 (z1, z4, 11),
+            z0 = svabalb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalb_s64.c
new file mode 100644 (file)
index 0000000..5c2ea4d
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abalb_s64_tied1:
+**     sabalb  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (abalb_s64_tied1, svint64_t, svint32_t,
+            z0 = svabalb_s64 (z0, z4, z5),
+            z0 = svabalb (z0, z4, z5))
+
+/*
+** abalb_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sabalb  z0\.d, \1\.s, z1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (abalb_s64_tied2, svint64_t, svint32_t,
+                z0_res = svabalb_s64 (z4, z0, z1),
+                z0_res = svabalb (z4, z0, z1))
+
+/*
+** abalb_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sabalb  z0\.d, z1\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (abalb_s64_tied3, svint64_t, svint32_t,
+                z0_res = svabalb_s64 (z4, z1, z0),
+                z0_res = svabalb (z4, z1, z0))
+
+/*
+** abalb_s64_untied:
+**     movprfx z0, z1
+**     sabalb  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (abalb_s64_untied, svint64_t, svint32_t,
+            z0 = svabalb_s64 (z1, z4, z5),
+            z0 = svabalb (z1, z4, z5))
+
+/*
+** abalb_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sabalb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalb_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+             z0 = svabalb_n_s64 (z0, z4, x0),
+             z0 = svabalb (z0, z4, x0))
+
+/*
+** abalb_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     sabalb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalb_w0_s64_untied, svint64_t, svint32_t, int32_t,
+             z0 = svabalb_n_s64 (z1, z4, x0),
+             z0 = svabalb (z1, z4, x0))
+
+/*
+** abalb_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     sabalb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (abalb_11_s64_tied1, svint64_t, svint32_t,
+            z0 = svabalb_n_s64 (z0, z4, 11),
+            z0 = svabalb (z0, z4, 11))
+
+/*
+** abalb_11_s64_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     sabalb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (abalb_11_s64_untied, svint64_t, svint32_t,
+            z0 = svabalb_n_s64 (z1, z4, 11),
+            z0 = svabalb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalb_u16.c
new file mode 100644 (file)
index 0000000..6cb3d89
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abalb_u16_tied1:
+**     uabalb  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (abalb_u16_tied1, svuint16_t, svuint8_t,
+            z0 = svabalb_u16 (z0, z4, z5),
+            z0 = svabalb (z0, z4, z5))
+
+/*
+** abalb_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uabalb  z0\.h, \1\.b, z1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (abalb_u16_tied2, svuint16_t, svuint8_t,
+                z0_res = svabalb_u16 (z4, z0, z1),
+                z0_res = svabalb (z4, z0, z1))
+
+/*
+** abalb_u16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uabalb  z0\.h, z1\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (abalb_u16_tied3, svuint16_t, svuint8_t,
+                z0_res = svabalb_u16 (z4, z1, z0),
+                z0_res = svabalb (z4, z1, z0))
+
+/*
+** abalb_u16_untied:
+**     movprfx z0, z1
+**     uabalb  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (abalb_u16_untied, svuint16_t, svuint8_t,
+            z0 = svabalb_u16 (z1, z4, z5),
+            z0 = svabalb (z1, z4, z5))
+
+/*
+** abalb_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uabalb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalb_w0_u16_tied1, svuint16_t, svuint8_t, uint8_t,
+             z0 = svabalb_n_u16 (z0, z4, x0),
+             z0 = svabalb (z0, z4, x0))
+
+/*
+** abalb_w0_u16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     uabalb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalb_w0_u16_untied, svuint16_t, svuint8_t, uint8_t,
+             z0 = svabalb_n_u16 (z1, z4, x0),
+             z0 = svabalb (z1, z4, x0))
+
+/*
+** abalb_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     uabalb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (abalb_11_u16_tied1, svuint16_t, svuint8_t,
+            z0 = svabalb_n_u16 (z0, z4, 11),
+            z0 = svabalb (z0, z4, 11))
+
+/*
+** abalb_11_u16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     uabalb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (abalb_11_u16_untied, svuint16_t, svuint8_t,
+            z0 = svabalb_n_u16 (z1, z4, 11),
+            z0 = svabalb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalb_u32.c
new file mode 100644 (file)
index 0000000..5d378da
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abalb_u32_tied1:
+**     uabalb  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (abalb_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svabalb_u32 (z0, z4, z5),
+            z0 = svabalb (z0, z4, z5))
+
+/*
+** abalb_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uabalb  z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (abalb_u32_tied2, svuint32_t, svuint16_t,
+                z0_res = svabalb_u32 (z4, z0, z1),
+                z0_res = svabalb (z4, z0, z1))
+
+/*
+** abalb_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uabalb  z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (abalb_u32_tied3, svuint32_t, svuint16_t,
+                z0_res = svabalb_u32 (z4, z1, z0),
+                z0_res = svabalb (z4, z1, z0))
+
+/*
+** abalb_u32_untied:
+**     movprfx z0, z1
+**     uabalb  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (abalb_u32_untied, svuint32_t, svuint16_t,
+            z0 = svabalb_u32 (z1, z4, z5),
+            z0 = svabalb (z1, z4, z5))
+
+/*
+** abalb_w0_u32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uabalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalb_w0_u32_tied1, svuint32_t, svuint16_t, uint16_t,
+             z0 = svabalb_n_u32 (z0, z4, x0),
+             z0 = svabalb (z0, z4, x0))
+
+/*
+** abalb_w0_u32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     uabalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalb_w0_u32_untied, svuint32_t, svuint16_t, uint16_t,
+             z0 = svabalb_n_u32 (z1, z4, x0),
+             z0 = svabalb (z1, z4, x0))
+
+/*
+** abalb_11_u32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     uabalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (abalb_11_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svabalb_n_u32 (z0, z4, 11),
+            z0 = svabalb (z0, z4, 11))
+
+/*
+** abalb_11_u32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     uabalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (abalb_11_u32_untied, svuint32_t, svuint16_t,
+            z0 = svabalb_n_u32 (z1, z4, 11),
+            z0 = svabalb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalb_u64.c
new file mode 100644 (file)
index 0000000..950938c
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abalb_u64_tied1:
+**     uabalb  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (abalb_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svabalb_u64 (z0, z4, z5),
+            z0 = svabalb (z0, z4, z5))
+
+/*
+** abalb_u64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uabalb  z0\.d, \1\.s, z1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (abalb_u64_tied2, svuint64_t, svuint32_t,
+                z0_res = svabalb_u64 (z4, z0, z1),
+                z0_res = svabalb (z4, z0, z1))
+
+/*
+** abalb_u64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uabalb  z0\.d, z1\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (abalb_u64_tied3, svuint64_t, svuint32_t,
+                z0_res = svabalb_u64 (z4, z1, z0),
+                z0_res = svabalb (z4, z1, z0))
+
+/*
+** abalb_u64_untied:
+**     movprfx z0, z1
+**     uabalb  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (abalb_u64_untied, svuint64_t, svuint32_t,
+            z0 = svabalb_u64 (z1, z4, z5),
+            z0 = svabalb (z1, z4, z5))
+
+/*
+** abalb_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uabalb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalb_w0_u64_tied1, svuint64_t, svuint32_t, uint32_t,
+             z0 = svabalb_n_u64 (z0, z4, x0),
+             z0 = svabalb (z0, z4, x0))
+
+/*
+** abalb_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     uabalb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalb_w0_u64_untied, svuint64_t, svuint32_t, uint32_t,
+             z0 = svabalb_n_u64 (z1, z4, x0),
+             z0 = svabalb (z1, z4, x0))
+
+/*
+** abalb_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     uabalb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (abalb_11_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svabalb_n_u64 (z0, z4, 11),
+            z0 = svabalb (z0, z4, 11))
+
+/*
+** abalb_11_u64_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     uabalb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (abalb_11_u64_untied, svuint64_t, svuint32_t,
+            z0 = svabalb_n_u64 (z1, z4, 11),
+            z0 = svabalb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalt_s16.c
new file mode 100644 (file)
index 0000000..7e7fbec
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abalt_s16_tied1:
+**     sabalt  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (abalt_s16_tied1, svint16_t, svint8_t,
+            z0 = svabalt_s16 (z0, z4, z5),
+            z0 = svabalt (z0, z4, z5))
+
+/*
+** abalt_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sabalt  z0\.h, \1\.b, z1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (abalt_s16_tied2, svint16_t, svint8_t,
+                z0_res = svabalt_s16 (z4, z0, z1),
+                z0_res = svabalt (z4, z0, z1))
+
+/*
+** abalt_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sabalt  z0\.h, z1\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (abalt_s16_tied3, svint16_t, svint8_t,
+                z0_res = svabalt_s16 (z4, z1, z0),
+                z0_res = svabalt (z4, z1, z0))
+
+/*
+** abalt_s16_untied:
+**     movprfx z0, z1
+**     sabalt  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (abalt_s16_untied, svint16_t, svint8_t,
+            z0 = svabalt_s16 (z1, z4, z5),
+            z0 = svabalt (z1, z4, z5))
+
+/*
+** abalt_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sabalt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalt_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+             z0 = svabalt_n_s16 (z0, z4, x0),
+             z0 = svabalt (z0, z4, x0))
+
+/*
+** abalt_w0_s16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     sabalt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalt_w0_s16_untied, svint16_t, svint8_t, int8_t,
+             z0 = svabalt_n_s16 (z1, z4, x0),
+             z0 = svabalt (z1, z4, x0))
+
+/*
+** abalt_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     sabalt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (abalt_11_s16_tied1, svint16_t, svint8_t,
+            z0 = svabalt_n_s16 (z0, z4, 11),
+            z0 = svabalt (z0, z4, 11))
+
+/*
+** abalt_11_s16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     sabalt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (abalt_11_s16_untied, svint16_t, svint8_t,
+            z0 = svabalt_n_s16 (z1, z4, 11),
+            z0 = svabalt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalt_s32.c
new file mode 100644 (file)
index 0000000..4173c49
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abalt_s32_tied1:
+**     sabalt  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (abalt_s32_tied1, svint32_t, svint16_t,
+            z0 = svabalt_s32 (z0, z4, z5),
+            z0 = svabalt (z0, z4, z5))
+
+/*
+** abalt_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sabalt  z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (abalt_s32_tied2, svint32_t, svint16_t,
+                z0_res = svabalt_s32 (z4, z0, z1),
+                z0_res = svabalt (z4, z0, z1))
+
+/*
+** abalt_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sabalt  z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (abalt_s32_tied3, svint32_t, svint16_t,
+                z0_res = svabalt_s32 (z4, z1, z0),
+                z0_res = svabalt (z4, z1, z0))
+
+/*
+** abalt_s32_untied:
+**     movprfx z0, z1
+**     sabalt  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (abalt_s32_untied, svint32_t, svint16_t,
+            z0 = svabalt_s32 (z1, z4, z5),
+            z0 = svabalt (z1, z4, z5))
+
+/*
+** abalt_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sabalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalt_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+             z0 = svabalt_n_s32 (z0, z4, x0),
+             z0 = svabalt (z0, z4, x0))
+
+/*
+** abalt_w0_s32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     sabalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalt_w0_s32_untied, svint32_t, svint16_t, int16_t,
+             z0 = svabalt_n_s32 (z1, z4, x0),
+             z0 = svabalt (z1, z4, x0))
+
+/*
+** abalt_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     sabalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (abalt_11_s32_tied1, svint32_t, svint16_t,
+            z0 = svabalt_n_s32 (z0, z4, 11),
+            z0 = svabalt (z0, z4, 11))
+
+/*
+** abalt_11_s32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     sabalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (abalt_11_s32_untied, svint32_t, svint16_t,
+            z0 = svabalt_n_s32 (z1, z4, 11),
+            z0 = svabalt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalt_s64.c
new file mode 100644 (file)
index 0000000..39964de
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abalt_s64_tied1:
+**     sabalt  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (abalt_s64_tied1, svint64_t, svint32_t,
+            z0 = svabalt_s64 (z0, z4, z5),
+            z0 = svabalt (z0, z4, z5))
+
+/*
+** abalt_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sabalt  z0\.d, \1\.s, z1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (abalt_s64_tied2, svint64_t, svint32_t,
+                z0_res = svabalt_s64 (z4, z0, z1),
+                z0_res = svabalt (z4, z0, z1))
+
+/*
+** abalt_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sabalt  z0\.d, z1\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (abalt_s64_tied3, svint64_t, svint32_t,
+                z0_res = svabalt_s64 (z4, z1, z0),
+                z0_res = svabalt (z4, z1, z0))
+
+/*
+** abalt_s64_untied:
+**     movprfx z0, z1
+**     sabalt  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (abalt_s64_untied, svint64_t, svint32_t,
+            z0 = svabalt_s64 (z1, z4, z5),
+            z0 = svabalt (z1, z4, z5))
+
+/*
+** abalt_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sabalt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalt_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+             z0 = svabalt_n_s64 (z0, z4, x0),
+             z0 = svabalt (z0, z4, x0))
+
+/*
+** abalt_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     sabalt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalt_w0_s64_untied, svint64_t, svint32_t, int32_t,
+             z0 = svabalt_n_s64 (z1, z4, x0),
+             z0 = svabalt (z1, z4, x0))
+
+/*
+** abalt_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     sabalt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (abalt_11_s64_tied1, svint64_t, svint32_t,
+            z0 = svabalt_n_s64 (z0, z4, 11),
+            z0 = svabalt (z0, z4, 11))
+
+/*
+** abalt_11_s64_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     sabalt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (abalt_11_s64_untied, svint64_t, svint32_t,
+            z0 = svabalt_n_s64 (z1, z4, 11),
+            z0 = svabalt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalt_u16.c
new file mode 100644 (file)
index 0000000..d0f956f
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abalt_u16_tied1:
+**     uabalt  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (abalt_u16_tied1, svuint16_t, svuint8_t,
+            z0 = svabalt_u16 (z0, z4, z5),
+            z0 = svabalt (z0, z4, z5))
+
+/*
+** abalt_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uabalt  z0\.h, \1\.b, z1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (abalt_u16_tied2, svuint16_t, svuint8_t,
+                z0_res = svabalt_u16 (z4, z0, z1),
+                z0_res = svabalt (z4, z0, z1))
+
+/*
+** abalt_u16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uabalt  z0\.h, z1\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (abalt_u16_tied3, svuint16_t, svuint8_t,
+                z0_res = svabalt_u16 (z4, z1, z0),
+                z0_res = svabalt (z4, z1, z0))
+
+/*
+** abalt_u16_untied:
+**     movprfx z0, z1
+**     uabalt  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (abalt_u16_untied, svuint16_t, svuint8_t,
+            z0 = svabalt_u16 (z1, z4, z5),
+            z0 = svabalt (z1, z4, z5))
+
+/*
+** abalt_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uabalt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalt_w0_u16_tied1, svuint16_t, svuint8_t, uint8_t,
+             z0 = svabalt_n_u16 (z0, z4, x0),
+             z0 = svabalt (z0, z4, x0))
+
+/*
+** abalt_w0_u16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     uabalt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalt_w0_u16_untied, svuint16_t, svuint8_t, uint8_t,
+             z0 = svabalt_n_u16 (z1, z4, x0),
+             z0 = svabalt (z1, z4, x0))
+
+/*
+** abalt_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     uabalt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (abalt_11_u16_tied1, svuint16_t, svuint8_t,
+            z0 = svabalt_n_u16 (z0, z4, 11),
+            z0 = svabalt (z0, z4, 11))
+
+/*
+** abalt_11_u16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     uabalt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (abalt_11_u16_untied, svuint16_t, svuint8_t,
+            z0 = svabalt_n_u16 (z1, z4, 11),
+            z0 = svabalt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalt_u32.c
new file mode 100644 (file)
index 0000000..efa5760
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abalt_u32_tied1:
+**     uabalt  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (abalt_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svabalt_u32 (z0, z4, z5),
+            z0 = svabalt (z0, z4, z5))
+
+/*
+** abalt_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uabalt  z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (abalt_u32_tied2, svuint32_t, svuint16_t,
+                z0_res = svabalt_u32 (z4, z0, z1),
+                z0_res = svabalt (z4, z0, z1))
+
+/*
+** abalt_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uabalt  z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (abalt_u32_tied3, svuint32_t, svuint16_t,
+                z0_res = svabalt_u32 (z4, z1, z0),
+                z0_res = svabalt (z4, z1, z0))
+
+/*
+** abalt_u32_untied:
+**     movprfx z0, z1
+**     uabalt  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (abalt_u32_untied, svuint32_t, svuint16_t,
+            z0 = svabalt_u32 (z1, z4, z5),
+            z0 = svabalt (z1, z4, z5))
+
+/*
+** abalt_w0_u32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uabalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalt_w0_u32_tied1, svuint32_t, svuint16_t, uint16_t,
+             z0 = svabalt_n_u32 (z0, z4, x0),
+             z0 = svabalt (z0, z4, x0))
+
+/*
+** abalt_w0_u32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     uabalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalt_w0_u32_untied, svuint32_t, svuint16_t, uint16_t,
+             z0 = svabalt_n_u32 (z1, z4, x0),
+             z0 = svabalt (z1, z4, x0))
+
+/*
+** abalt_11_u32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     uabalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (abalt_11_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svabalt_n_u32 (z0, z4, 11),
+            z0 = svabalt (z0, z4, 11))
+
+/*
+** abalt_11_u32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     uabalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (abalt_11_u32_untied, svuint32_t, svuint16_t,
+            z0 = svabalt_n_u32 (z1, z4, 11),
+            z0 = svabalt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abalt_u64.c
new file mode 100644 (file)
index 0000000..8f1460f
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abalt_u64_tied1:
+**     uabalt  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (abalt_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svabalt_u64 (z0, z4, z5),
+            z0 = svabalt (z0, z4, z5))
+
+/*
+** abalt_u64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uabalt  z0\.d, \1\.s, z1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (abalt_u64_tied2, svuint64_t, svuint32_t,
+                z0_res = svabalt_u64 (z4, z0, z1),
+                z0_res = svabalt (z4, z0, z1))
+
+/*
+** abalt_u64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uabalt  z0\.d, z1\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (abalt_u64_tied3, svuint64_t, svuint32_t,
+                z0_res = svabalt_u64 (z4, z1, z0),
+                z0_res = svabalt (z4, z1, z0))
+
+/*
+** abalt_u64_untied:
+**     movprfx z0, z1
+**     uabalt  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (abalt_u64_untied, svuint64_t, svuint32_t,
+            z0 = svabalt_u64 (z1, z4, z5),
+            z0 = svabalt (z1, z4, z5))
+
+/*
+** abalt_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uabalt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalt_w0_u64_tied1, svuint64_t, svuint32_t, uint32_t,
+             z0 = svabalt_n_u64 (z0, z4, x0),
+             z0 = svabalt (z0, z4, x0))
+
+/*
+** abalt_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     uabalt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (abalt_w0_u64_untied, svuint64_t, svuint32_t, uint32_t,
+             z0 = svabalt_n_u64 (z1, z4, x0),
+             z0 = svabalt (z1, z4, x0))
+
+/*
+** abalt_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     uabalt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (abalt_11_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svabalt_n_u64 (z0, z4, 11),
+            z0 = svabalt (z0, z4, 11))
+
+/*
+** abalt_11_u64_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     uabalt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (abalt_11_u64_untied, svuint64_t, svuint32_t,
+            z0 = svabalt_n_u64 (z1, z4, 11),
+            z0 = svabalt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlb_s16.c
new file mode 100644 (file)
index 0000000..f5f4323
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abdlb_s16_tied1:
+**     sabdlb  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svabdlb_s16 (z0, z1),
+                   z0_res = svabdlb (z0, z1))
+
+/*
+** abdlb_s16_tied2:
+**     sabdlb  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_s16_tied2, svint16_t, svint8_t,
+                   z0_res = svabdlb_s16 (z1, z0),
+                   z0_res = svabdlb (z1, z0))
+
+/*
+** abdlb_s16_untied:
+**     sabdlb  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_s16_untied, svint16_t, svint8_t,
+                   z0_res = svabdlb_s16 (z1, z2),
+                   z0_res = svabdlb (z1, z2))
+
+/*
+** abdlb_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sabdlb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlb_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+                    z0_res = svabdlb_n_s16 (z0, x0),
+                    z0_res = svabdlb (z0, x0))
+
+/*
+** abdlb_w0_s16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     sabdlb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlb_w0_s16_untied, svint16_t, svint8_t, int8_t,
+                    z0_res = svabdlb_n_s16 (z1, x0),
+                    z0_res = svabdlb (z1, x0))
+
+/*
+** abdlb_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     sabdlb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_11_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svabdlb_n_s16 (z0, 11),
+                   z0_res = svabdlb (z0, 11))
+
+/*
+** abdlb_11_s16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     sabdlb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_11_s16_untied, svint16_t, svint8_t,
+                   z0_res = svabdlb_n_s16 (z1, 11),
+                   z0_res = svabdlb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlb_s32.c
new file mode 100644 (file)
index 0000000..0555a3e
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abdlb_s32_tied1:
+**     sabdlb  z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svabdlb_s32 (z0, z1),
+                   z0_res = svabdlb (z0, z1))
+
+/*
+** abdlb_s32_tied2:
+**     sabdlb  z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_s32_tied2, svint32_t, svint16_t,
+                   z0_res = svabdlb_s32 (z1, z0),
+                   z0_res = svabdlb (z1, z0))
+
+/*
+** abdlb_s32_untied:
+**     sabdlb  z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_s32_untied, svint32_t, svint16_t,
+                   z0_res = svabdlb_s32 (z1, z2),
+                   z0_res = svabdlb (z1, z2))
+
+/*
+** abdlb_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sabdlb  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlb_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+                    z0_res = svabdlb_n_s32 (z0, x0),
+                    z0_res = svabdlb (z0, x0))
+
+/*
+** abdlb_w0_s32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     sabdlb  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlb_w0_s32_untied, svint32_t, svint16_t, int16_t,
+                    z0_res = svabdlb_n_s32 (z1, x0),
+                    z0_res = svabdlb (z1, x0))
+
+/*
+** abdlb_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     sabdlb  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_11_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svabdlb_n_s32 (z0, 11),
+                   z0_res = svabdlb (z0, 11))
+
+/*
+** abdlb_11_s32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     sabdlb  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_11_s32_untied, svint32_t, svint16_t,
+                   z0_res = svabdlb_n_s32 (z1, 11),
+                   z0_res = svabdlb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlb_s64.c
new file mode 100644 (file)
index 0000000..9cbbb8f
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abdlb_s64_tied1:
+**     sabdlb  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svabdlb_s64 (z0, z1),
+                   z0_res = svabdlb (z0, z1))
+
+/*
+** abdlb_s64_tied2:
+**     sabdlb  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_s64_tied2, svint64_t, svint32_t,
+                   z0_res = svabdlb_s64 (z1, z0),
+                   z0_res = svabdlb (z1, z0))
+
+/*
+** abdlb_s64_untied:
+**     sabdlb  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_s64_untied, svint64_t, svint32_t,
+                   z0_res = svabdlb_s64 (z1, z2),
+                   z0_res = svabdlb (z1, z2))
+
+/*
+** abdlb_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sabdlb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlb_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+                    z0_res = svabdlb_n_s64 (z0, x0),
+                    z0_res = svabdlb (z0, x0))
+
+/*
+** abdlb_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     sabdlb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlb_w0_s64_untied, svint64_t, svint32_t, int32_t,
+                    z0_res = svabdlb_n_s64 (z1, x0),
+                    z0_res = svabdlb (z1, x0))
+
+/*
+** abdlb_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     sabdlb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_11_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svabdlb_n_s64 (z0, 11),
+                   z0_res = svabdlb (z0, 11))
+
+/*
+** abdlb_11_s64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     sabdlb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_11_s64_untied, svint64_t, svint32_t,
+                   z0_res = svabdlb_n_s64 (z1, 11),
+                   z0_res = svabdlb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlb_u16.c
new file mode 100644 (file)
index 0000000..64ac063
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abdlb_u16_tied1:
+**     uabdlb  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svabdlb_u16 (z0, z1),
+                   z0_res = svabdlb (z0, z1))
+
+/*
+** abdlb_u16_tied2:
+**     uabdlb  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_u16_tied2, svuint16_t, svuint8_t,
+                   z0_res = svabdlb_u16 (z1, z0),
+                   z0_res = svabdlb (z1, z0))
+
+/*
+** abdlb_u16_untied:
+**     uabdlb  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svabdlb_u16 (z1, z2),
+                   z0_res = svabdlb (z1, z2))
+
+/*
+** abdlb_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uabdlb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlb_w0_u16_tied1, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svabdlb_n_u16 (z0, x0),
+                    z0_res = svabdlb (z0, x0))
+
+/*
+** abdlb_w0_u16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     uabdlb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlb_w0_u16_untied, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svabdlb_n_u16 (z1, x0),
+                    z0_res = svabdlb (z1, x0))
+
+/*
+** abdlb_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     uabdlb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_11_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svabdlb_n_u16 (z0, 11),
+                   z0_res = svabdlb (z0, 11))
+
+/*
+** abdlb_11_u16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     uabdlb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_11_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svabdlb_n_u16 (z1, 11),
+                   z0_res = svabdlb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlb_u32.c
new file mode 100644 (file)
index 0000000..8cf896e
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abdlb_u32_tied1:
+**     uabdlb  z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svabdlb_u32 (z0, z1),
+                   z0_res = svabdlb (z0, z1))
+
+/*
+** abdlb_u32_tied2:
+**     uabdlb  z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_u32_tied2, svuint32_t, svuint16_t,
+                   z0_res = svabdlb_u32 (z1, z0),
+                   z0_res = svabdlb (z1, z0))
+
+/*
+** abdlb_u32_untied:
+**     uabdlb  z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svabdlb_u32 (z1, z2),
+                   z0_res = svabdlb (z1, z2))
+
+/*
+** abdlb_w0_u32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uabdlb  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlb_w0_u32_tied1, svuint32_t, svuint16_t, uint16_t,
+                    z0_res = svabdlb_n_u32 (z0, x0),
+                    z0_res = svabdlb (z0, x0))
+
+/*
+** abdlb_w0_u32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     uabdlb  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlb_w0_u32_untied, svuint32_t, svuint16_t, uint16_t,
+                    z0_res = svabdlb_n_u32 (z1, x0),
+                    z0_res = svabdlb (z1, x0))
+
+/*
+** abdlb_11_u32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     uabdlb  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_11_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svabdlb_n_u32 (z0, 11),
+                   z0_res = svabdlb (z0, 11))
+
+/*
+** abdlb_11_u32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     uabdlb  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_11_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svabdlb_n_u32 (z1, 11),
+                   z0_res = svabdlb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlb_u64.c
new file mode 100644 (file)
index 0000000..6ed67fe
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abdlb_u64_tied1:
+**     uabdlb  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svabdlb_u64 (z0, z1),
+                   z0_res = svabdlb (z0, z1))
+
+/*
+** abdlb_u64_tied2:
+**     uabdlb  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_u64_tied2, svuint64_t, svuint32_t,
+                   z0_res = svabdlb_u64 (z1, z0),
+                   z0_res = svabdlb (z1, z0))
+
+/*
+** abdlb_u64_untied:
+**     uabdlb  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svabdlb_u64 (z1, z2),
+                   z0_res = svabdlb (z1, z2))
+
+/*
+** abdlb_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uabdlb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlb_w0_u64_tied1, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svabdlb_n_u64 (z0, x0),
+                    z0_res = svabdlb (z0, x0))
+
+/*
+** abdlb_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     uabdlb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlb_w0_u64_untied, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svabdlb_n_u64 (z1, x0),
+                    z0_res = svabdlb (z1, x0))
+
+/*
+** abdlb_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     uabdlb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_11_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svabdlb_n_u64 (z0, 11),
+                   z0_res = svabdlb (z0, 11))
+
+/*
+** abdlb_11_u64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     uabdlb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlb_11_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svabdlb_n_u64 (z1, 11),
+                   z0_res = svabdlb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlt_s16.c
new file mode 100644 (file)
index 0000000..482d5ed
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abdlt_s16_tied1:
+**     sabdlt  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svabdlt_s16 (z0, z1),
+                   z0_res = svabdlt (z0, z1))
+
+/*
+** abdlt_s16_tied2:
+**     sabdlt  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_s16_tied2, svint16_t, svint8_t,
+                   z0_res = svabdlt_s16 (z1, z0),
+                   z0_res = svabdlt (z1, z0))
+
+/*
+** abdlt_s16_untied:
+**     sabdlt  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_s16_untied, svint16_t, svint8_t,
+                   z0_res = svabdlt_s16 (z1, z2),
+                   z0_res = svabdlt (z1, z2))
+
+/*
+** abdlt_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sabdlt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlt_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+                    z0_res = svabdlt_n_s16 (z0, x0),
+                    z0_res = svabdlt (z0, x0))
+
+/*
+** abdlt_w0_s16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     sabdlt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlt_w0_s16_untied, svint16_t, svint8_t, int8_t,
+                    z0_res = svabdlt_n_s16 (z1, x0),
+                    z0_res = svabdlt (z1, x0))
+
+/*
+** abdlt_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     sabdlt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_11_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svabdlt_n_s16 (z0, 11),
+                   z0_res = svabdlt (z0, 11))
+
+/*
+** abdlt_11_s16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     sabdlt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_11_s16_untied, svint16_t, svint8_t,
+                   z0_res = svabdlt_n_s16 (z1, 11),
+                   z0_res = svabdlt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlt_s32.c
new file mode 100644 (file)
index 0000000..bee805c
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abdlt_s32_tied1:
+**     sabdlt  z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svabdlt_s32 (z0, z1),
+                   z0_res = svabdlt (z0, z1))
+
+/*
+** abdlt_s32_tied2:
+**     sabdlt  z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_s32_tied2, svint32_t, svint16_t,
+                   z0_res = svabdlt_s32 (z1, z0),
+                   z0_res = svabdlt (z1, z0))
+
+/*
+** abdlt_s32_untied:
+**     sabdlt  z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_s32_untied, svint32_t, svint16_t,
+                   z0_res = svabdlt_s32 (z1, z2),
+                   z0_res = svabdlt (z1, z2))
+
+/*
+** abdlt_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sabdlt  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlt_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+                    z0_res = svabdlt_n_s32 (z0, x0),
+                    z0_res = svabdlt (z0, x0))
+
+/*
+** abdlt_w0_s32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     sabdlt  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlt_w0_s32_untied, svint32_t, svint16_t, int16_t,
+                    z0_res = svabdlt_n_s32 (z1, x0),
+                    z0_res = svabdlt (z1, x0))
+
+/*
+** abdlt_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     sabdlt  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_11_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svabdlt_n_s32 (z0, 11),
+                   z0_res = svabdlt (z0, 11))
+
+/*
+** abdlt_11_s32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     sabdlt  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_11_s32_untied, svint32_t, svint16_t,
+                   z0_res = svabdlt_n_s32 (z1, 11),
+                   z0_res = svabdlt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlt_s64.c
new file mode 100644 (file)
index 0000000..ccc9b2a
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abdlt_s64_tied1:
+**     sabdlt  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svabdlt_s64 (z0, z1),
+                   z0_res = svabdlt (z0, z1))
+
+/*
+** abdlt_s64_tied2:
+**     sabdlt  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_s64_tied2, svint64_t, svint32_t,
+                   z0_res = svabdlt_s64 (z1, z0),
+                   z0_res = svabdlt (z1, z0))
+
+/*
+** abdlt_s64_untied:
+**     sabdlt  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_s64_untied, svint64_t, svint32_t,
+                   z0_res = svabdlt_s64 (z1, z2),
+                   z0_res = svabdlt (z1, z2))
+
+/*
+** abdlt_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sabdlt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlt_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+                    z0_res = svabdlt_n_s64 (z0, x0),
+                    z0_res = svabdlt (z0, x0))
+
+/*
+** abdlt_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     sabdlt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlt_w0_s64_untied, svint64_t, svint32_t, int32_t,
+                    z0_res = svabdlt_n_s64 (z1, x0),
+                    z0_res = svabdlt (z1, x0))
+
+/*
+** abdlt_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     sabdlt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_11_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svabdlt_n_s64 (z0, 11),
+                   z0_res = svabdlt (z0, 11))
+
+/*
+** abdlt_11_s64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     sabdlt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_11_s64_untied, svint64_t, svint32_t,
+                   z0_res = svabdlt_n_s64 (z1, 11),
+                   z0_res = svabdlt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlt_u16.c
new file mode 100644 (file)
index 0000000..fb90dd8
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abdlt_u16_tied1:
+**     uabdlt  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svabdlt_u16 (z0, z1),
+                   z0_res = svabdlt (z0, z1))
+
+/*
+** abdlt_u16_tied2:
+**     uabdlt  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_u16_tied2, svuint16_t, svuint8_t,
+                   z0_res = svabdlt_u16 (z1, z0),
+                   z0_res = svabdlt (z1, z0))
+
+/*
+** abdlt_u16_untied:
+**     uabdlt  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svabdlt_u16 (z1, z2),
+                   z0_res = svabdlt (z1, z2))
+
+/*
+** abdlt_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uabdlt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlt_w0_u16_tied1, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svabdlt_n_u16 (z0, x0),
+                    z0_res = svabdlt (z0, x0))
+
+/*
+** abdlt_w0_u16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     uabdlt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlt_w0_u16_untied, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svabdlt_n_u16 (z1, x0),
+                    z0_res = svabdlt (z1, x0))
+
+/*
+** abdlt_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     uabdlt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_11_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svabdlt_n_u16 (z0, 11),
+                   z0_res = svabdlt (z0, 11))
+
+/*
+** abdlt_11_u16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     uabdlt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_11_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svabdlt_n_u16 (z1, 11),
+                   z0_res = svabdlt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlt_u32.c
new file mode 100644 (file)
index 0000000..161e8f0
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abdlt_u32_tied1:
+**     uabdlt  z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svabdlt_u32 (z0, z1),
+                   z0_res = svabdlt (z0, z1))
+
+/*
+** abdlt_u32_tied2:
+**     uabdlt  z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_u32_tied2, svuint32_t, svuint16_t,
+                   z0_res = svabdlt_u32 (z1, z0),
+                   z0_res = svabdlt (z1, z0))
+
+/*
+** abdlt_u32_untied:
+**     uabdlt  z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svabdlt_u32 (z1, z2),
+                   z0_res = svabdlt (z1, z2))
+
+/*
+** abdlt_w0_u32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uabdlt  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlt_w0_u32_tied1, svuint32_t, svuint16_t, uint16_t,
+                    z0_res = svabdlt_n_u32 (z0, x0),
+                    z0_res = svabdlt (z0, x0))
+
+/*
+** abdlt_w0_u32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     uabdlt  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlt_w0_u32_untied, svuint32_t, svuint16_t, uint16_t,
+                    z0_res = svabdlt_n_u32 (z1, x0),
+                    z0_res = svabdlt (z1, x0))
+
+/*
+** abdlt_11_u32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     uabdlt  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_11_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svabdlt_n_u32 (z0, 11),
+                   z0_res = svabdlt (z0, 11))
+
+/*
+** abdlt_11_u32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     uabdlt  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_11_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svabdlt_n_u32 (z1, 11),
+                   z0_res = svabdlt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/abdlt_u64.c
new file mode 100644 (file)
index 0000000..e21cd16
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** abdlt_u64_tied1:
+**     uabdlt  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svabdlt_u64 (z0, z1),
+                   z0_res = svabdlt (z0, z1))
+
+/*
+** abdlt_u64_tied2:
+**     uabdlt  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_u64_tied2, svuint64_t, svuint32_t,
+                   z0_res = svabdlt_u64 (z1, z0),
+                   z0_res = svabdlt (z1, z0))
+
+/*
+** abdlt_u64_untied:
+**     uabdlt  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svabdlt_u64 (z1, z2),
+                   z0_res = svabdlt (z1, z2))
+
+/*
+** abdlt_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uabdlt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlt_w0_u64_tied1, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svabdlt_n_u64 (z0, x0),
+                    z0_res = svabdlt (z0, x0))
+
+/*
+** abdlt_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     uabdlt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (abdlt_w0_u64_untied, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svabdlt_n_u64 (z1, x0),
+                    z0_res = svabdlt (z1, x0))
+
+/*
+** abdlt_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     uabdlt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_11_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svabdlt_n_u64 (z0, 11),
+                   z0_res = svabdlt (z0, 11))
+
+/*
+** abdlt_11_u64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     uabdlt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (abdlt_11_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svabdlt_n_u64 (z1, 11),
+                   z0_res = svabdlt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adalp_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adalp_s16.c
new file mode 100644 (file)
index 0000000..9372acc
--- /dev/null
@@ -0,0 +1,94 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** adalp_s16_m_tied1:
+**     sadalp  z0\.h, p0/m, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (adalp_s16_m_tied1, svint16_t, svint8_t,
+            z0 = svadalp_s16_m (p0, z0, z4),
+            z0 = svadalp_m (p0, z0, z4))
+
+/*
+** adalp_s16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sadalp  z0\.h, p0/m, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (adalp_s16_m_tied2, svint16_t, svint8_t,
+                z0_res = svadalp_s16_m (p0, z4, z0),
+                z0_res = svadalp_m (p0, z4, z0))
+
+/*
+** adalp_s16_m_untied:
+**     movprfx z0, z1
+**     sadalp  z0\.h, p0/m, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (adalp_s16_m_untied, svint16_t, svint8_t,
+            z0 = svadalp_s16_m (p0, z1, z4),
+            z0 = svadalp_m (p0, z1, z4))
+
+/*
+** adalp_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sadalp  z0\.h, p0/m, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (adalp_s16_z_tied1, svint16_t, svint8_t,
+            z0 = svadalp_s16_z (p0, z0, z4),
+            z0 = svadalp_z (p0, z0, z4))
+
+/*
+** adalp_s16_z_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.h, p0/z, z4\.h
+**     sadalp  z0\.h, p0/m, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (adalp_s16_z_tied2, svint16_t, svint8_t,
+                z0_res = svadalp_s16_z (p0, z4, z0),
+                z0_res = svadalp_z (p0, z4, z0))
+
+/*
+** adalp_s16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     sadalp  z0\.h, p0/m, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (adalp_s16_z_untied, svint16_t, svint8_t,
+            z0 = svadalp_s16_z (p0, z1, z4),
+            z0 = svadalp_z (p0, z1, z4))
+
+/*
+** adalp_s16_x_tied1:
+**     sadalp  z0\.h, p0/m, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (adalp_s16_x_tied1, svint16_t, svint8_t,
+            z0 = svadalp_s16_x (p0, z0, z4),
+            z0 = svadalp_x (p0, z0, z4))
+
+/*
+** adalp_s16_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sadalp  z0\.h, p0/m, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (adalp_s16_x_tied2, svint16_t, svint8_t,
+                z0_res = svadalp_s16_x (p0, z4, z0),
+                z0_res = svadalp_x (p0, z4, z0))
+
+/*
+** adalp_s16_x_untied:
+**     movprfx z0, z1
+**     sadalp  z0\.h, p0/m, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (adalp_s16_x_untied, svint16_t, svint8_t,
+            z0 = svadalp_s16_x (p0, z1, z4),
+            z0 = svadalp_x (p0, z1, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adalp_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adalp_s32.c
new file mode 100644 (file)
index 0000000..b0404e0
--- /dev/null
@@ -0,0 +1,94 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** adalp_s32_m_tied1:
+**     sadalp  z0\.s, p0/m, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (adalp_s32_m_tied1, svint32_t, svint16_t,
+            z0 = svadalp_s32_m (p0, z0, z4),
+            z0 = svadalp_m (p0, z0, z4))
+
+/*
+** adalp_s32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sadalp  z0\.s, p0/m, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (adalp_s32_m_tied2, svint32_t, svint16_t,
+                z0_res = svadalp_s32_m (p0, z4, z0),
+                z0_res = svadalp_m (p0, z4, z0))
+
+/*
+** adalp_s32_m_untied:
+**     movprfx z0, z1
+**     sadalp  z0\.s, p0/m, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (adalp_s32_m_untied, svint32_t, svint16_t,
+            z0 = svadalp_s32_m (p0, z1, z4),
+            z0 = svadalp_m (p0, z1, z4))
+
+/*
+** adalp_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sadalp  z0\.s, p0/m, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (adalp_s32_z_tied1, svint32_t, svint16_t,
+            z0 = svadalp_s32_z (p0, z0, z4),
+            z0 = svadalp_z (p0, z0, z4))
+
+/*
+** adalp_s32_z_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.s, p0/z, z4\.s
+**     sadalp  z0\.s, p0/m, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (adalp_s32_z_tied2, svint32_t, svint16_t,
+                z0_res = svadalp_s32_z (p0, z4, z0),
+                z0_res = svadalp_z (p0, z4, z0))
+
+/*
+** adalp_s32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     sadalp  z0\.s, p0/m, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (adalp_s32_z_untied, svint32_t, svint16_t,
+            z0 = svadalp_s32_z (p0, z1, z4),
+            z0 = svadalp_z (p0, z1, z4))
+
+/*
+** adalp_s32_x_tied1:
+**     sadalp  z0\.s, p0/m, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (adalp_s32_x_tied1, svint32_t, svint16_t,
+            z0 = svadalp_s32_x (p0, z0, z4),
+            z0 = svadalp_x (p0, z0, z4))
+
+/*
+** adalp_s32_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sadalp  z0\.s, p0/m, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (adalp_s32_x_tied2, svint32_t, svint16_t,
+                z0_res = svadalp_s32_x (p0, z4, z0),
+                z0_res = svadalp_x (p0, z4, z0))
+
+/*
+** adalp_s32_x_untied:
+**     movprfx z0, z1
+**     sadalp  z0\.s, p0/m, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (adalp_s32_x_untied, svint32_t, svint16_t,
+            z0 = svadalp_s32_x (p0, z1, z4),
+            z0 = svadalp_x (p0, z1, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adalp_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adalp_s64.c
new file mode 100644 (file)
index 0000000..f17b2c5
--- /dev/null
@@ -0,0 +1,94 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** adalp_s64_m_tied1:
+**     sadalp  z0\.d, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (adalp_s64_m_tied1, svint64_t, svint32_t,
+            z0 = svadalp_s64_m (p0, z0, z4),
+            z0 = svadalp_m (p0, z0, z4))
+
+/*
+** adalp_s64_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sadalp  z0\.d, p0/m, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (adalp_s64_m_tied2, svint64_t, svint32_t,
+                z0_res = svadalp_s64_m (p0, z4, z0),
+                z0_res = svadalp_m (p0, z4, z0))
+
+/*
+** adalp_s64_m_untied:
+**     movprfx z0, z1
+**     sadalp  z0\.d, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (adalp_s64_m_untied, svint64_t, svint32_t,
+            z0 = svadalp_s64_m (p0, z1, z4),
+            z0 = svadalp_m (p0, z1, z4))
+
+/*
+** adalp_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sadalp  z0\.d, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (adalp_s64_z_tied1, svint64_t, svint32_t,
+            z0 = svadalp_s64_z (p0, z0, z4),
+            z0 = svadalp_z (p0, z0, z4))
+
+/*
+** adalp_s64_z_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.d, p0/z, z4\.d
+**     sadalp  z0\.d, p0/m, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (adalp_s64_z_tied2, svint64_t, svint32_t,
+                z0_res = svadalp_s64_z (p0, z4, z0),
+                z0_res = svadalp_z (p0, z4, z0))
+
+/*
+** adalp_s64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     sadalp  z0\.d, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (adalp_s64_z_untied, svint64_t, svint32_t,
+            z0 = svadalp_s64_z (p0, z1, z4),
+            z0 = svadalp_z (p0, z1, z4))
+
+/*
+** adalp_s64_x_tied1:
+**     sadalp  z0\.d, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (adalp_s64_x_tied1, svint64_t, svint32_t,
+            z0 = svadalp_s64_x (p0, z0, z4),
+            z0 = svadalp_x (p0, z0, z4))
+
+/*
+** adalp_s64_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sadalp  z0\.d, p0/m, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (adalp_s64_x_tied2, svint64_t, svint32_t,
+                z0_res = svadalp_s64_x (p0, z4, z0),
+                z0_res = svadalp_x (p0, z4, z0))
+
+/*
+** adalp_s64_x_untied:
+**     movprfx z0, z1
+**     sadalp  z0\.d, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (adalp_s64_x_untied, svint64_t, svint32_t,
+            z0 = svadalp_s64_x (p0, z1, z4),
+            z0 = svadalp_x (p0, z1, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adalp_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adalp_u16.c
new file mode 100644 (file)
index 0000000..bc4a4ac
--- /dev/null
@@ -0,0 +1,94 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** adalp_u16_m_tied1:
+**     uadalp  z0\.h, p0/m, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (adalp_u16_m_tied1, svuint16_t, svuint8_t,
+            z0 = svadalp_u16_m (p0, z0, z4),
+            z0 = svadalp_m (p0, z0, z4))
+
+/*
+** adalp_u16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uadalp  z0\.h, p0/m, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (adalp_u16_m_tied2, svuint16_t, svuint8_t,
+                z0_res = svadalp_u16_m (p0, z4, z0),
+                z0_res = svadalp_m (p0, z4, z0))
+
+/*
+** adalp_u16_m_untied:
+**     movprfx z0, z1
+**     uadalp  z0\.h, p0/m, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (adalp_u16_m_untied, svuint16_t, svuint8_t,
+            z0 = svadalp_u16_m (p0, z1, z4),
+            z0 = svadalp_m (p0, z1, z4))
+
+/*
+** adalp_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uadalp  z0\.h, p0/m, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (adalp_u16_z_tied1, svuint16_t, svuint8_t,
+            z0 = svadalp_u16_z (p0, z0, z4),
+            z0 = svadalp_z (p0, z0, z4))
+
+/*
+** adalp_u16_z_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.h, p0/z, z4\.h
+**     uadalp  z0\.h, p0/m, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (adalp_u16_z_tied2, svuint16_t, svuint8_t,
+                z0_res = svadalp_u16_z (p0, z4, z0),
+                z0_res = svadalp_z (p0, z4, z0))
+
+/*
+** adalp_u16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     uadalp  z0\.h, p0/m, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (adalp_u16_z_untied, svuint16_t, svuint8_t,
+            z0 = svadalp_u16_z (p0, z1, z4),
+            z0 = svadalp_z (p0, z1, z4))
+
+/*
+** adalp_u16_x_tied1:
+**     uadalp  z0\.h, p0/m, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (adalp_u16_x_tied1, svuint16_t, svuint8_t,
+            z0 = svadalp_u16_x (p0, z0, z4),
+            z0 = svadalp_x (p0, z0, z4))
+
+/*
+** adalp_u16_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uadalp  z0\.h, p0/m, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (adalp_u16_x_tied2, svuint16_t, svuint8_t,
+                z0_res = svadalp_u16_x (p0, z4, z0),
+                z0_res = svadalp_x (p0, z4, z0))
+
+/*
+** adalp_u16_x_untied:
+**     movprfx z0, z1
+**     uadalp  z0\.h, p0/m, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (adalp_u16_x_untied, svuint16_t, svuint8_t,
+            z0 = svadalp_u16_x (p0, z1, z4),
+            z0 = svadalp_x (p0, z1, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adalp_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adalp_u32.c
new file mode 100644 (file)
index 0000000..c21c505
--- /dev/null
@@ -0,0 +1,94 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** adalp_u32_m_tied1:
+**     uadalp  z0\.s, p0/m, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (adalp_u32_m_tied1, svuint32_t, svuint16_t,
+            z0 = svadalp_u32_m (p0, z0, z4),
+            z0 = svadalp_m (p0, z0, z4))
+
+/*
+** adalp_u32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uadalp  z0\.s, p0/m, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (adalp_u32_m_tied2, svuint32_t, svuint16_t,
+                z0_res = svadalp_u32_m (p0, z4, z0),
+                z0_res = svadalp_m (p0, z4, z0))
+
+/*
+** adalp_u32_m_untied:
+**     movprfx z0, z1
+**     uadalp  z0\.s, p0/m, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (adalp_u32_m_untied, svuint32_t, svuint16_t,
+            z0 = svadalp_u32_m (p0, z1, z4),
+            z0 = svadalp_m (p0, z1, z4))
+
+/*
+** adalp_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uadalp  z0\.s, p0/m, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (adalp_u32_z_tied1, svuint32_t, svuint16_t,
+            z0 = svadalp_u32_z (p0, z0, z4),
+            z0 = svadalp_z (p0, z0, z4))
+
+/*
+** adalp_u32_z_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.s, p0/z, z4\.s
+**     uadalp  z0\.s, p0/m, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (adalp_u32_z_tied2, svuint32_t, svuint16_t,
+                z0_res = svadalp_u32_z (p0, z4, z0),
+                z0_res = svadalp_z (p0, z4, z0))
+
+/*
+** adalp_u32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     uadalp  z0\.s, p0/m, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (adalp_u32_z_untied, svuint32_t, svuint16_t,
+            z0 = svadalp_u32_z (p0, z1, z4),
+            z0 = svadalp_z (p0, z1, z4))
+
+/*
+** adalp_u32_x_tied1:
+**     uadalp  z0\.s, p0/m, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (adalp_u32_x_tied1, svuint32_t, svuint16_t,
+            z0 = svadalp_u32_x (p0, z0, z4),
+            z0 = svadalp_x (p0, z0, z4))
+
+/*
+** adalp_u32_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uadalp  z0\.s, p0/m, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (adalp_u32_x_tied2, svuint32_t, svuint16_t,
+                z0_res = svadalp_u32_x (p0, z4, z0),
+                z0_res = svadalp_x (p0, z4, z0))
+
+/*
+** adalp_u32_x_untied:
+**     movprfx z0, z1
+**     uadalp  z0\.s, p0/m, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (adalp_u32_x_untied, svuint32_t, svuint16_t,
+            z0 = svadalp_u32_x (p0, z1, z4),
+            z0 = svadalp_x (p0, z1, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adalp_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adalp_u64.c
new file mode 100644 (file)
index 0000000..761feeb
--- /dev/null
@@ -0,0 +1,94 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** adalp_u64_m_tied1:
+**     uadalp  z0\.d, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (adalp_u64_m_tied1, svuint64_t, svuint32_t,
+            z0 = svadalp_u64_m (p0, z0, z4),
+            z0 = svadalp_m (p0, z0, z4))
+
+/*
+** adalp_u64_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uadalp  z0\.d, p0/m, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (adalp_u64_m_tied2, svuint64_t, svuint32_t,
+                z0_res = svadalp_u64_m (p0, z4, z0),
+                z0_res = svadalp_m (p0, z4, z0))
+
+/*
+** adalp_u64_m_untied:
+**     movprfx z0, z1
+**     uadalp  z0\.d, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (adalp_u64_m_untied, svuint64_t, svuint32_t,
+            z0 = svadalp_u64_m (p0, z1, z4),
+            z0 = svadalp_m (p0, z1, z4))
+
+/*
+** adalp_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uadalp  z0\.d, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (adalp_u64_z_tied1, svuint64_t, svuint32_t,
+            z0 = svadalp_u64_z (p0, z0, z4),
+            z0 = svadalp_z (p0, z0, z4))
+
+/*
+** adalp_u64_z_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.d, p0/z, z4\.d
+**     uadalp  z0\.d, p0/m, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (adalp_u64_z_tied2, svuint64_t, svuint32_t,
+                z0_res = svadalp_u64_z (p0, z4, z0),
+                z0_res = svadalp_z (p0, z4, z0))
+
+/*
+** adalp_u64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     uadalp  z0\.d, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (adalp_u64_z_untied, svuint64_t, svuint32_t,
+            z0 = svadalp_u64_z (p0, z1, z4),
+            z0 = svadalp_z (p0, z1, z4))
+
+/*
+** adalp_u64_x_tied1:
+**     uadalp  z0\.d, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (adalp_u64_x_tied1, svuint64_t, svuint32_t,
+            z0 = svadalp_u64_x (p0, z0, z4),
+            z0 = svadalp_x (p0, z0, z4))
+
+/*
+** adalp_u64_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uadalp  z0\.d, p0/m, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (adalp_u64_x_tied2, svuint64_t, svuint32_t,
+                z0_res = svadalp_u64_x (p0, z4, z0),
+                z0_res = svadalp_x (p0, z4, z0))
+
+/*
+** adalp_u64_x_untied:
+**     movprfx z0, z1
+**     uadalp  z0\.d, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (adalp_u64_x_untied, svuint64_t, svuint32_t,
+            z0 = svadalp_u64_x (p0, z1, z4),
+            z0 = svadalp_x (p0, z1, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adclb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adclb_u32.c
new file mode 100644 (file)
index 0000000..64d5c08
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** adclb_u32_tied1:
+**     adclb   z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (adclb_u32_tied1, svuint32_t,
+               z0 = svadclb_u32 (z0, z1, z2),
+               z0 = svadclb (z0, z1, z2))
+
+/*
+** adclb_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     adclb   z0\.s, \1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (adclb_u32_tied2, svuint32_t,
+               z0 = svadclb_u32 (z1, z0, z2),
+               z0 = svadclb (z1, z0, z2))
+
+/*
+** adclb_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     adclb   z0\.s, z2\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (adclb_u32_tied3, svuint32_t,
+               z0 = svadclb_u32 (z1, z2, z0),
+               z0 = svadclb (z1, z2, z0))
+
+/*
+** adclb_u32_untied:
+**     movprfx z0, z1
+**     adclb   z0\.s, z2\.s, z3\.s
+**     ret
+*/
+TEST_UNIFORM_Z (adclb_u32_untied, svuint32_t,
+               z0 = svadclb_u32 (z1, z2, z3),
+               z0 = svadclb (z1, z2, z3))
+
+/*
+** adclb_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     adclb   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (adclb_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = svadclb_n_u32 (z0, z1, x0),
+                z0 = svadclb (z0, z1, x0))
+
+/*
+** adclb_w0_u32_tied2:
+**     mov     (z[0-9]+\.s), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     adclb   z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (adclb_w0_u32_tied2, svuint32_t, uint32_t,
+                z0 = svadclb_n_u32 (z1, z0, x0),
+                z0 = svadclb (z1, z0, x0))
+
+/*
+** adclb_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     adclb   z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (adclb_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = svadclb_n_u32 (z1, z2, x0),
+                z0 = svadclb (z1, z2, x0))
+
+/*
+** adclb_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     adclb   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (adclb_11_u32_tied1, svuint32_t,
+               z0 = svadclb_n_u32 (z0, z1, 11),
+               z0 = svadclb (z0, z1, 11))
+
+/*
+** adclb_11_u32_tied2:
+**     mov     (z[0-9]+\.s), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     adclb   z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (adclb_11_u32_tied2, svuint32_t,
+               z0 = svadclb_n_u32 (z1, z0, 11),
+               z0 = svadclb (z1, z0, 11))
+
+/*
+** adclb_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     adclb   z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (adclb_11_u32_untied, svuint32_t,
+               z0 = svadclb_n_u32 (z1, z2, 11),
+               z0 = svadclb (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adclb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adclb_u64.c
new file mode 100644 (file)
index 0000000..77b2bd2
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** adclb_u64_tied1:
+**     adclb   z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (adclb_u64_tied1, svuint64_t,
+               z0 = svadclb_u64 (z0, z1, z2),
+               z0 = svadclb (z0, z1, z2))
+
+/*
+** adclb_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     adclb   z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (adclb_u64_tied2, svuint64_t,
+               z0 = svadclb_u64 (z1, z0, z2),
+               z0 = svadclb (z1, z0, z2))
+
+/*
+** adclb_u64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     adclb   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (adclb_u64_tied3, svuint64_t,
+               z0 = svadclb_u64 (z1, z2, z0),
+               z0 = svadclb (z1, z2, z0))
+
+/*
+** adclb_u64_untied:
+**     movprfx z0, z1
+**     adclb   z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (adclb_u64_untied, svuint64_t,
+               z0 = svadclb_u64 (z1, z2, z3),
+               z0 = svadclb (z1, z2, z3))
+
+/*
+** adclb_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     adclb   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (adclb_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = svadclb_n_u64 (z0, z1, x0),
+                z0 = svadclb (z0, z1, x0))
+
+/*
+** adclb_x0_u64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     adclb   z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (adclb_x0_u64_tied2, svuint64_t, uint64_t,
+                z0 = svadclb_n_u64 (z1, z0, x0),
+                z0 = svadclb (z1, z0, x0))
+
+/*
+** adclb_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     adclb   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (adclb_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = svadclb_n_u64 (z1, z2, x0),
+                z0 = svadclb (z1, z2, x0))
+
+/*
+** adclb_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     adclb   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (adclb_11_u64_tied1, svuint64_t,
+               z0 = svadclb_n_u64 (z0, z1, 11),
+               z0 = svadclb (z0, z1, 11))
+
+/*
+** adclb_11_u64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     adclb   z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (adclb_11_u64_tied2, svuint64_t,
+               z0 = svadclb_n_u64 (z1, z0, 11),
+               z0 = svadclb (z1, z0, 11))
+
+/*
+** adclb_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     adclb   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (adclb_11_u64_untied, svuint64_t,
+               z0 = svadclb_n_u64 (z1, z2, 11),
+               z0 = svadclb (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adclt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adclt_u32.c
new file mode 100644 (file)
index 0000000..d755227
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** adclt_u32_tied1:
+**     adclt   z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (adclt_u32_tied1, svuint32_t,
+               z0 = svadclt_u32 (z0, z1, z2),
+               z0 = svadclt (z0, z1, z2))
+
+/*
+** adclt_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     adclt   z0\.s, \1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (adclt_u32_tied2, svuint32_t,
+               z0 = svadclt_u32 (z1, z0, z2),
+               z0 = svadclt (z1, z0, z2))
+
+/*
+** adclt_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     adclt   z0\.s, z2\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (adclt_u32_tied3, svuint32_t,
+               z0 = svadclt_u32 (z1, z2, z0),
+               z0 = svadclt (z1, z2, z0))
+
+/*
+** adclt_u32_untied:
+**     movprfx z0, z1
+**     adclt   z0\.s, z2\.s, z3\.s
+**     ret
+*/
+TEST_UNIFORM_Z (adclt_u32_untied, svuint32_t,
+               z0 = svadclt_u32 (z1, z2, z3),
+               z0 = svadclt (z1, z2, z3))
+
+/*
+** adclt_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     adclt   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (adclt_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = svadclt_n_u32 (z0, z1, x0),
+                z0 = svadclt (z0, z1, x0))
+
+/*
+** adclt_w0_u32_tied2:
+**     mov     (z[0-9]+\.s), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     adclt   z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (adclt_w0_u32_tied2, svuint32_t, uint32_t,
+                z0 = svadclt_n_u32 (z1, z0, x0),
+                z0 = svadclt (z1, z0, x0))
+
+/*
+** adclt_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     adclt   z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (adclt_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = svadclt_n_u32 (z1, z2, x0),
+                z0 = svadclt (z1, z2, x0))
+
+/*
+** adclt_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     adclt   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (adclt_11_u32_tied1, svuint32_t,
+               z0 = svadclt_n_u32 (z0, z1, 11),
+               z0 = svadclt (z0, z1, 11))
+
+/*
+** adclt_11_u32_tied2:
+**     mov     (z[0-9]+\.s), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     adclt   z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (adclt_11_u32_tied2, svuint32_t,
+               z0 = svadclt_n_u32 (z1, z0, 11),
+               z0 = svadclt (z1, z0, 11))
+
+/*
+** adclt_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     adclt   z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (adclt_11_u32_untied, svuint32_t,
+               z0 = svadclt_n_u32 (z1, z2, 11),
+               z0 = svadclt (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adclt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/adclt_u64.c
new file mode 100644 (file)
index 0000000..b872c35
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** adclt_u64_tied1:
+**     adclt   z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (adclt_u64_tied1, svuint64_t,
+               z0 = svadclt_u64 (z0, z1, z2),
+               z0 = svadclt (z0, z1, z2))
+
+/*
+** adclt_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     adclt   z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (adclt_u64_tied2, svuint64_t,
+               z0 = svadclt_u64 (z1, z0, z2),
+               z0 = svadclt (z1, z0, z2))
+
+/*
+** adclt_u64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     adclt   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (adclt_u64_tied3, svuint64_t,
+               z0 = svadclt_u64 (z1, z2, z0),
+               z0 = svadclt (z1, z2, z0))
+
+/*
+** adclt_u64_untied:
+**     movprfx z0, z1
+**     adclt   z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (adclt_u64_untied, svuint64_t,
+               z0 = svadclt_u64 (z1, z2, z3),
+               z0 = svadclt (z1, z2, z3))
+
+/*
+** adclt_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     adclt   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (adclt_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = svadclt_n_u64 (z0, z1, x0),
+                z0 = svadclt (z0, z1, x0))
+
+/*
+** adclt_x0_u64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     adclt   z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (adclt_x0_u64_tied2, svuint64_t, uint64_t,
+                z0 = svadclt_n_u64 (z1, z0, x0),
+                z0 = svadclt (z1, z0, x0))
+
+/*
+** adclt_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     adclt   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (adclt_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = svadclt_n_u64 (z1, z2, x0),
+                z0 = svadclt (z1, z2, x0))
+
+/*
+** adclt_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     adclt   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (adclt_11_u64_tied1, svuint64_t,
+               z0 = svadclt_n_u64 (z0, z1, 11),
+               z0 = svadclt (z0, z1, 11))
+
+/*
+** adclt_11_u64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     adclt   z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (adclt_11_u64_tied2, svuint64_t,
+               z0 = svadclt_n_u64 (z1, z0, 11),
+               z0 = svadclt (z1, z0, 11))
+
+/*
+** adclt_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     adclt   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (adclt_11_u64_untied, svuint64_t,
+               z0 = svadclt_n_u64 (z1, z2, 11),
+               z0 = svadclt (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnb_s16.c
new file mode 100644 (file)
index 0000000..1dfbd2d
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addhnb_s16_tied1:
+**     addhnb  z0\.b, (z0\.h, z1\.h|z1\.h, z0\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_s16_tied1, svint8_t, svint16_t,
+                   z0_res = svaddhnb_s16 (z0, z1),
+                   z0_res = svaddhnb (z0, z1))
+
+/*
+** addhnb_s16_tied2:
+**     addhnb  z0\.b, (z0\.h, z1\.h|z1\.h, z0\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_s16_tied2, svint8_t, svint16_t,
+                   z0_res = svaddhnb_s16 (z1, z0),
+                   z0_res = svaddhnb (z1, z0))
+
+/*
+** addhnb_s16_untied:
+**     addhnb  z0\.b, (z1\.h, z2\.h|z2\.h, z1\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_s16_untied, svint8_t, svint16_t,
+                   z0_res = svaddhnb_s16 (z1, z2),
+                   z0_res = svaddhnb (z1, z2))
+
+/*
+** addhnb_w0_s16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     addhnb  z0\.b, (z0\.h, \1|\1, z0\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addhnb_w0_s16_tied1, svint8_t, svint16_t, int16_t,
+                    z0_res = svaddhnb_n_s16 (z0, x0),
+                    z0_res = svaddhnb (z0, x0))
+
+/*
+** addhnb_w0_s16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     addhnb  z0\.b, (z1\.h, \1|\1, z1\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addhnb_w0_s16_untied, svint8_t, svint16_t, int16_t,
+                    z0_res = svaddhnb_n_s16 (z1, x0),
+                    z0_res = svaddhnb (z1, x0))
+
+/*
+** addhnb_11_s16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     addhnb  z0\.b, (z0\.h, \1|\1, z0\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_11_s16_tied1, svint8_t, svint16_t,
+                   z0_res = svaddhnb_n_s16 (z0, 11),
+                   z0_res = svaddhnb (z0, 11))
+
+/*
+** addhnb_11_s16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     addhnb  z0\.b, (z1\.h, \1|\1, z1\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_11_s16_untied, svint8_t, svint16_t,
+                   z0_res = svaddhnb_n_s16 (z1, 11),
+                   z0_res = svaddhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnb_s32.c
new file mode 100644 (file)
index 0000000..44b961c
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addhnb_s32_tied1:
+**     addhnb  z0\.h, (z0\.s, z1\.s|z1\.s, z0\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_s32_tied1, svint16_t, svint32_t,
+                   z0_res = svaddhnb_s32 (z0, z1),
+                   z0_res = svaddhnb (z0, z1))
+
+/*
+** addhnb_s32_tied2:
+**     addhnb  z0\.h, (z0\.s, z1\.s|z1\.s, z0\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_s32_tied2, svint16_t, svint32_t,
+                   z0_res = svaddhnb_s32 (z1, z0),
+                   z0_res = svaddhnb (z1, z0))
+
+/*
+** addhnb_s32_untied:
+**     addhnb  z0\.h, (z1\.s, z2\.s|z2\.s, z1\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_s32_untied, svint16_t, svint32_t,
+                   z0_res = svaddhnb_s32 (z1, z2),
+                   z0_res = svaddhnb (z1, z2))
+
+/*
+** addhnb_w0_s32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     addhnb  z0\.h, (z0\.s, \1|\1, z0\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addhnb_w0_s32_tied1, svint16_t, svint32_t, int32_t,
+                    z0_res = svaddhnb_n_s32 (z0, x0),
+                    z0_res = svaddhnb (z0, x0))
+
+/*
+** addhnb_w0_s32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     addhnb  z0\.h, (z1\.s, \1|\1, z1\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addhnb_w0_s32_untied, svint16_t, svint32_t, int32_t,
+                    z0_res = svaddhnb_n_s32 (z1, x0),
+                    z0_res = svaddhnb (z1, x0))
+
+/*
+** addhnb_11_s32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     addhnb  z0\.h, (z0\.s, \1|\1, z0\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_11_s32_tied1, svint16_t, svint32_t,
+                   z0_res = svaddhnb_n_s32 (z0, 11),
+                   z0_res = svaddhnb (z0, 11))
+
+/*
+** addhnb_11_s32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     addhnb  z0\.h, (z1\.s, \1|\1, z1\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_11_s32_untied, svint16_t, svint32_t,
+                   z0_res = svaddhnb_n_s32 (z1, 11),
+                   z0_res = svaddhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnb_s64.c
new file mode 100644 (file)
index 0000000..97115c2
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addhnb_s64_tied1:
+**     addhnb  z0\.s, (z0\.d, z1\.d|z1\.d, z0\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_s64_tied1, svint32_t, svint64_t,
+                   z0_res = svaddhnb_s64 (z0, z1),
+                   z0_res = svaddhnb (z0, z1))
+
+/*
+** addhnb_s64_tied2:
+**     addhnb  z0\.s, (z0\.d, z1\.d|z1\.d, z0\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_s64_tied2, svint32_t, svint64_t,
+                   z0_res = svaddhnb_s64 (z1, z0),
+                   z0_res = svaddhnb (z1, z0))
+
+/*
+** addhnb_s64_untied:
+**     addhnb  z0\.s, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_s64_untied, svint32_t, svint64_t,
+                   z0_res = svaddhnb_s64 (z1, z2),
+                   z0_res = svaddhnb (z1, z2))
+
+/*
+** addhnb_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     addhnb  z0\.s, (z0\.d, \1|\1, z0\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addhnb_x0_s64_tied1, svint32_t, svint64_t, int64_t,
+                    z0_res = svaddhnb_n_s64 (z0, x0),
+                    z0_res = svaddhnb (z0, x0))
+
+/*
+** addhnb_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     addhnb  z0\.s, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addhnb_x0_s64_untied, svint32_t, svint64_t, int64_t,
+                    z0_res = svaddhnb_n_s64 (z1, x0),
+                    z0_res = svaddhnb (z1, x0))
+
+/*
+** addhnb_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     addhnb  z0\.s, (z0\.d, \1|\1, z0\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_11_s64_tied1, svint32_t, svint64_t,
+                   z0_res = svaddhnb_n_s64 (z0, 11),
+                   z0_res = svaddhnb (z0, 11))
+
+/*
+** addhnb_11_s64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     addhnb  z0\.s, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_11_s64_untied, svint32_t, svint64_t,
+                   z0_res = svaddhnb_n_s64 (z1, 11),
+                   z0_res = svaddhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnb_u16.c
new file mode 100644 (file)
index 0000000..dc2d12b
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addhnb_u16_tied1:
+**     addhnb  z0\.b, (z0\.h, z1\.h|z1\.h, z0\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_u16_tied1, svuint8_t, svuint16_t,
+                   z0_res = svaddhnb_u16 (z0, z1),
+                   z0_res = svaddhnb (z0, z1))
+
+/*
+** addhnb_u16_tied2:
+**     addhnb  z0\.b, (z0\.h, z1\.h|z1\.h, z0\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_u16_tied2, svuint8_t, svuint16_t,
+                   z0_res = svaddhnb_u16 (z1, z0),
+                   z0_res = svaddhnb (z1, z0))
+
+/*
+** addhnb_u16_untied:
+**     addhnb  z0\.b, (z1\.h, z2\.h|z2\.h, z1\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_u16_untied, svuint8_t, svuint16_t,
+                   z0_res = svaddhnb_u16 (z1, z2),
+                   z0_res = svaddhnb (z1, z2))
+
+/*
+** addhnb_w0_u16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     addhnb  z0\.b, (z0\.h, \1|\1, z0\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addhnb_w0_u16_tied1, svuint8_t, svuint16_t, uint16_t,
+                    z0_res = svaddhnb_n_u16 (z0, x0),
+                    z0_res = svaddhnb (z0, x0))
+
+/*
+** addhnb_w0_u16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     addhnb  z0\.b, (z1\.h, \1|\1, z1\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addhnb_w0_u16_untied, svuint8_t, svuint16_t, uint16_t,
+                    z0_res = svaddhnb_n_u16 (z1, x0),
+                    z0_res = svaddhnb (z1, x0))
+
+/*
+** addhnb_11_u16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     addhnb  z0\.b, (z0\.h, \1|\1, z0\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_11_u16_tied1, svuint8_t, svuint16_t,
+                   z0_res = svaddhnb_n_u16 (z0, 11),
+                   z0_res = svaddhnb (z0, 11))
+
+/*
+** addhnb_11_u16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     addhnb  z0\.b, (z1\.h, \1|\1, z1\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_11_u16_untied, svuint8_t, svuint16_t,
+                   z0_res = svaddhnb_n_u16 (z1, 11),
+                   z0_res = svaddhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnb_u32.c
new file mode 100644 (file)
index 0000000..ba6d3b1
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addhnb_u32_tied1:
+**     addhnb  z0\.h, (z0\.s, z1\.s|z1\.s, z0\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_u32_tied1, svuint16_t, svuint32_t,
+                   z0_res = svaddhnb_u32 (z0, z1),
+                   z0_res = svaddhnb (z0, z1))
+
+/*
+** addhnb_u32_tied2:
+**     addhnb  z0\.h, (z0\.s, z1\.s|z1\.s, z0\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_u32_tied2, svuint16_t, svuint32_t,
+                   z0_res = svaddhnb_u32 (z1, z0),
+                   z0_res = svaddhnb (z1, z0))
+
+/*
+** addhnb_u32_untied:
+**     addhnb  z0\.h, (z1\.s, z2\.s|z2\.s, z1\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_u32_untied, svuint16_t, svuint32_t,
+                   z0_res = svaddhnb_u32 (z1, z2),
+                   z0_res = svaddhnb (z1, z2))
+
+/*
+** addhnb_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     addhnb  z0\.h, (z0\.s, \1|\1, z0\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addhnb_w0_u32_tied1, svuint16_t, svuint32_t, uint32_t,
+                    z0_res = svaddhnb_n_u32 (z0, x0),
+                    z0_res = svaddhnb (z0, x0))
+
+/*
+** addhnb_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     addhnb  z0\.h, (z1\.s, \1|\1, z1\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addhnb_w0_u32_untied, svuint16_t, svuint32_t, uint32_t,
+                    z0_res = svaddhnb_n_u32 (z1, x0),
+                    z0_res = svaddhnb (z1, x0))
+
+/*
+** addhnb_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     addhnb  z0\.h, (z0\.s, \1|\1, z0\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_11_u32_tied1, svuint16_t, svuint32_t,
+                   z0_res = svaddhnb_n_u32 (z0, 11),
+                   z0_res = svaddhnb (z0, 11))
+
+/*
+** addhnb_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     addhnb  z0\.h, (z1\.s, \1|\1, z1\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_11_u32_untied, svuint16_t, svuint32_t,
+                   z0_res = svaddhnb_n_u32 (z1, 11),
+                   z0_res = svaddhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnb_u64.c
new file mode 100644 (file)
index 0000000..7baa314
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addhnb_u64_tied1:
+**     addhnb  z0\.s, (z0\.d, z1\.d|z1\.d, z0\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_u64_tied1, svuint32_t, svuint64_t,
+                   z0_res = svaddhnb_u64 (z0, z1),
+                   z0_res = svaddhnb (z0, z1))
+
+/*
+** addhnb_u64_tied2:
+**     addhnb  z0\.s, (z0\.d, z1\.d|z1\.d, z0\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_u64_tied2, svuint32_t, svuint64_t,
+                   z0_res = svaddhnb_u64 (z1, z0),
+                   z0_res = svaddhnb (z1, z0))
+
+/*
+** addhnb_u64_untied:
+**     addhnb  z0\.s, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_u64_untied, svuint32_t, svuint64_t,
+                   z0_res = svaddhnb_u64 (z1, z2),
+                   z0_res = svaddhnb (z1, z2))
+
+/*
+** addhnb_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     addhnb  z0\.s, (z0\.d, \1|\1, z0\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addhnb_x0_u64_tied1, svuint32_t, svuint64_t, uint64_t,
+                    z0_res = svaddhnb_n_u64 (z0, x0),
+                    z0_res = svaddhnb (z0, x0))
+
+/*
+** addhnb_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     addhnb  z0\.s, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addhnb_x0_u64_untied, svuint32_t, svuint64_t, uint64_t,
+                    z0_res = svaddhnb_n_u64 (z1, x0),
+                    z0_res = svaddhnb (z1, x0))
+
+/*
+** addhnb_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     addhnb  z0\.s, (z0\.d, \1|\1, z0\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_11_u64_tied1, svuint32_t, svuint64_t,
+                   z0_res = svaddhnb_n_u64 (z0, 11),
+                   z0_res = svaddhnb (z0, 11))
+
+/*
+** addhnb_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     addhnb  z0\.s, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addhnb_11_u64_untied, svuint32_t, svuint64_t,
+                   z0_res = svaddhnb_n_u64 (z1, 11),
+                   z0_res = svaddhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnt_s16.c
new file mode 100644 (file)
index 0000000..79909ad
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addhnt_s16_tied1:
+**     addhnt  z0\.b, (z4\.h, z5\.h|z5\.h, z4\.h)
+**     ret
+*/
+TEST_DUAL_Z (addhnt_s16_tied1, svint8_t, svint16_t,
+            z0 = svaddhnt_s16 (z0, z4, z5),
+            z0 = svaddhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (addhnt_s16_tied2, svint8_t, svint16_t,
+                z0_res = svaddhnt_s16 (z4, z0, z1),
+                z0_res = svaddhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (addhnt_s16_tied3, svint8_t, svint16_t,
+                z0_res = svaddhnt_s16 (z4, z1, z0),
+                z0_res = svaddhnt (z4, z1, z0))
+
+/*
+** addhnt_s16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     addhnt  z0\.b, (z4\.h, z5\.h|z5\.h, z4\.h)
+** |
+**     addhnt  z1\.b, (z4\.h, z5\.h|z5\.h, z4\.h)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (addhnt_s16_untied, svint8_t, svint16_t,
+            z0 = svaddhnt_s16 (z1, z4, z5),
+            z0 = svaddhnt (z1, z4, z5))
+
+/*
+** addhnt_w0_s16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     addhnt  z0\.b, (z4\.h, \1|\1, z4\.h)
+**     ret
+*/
+TEST_DUAL_ZX (addhnt_w0_s16_tied1, svint8_t, svint16_t, int16_t,
+             z0 = svaddhnt_n_s16 (z0, z4, x0),
+             z0 = svaddhnt (z0, z4, x0))
+
+/*
+** addhnt_w0_s16_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     mov     z0\.d, z1\.d
+**     addhnt  z0\.b, (z4\.h, \1|\1, z4\.h)
+** |
+**     addhnt  z1\.b, (z4\.h, \1|\1, z4\.h)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (addhnt_w0_s16_untied, svint8_t, svint16_t, int16_t,
+             z0 = svaddhnt_n_s16 (z1, z4, x0),
+             z0 = svaddhnt (z1, z4, x0))
+
+/*
+** addhnt_11_s16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     addhnt  z0\.b, (z4\.h, \1|\1, z4\.h)
+**     ret
+*/
+TEST_DUAL_Z (addhnt_11_s16_tied1, svint8_t, svint16_t,
+            z0 = svaddhnt_n_s16 (z0, z4, 11),
+            z0 = svaddhnt (z0, z4, 11))
+
+/*
+** addhnt_11_s16_untied:
+**     mov     (z[0-9]+\.h), #11
+** (
+**     mov     z0\.d, z1\.d
+**     addhnt  z0\.b, (z4\.h, \1|\1, z4\.h)
+** |
+**     addhnt  z1\.b, (z4\.h, \1|\1, z4\.h)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (addhnt_11_s16_untied, svint8_t, svint16_t,
+            z0 = svaddhnt_n_s16 (z1, z4, 11),
+            z0 = svaddhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnt_s32.c
new file mode 100644 (file)
index 0000000..07e75a1
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addhnt_s32_tied1:
+**     addhnt  z0\.h, (z4\.s, z5\.s|z5\.s, z4\.s)
+**     ret
+*/
+TEST_DUAL_Z (addhnt_s32_tied1, svint16_t, svint32_t,
+            z0 = svaddhnt_s32 (z0, z4, z5),
+            z0 = svaddhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (addhnt_s32_tied2, svint16_t, svint32_t,
+                z0_res = svaddhnt_s32 (z4, z0, z1),
+                z0_res = svaddhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (addhnt_s32_tied3, svint16_t, svint32_t,
+                z0_res = svaddhnt_s32 (z4, z1, z0),
+                z0_res = svaddhnt (z4, z1, z0))
+
+/*
+** addhnt_s32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     addhnt  z0\.h, (z4\.s, z5\.s|z5\.s, z4\.s)
+** |
+**     addhnt  z1\.h, (z4\.s, z5\.s|z5\.s, z4\.s)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (addhnt_s32_untied, svint16_t, svint32_t,
+            z0 = svaddhnt_s32 (z1, z4, z5),
+            z0 = svaddhnt (z1, z4, z5))
+
+/*
+** addhnt_w0_s32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     addhnt  z0\.h, (z4\.s, \1|\1, z4\.s)
+**     ret
+*/
+TEST_DUAL_ZX (addhnt_w0_s32_tied1, svint16_t, svint32_t, int32_t,
+             z0 = svaddhnt_n_s32 (z0, z4, x0),
+             z0 = svaddhnt (z0, z4, x0))
+
+/*
+** addhnt_w0_s32_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     mov     z0\.d, z1\.d
+**     addhnt  z0\.h, (z4\.s, \1|\1, z4\.s)
+** |
+**     addhnt  z1\.h, (z4\.s, \1|\1, z4\.s)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (addhnt_w0_s32_untied, svint16_t, svint32_t, int32_t,
+             z0 = svaddhnt_n_s32 (z1, z4, x0),
+             z0 = svaddhnt (z1, z4, x0))
+
+/*
+** addhnt_11_s32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     addhnt  z0\.h, (z4\.s, \1|\1, z4\.s)
+**     ret
+*/
+TEST_DUAL_Z (addhnt_11_s32_tied1, svint16_t, svint32_t,
+            z0 = svaddhnt_n_s32 (z0, z4, 11),
+            z0 = svaddhnt (z0, z4, 11))
+
+/*
+** addhnt_11_s32_untied:
+**     mov     (z[0-9]+\.s), #11
+** (
+**     mov     z0\.d, z1\.d
+**     addhnt  z0\.h, (z4\.s, \1|\1, z4\.s)
+** |
+**     addhnt  z1\.h, (z4\.s, \1|\1, z4\.s)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (addhnt_11_s32_untied, svint16_t, svint32_t,
+            z0 = svaddhnt_n_s32 (z1, z4, 11),
+            z0 = svaddhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnt_s64.c
new file mode 100644 (file)
index 0000000..84984a9
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addhnt_s64_tied1:
+**     addhnt  z0\.s, (z4\.d, z5\.d|z5\.d, z4\.d)
+**     ret
+*/
+TEST_DUAL_Z (addhnt_s64_tied1, svint32_t, svint64_t,
+            z0 = svaddhnt_s64 (z0, z4, z5),
+            z0 = svaddhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (addhnt_s64_tied2, svint32_t, svint64_t,
+                z0_res = svaddhnt_s64 (z4, z0, z1),
+                z0_res = svaddhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (addhnt_s64_tied3, svint32_t, svint64_t,
+                z0_res = svaddhnt_s64 (z4, z1, z0),
+                z0_res = svaddhnt (z4, z1, z0))
+
+/*
+** addhnt_s64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     addhnt  z0\.s, (z4\.d, z5\.d|z5\.d, z4\.d)
+** |
+**     addhnt  z1\.s, (z4\.d, z5\.d|z5\.d, z4\.d)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (addhnt_s64_untied, svint32_t, svint64_t,
+            z0 = svaddhnt_s64 (z1, z4, z5),
+            z0 = svaddhnt (z1, z4, z5))
+
+/*
+** addhnt_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     addhnt  z0\.s, (z4\.d, \1|\1, z4\.d)
+**     ret
+*/
+TEST_DUAL_ZX (addhnt_x0_s64_tied1, svint32_t, svint64_t, int64_t,
+             z0 = svaddhnt_n_s64 (z0, z4, x0),
+             z0 = svaddhnt (z0, z4, x0))
+
+/*
+** addhnt_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     mov     z0\.d, z1\.d
+**     addhnt  z0\.s, (z4\.d, \1|\1, z4\.d)
+** |
+**     addhnt  z1\.s, (z4\.d, \1|\1, z4\.d)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (addhnt_x0_s64_untied, svint32_t, svint64_t, int64_t,
+             z0 = svaddhnt_n_s64 (z1, z4, x0),
+             z0 = svaddhnt (z1, z4, x0))
+
+/*
+** addhnt_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     addhnt  z0\.s, (z4\.d, \1|\1, z4\.d)
+**     ret
+*/
+TEST_DUAL_Z (addhnt_11_s64_tied1, svint32_t, svint64_t,
+            z0 = svaddhnt_n_s64 (z0, z4, 11),
+            z0 = svaddhnt (z0, z4, 11))
+
+/*
+** addhnt_11_s64_untied:
+**     mov     (z[0-9]+\.d), #11
+** (
+**     mov     z0\.d, z1\.d
+**     addhnt  z0\.s, (z4\.d, \1|\1, z4\.d)
+** |
+**     addhnt  z1\.s, (z4\.d, \1|\1, z4\.d)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (addhnt_11_s64_untied, svint32_t, svint64_t,
+            z0 = svaddhnt_n_s64 (z1, z4, 11),
+            z0 = svaddhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnt_u16.c
new file mode 100644 (file)
index 0000000..a05d79f
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addhnt_u16_tied1:
+**     addhnt  z0\.b, (z4\.h, z5\.h|z5\.h, z4\.h)
+**     ret
+*/
+TEST_DUAL_Z (addhnt_u16_tied1, svuint8_t, svuint16_t,
+            z0 = svaddhnt_u16 (z0, z4, z5),
+            z0 = svaddhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (addhnt_u16_tied2, svuint8_t, svuint16_t,
+                z0_res = svaddhnt_u16 (z4, z0, z1),
+                z0_res = svaddhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (addhnt_u16_tied3, svuint8_t, svuint16_t,
+                z0_res = svaddhnt_u16 (z4, z1, z0),
+                z0_res = svaddhnt (z4, z1, z0))
+
+/*
+** addhnt_u16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     addhnt  z0\.b, (z4\.h, z5\.h|z5\.h, z4\.h)
+** |
+**     addhnt  z1\.b, (z4\.h, z5\.h|z5\.h, z4\.h)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (addhnt_u16_untied, svuint8_t, svuint16_t,
+            z0 = svaddhnt_u16 (z1, z4, z5),
+            z0 = svaddhnt (z1, z4, z5))
+
+/*
+** addhnt_w0_u16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     addhnt  z0\.b, (z4\.h, \1|\1, z4\.h)
+**     ret
+*/
+TEST_DUAL_ZX (addhnt_w0_u16_tied1, svuint8_t, svuint16_t, uint16_t,
+             z0 = svaddhnt_n_u16 (z0, z4, x0),
+             z0 = svaddhnt (z0, z4, x0))
+
+/*
+** addhnt_w0_u16_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     mov     z0\.d, z1\.d
+**     addhnt  z0\.b, (z4\.h, \1|\1, z4\.h)
+** |
+**     addhnt  z1\.b, (z4\.h, \1|\1, z4\.h)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (addhnt_w0_u16_untied, svuint8_t, svuint16_t, uint16_t,
+             z0 = svaddhnt_n_u16 (z1, z4, x0),
+             z0 = svaddhnt (z1, z4, x0))
+
+/*
+** addhnt_11_u16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     addhnt  z0\.b, (z4\.h, \1|\1, z4\.h)
+**     ret
+*/
+TEST_DUAL_Z (addhnt_11_u16_tied1, svuint8_t, svuint16_t,
+            z0 = svaddhnt_n_u16 (z0, z4, 11),
+            z0 = svaddhnt (z0, z4, 11))
+
+/*
+** addhnt_11_u16_untied:
+**     mov     (z[0-9]+\.h), #11
+** (
+**     mov     z0\.d, z1\.d
+**     addhnt  z0\.b, (z4\.h, \1|\1, z4\.h)
+** |
+**     addhnt  z1\.b, (z4\.h, \1|\1, z4\.h)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (addhnt_11_u16_untied, svuint8_t, svuint16_t,
+            z0 = svaddhnt_n_u16 (z1, z4, 11),
+            z0 = svaddhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnt_u32.c
new file mode 100644 (file)
index 0000000..b2249a7
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addhnt_u32_tied1:
+**     addhnt  z0\.h, (z4\.s, z5\.s|z5\.s, z4\.s)
+**     ret
+*/
+TEST_DUAL_Z (addhnt_u32_tied1, svuint16_t, svuint32_t,
+            z0 = svaddhnt_u32 (z0, z4, z5),
+            z0 = svaddhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (addhnt_u32_tied2, svuint16_t, svuint32_t,
+                z0_res = svaddhnt_u32 (z4, z0, z1),
+                z0_res = svaddhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (addhnt_u32_tied3, svuint16_t, svuint32_t,
+                z0_res = svaddhnt_u32 (z4, z1, z0),
+                z0_res = svaddhnt (z4, z1, z0))
+
+/*
+** addhnt_u32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     addhnt  z0\.h, (z4\.s, z5\.s|z5\.s, z4\.s)
+** |
+**     addhnt  z1\.h, (z4\.s, z5\.s|z5\.s, z4\.s)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (addhnt_u32_untied, svuint16_t, svuint32_t,
+            z0 = svaddhnt_u32 (z1, z4, z5),
+            z0 = svaddhnt (z1, z4, z5))
+
+/*
+** addhnt_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     addhnt  z0\.h, (z4\.s, \1|\1, z4\.s)
+**     ret
+*/
+TEST_DUAL_ZX (addhnt_w0_u32_tied1, svuint16_t, svuint32_t, uint32_t,
+             z0 = svaddhnt_n_u32 (z0, z4, x0),
+             z0 = svaddhnt (z0, z4, x0))
+
+/*
+** addhnt_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     mov     z0\.d, z1\.d
+**     addhnt  z0\.h, (z4\.s, \1|\1, z4\.s)
+** |
+**     addhnt  z1\.h, (z4\.s, \1|\1, z4\.s)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (addhnt_w0_u32_untied, svuint16_t, svuint32_t, uint32_t,
+             z0 = svaddhnt_n_u32 (z1, z4, x0),
+             z0 = svaddhnt (z1, z4, x0))
+
+/*
+** addhnt_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     addhnt  z0\.h, (z4\.s, \1|\1, z4\.s)
+**     ret
+*/
+TEST_DUAL_Z (addhnt_11_u32_tied1, svuint16_t, svuint32_t,
+            z0 = svaddhnt_n_u32 (z0, z4, 11),
+            z0 = svaddhnt (z0, z4, 11))
+
+/*
+** addhnt_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+** (
+**     mov     z0\.d, z1\.d
+**     addhnt  z0\.h, (z4\.s, \1|\1, z4\.s)
+** |
+**     addhnt  z1\.h, (z4\.s, \1|\1, z4\.s)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (addhnt_11_u32_untied, svuint16_t, svuint32_t,
+            z0 = svaddhnt_n_u32 (z1, z4, 11),
+            z0 = svaddhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addhnt_u64.c
new file mode 100644 (file)
index 0000000..c1c01b5
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addhnt_u64_tied1:
+**     addhnt  z0\.s, (z4\.d, z5\.d|z5\.d, z4\.d)
+**     ret
+*/
+TEST_DUAL_Z (addhnt_u64_tied1, svuint32_t, svuint64_t,
+            z0 = svaddhnt_u64 (z0, z4, z5),
+            z0 = svaddhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (addhnt_u64_tied2, svuint32_t, svuint64_t,
+                z0_res = svaddhnt_u64 (z4, z0, z1),
+                z0_res = svaddhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (addhnt_u64_tied3, svuint32_t, svuint64_t,
+                z0_res = svaddhnt_u64 (z4, z1, z0),
+                z0_res = svaddhnt (z4, z1, z0))
+
+/*
+** addhnt_u64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     addhnt  z0\.s, (z4\.d, z5\.d|z5\.d, z4\.d)
+** |
+**     addhnt  z1\.s, (z4\.d, z5\.d|z5\.d, z4\.d)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (addhnt_u64_untied, svuint32_t, svuint64_t,
+            z0 = svaddhnt_u64 (z1, z4, z5),
+            z0 = svaddhnt (z1, z4, z5))
+
+/*
+** addhnt_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     addhnt  z0\.s, (z4\.d, \1|\1, z4\.d)
+**     ret
+*/
+TEST_DUAL_ZX (addhnt_x0_u64_tied1, svuint32_t, svuint64_t, uint64_t,
+             z0 = svaddhnt_n_u64 (z0, z4, x0),
+             z0 = svaddhnt (z0, z4, x0))
+
+/*
+** addhnt_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     mov     z0\.d, z1\.d
+**     addhnt  z0\.s, (z4\.d, \1|\1, z4\.d)
+** |
+**     addhnt  z1\.s, (z4\.d, \1|\1, z4\.d)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (addhnt_x0_u64_untied, svuint32_t, svuint64_t, uint64_t,
+             z0 = svaddhnt_n_u64 (z1, z4, x0),
+             z0 = svaddhnt (z1, z4, x0))
+
+/*
+** addhnt_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     addhnt  z0\.s, (z4\.d, \1|\1, z4\.d)
+**     ret
+*/
+TEST_DUAL_Z (addhnt_11_u64_tied1, svuint32_t, svuint64_t,
+            z0 = svaddhnt_n_u64 (z0, z4, 11),
+            z0 = svaddhnt (z0, z4, 11))
+
+/*
+** addhnt_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+** (
+**     mov     z0\.d, z1\.d
+**     addhnt  z0\.s, (z4\.d, \1|\1, z4\.d)
+** |
+**     addhnt  z1\.s, (z4\.d, \1|\1, z4\.d)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (addhnt_11_u64_untied, svuint32_t, svuint64_t,
+            z0 = svaddhnt_n_u64 (z1, z4, 11),
+            z0 = svaddhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlb_s16.c
new file mode 100644 (file)
index 0000000..1288dc7
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addlb_s16_tied1:
+**     saddlb  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svaddlb_s16 (z0, z1),
+                   z0_res = svaddlb (z0, z1))
+
+/*
+** addlb_s16_tied2:
+**     saddlb  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_s16_tied2, svint16_t, svint8_t,
+                   z0_res = svaddlb_s16 (z1, z0),
+                   z0_res = svaddlb (z1, z0))
+
+/*
+** addlb_s16_untied:
+**     saddlb  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_s16_untied, svint16_t, svint8_t,
+                   z0_res = svaddlb_s16 (z1, z2),
+                   z0_res = svaddlb (z1, z2))
+
+/*
+** addlb_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     saddlb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlb_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+                    z0_res = svaddlb_n_s16 (z0, x0),
+                    z0_res = svaddlb (z0, x0))
+
+/*
+** addlb_w0_s16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     saddlb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlb_w0_s16_untied, svint16_t, svint8_t, int8_t,
+                    z0_res = svaddlb_n_s16 (z1, x0),
+                    z0_res = svaddlb (z1, x0))
+
+/*
+** addlb_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     saddlb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_11_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svaddlb_n_s16 (z0, 11),
+                   z0_res = svaddlb (z0, 11))
+
+/*
+** addlb_11_s16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     saddlb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_11_s16_untied, svint16_t, svint8_t,
+                   z0_res = svaddlb_n_s16 (z1, 11),
+                   z0_res = svaddlb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlb_s32.c
new file mode 100644 (file)
index 0000000..feb7aa7
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addlb_s32_tied1:
+**     saddlb  z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svaddlb_s32 (z0, z1),
+                   z0_res = svaddlb (z0, z1))
+
+/*
+** addlb_s32_tied2:
+**     saddlb  z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_s32_tied2, svint32_t, svint16_t,
+                   z0_res = svaddlb_s32 (z1, z0),
+                   z0_res = svaddlb (z1, z0))
+
+/*
+** addlb_s32_untied:
+**     saddlb  z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_s32_untied, svint32_t, svint16_t,
+                   z0_res = svaddlb_s32 (z1, z2),
+                   z0_res = svaddlb (z1, z2))
+
+/*
+** addlb_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     saddlb  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlb_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+                    z0_res = svaddlb_n_s32 (z0, x0),
+                    z0_res = svaddlb (z0, x0))
+
+/*
+** addlb_w0_s32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     saddlb  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlb_w0_s32_untied, svint32_t, svint16_t, int16_t,
+                    z0_res = svaddlb_n_s32 (z1, x0),
+                    z0_res = svaddlb (z1, x0))
+
+/*
+** addlb_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     saddlb  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_11_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svaddlb_n_s32 (z0, 11),
+                   z0_res = svaddlb (z0, 11))
+
+/*
+** addlb_11_s32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     saddlb  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_11_s32_untied, svint32_t, svint16_t,
+                   z0_res = svaddlb_n_s32 (z1, 11),
+                   z0_res = svaddlb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlb_s64.c
new file mode 100644 (file)
index 0000000..a37c340
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addlb_s64_tied1:
+**     saddlb  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svaddlb_s64 (z0, z1),
+                   z0_res = svaddlb (z0, z1))
+
+/*
+** addlb_s64_tied2:
+**     saddlb  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_s64_tied2, svint64_t, svint32_t,
+                   z0_res = svaddlb_s64 (z1, z0),
+                   z0_res = svaddlb (z1, z0))
+
+/*
+** addlb_s64_untied:
+**     saddlb  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_s64_untied, svint64_t, svint32_t,
+                   z0_res = svaddlb_s64 (z1, z2),
+                   z0_res = svaddlb (z1, z2))
+
+/*
+** addlb_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     saddlb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlb_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+                    z0_res = svaddlb_n_s64 (z0, x0),
+                    z0_res = svaddlb (z0, x0))
+
+/*
+** addlb_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     saddlb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlb_w0_s64_untied, svint64_t, svint32_t, int32_t,
+                    z0_res = svaddlb_n_s64 (z1, x0),
+                    z0_res = svaddlb (z1, x0))
+
+/*
+** addlb_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     saddlb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_11_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svaddlb_n_s64 (z0, 11),
+                   z0_res = svaddlb (z0, 11))
+
+/*
+** addlb_11_s64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     saddlb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_11_s64_untied, svint64_t, svint32_t,
+                   z0_res = svaddlb_n_s64 (z1, 11),
+                   z0_res = svaddlb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlb_u16.c
new file mode 100644 (file)
index 0000000..92cb58e
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addlb_u16_tied1:
+**     uaddlb  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svaddlb_u16 (z0, z1),
+                   z0_res = svaddlb (z0, z1))
+
+/*
+** addlb_u16_tied2:
+**     uaddlb  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_u16_tied2, svuint16_t, svuint8_t,
+                   z0_res = svaddlb_u16 (z1, z0),
+                   z0_res = svaddlb (z1, z0))
+
+/*
+** addlb_u16_untied:
+**     uaddlb  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svaddlb_u16 (z1, z2),
+                   z0_res = svaddlb (z1, z2))
+
+/*
+** addlb_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uaddlb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlb_w0_u16_tied1, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svaddlb_n_u16 (z0, x0),
+                    z0_res = svaddlb (z0, x0))
+
+/*
+** addlb_w0_u16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     uaddlb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlb_w0_u16_untied, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svaddlb_n_u16 (z1, x0),
+                    z0_res = svaddlb (z1, x0))
+
+/*
+** addlb_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     uaddlb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_11_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svaddlb_n_u16 (z0, 11),
+                   z0_res = svaddlb (z0, 11))
+
+/*
+** addlb_11_u16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     uaddlb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_11_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svaddlb_n_u16 (z1, 11),
+                   z0_res = svaddlb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlb_u32.c
new file mode 100644 (file)
index 0000000..0bd2eac
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addlb_u32_tied1:
+**     uaddlb  z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svaddlb_u32 (z0, z1),
+                   z0_res = svaddlb (z0, z1))
+
+/*
+** addlb_u32_tied2:
+**     uaddlb  z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_u32_tied2, svuint32_t, svuint16_t,
+                   z0_res = svaddlb_u32 (z1, z0),
+                   z0_res = svaddlb (z1, z0))
+
+/*
+** addlb_u32_untied:
+**     uaddlb  z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svaddlb_u32 (z1, z2),
+                   z0_res = svaddlb (z1, z2))
+
+/*
+** addlb_w0_u32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uaddlb  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlb_w0_u32_tied1, svuint32_t, svuint16_t, uint16_t,
+                    z0_res = svaddlb_n_u32 (z0, x0),
+                    z0_res = svaddlb (z0, x0))
+
+/*
+** addlb_w0_u32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     uaddlb  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlb_w0_u32_untied, svuint32_t, svuint16_t, uint16_t,
+                    z0_res = svaddlb_n_u32 (z1, x0),
+                    z0_res = svaddlb (z1, x0))
+
+/*
+** addlb_11_u32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     uaddlb  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_11_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svaddlb_n_u32 (z0, 11),
+                   z0_res = svaddlb (z0, 11))
+
+/*
+** addlb_11_u32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     uaddlb  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_11_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svaddlb_n_u32 (z1, 11),
+                   z0_res = svaddlb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlb_u64.c
new file mode 100644 (file)
index 0000000..758d3e0
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addlb_u64_tied1:
+**     uaddlb  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svaddlb_u64 (z0, z1),
+                   z0_res = svaddlb (z0, z1))
+
+/*
+** addlb_u64_tied2:
+**     uaddlb  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_u64_tied2, svuint64_t, svuint32_t,
+                   z0_res = svaddlb_u64 (z1, z0),
+                   z0_res = svaddlb (z1, z0))
+
+/*
+** addlb_u64_untied:
+**     uaddlb  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svaddlb_u64 (z1, z2),
+                   z0_res = svaddlb (z1, z2))
+
+/*
+** addlb_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uaddlb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlb_w0_u64_tied1, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svaddlb_n_u64 (z0, x0),
+                    z0_res = svaddlb (z0, x0))
+
+/*
+** addlb_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     uaddlb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlb_w0_u64_untied, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svaddlb_n_u64 (z1, x0),
+                    z0_res = svaddlb (z1, x0))
+
+/*
+** addlb_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     uaddlb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_11_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svaddlb_n_u64 (z0, 11),
+                   z0_res = svaddlb (z0, 11))
+
+/*
+** addlb_11_u64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     uaddlb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlb_11_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svaddlb_n_u64 (z1, 11),
+                   z0_res = svaddlb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlbt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlbt_s16.c
new file mode 100644 (file)
index 0000000..c6bc5ea
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addlbt_s16_tied1:
+**     saddlbt z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlbt_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svaddlbt_s16 (z0, z1),
+                   z0_res = svaddlbt (z0, z1))
+
+/*
+** addlbt_s16_tied2:
+**     saddlbt z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlbt_s16_tied2, svint16_t, svint8_t,
+                   z0_res = svaddlbt_s16 (z1, z0),
+                   z0_res = svaddlbt (z1, z0))
+
+/*
+** addlbt_s16_untied:
+**     saddlbt z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlbt_s16_untied, svint16_t, svint8_t,
+                   z0_res = svaddlbt_s16 (z1, z2),
+                   z0_res = svaddlbt (z1, z2))
+
+/*
+** addlbt_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     saddlbt z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlbt_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+                    z0_res = svaddlbt_n_s16 (z0, x0),
+                    z0_res = svaddlbt (z0, x0))
+
+/*
+** addlbt_w0_s16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     saddlbt z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlbt_w0_s16_untied, svint16_t, svint8_t, int8_t,
+                    z0_res = svaddlbt_n_s16 (z1, x0),
+                    z0_res = svaddlbt (z1, x0))
+
+/*
+** addlbt_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     saddlbt z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlbt_11_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svaddlbt_n_s16 (z0, 11),
+                   z0_res = svaddlbt (z0, 11))
+
+/*
+** addlbt_11_s16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     saddlbt z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlbt_11_s16_untied, svint16_t, svint8_t,
+                   z0_res = svaddlbt_n_s16 (z1, 11),
+                   z0_res = svaddlbt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlbt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlbt_s32.c
new file mode 100644 (file)
index 0000000..c37271a
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addlbt_s32_tied1:
+**     saddlbt z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlbt_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svaddlbt_s32 (z0, z1),
+                   z0_res = svaddlbt (z0, z1))
+
+/*
+** addlbt_s32_tied2:
+**     saddlbt z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlbt_s32_tied2, svint32_t, svint16_t,
+                   z0_res = svaddlbt_s32 (z1, z0),
+                   z0_res = svaddlbt (z1, z0))
+
+/*
+** addlbt_s32_untied:
+**     saddlbt z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlbt_s32_untied, svint32_t, svint16_t,
+                   z0_res = svaddlbt_s32 (z1, z2),
+                   z0_res = svaddlbt (z1, z2))
+
+/*
+** addlbt_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     saddlbt z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlbt_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+                    z0_res = svaddlbt_n_s32 (z0, x0),
+                    z0_res = svaddlbt (z0, x0))
+
+/*
+** addlbt_w0_s32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     saddlbt z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlbt_w0_s32_untied, svint32_t, svint16_t, int16_t,
+                    z0_res = svaddlbt_n_s32 (z1, x0),
+                    z0_res = svaddlbt (z1, x0))
+
+/*
+** addlbt_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     saddlbt z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlbt_11_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svaddlbt_n_s32 (z0, 11),
+                   z0_res = svaddlbt (z0, 11))
+
+/*
+** addlbt_11_s32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     saddlbt z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlbt_11_s32_untied, svint32_t, svint16_t,
+                   z0_res = svaddlbt_n_s32 (z1, 11),
+                   z0_res = svaddlbt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlbt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlbt_s64.c
new file mode 100644 (file)
index 0000000..4db9c9f
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addlbt_s64_tied1:
+**     saddlbt z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlbt_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svaddlbt_s64 (z0, z1),
+                   z0_res = svaddlbt (z0, z1))
+
+/*
+** addlbt_s64_tied2:
+**     saddlbt z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlbt_s64_tied2, svint64_t, svint32_t,
+                   z0_res = svaddlbt_s64 (z1, z0),
+                   z0_res = svaddlbt (z1, z0))
+
+/*
+** addlbt_s64_untied:
+**     saddlbt z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlbt_s64_untied, svint64_t, svint32_t,
+                   z0_res = svaddlbt_s64 (z1, z2),
+                   z0_res = svaddlbt (z1, z2))
+
+/*
+** addlbt_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     saddlbt z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlbt_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+                    z0_res = svaddlbt_n_s64 (z0, x0),
+                    z0_res = svaddlbt (z0, x0))
+
+/*
+** addlbt_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     saddlbt z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlbt_w0_s64_untied, svint64_t, svint32_t, int32_t,
+                    z0_res = svaddlbt_n_s64 (z1, x0),
+                    z0_res = svaddlbt (z1, x0))
+
+/*
+** addlbt_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     saddlbt z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlbt_11_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svaddlbt_n_s64 (z0, 11),
+                   z0_res = svaddlbt (z0, 11))
+
+/*
+** addlbt_11_s64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     saddlbt z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlbt_11_s64_untied, svint64_t, svint32_t,
+                   z0_res = svaddlbt_n_s64 (z1, 11),
+                   z0_res = svaddlbt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlt_s16.c
new file mode 100644 (file)
index 0000000..f585c86
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addlt_s16_tied1:
+**     saddlt  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svaddlt_s16 (z0, z1),
+                   z0_res = svaddlt (z0, z1))
+
+/*
+** addlt_s16_tied2:
+**     saddlt  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_s16_tied2, svint16_t, svint8_t,
+                   z0_res = svaddlt_s16 (z1, z0),
+                   z0_res = svaddlt (z1, z0))
+
+/*
+** addlt_s16_untied:
+**     saddlt  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_s16_untied, svint16_t, svint8_t,
+                   z0_res = svaddlt_s16 (z1, z2),
+                   z0_res = svaddlt (z1, z2))
+
+/*
+** addlt_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     saddlt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlt_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+                    z0_res = svaddlt_n_s16 (z0, x0),
+                    z0_res = svaddlt (z0, x0))
+
+/*
+** addlt_w0_s16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     saddlt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlt_w0_s16_untied, svint16_t, svint8_t, int8_t,
+                    z0_res = svaddlt_n_s16 (z1, x0),
+                    z0_res = svaddlt (z1, x0))
+
+/*
+** addlt_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     saddlt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_11_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svaddlt_n_s16 (z0, 11),
+                   z0_res = svaddlt (z0, 11))
+
+/*
+** addlt_11_s16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     saddlt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_11_s16_untied, svint16_t, svint8_t,
+                   z0_res = svaddlt_n_s16 (z1, 11),
+                   z0_res = svaddlt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlt_s32.c
new file mode 100644 (file)
index 0000000..1669933
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addlt_s32_tied1:
+**     saddlt  z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svaddlt_s32 (z0, z1),
+                   z0_res = svaddlt (z0, z1))
+
+/*
+** addlt_s32_tied2:
+**     saddlt  z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_s32_tied2, svint32_t, svint16_t,
+                   z0_res = svaddlt_s32 (z1, z0),
+                   z0_res = svaddlt (z1, z0))
+
+/*
+** addlt_s32_untied:
+**     saddlt  z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_s32_untied, svint32_t, svint16_t,
+                   z0_res = svaddlt_s32 (z1, z2),
+                   z0_res = svaddlt (z1, z2))
+
+/*
+** addlt_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     saddlt  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlt_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+                    z0_res = svaddlt_n_s32 (z0, x0),
+                    z0_res = svaddlt (z0, x0))
+
+/*
+** addlt_w0_s32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     saddlt  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlt_w0_s32_untied, svint32_t, svint16_t, int16_t,
+                    z0_res = svaddlt_n_s32 (z1, x0),
+                    z0_res = svaddlt (z1, x0))
+
+/*
+** addlt_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     saddlt  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_11_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svaddlt_n_s32 (z0, 11),
+                   z0_res = svaddlt (z0, 11))
+
+/*
+** addlt_11_s32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     saddlt  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_11_s32_untied, svint32_t, svint16_t,
+                   z0_res = svaddlt_n_s32 (z1, 11),
+                   z0_res = svaddlt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlt_s64.c
new file mode 100644 (file)
index 0000000..3f0c78a
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addlt_s64_tied1:
+**     saddlt  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svaddlt_s64 (z0, z1),
+                   z0_res = svaddlt (z0, z1))
+
+/*
+** addlt_s64_tied2:
+**     saddlt  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_s64_tied2, svint64_t, svint32_t,
+                   z0_res = svaddlt_s64 (z1, z0),
+                   z0_res = svaddlt (z1, z0))
+
+/*
+** addlt_s64_untied:
+**     saddlt  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_s64_untied, svint64_t, svint32_t,
+                   z0_res = svaddlt_s64 (z1, z2),
+                   z0_res = svaddlt (z1, z2))
+
+/*
+** addlt_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     saddlt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlt_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+                    z0_res = svaddlt_n_s64 (z0, x0),
+                    z0_res = svaddlt (z0, x0))
+
+/*
+** addlt_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     saddlt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlt_w0_s64_untied, svint64_t, svint32_t, int32_t,
+                    z0_res = svaddlt_n_s64 (z1, x0),
+                    z0_res = svaddlt (z1, x0))
+
+/*
+** addlt_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     saddlt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_11_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svaddlt_n_s64 (z0, 11),
+                   z0_res = svaddlt (z0, 11))
+
+/*
+** addlt_11_s64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     saddlt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_11_s64_untied, svint64_t, svint32_t,
+                   z0_res = svaddlt_n_s64 (z1, 11),
+                   z0_res = svaddlt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlt_u16.c
new file mode 100644 (file)
index 0000000..250c9b0
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addlt_u16_tied1:
+**     uaddlt  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svaddlt_u16 (z0, z1),
+                   z0_res = svaddlt (z0, z1))
+
+/*
+** addlt_u16_tied2:
+**     uaddlt  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_u16_tied2, svuint16_t, svuint8_t,
+                   z0_res = svaddlt_u16 (z1, z0),
+                   z0_res = svaddlt (z1, z0))
+
+/*
+** addlt_u16_untied:
+**     uaddlt  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svaddlt_u16 (z1, z2),
+                   z0_res = svaddlt (z1, z2))
+
+/*
+** addlt_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uaddlt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlt_w0_u16_tied1, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svaddlt_n_u16 (z0, x0),
+                    z0_res = svaddlt (z0, x0))
+
+/*
+** addlt_w0_u16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     uaddlt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlt_w0_u16_untied, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svaddlt_n_u16 (z1, x0),
+                    z0_res = svaddlt (z1, x0))
+
+/*
+** addlt_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     uaddlt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_11_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svaddlt_n_u16 (z0, 11),
+                   z0_res = svaddlt (z0, 11))
+
+/*
+** addlt_11_u16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     uaddlt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_11_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svaddlt_n_u16 (z1, 11),
+                   z0_res = svaddlt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlt_u32.c
new file mode 100644 (file)
index 0000000..c264da6
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addlt_u32_tied1:
+**     uaddlt  z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svaddlt_u32 (z0, z1),
+                   z0_res = svaddlt (z0, z1))
+
+/*
+** addlt_u32_tied2:
+**     uaddlt  z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_u32_tied2, svuint32_t, svuint16_t,
+                   z0_res = svaddlt_u32 (z1, z0),
+                   z0_res = svaddlt (z1, z0))
+
+/*
+** addlt_u32_untied:
+**     uaddlt  z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svaddlt_u32 (z1, z2),
+                   z0_res = svaddlt (z1, z2))
+
+/*
+** addlt_w0_u32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uaddlt  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlt_w0_u32_tied1, svuint32_t, svuint16_t, uint16_t,
+                    z0_res = svaddlt_n_u32 (z0, x0),
+                    z0_res = svaddlt (z0, x0))
+
+/*
+** addlt_w0_u32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     uaddlt  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlt_w0_u32_untied, svuint32_t, svuint16_t, uint16_t,
+                    z0_res = svaddlt_n_u32 (z1, x0),
+                    z0_res = svaddlt (z1, x0))
+
+/*
+** addlt_11_u32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     uaddlt  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_11_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svaddlt_n_u32 (z0, 11),
+                   z0_res = svaddlt (z0, 11))
+
+/*
+** addlt_11_u32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     uaddlt  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_11_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svaddlt_n_u32 (z1, 11),
+                   z0_res = svaddlt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addlt_u64.c
new file mode 100644 (file)
index 0000000..5a4f3d6
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addlt_u64_tied1:
+**     uaddlt  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svaddlt_u64 (z0, z1),
+                   z0_res = svaddlt (z0, z1))
+
+/*
+** addlt_u64_tied2:
+**     uaddlt  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_u64_tied2, svuint64_t, svuint32_t,
+                   z0_res = svaddlt_u64 (z1, z0),
+                   z0_res = svaddlt (z1, z0))
+
+/*
+** addlt_u64_untied:
+**     uaddlt  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svaddlt_u64 (z1, z2),
+                   z0_res = svaddlt (z1, z2))
+
+/*
+** addlt_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uaddlt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlt_w0_u64_tied1, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svaddlt_n_u64 (z0, x0),
+                    z0_res = svaddlt (z0, x0))
+
+/*
+** addlt_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     uaddlt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (addlt_w0_u64_untied, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svaddlt_n_u64 (z1, x0),
+                    z0_res = svaddlt (z1, x0))
+
+/*
+** addlt_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     uaddlt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_11_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svaddlt_n_u64 (z0, 11),
+                   z0_res = svaddlt (z0, 11))
+
+/*
+** addlt_11_u64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     uaddlt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (addlt_11_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svaddlt_n_u64 (z1, 11),
+                   z0_res = svaddlt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_f16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_f16.c
new file mode 100644 (file)
index 0000000..98bc3d9
--- /dev/null
@@ -0,0 +1,96 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addp_f16_m_tied1:
+**     faddp   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (addp_f16_m_tied1, svfloat16_t,
+               z0 = svaddp_f16_m (p0, z0, z1),
+               z0 = svaddp_m (p0, z0, z1))
+
+/*
+** addp_f16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     faddp   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (addp_f16_m_tied2, svfloat16_t,
+               z0 = svaddp_f16_m (p0, z1, z0),
+               z0 = svaddp_m (p0, z1, z0))
+
+/*
+** addp_f16_m_untied:
+**     movprfx z0, z1
+**     faddp   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (addp_f16_m_untied, svfloat16_t,
+               z0 = svaddp_f16_m (p0, z1, z2),
+               z0 = svaddp_m (p0, z1, z2))
+
+/*
+** addp_f16_x_tied1:
+**     faddp   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (addp_f16_x_tied1, svfloat16_t,
+               z0 = svaddp_f16_x (p0, z0, z1),
+               z0 = svaddp_x (p0, z0, z1))
+
+/*
+** addp_f16_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     faddp   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (addp_f16_x_tied2, svfloat16_t,
+               z0 = svaddp_f16_x (p0, z1, z0),
+               z0 = svaddp_x (p0, z1, z0))
+
+/*
+** addp_f16_x_untied:
+**     movprfx z0, z1
+**     faddp   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (addp_f16_x_untied, svfloat16_t,
+               z0 = svaddp_f16_x (p0, z1, z2),
+               z0 = svaddp_x (p0, z1, z2))
+
+/*
+** ptrue_addp_f16_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_addp_f16_x_tied1, svfloat16_t,
+               z0 = svaddp_f16_x (svptrue_b16 (), z0, z1),
+               z0 = svaddp_x (svptrue_b16 (), z0, z1))
+
+/*
+** ptrue_addp_f16_x_tied2:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_addp_f16_x_tied2, svfloat16_t,
+               z0 = svaddp_f16_x (svptrue_b16 (), z1, z0),
+               z0 = svaddp_x (svptrue_b16 (), z1, z0))
+
+/*
+** ptrue_addp_f16_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_addp_f16_x_untied, svfloat16_t,
+               z0 = svaddp_f16_x (svptrue_b16 (), z1, z2),
+               z0 = svaddp_x (svptrue_b16 (), z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_f32.c
new file mode 100644 (file)
index 0000000..71dfd6a
--- /dev/null
@@ -0,0 +1,96 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addp_f32_m_tied1:
+**     faddp   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (addp_f32_m_tied1, svfloat32_t,
+               z0 = svaddp_f32_m (p0, z0, z1),
+               z0 = svaddp_m (p0, z0, z1))
+
+/*
+** addp_f32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     faddp   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (addp_f32_m_tied2, svfloat32_t,
+               z0 = svaddp_f32_m (p0, z1, z0),
+               z0 = svaddp_m (p0, z1, z0))
+
+/*
+** addp_f32_m_untied:
+**     movprfx z0, z1
+**     faddp   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (addp_f32_m_untied, svfloat32_t,
+               z0 = svaddp_f32_m (p0, z1, z2),
+               z0 = svaddp_m (p0, z1, z2))
+
+/*
+** addp_f32_x_tied1:
+**     faddp   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (addp_f32_x_tied1, svfloat32_t,
+               z0 = svaddp_f32_x (p0, z0, z1),
+               z0 = svaddp_x (p0, z0, z1))
+
+/*
+** addp_f32_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     faddp   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (addp_f32_x_tied2, svfloat32_t,
+               z0 = svaddp_f32_x (p0, z1, z0),
+               z0 = svaddp_x (p0, z1, z0))
+
+/*
+** addp_f32_x_untied:
+**     movprfx z0, z1
+**     faddp   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (addp_f32_x_untied, svfloat32_t,
+               z0 = svaddp_f32_x (p0, z1, z2),
+               z0 = svaddp_x (p0, z1, z2))
+
+/*
+** ptrue_addp_f32_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_addp_f32_x_tied1, svfloat32_t,
+               z0 = svaddp_f32_x (svptrue_b32 (), z0, z1),
+               z0 = svaddp_x (svptrue_b32 (), z0, z1))
+
+/*
+** ptrue_addp_f32_x_tied2:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_addp_f32_x_tied2, svfloat32_t,
+               z0 = svaddp_f32_x (svptrue_b32 (), z1, z0),
+               z0 = svaddp_x (svptrue_b32 (), z1, z0))
+
+/*
+** ptrue_addp_f32_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_addp_f32_x_untied, svfloat32_t,
+               z0 = svaddp_f32_x (svptrue_b32 (), z1, z2),
+               z0 = svaddp_x (svptrue_b32 (), z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_f64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_f64.c
new file mode 100644 (file)
index 0000000..ff9a95a
--- /dev/null
@@ -0,0 +1,96 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addp_f64_m_tied1:
+**     faddp   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (addp_f64_m_tied1, svfloat64_t,
+               z0 = svaddp_f64_m (p0, z0, z1),
+               z0 = svaddp_m (p0, z0, z1))
+
+/*
+** addp_f64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     faddp   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addp_f64_m_tied2, svfloat64_t,
+               z0 = svaddp_f64_m (p0, z1, z0),
+               z0 = svaddp_m (p0, z1, z0))
+
+/*
+** addp_f64_m_untied:
+**     movprfx z0, z1
+**     faddp   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (addp_f64_m_untied, svfloat64_t,
+               z0 = svaddp_f64_m (p0, z1, z2),
+               z0 = svaddp_m (p0, z1, z2))
+
+/*
+** addp_f64_x_tied1:
+**     faddp   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (addp_f64_x_tied1, svfloat64_t,
+               z0 = svaddp_f64_x (p0, z0, z1),
+               z0 = svaddp_x (p0, z0, z1))
+
+/*
+** addp_f64_x_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     faddp   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addp_f64_x_tied2, svfloat64_t,
+               z0 = svaddp_f64_x (p0, z1, z0),
+               z0 = svaddp_x (p0, z1, z0))
+
+/*
+** addp_f64_x_untied:
+**     movprfx z0, z1
+**     faddp   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (addp_f64_x_untied, svfloat64_t,
+               z0 = svaddp_f64_x (p0, z1, z2),
+               z0 = svaddp_x (p0, z1, z2))
+
+/*
+** ptrue_addp_f64_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_addp_f64_x_tied1, svfloat64_t,
+               z0 = svaddp_f64_x (svptrue_b64 (), z0, z1),
+               z0 = svaddp_x (svptrue_b64 (), z0, z1))
+
+/*
+** ptrue_addp_f64_x_tied2:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_addp_f64_x_tied2, svfloat64_t,
+               z0 = svaddp_f64_x (svptrue_b64 (), z1, z0),
+               z0 = svaddp_x (svptrue_b64 (), z1, z0))
+
+/*
+** ptrue_addp_f64_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_addp_f64_x_untied, svfloat64_t,
+               z0 = svaddp_f64_x (svptrue_b64 (), z1, z2),
+               z0 = svaddp_x (svptrue_b64 (), z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_s16.c
new file mode 100644 (file)
index 0000000..504330a
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addp_s16_m_tied1:
+**     addp    z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s16_m_tied1, svint16_t,
+               z0 = svaddp_s16_m (p0, z0, z1),
+               z0 = svaddp_m (p0, z0, z1))
+
+/*
+** addp_s16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     addp    z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s16_m_tied2, svint16_t,
+               z0 = svaddp_s16_m (p0, z1, z0),
+               z0 = svaddp_m (p0, z1, z0))
+
+/*
+** addp_s16_m_untied:
+**     movprfx z0, z1
+**     addp    z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s16_m_untied, svint16_t,
+               z0 = svaddp_s16_m (p0, z1, z2),
+               z0 = svaddp_m (p0, z1, z2))
+
+/*
+** addp_s16_x_tied1:
+**     addp    z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s16_x_tied1, svint16_t,
+               z0 = svaddp_s16_x (p0, z0, z1),
+               z0 = svaddp_x (p0, z0, z1))
+
+/*
+** addp_s16_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     addp    z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s16_x_tied2, svint16_t,
+               z0 = svaddp_s16_x (p0, z1, z0),
+               z0 = svaddp_x (p0, z1, z0))
+
+/*
+** addp_s16_x_untied:
+**     movprfx z0, z1
+**     addp    z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s16_x_untied, svint16_t,
+               z0 = svaddp_s16_x (p0, z1, z2),
+               z0 = svaddp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_s32.c
new file mode 100644 (file)
index 0000000..3e04a0b
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addp_s32_m_tied1:
+**     addp    z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s32_m_tied1, svint32_t,
+               z0 = svaddp_s32_m (p0, z0, z1),
+               z0 = svaddp_m (p0, z0, z1))
+
+/*
+** addp_s32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     addp    z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s32_m_tied2, svint32_t,
+               z0 = svaddp_s32_m (p0, z1, z0),
+               z0 = svaddp_m (p0, z1, z0))
+
+/*
+** addp_s32_m_untied:
+**     movprfx z0, z1
+**     addp    z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s32_m_untied, svint32_t,
+               z0 = svaddp_s32_m (p0, z1, z2),
+               z0 = svaddp_m (p0, z1, z2))
+
+/*
+** addp_s32_x_tied1:
+**     addp    z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s32_x_tied1, svint32_t,
+               z0 = svaddp_s32_x (p0, z0, z1),
+               z0 = svaddp_x (p0, z0, z1))
+
+/*
+** addp_s32_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     addp    z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s32_x_tied2, svint32_t,
+               z0 = svaddp_s32_x (p0, z1, z0),
+               z0 = svaddp_x (p0, z1, z0))
+
+/*
+** addp_s32_x_untied:
+**     movprfx z0, z1
+**     addp    z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s32_x_untied, svint32_t,
+               z0 = svaddp_s32_x (p0, z1, z2),
+               z0 = svaddp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_s64.c
new file mode 100644 (file)
index 0000000..9cb56dc
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addp_s64_m_tied1:
+**     addp    z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s64_m_tied1, svint64_t,
+               z0 = svaddp_s64_m (p0, z0, z1),
+               z0 = svaddp_m (p0, z0, z1))
+
+/*
+** addp_s64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     addp    z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s64_m_tied2, svint64_t,
+               z0 = svaddp_s64_m (p0, z1, z0),
+               z0 = svaddp_m (p0, z1, z0))
+
+/*
+** addp_s64_m_untied:
+**     movprfx z0, z1
+**     addp    z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s64_m_untied, svint64_t,
+               z0 = svaddp_s64_m (p0, z1, z2),
+               z0 = svaddp_m (p0, z1, z2))
+
+/*
+** addp_s64_x_tied1:
+**     addp    z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s64_x_tied1, svint64_t,
+               z0 = svaddp_s64_x (p0, z0, z1),
+               z0 = svaddp_x (p0, z0, z1))
+
+/*
+** addp_s64_x_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     addp    z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s64_x_tied2, svint64_t,
+               z0 = svaddp_s64_x (p0, z1, z0),
+               z0 = svaddp_x (p0, z1, z0))
+
+/*
+** addp_s64_x_untied:
+**     movprfx z0, z1
+**     addp    z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s64_x_untied, svint64_t,
+               z0 = svaddp_s64_x (p0, z1, z2),
+               z0 = svaddp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_s8.c
new file mode 100644 (file)
index 0000000..f9fdede
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addp_s8_m_tied1:
+**     addp    z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s8_m_tied1, svint8_t,
+               z0 = svaddp_s8_m (p0, z0, z1),
+               z0 = svaddp_m (p0, z0, z1))
+
+/*
+** addp_s8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     addp    z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s8_m_tied2, svint8_t,
+               z0 = svaddp_s8_m (p0, z1, z0),
+               z0 = svaddp_m (p0, z1, z0))
+
+/*
+** addp_s8_m_untied:
+**     movprfx z0, z1
+**     addp    z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s8_m_untied, svint8_t,
+               z0 = svaddp_s8_m (p0, z1, z2),
+               z0 = svaddp_m (p0, z1, z2))
+
+/*
+** addp_s8_x_tied1:
+**     addp    z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s8_x_tied1, svint8_t,
+               z0 = svaddp_s8_x (p0, z0, z1),
+               z0 = svaddp_x (p0, z0, z1))
+
+/*
+** addp_s8_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     addp    z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s8_x_tied2, svint8_t,
+               z0 = svaddp_s8_x (p0, z1, z0),
+               z0 = svaddp_x (p0, z1, z0))
+
+/*
+** addp_s8_x_untied:
+**     movprfx z0, z1
+**     addp    z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (addp_s8_x_untied, svint8_t,
+               z0 = svaddp_s8_x (p0, z1, z2),
+               z0 = svaddp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_u16.c
new file mode 100644 (file)
index 0000000..ed897c4
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addp_u16_m_tied1:
+**     addp    z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u16_m_tied1, svuint16_t,
+               z0 = svaddp_u16_m (p0, z0, z1),
+               z0 = svaddp_m (p0, z0, z1))
+
+/*
+** addp_u16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     addp    z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u16_m_tied2, svuint16_t,
+               z0 = svaddp_u16_m (p0, z1, z0),
+               z0 = svaddp_m (p0, z1, z0))
+
+/*
+** addp_u16_m_untied:
+**     movprfx z0, z1
+**     addp    z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u16_m_untied, svuint16_t,
+               z0 = svaddp_u16_m (p0, z1, z2),
+               z0 = svaddp_m (p0, z1, z2))
+
+/*
+** addp_u16_x_tied1:
+**     addp    z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u16_x_tied1, svuint16_t,
+               z0 = svaddp_u16_x (p0, z0, z1),
+               z0 = svaddp_x (p0, z0, z1))
+
+/*
+** addp_u16_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     addp    z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u16_x_tied2, svuint16_t,
+               z0 = svaddp_u16_x (p0, z1, z0),
+               z0 = svaddp_x (p0, z1, z0))
+
+/*
+** addp_u16_x_untied:
+**     movprfx z0, z1
+**     addp    z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u16_x_untied, svuint16_t,
+               z0 = svaddp_u16_x (p0, z1, z2),
+               z0 = svaddp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_u32.c
new file mode 100644 (file)
index 0000000..3f735d8
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addp_u32_m_tied1:
+**     addp    z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u32_m_tied1, svuint32_t,
+               z0 = svaddp_u32_m (p0, z0, z1),
+               z0 = svaddp_m (p0, z0, z1))
+
+/*
+** addp_u32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     addp    z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u32_m_tied2, svuint32_t,
+               z0 = svaddp_u32_m (p0, z1, z0),
+               z0 = svaddp_m (p0, z1, z0))
+
+/*
+** addp_u32_m_untied:
+**     movprfx z0, z1
+**     addp    z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u32_m_untied, svuint32_t,
+               z0 = svaddp_u32_m (p0, z1, z2),
+               z0 = svaddp_m (p0, z1, z2))
+
+/*
+** addp_u32_x_tied1:
+**     addp    z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u32_x_tied1, svuint32_t,
+               z0 = svaddp_u32_x (p0, z0, z1),
+               z0 = svaddp_x (p0, z0, z1))
+
+/*
+** addp_u32_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     addp    z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u32_x_tied2, svuint32_t,
+               z0 = svaddp_u32_x (p0, z1, z0),
+               z0 = svaddp_x (p0, z1, z0))
+
+/*
+** addp_u32_x_untied:
+**     movprfx z0, z1
+**     addp    z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u32_x_untied, svuint32_t,
+               z0 = svaddp_u32_x (p0, z1, z2),
+               z0 = svaddp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_u64.c
new file mode 100644 (file)
index 0000000..a739272
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addp_u64_m_tied1:
+**     addp    z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u64_m_tied1, svuint64_t,
+               z0 = svaddp_u64_m (p0, z0, z1),
+               z0 = svaddp_m (p0, z0, z1))
+
+/*
+** addp_u64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     addp    z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u64_m_tied2, svuint64_t,
+               z0 = svaddp_u64_m (p0, z1, z0),
+               z0 = svaddp_m (p0, z1, z0))
+
+/*
+** addp_u64_m_untied:
+**     movprfx z0, z1
+**     addp    z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u64_m_untied, svuint64_t,
+               z0 = svaddp_u64_m (p0, z1, z2),
+               z0 = svaddp_m (p0, z1, z2))
+
+/*
+** addp_u64_x_tied1:
+**     addp    z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u64_x_tied1, svuint64_t,
+               z0 = svaddp_u64_x (p0, z0, z1),
+               z0 = svaddp_x (p0, z0, z1))
+
+/*
+** addp_u64_x_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     addp    z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u64_x_tied2, svuint64_t,
+               z0 = svaddp_u64_x (p0, z1, z0),
+               z0 = svaddp_x (p0, z1, z0))
+
+/*
+** addp_u64_x_untied:
+**     movprfx z0, z1
+**     addp    z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u64_x_untied, svuint64_t,
+               z0 = svaddp_u64_x (p0, z1, z2),
+               z0 = svaddp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addp_u8.c
new file mode 100644 (file)
index 0000000..6417304
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addp_u8_m_tied1:
+**     addp    z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u8_m_tied1, svuint8_t,
+               z0 = svaddp_u8_m (p0, z0, z1),
+               z0 = svaddp_m (p0, z0, z1))
+
+/*
+** addp_u8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     addp    z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u8_m_tied2, svuint8_t,
+               z0 = svaddp_u8_m (p0, z1, z0),
+               z0 = svaddp_m (p0, z1, z0))
+
+/*
+** addp_u8_m_untied:
+**     movprfx z0, z1
+**     addp    z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u8_m_untied, svuint8_t,
+               z0 = svaddp_u8_m (p0, z1, z2),
+               z0 = svaddp_m (p0, z1, z2))
+
+/*
+** addp_u8_x_tied1:
+**     addp    z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u8_x_tied1, svuint8_t,
+               z0 = svaddp_u8_x (p0, z0, z1),
+               z0 = svaddp_x (p0, z0, z1))
+
+/*
+** addp_u8_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     addp    z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u8_x_tied2, svuint8_t,
+               z0 = svaddp_u8_x (p0, z1, z0),
+               z0 = svaddp_x (p0, z1, z0))
+
+/*
+** addp_u8_x_untied:
+**     movprfx z0, z1
+**     addp    z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (addp_u8_x_untied, svuint8_t,
+               z0 = svaddp_u8_x (p0, z1, z2),
+               z0 = svaddp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwb_s16.c
new file mode 100644 (file)
index 0000000..c0f7ef3
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addwb_s16_tied1:
+**     saddwb  z0\.h, z0\.h, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (addwb_s16_tied1, svint16_t, svint8_t,
+            z0 = svaddwb_s16 (z0, z4),
+            z0 = svaddwb (z0, z4))
+
+/*
+** addwb_s16_tied2:
+**     saddwb  z0\.h, z4\.h, z0\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (addwb_s16_tied2, svint16_t, svint8_t,
+                z0_res = svaddwb_s16 (z4, z0),
+                z0_res = svaddwb (z4, z0))
+
+/*
+** addwb_s16_untied:
+**     saddwb  z0\.h, z1\.h, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (addwb_s16_untied, svint16_t, svint8_t,
+            z0 = svaddwb_s16 (z1, z4),
+            z0 = svaddwb (z1, z4))
+
+/*
+** addwb_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     saddwb  z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwb_w0_s16_tied1, svint16_t, int8_t,
+                z0 = svaddwb_n_s16 (z0, x0),
+                z0 = svaddwb (z0, x0))
+
+/*
+** addwb_w0_s16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     saddwb  z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwb_w0_s16_untied, svint16_t, int8_t,
+                z0 = svaddwb_n_s16 (z1, x0),
+                z0 = svaddwb (z1, x0))
+
+/*
+** addwb_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     saddwb  z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwb_11_s16_tied1, svint16_t,
+               z0 = svaddwb_n_s16 (z0, 11),
+               z0 = svaddwb (z0, 11))
+
+/*
+** addwb_11_s16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     saddwb  z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwb_11_s16_untied, svint16_t,
+               z0 = svaddwb_n_s16 (z1, 11),
+               z0 = svaddwb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwb_s32.c
new file mode 100644 (file)
index 0000000..263b9d9
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addwb_s32_tied1:
+**     saddwb  z0\.s, z0\.s, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (addwb_s32_tied1, svint32_t, svint16_t,
+            z0 = svaddwb_s32 (z0, z4),
+            z0 = svaddwb (z0, z4))
+
+/*
+** addwb_s32_tied2:
+**     saddwb  z0\.s, z4\.s, z0\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (addwb_s32_tied2, svint32_t, svint16_t,
+                z0_res = svaddwb_s32 (z4, z0),
+                z0_res = svaddwb (z4, z0))
+
+/*
+** addwb_s32_untied:
+**     saddwb  z0\.s, z1\.s, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (addwb_s32_untied, svint32_t, svint16_t,
+            z0 = svaddwb_s32 (z1, z4),
+            z0 = svaddwb (z1, z4))
+
+/*
+** addwb_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     saddwb  z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwb_w0_s32_tied1, svint32_t, int16_t,
+                z0 = svaddwb_n_s32 (z0, x0),
+                z0 = svaddwb (z0, x0))
+
+/*
+** addwb_w0_s32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     saddwb  z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwb_w0_s32_untied, svint32_t, int16_t,
+                z0 = svaddwb_n_s32 (z1, x0),
+                z0 = svaddwb (z1, x0))
+
+/*
+** addwb_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     saddwb  z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwb_11_s32_tied1, svint32_t,
+               z0 = svaddwb_n_s32 (z0, 11),
+               z0 = svaddwb (z0, 11))
+
+/*
+** addwb_11_s32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     saddwb  z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwb_11_s32_untied, svint32_t,
+               z0 = svaddwb_n_s32 (z1, 11),
+               z0 = svaddwb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwb_s64.c
new file mode 100644 (file)
index 0000000..0b5740f
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addwb_s64_tied1:
+**     saddwb  z0\.d, z0\.d, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (addwb_s64_tied1, svint64_t, svint32_t,
+            z0 = svaddwb_s64 (z0, z4),
+            z0 = svaddwb (z0, z4))
+
+/*
+** addwb_s64_tied2:
+**     saddwb  z0\.d, z4\.d, z0\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (addwb_s64_tied2, svint64_t, svint32_t,
+                z0_res = svaddwb_s64 (z4, z0),
+                z0_res = svaddwb (z4, z0))
+
+/*
+** addwb_s64_untied:
+**     saddwb  z0\.d, z1\.d, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (addwb_s64_untied, svint64_t, svint32_t,
+            z0 = svaddwb_s64 (z1, z4),
+            z0 = svaddwb (z1, z4))
+
+/*
+** addwb_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     saddwb  z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwb_w0_s64_tied1, svint64_t, int32_t,
+                z0 = svaddwb_n_s64 (z0, x0),
+                z0 = svaddwb (z0, x0))
+
+/*
+** addwb_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     saddwb  z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwb_w0_s64_untied, svint64_t, int32_t,
+                z0 = svaddwb_n_s64 (z1, x0),
+                z0 = svaddwb (z1, x0))
+
+/*
+** addwb_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     saddwb  z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwb_11_s64_tied1, svint64_t,
+               z0 = svaddwb_n_s64 (z0, 11),
+               z0 = svaddwb (z0, 11))
+
+/*
+** addwb_11_s64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     saddwb  z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwb_11_s64_untied, svint64_t,
+               z0 = svaddwb_n_s64 (z1, 11),
+               z0 = svaddwb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwb_u16.c
new file mode 100644 (file)
index 0000000..acf21ea
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addwb_u16_tied1:
+**     uaddwb  z0\.h, z0\.h, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (addwb_u16_tied1, svuint16_t, svuint8_t,
+            z0 = svaddwb_u16 (z0, z4),
+            z0 = svaddwb (z0, z4))
+
+/*
+** addwb_u16_tied2:
+**     uaddwb  z0\.h, z4\.h, z0\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (addwb_u16_tied2, svuint16_t, svuint8_t,
+                z0_res = svaddwb_u16 (z4, z0),
+                z0_res = svaddwb (z4, z0))
+
+/*
+** addwb_u16_untied:
+**     uaddwb  z0\.h, z1\.h, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (addwb_u16_untied, svuint16_t, svuint8_t,
+            z0 = svaddwb_u16 (z1, z4),
+            z0 = svaddwb (z1, z4))
+
+/*
+** addwb_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uaddwb  z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwb_w0_u16_tied1, svuint16_t, uint8_t,
+                z0 = svaddwb_n_u16 (z0, x0),
+                z0 = svaddwb (z0, x0))
+
+/*
+** addwb_w0_u16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     uaddwb  z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwb_w0_u16_untied, svuint16_t, uint8_t,
+                z0 = svaddwb_n_u16 (z1, x0),
+                z0 = svaddwb (z1, x0))
+
+/*
+** addwb_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     uaddwb  z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwb_11_u16_tied1, svuint16_t,
+               z0 = svaddwb_n_u16 (z0, 11),
+               z0 = svaddwb (z0, 11))
+
+/*
+** addwb_11_u16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     uaddwb  z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwb_11_u16_untied, svuint16_t,
+               z0 = svaddwb_n_u16 (z1, 11),
+               z0 = svaddwb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwb_u32.c
new file mode 100644 (file)
index 0000000..4cecac9
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addwb_u32_tied1:
+**     uaddwb  z0\.s, z0\.s, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (addwb_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svaddwb_u32 (z0, z4),
+            z0 = svaddwb (z0, z4))
+
+/*
+** addwb_u32_tied2:
+**     uaddwb  z0\.s, z4\.s, z0\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (addwb_u32_tied2, svuint32_t, svuint16_t,
+                z0_res = svaddwb_u32 (z4, z0),
+                z0_res = svaddwb (z4, z0))
+
+/*
+** addwb_u32_untied:
+**     uaddwb  z0\.s, z1\.s, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (addwb_u32_untied, svuint32_t, svuint16_t,
+            z0 = svaddwb_u32 (z1, z4),
+            z0 = svaddwb (z1, z4))
+
+/*
+** addwb_w0_u32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uaddwb  z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwb_w0_u32_tied1, svuint32_t, uint16_t,
+                z0 = svaddwb_n_u32 (z0, x0),
+                z0 = svaddwb (z0, x0))
+
+/*
+** addwb_w0_u32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     uaddwb  z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwb_w0_u32_untied, svuint32_t, uint16_t,
+                z0 = svaddwb_n_u32 (z1, x0),
+                z0 = svaddwb (z1, x0))
+
+/*
+** addwb_11_u32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     uaddwb  z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwb_11_u32_tied1, svuint32_t,
+               z0 = svaddwb_n_u32 (z0, 11),
+               z0 = svaddwb (z0, 11))
+
+/*
+** addwb_11_u32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     uaddwb  z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwb_11_u32_untied, svuint32_t,
+               z0 = svaddwb_n_u32 (z1, 11),
+               z0 = svaddwb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwb_u64.c
new file mode 100644 (file)
index 0000000..2de559d
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addwb_u64_tied1:
+**     uaddwb  z0\.d, z0\.d, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (addwb_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svaddwb_u64 (z0, z4),
+            z0 = svaddwb (z0, z4))
+
+/*
+** addwb_u64_tied2:
+**     uaddwb  z0\.d, z4\.d, z0\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (addwb_u64_tied2, svuint64_t, svuint32_t,
+                z0_res = svaddwb_u64 (z4, z0),
+                z0_res = svaddwb (z4, z0))
+
+/*
+** addwb_u64_untied:
+**     uaddwb  z0\.d, z1\.d, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (addwb_u64_untied, svuint64_t, svuint32_t,
+            z0 = svaddwb_u64 (z1, z4),
+            z0 = svaddwb (z1, z4))
+
+/*
+** addwb_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uaddwb  z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwb_w0_u64_tied1, svuint64_t, uint32_t,
+                z0 = svaddwb_n_u64 (z0, x0),
+                z0 = svaddwb (z0, x0))
+
+/*
+** addwb_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     uaddwb  z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwb_w0_u64_untied, svuint64_t, uint32_t,
+                z0 = svaddwb_n_u64 (z1, x0),
+                z0 = svaddwb (z1, x0))
+
+/*
+** addwb_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     uaddwb  z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwb_11_u64_tied1, svuint64_t,
+               z0 = svaddwb_n_u64 (z0, 11),
+               z0 = svaddwb (z0, 11))
+
+/*
+** addwb_11_u64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     uaddwb  z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwb_11_u64_untied, svuint64_t,
+               z0 = svaddwb_n_u64 (z1, 11),
+               z0 = svaddwb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwt_s16.c
new file mode 100644 (file)
index 0000000..ae831e4
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addwt_s16_tied1:
+**     saddwt  z0\.h, z0\.h, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (addwt_s16_tied1, svint16_t, svint8_t,
+            z0 = svaddwt_s16 (z0, z4),
+            z0 = svaddwt (z0, z4))
+
+/*
+** addwt_s16_tied2:
+**     saddwt  z0\.h, z4\.h, z0\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (addwt_s16_tied2, svint16_t, svint8_t,
+                z0_res = svaddwt_s16 (z4, z0),
+                z0_res = svaddwt (z4, z0))
+
+/*
+** addwt_s16_untied:
+**     saddwt  z0\.h, z1\.h, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (addwt_s16_untied, svint16_t, svint8_t,
+            z0 = svaddwt_s16 (z1, z4),
+            z0 = svaddwt (z1, z4))
+
+/*
+** addwt_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     saddwt  z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwt_w0_s16_tied1, svint16_t, int8_t,
+                z0 = svaddwt_n_s16 (z0, x0),
+                z0 = svaddwt (z0, x0))
+
+/*
+** addwt_w0_s16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     saddwt  z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwt_w0_s16_untied, svint16_t, int8_t,
+                z0 = svaddwt_n_s16 (z1, x0),
+                z0 = svaddwt (z1, x0))
+
+/*
+** addwt_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     saddwt  z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwt_11_s16_tied1, svint16_t,
+               z0 = svaddwt_n_s16 (z0, 11),
+               z0 = svaddwt (z0, 11))
+
+/*
+** addwt_11_s16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     saddwt  z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwt_11_s16_untied, svint16_t,
+               z0 = svaddwt_n_s16 (z1, 11),
+               z0 = svaddwt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwt_s32.c
new file mode 100644 (file)
index 0000000..d4ac108
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addwt_s32_tied1:
+**     saddwt  z0\.s, z0\.s, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (addwt_s32_tied1, svint32_t, svint16_t,
+            z0 = svaddwt_s32 (z0, z4),
+            z0 = svaddwt (z0, z4))
+
+/*
+** addwt_s32_tied2:
+**     saddwt  z0\.s, z4\.s, z0\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (addwt_s32_tied2, svint32_t, svint16_t,
+                z0_res = svaddwt_s32 (z4, z0),
+                z0_res = svaddwt (z4, z0))
+
+/*
+** addwt_s32_untied:
+**     saddwt  z0\.s, z1\.s, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (addwt_s32_untied, svint32_t, svint16_t,
+            z0 = svaddwt_s32 (z1, z4),
+            z0 = svaddwt (z1, z4))
+
+/*
+** addwt_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     saddwt  z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwt_w0_s32_tied1, svint32_t, int16_t,
+                z0 = svaddwt_n_s32 (z0, x0),
+                z0 = svaddwt (z0, x0))
+
+/*
+** addwt_w0_s32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     saddwt  z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwt_w0_s32_untied, svint32_t, int16_t,
+                z0 = svaddwt_n_s32 (z1, x0),
+                z0 = svaddwt (z1, x0))
+
+/*
+** addwt_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     saddwt  z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwt_11_s32_tied1, svint32_t,
+               z0 = svaddwt_n_s32 (z0, 11),
+               z0 = svaddwt (z0, 11))
+
+/*
+** addwt_11_s32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     saddwt  z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwt_11_s32_untied, svint32_t,
+               z0 = svaddwt_n_s32 (z1, 11),
+               z0 = svaddwt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwt_s64.c
new file mode 100644 (file)
index 0000000..88370f7
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addwt_s64_tied1:
+**     saddwt  z0\.d, z0\.d, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (addwt_s64_tied1, svint64_t, svint32_t,
+            z0 = svaddwt_s64 (z0, z4),
+            z0 = svaddwt (z0, z4))
+
+/*
+** addwt_s64_tied2:
+**     saddwt  z0\.d, z4\.d, z0\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (addwt_s64_tied2, svint64_t, svint32_t,
+                z0_res = svaddwt_s64 (z4, z0),
+                z0_res = svaddwt (z4, z0))
+
+/*
+** addwt_s64_untied:
+**     saddwt  z0\.d, z1\.d, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (addwt_s64_untied, svint64_t, svint32_t,
+            z0 = svaddwt_s64 (z1, z4),
+            z0 = svaddwt (z1, z4))
+
+/*
+** addwt_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     saddwt  z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwt_w0_s64_tied1, svint64_t, int32_t,
+                z0 = svaddwt_n_s64 (z0, x0),
+                z0 = svaddwt (z0, x0))
+
+/*
+** addwt_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     saddwt  z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwt_w0_s64_untied, svint64_t, int32_t,
+                z0 = svaddwt_n_s64 (z1, x0),
+                z0 = svaddwt (z1, x0))
+
+/*
+** addwt_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     saddwt  z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwt_11_s64_tied1, svint64_t,
+               z0 = svaddwt_n_s64 (z0, 11),
+               z0 = svaddwt (z0, 11))
+
+/*
+** addwt_11_s64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     saddwt  z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwt_11_s64_untied, svint64_t,
+               z0 = svaddwt_n_s64 (z1, 11),
+               z0 = svaddwt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwt_u16.c
new file mode 100644 (file)
index 0000000..76312cd
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addwt_u16_tied1:
+**     uaddwt  z0\.h, z0\.h, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (addwt_u16_tied1, svuint16_t, svuint8_t,
+            z0 = svaddwt_u16 (z0, z4),
+            z0 = svaddwt (z0, z4))
+
+/*
+** addwt_u16_tied2:
+**     uaddwt  z0\.h, z4\.h, z0\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (addwt_u16_tied2, svuint16_t, svuint8_t,
+                z0_res = svaddwt_u16 (z4, z0),
+                z0_res = svaddwt (z4, z0))
+
+/*
+** addwt_u16_untied:
+**     uaddwt  z0\.h, z1\.h, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (addwt_u16_untied, svuint16_t, svuint8_t,
+            z0 = svaddwt_u16 (z1, z4),
+            z0 = svaddwt (z1, z4))
+
+/*
+** addwt_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uaddwt  z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwt_w0_u16_tied1, svuint16_t, uint8_t,
+                z0 = svaddwt_n_u16 (z0, x0),
+                z0 = svaddwt (z0, x0))
+
+/*
+** addwt_w0_u16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     uaddwt  z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwt_w0_u16_untied, svuint16_t, uint8_t,
+                z0 = svaddwt_n_u16 (z1, x0),
+                z0 = svaddwt (z1, x0))
+
+/*
+** addwt_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     uaddwt  z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwt_11_u16_tied1, svuint16_t,
+               z0 = svaddwt_n_u16 (z0, 11),
+               z0 = svaddwt (z0, 11))
+
+/*
+** addwt_11_u16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     uaddwt  z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwt_11_u16_untied, svuint16_t,
+               z0 = svaddwt_n_u16 (z1, 11),
+               z0 = svaddwt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwt_u32.c
new file mode 100644 (file)
index 0000000..808645f
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addwt_u32_tied1:
+**     uaddwt  z0\.s, z0\.s, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (addwt_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svaddwt_u32 (z0, z4),
+            z0 = svaddwt (z0, z4))
+
+/*
+** addwt_u32_tied2:
+**     uaddwt  z0\.s, z4\.s, z0\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (addwt_u32_tied2, svuint32_t, svuint16_t,
+                z0_res = svaddwt_u32 (z4, z0),
+                z0_res = svaddwt (z4, z0))
+
+/*
+** addwt_u32_untied:
+**     uaddwt  z0\.s, z1\.s, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (addwt_u32_untied, svuint32_t, svuint16_t,
+            z0 = svaddwt_u32 (z1, z4),
+            z0 = svaddwt (z1, z4))
+
+/*
+** addwt_w0_u32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uaddwt  z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwt_w0_u32_tied1, svuint32_t, uint16_t,
+                z0 = svaddwt_n_u32 (z0, x0),
+                z0 = svaddwt (z0, x0))
+
+/*
+** addwt_w0_u32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     uaddwt  z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwt_w0_u32_untied, svuint32_t, uint16_t,
+                z0 = svaddwt_n_u32 (z1, x0),
+                z0 = svaddwt (z1, x0))
+
+/*
+** addwt_11_u32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     uaddwt  z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwt_11_u32_tied1, svuint32_t,
+               z0 = svaddwt_n_u32 (z0, 11),
+               z0 = svaddwt (z0, 11))
+
+/*
+** addwt_11_u32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     uaddwt  z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwt_11_u32_untied, svuint32_t,
+               z0 = svaddwt_n_u32 (z1, 11),
+               z0 = svaddwt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/addwt_u64.c
new file mode 100644 (file)
index 0000000..f72dde7
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** addwt_u64_tied1:
+**     uaddwt  z0\.d, z0\.d, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (addwt_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svaddwt_u64 (z0, z4),
+            z0 = svaddwt (z0, z4))
+
+/*
+** addwt_u64_tied2:
+**     uaddwt  z0\.d, z4\.d, z0\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (addwt_u64_tied2, svuint64_t, svuint32_t,
+                z0_res = svaddwt_u64 (z4, z0),
+                z0_res = svaddwt (z4, z0))
+
+/*
+** addwt_u64_untied:
+**     uaddwt  z0\.d, z1\.d, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (addwt_u64_untied, svuint64_t, svuint32_t,
+            z0 = svaddwt_u64 (z1, z4),
+            z0 = svaddwt (z1, z4))
+
+/*
+** addwt_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uaddwt  z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwt_w0_u64_tied1, svuint64_t, uint32_t,
+                z0 = svaddwt_n_u64 (z0, x0),
+                z0 = svaddwt (z0, x0))
+
+/*
+** addwt_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     uaddwt  z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (addwt_w0_u64_untied, svuint64_t, uint32_t,
+                z0 = svaddwt_n_u64 (z1, x0),
+                z0 = svaddwt (z1, x0))
+
+/*
+** addwt_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     uaddwt  z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwt_11_u64_tied1, svuint64_t,
+               z0 = svaddwt_n_u64 (z0, 11),
+               z0 = svaddwt (z0, 11))
+
+/*
+** addwt_11_u64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     uaddwt  z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (addwt_11_u64_untied, svuint64_t,
+               z0 = svaddwt_n_u64 (z1, 11),
+               z0 = svaddwt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aesd_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aesd_u8.c
new file mode 100644 (file)
index 0000000..622f5cf
--- /dev/null
@@ -0,0 +1,44 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-aes"
+
+/*
+** aesd_u8_tied1:
+**     aesd    z0\.b, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (aesd_u8_tied1, svuint8_t,
+               z0 = svaesd_u8 (z0, z1),
+               z0 = svaesd (z0, z1))
+
+/*
+** aesd_u8_tied2:
+**     aesd    z0\.b, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (aesd_u8_tied2, svuint8_t,
+               z0 = svaesd_u8 (z1, z0),
+               z0 = svaesd (z1, z0))
+
+/*
+** aesd_u8_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     aesd    z0\.b, z0\.b, z2\.b
+** |
+**     aesd    z1\.b, z0\.b, z2\.b
+**     mov     z0\.d, z1\.d
+** |
+**     mov     z0\.d, z2\.d
+**     aesd    z0\.b, z0\.b, z1\.b
+** |
+**     aesd    z2\.b, z0\.b, z1\.b
+**     mov     z0\.d, z2\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (aesd_u8_untied, svuint8_t,
+               z0 = svaesd_u8 (z1, z2),
+               z0 = svaesd (z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aese_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aese_u8.c
new file mode 100644 (file)
index 0000000..6555bbb
--- /dev/null
@@ -0,0 +1,44 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-aes"
+
+/*
+** aese_u8_tied1:
+**     aese    z0\.b, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (aese_u8_tied1, svuint8_t,
+               z0 = svaese_u8 (z0, z1),
+               z0 = svaese (z0, z1))
+
+/*
+** aese_u8_tied2:
+**     aese    z0\.b, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (aese_u8_tied2, svuint8_t,
+               z0 = svaese_u8 (z1, z0),
+               z0 = svaese (z1, z0))
+
+/*
+** aese_u8_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     aese    z0\.b, z0\.b, z2\.b
+** |
+**     aese    z1\.b, z0\.b, z2\.b
+**     mov     z0\.d, z1\.d
+** |
+**     mov     z0\.d, z2\.d
+**     aese    z0\.b, z0\.b, z1\.b
+** |
+**     aese    z2\.b, z0\.b, z1\.b
+**     mov     z0\.d, z2\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (aese_u8_untied, svuint8_t,
+               z0 = svaese_u8 (z1, z2),
+               z0 = svaese (z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aesimc_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aesimc_u8.c
new file mode 100644 (file)
index 0000000..4630595
--- /dev/null
@@ -0,0 +1,29 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-aes"
+
+/*
+** aesimc_u8_tied1:
+**     aesimc  z0\.b, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (aesimc_u8_tied1, svuint8_t,
+               z0 = svaesimc_u8 (z0),
+               z0 = svaesimc (z0))
+
+/*
+** aesimc_u8_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     aesimc  z0\.b, z0\.b
+** |
+**     aesimc  z1\.b, z0\.b
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (aesimc_u8_untied, svuint8_t,
+               z0 = svaesimc_u8 (z1),
+               z0 = svaesimc (z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aesmc_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/aesmc_u8.c
new file mode 100644 (file)
index 0000000..6e8acf4
--- /dev/null
@@ -0,0 +1,29 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-aes"
+
+/*
+** aesmc_u8_tied1:
+**     aesmc   z0\.b, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (aesmc_u8_tied1, svuint8_t,
+               z0 = svaesmc_u8 (z0),
+               z0 = svaesmc (z0))
+
+/*
+** aesmc_u8_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     aesmc   z0\.b, z0\.b
+** |
+**     aesmc   z1\.b, z0\.b
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (aesmc_u8_untied, svuint8_t,
+               z0 = svaesmc_u8 (z1),
+               z0 = svaesmc (z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_s16.c
new file mode 100644 (file)
index 0000000..acad87d
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bcax_s16_tied1:
+**     bcax    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_s16_tied1, svint16_t,
+               z0 = svbcax_s16 (z0, z1, z2),
+               z0 = svbcax (z0, z1, z2))
+
+/*
+** bcax_s16_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_s16_tied2, svint16_t,
+               z0 = svbcax_s16 (z1, z0, z2),
+               z0 = svbcax (z1, z0, z2))
+
+/*
+** bcax_s16_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_s16_tied3, svint16_t,
+               z0 = svbcax_s16 (z1, z2, z0),
+               z0 = svbcax (z1, z2, z0))
+
+/*
+** bcax_s16_untied:
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, z3\.d|z3\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_s16_untied, svint16_t,
+               z0 = svbcax_s16 (z1, z2, z3),
+               z0 = svbcax (z1, z2, z3))
+
+/*
+** bcax_w0_s16_tied1:
+**     mov     (z[0-9]+)\.h, w0
+**     bcax    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_w0_s16_tied1, svint16_t, int16_t,
+                z0 = svbcax_n_s16 (z0, z1, x0),
+                z0 = svbcax (z0, z1, x0))
+
+/*
+** bcax_w0_s16_tied2:
+**     mov     (z[0-9]+)\.h, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (\1\.d, \2|\2, \1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_w0_s16_tied2, svint16_t, int16_t,
+                z0 = svbcax_n_s16 (z1, z0, x0),
+                z0 = svbcax (z1, z0, x0))
+
+/*
+** bcax_w0_s16_untied: { xfail *-*-*}
+**     mov     (z[0-9]+)\.h, w0
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1\.d|\1\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_w0_s16_untied, svint16_t, int16_t,
+                z0 = svbcax_n_s16 (z1, z2, x0),
+                z0 = svbcax (z1, z2, x0))
+
+/*
+** bcax_11_s16_tied1:
+**     mov     (z[0-9]+)\.h, #11
+**     bcax    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_s16_tied1, svint16_t,
+               z0 = svbcax_n_s16 (z0, z1, 11),
+               z0 = svbcax (z0, z1, 11))
+
+/*
+** bcax_11_s16_tied2:
+**     mov     (z[0-9]+)\.h, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (\1\.d, \2|\2, \1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_s16_tied2, svint16_t,
+               z0 = svbcax_n_s16 (z1, z0, 11),
+               z0 = svbcax (z1, z0, 11))
+
+/*
+** bcax_11_s16_untied: { xfail *-*-*}
+**     mov     (z[0-9]+)\.h, #11
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1\.d|\1\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_s16_untied, svint16_t,
+               z0 = svbcax_n_s16 (z1, z2, 11),
+               z0 = svbcax (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_s32.c
new file mode 100644 (file)
index 0000000..aeb4357
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bcax_s32_tied1:
+**     bcax    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_s32_tied1, svint32_t,
+               z0 = svbcax_s32 (z0, z1, z2),
+               z0 = svbcax (z0, z1, z2))
+
+/*
+** bcax_s32_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_s32_tied2, svint32_t,
+               z0 = svbcax_s32 (z1, z0, z2),
+               z0 = svbcax (z1, z0, z2))
+
+/*
+** bcax_s32_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_s32_tied3, svint32_t,
+               z0 = svbcax_s32 (z1, z2, z0),
+               z0 = svbcax (z1, z2, z0))
+
+/*
+** bcax_s32_untied:
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, z3\.d|z3\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_s32_untied, svint32_t,
+               z0 = svbcax_s32 (z1, z2, z3),
+               z0 = svbcax (z1, z2, z3))
+
+/*
+** bcax_w0_s32_tied1:
+**     mov     (z[0-9]+)\.s, w0
+**     bcax    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_w0_s32_tied1, svint32_t, int32_t,
+                z0 = svbcax_n_s32 (z0, z1, x0),
+                z0 = svbcax (z0, z1, x0))
+
+/*
+** bcax_w0_s32_tied2:
+**     mov     (z[0-9]+)\.s, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (\1\.d, \2|\2, \1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_w0_s32_tied2, svint32_t, int32_t,
+                z0 = svbcax_n_s32 (z1, z0, x0),
+                z0 = svbcax (z1, z0, x0))
+
+/*
+** bcax_w0_s32_untied:
+**     mov     (z[0-9]+)\.s, w0
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1\.d|\1\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_w0_s32_untied, svint32_t, int32_t,
+                z0 = svbcax_n_s32 (z1, z2, x0),
+                z0 = svbcax (z1, z2, x0))
+
+/*
+** bcax_11_s32_tied1:
+**     mov     (z[0-9]+)\.s, #11
+**     bcax    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_s32_tied1, svint32_t,
+               z0 = svbcax_n_s32 (z0, z1, 11),
+               z0 = svbcax (z0, z1, 11))
+
+/*
+** bcax_11_s32_tied2:
+**     mov     (z[0-9]+)\.s, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (\1\.d, \2|\2, \1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_s32_tied2, svint32_t,
+               z0 = svbcax_n_s32 (z1, z0, 11),
+               z0 = svbcax (z1, z0, 11))
+
+/*
+** bcax_11_s32_untied: { xfail *-*-*}
+**     mov     (z[0-9]+)\.s, #11
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1\.d|\1\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_s32_untied, svint32_t,
+               z0 = svbcax_n_s32 (z1, z2, 11),
+               z0 = svbcax (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_s64.c
new file mode 100644 (file)
index 0000000..2087e58
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bcax_s64_tied1:
+**     bcax    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_s64_tied1, svint64_t,
+               z0 = svbcax_s64 (z0, z1, z2),
+               z0 = svbcax (z0, z1, z2))
+
+/*
+** bcax_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_s64_tied2, svint64_t,
+               z0 = svbcax_s64 (z1, z0, z2),
+               z0 = svbcax (z1, z0, z2))
+
+/*
+** bcax_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_s64_tied3, svint64_t,
+               z0 = svbcax_s64 (z1, z2, z0),
+               z0 = svbcax (z1, z2, z0))
+
+/*
+** bcax_s64_untied:
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, z3\.d|z3\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_s64_untied, svint64_t,
+               z0 = svbcax_s64 (z1, z2, z3),
+               z0 = svbcax (z1, z2, z3))
+
+/*
+** bcax_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     bcax    z0\.d, z0\.d, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_x0_s64_tied1, svint64_t, int64_t,
+                z0 = svbcax_n_s64 (z0, z1, x0),
+                z0 = svbcax (z0, z1, x0))
+
+/*
+** bcax_x0_s64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (\1, \2|\2, \1)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_x0_s64_tied2, svint64_t, int64_t,
+                z0 = svbcax_n_s64 (z1, z0, x0),
+                z0 = svbcax (z1, z0, x0))
+
+/*
+** bcax_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_x0_s64_untied, svint64_t, int64_t,
+                z0 = svbcax_n_s64 (z1, z2, x0),
+                z0 = svbcax (z1, z2, x0))
+
+/*
+** bcax_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     bcax    z0\.d, z0\.d, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_s64_tied1, svint64_t,
+               z0 = svbcax_n_s64 (z0, z1, 11),
+               z0 = svbcax (z0, z1, 11))
+
+/*
+** bcax_11_s64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (\1, \2|\2, \1)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_s64_tied2, svint64_t,
+               z0 = svbcax_n_s64 (z1, z0, 11),
+               z0 = svbcax (z1, z0, 11))
+
+/*
+** bcax_11_s64_untied: { xfail *-*-*}
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_s64_untied, svint64_t,
+               z0 = svbcax_n_s64 (z1, z2, 11),
+               z0 = svbcax (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_s8.c
new file mode 100644 (file)
index 0000000..548aafa
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bcax_s8_tied1:
+**     bcax    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_s8_tied1, svint8_t,
+               z0 = svbcax_s8 (z0, z1, z2),
+               z0 = svbcax (z0, z1, z2))
+
+/*
+** bcax_s8_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_s8_tied2, svint8_t,
+               z0 = svbcax_s8 (z1, z0, z2),
+               z0 = svbcax (z1, z0, z2))
+
+/*
+** bcax_s8_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_s8_tied3, svint8_t,
+               z0 = svbcax_s8 (z1, z2, z0),
+               z0 = svbcax (z1, z2, z0))
+
+/*
+** bcax_s8_untied:
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, z3\.d|z3\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_s8_untied, svint8_t,
+               z0 = svbcax_s8 (z1, z2, z3),
+               z0 = svbcax (z1, z2, z3))
+
+/*
+** bcax_w0_s8_tied1:
+**     mov     (z[0-9]+)\.b, w0
+**     bcax    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_w0_s8_tied1, svint8_t, int8_t,
+                z0 = svbcax_n_s8 (z0, z1, x0),
+                z0 = svbcax (z0, z1, x0))
+
+/*
+** bcax_w0_s8_tied2:
+**     mov     (z[0-9]+)\.b, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (\1\.d, \2|\2, \1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_w0_s8_tied2, svint8_t, int8_t,
+                z0 = svbcax_n_s8 (z1, z0, x0),
+                z0 = svbcax (z1, z0, x0))
+
+/*
+** bcax_w0_s8_untied: { xfail *-*-*}
+**     mov     (z[0-9]+)\.b, w0
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1\.d|\1\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_w0_s8_untied, svint8_t, int8_t,
+                z0 = svbcax_n_s8 (z1, z2, x0),
+                z0 = svbcax (z1, z2, x0))
+
+/*
+** bcax_11_s8_tied1:
+**     mov     (z[0-9]+)\.b, #11
+**     bcax    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_s8_tied1, svint8_t,
+               z0 = svbcax_n_s8 (z0, z1, 11),
+               z0 = svbcax (z0, z1, 11))
+
+/*
+** bcax_11_s8_tied2:
+**     mov     (z[0-9]+)\.b, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (\1\.d, \2|\2, \1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_s8_tied2, svint8_t,
+               z0 = svbcax_n_s8 (z1, z0, 11),
+               z0 = svbcax (z1, z0, 11))
+
+/*
+** bcax_11_s8_untied: { xfail *-*-*}
+**     mov     (z[0-9]+)\.b, #11
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1\.d|\1\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_s8_untied, svint8_t,
+               z0 = svbcax_n_s8 (z1, z2, 11),
+               z0 = svbcax (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_u16.c
new file mode 100644 (file)
index 0000000..b63a477
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bcax_u16_tied1:
+**     bcax    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_u16_tied1, svuint16_t,
+               z0 = svbcax_u16 (z0, z1, z2),
+               z0 = svbcax (z0, z1, z2))
+
+/*
+** bcax_u16_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_u16_tied2, svuint16_t,
+               z0 = svbcax_u16 (z1, z0, z2),
+               z0 = svbcax (z1, z0, z2))
+
+/*
+** bcax_u16_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_u16_tied3, svuint16_t,
+               z0 = svbcax_u16 (z1, z2, z0),
+               z0 = svbcax (z1, z2, z0))
+
+/*
+** bcax_u16_untied:
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, z3\.d|z3\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_u16_untied, svuint16_t,
+               z0 = svbcax_u16 (z1, z2, z3),
+               z0 = svbcax (z1, z2, z3))
+
+/*
+** bcax_w0_u16_tied1:
+**     mov     (z[0-9]+)\.h, w0
+**     bcax    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_w0_u16_tied1, svuint16_t, uint16_t,
+                z0 = svbcax_n_u16 (z0, z1, x0),
+                z0 = svbcax (z0, z1, x0))
+
+/*
+** bcax_w0_u16_tied2:
+**     mov     (z[0-9]+)\.h, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (\1\.d, \2|\2, \1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_w0_u16_tied2, svuint16_t, uint16_t,
+                z0 = svbcax_n_u16 (z1, z0, x0),
+                z0 = svbcax (z1, z0, x0))
+
+/*
+** bcax_w0_u16_untied: { xfail *-*-*}
+**     mov     (z[0-9]+)\.h, w0
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1\.d|\1\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_w0_u16_untied, svuint16_t, uint16_t,
+                z0 = svbcax_n_u16 (z1, z2, x0),
+                z0 = svbcax (z1, z2, x0))
+
+/*
+** bcax_11_u16_tied1:
+**     mov     (z[0-9]+)\.h, #11
+**     bcax    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_u16_tied1, svuint16_t,
+               z0 = svbcax_n_u16 (z0, z1, 11),
+               z0 = svbcax (z0, z1, 11))
+
+/*
+** bcax_11_u16_tied2:
+**     mov     (z[0-9]+)\.h, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (\1\.d, \2|\2, \1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_u16_tied2, svuint16_t,
+               z0 = svbcax_n_u16 (z1, z0, 11),
+               z0 = svbcax (z1, z0, 11))
+
+/*
+** bcax_11_u16_untied: { xfail *-*-*}
+**     mov     (z[0-9]+)\.h, #11
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1\.d|\1\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_u16_untied, svuint16_t,
+               z0 = svbcax_n_u16 (z1, z2, 11),
+               z0 = svbcax (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_u32.c
new file mode 100644 (file)
index 0000000..d03c938
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bcax_u32_tied1:
+**     bcax    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_u32_tied1, svuint32_t,
+               z0 = svbcax_u32 (z0, z1, z2),
+               z0 = svbcax (z0, z1, z2))
+
+/*
+** bcax_u32_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_u32_tied2, svuint32_t,
+               z0 = svbcax_u32 (z1, z0, z2),
+               z0 = svbcax (z1, z0, z2))
+
+/*
+** bcax_u32_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_u32_tied3, svuint32_t,
+               z0 = svbcax_u32 (z1, z2, z0),
+               z0 = svbcax (z1, z2, z0))
+
+/*
+** bcax_u32_untied:
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, z3\.d|z3\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_u32_untied, svuint32_t,
+               z0 = svbcax_u32 (z1, z2, z3),
+               z0 = svbcax (z1, z2, z3))
+
+/*
+** bcax_w0_u32_tied1:
+**     mov     (z[0-9]+)\.s, w0
+**     bcax    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = svbcax_n_u32 (z0, z1, x0),
+                z0 = svbcax (z0, z1, x0))
+
+/*
+** bcax_w0_u32_tied2:
+**     mov     (z[0-9]+)\.s, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (\1\.d, \2|\2, \1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_w0_u32_tied2, svuint32_t, uint32_t,
+                z0 = svbcax_n_u32 (z1, z0, x0),
+                z0 = svbcax (z1, z0, x0))
+
+/*
+** bcax_w0_u32_untied:
+**     mov     (z[0-9]+)\.s, w0
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1\.d|\1\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = svbcax_n_u32 (z1, z2, x0),
+                z0 = svbcax (z1, z2, x0))
+
+/*
+** bcax_11_u32_tied1:
+**     mov     (z[0-9]+)\.s, #11
+**     bcax    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_u32_tied1, svuint32_t,
+               z0 = svbcax_n_u32 (z0, z1, 11),
+               z0 = svbcax (z0, z1, 11))
+
+/*
+** bcax_11_u32_tied2:
+**     mov     (z[0-9]+)\.s, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (\1\.d, \2|\2, \1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_u32_tied2, svuint32_t,
+               z0 = svbcax_n_u32 (z1, z0, 11),
+               z0 = svbcax (z1, z0, 11))
+
+/*
+** bcax_11_u32_untied: { xfail *-*-*}
+**     mov     (z[0-9]+)\.s, #11
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1\.d|\1\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_u32_untied, svuint32_t,
+               z0 = svbcax_n_u32 (z1, z2, 11),
+               z0 = svbcax (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_u64.c
new file mode 100644 (file)
index 0000000..e039062
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bcax_u64_tied1:
+**     bcax    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_u64_tied1, svuint64_t,
+               z0 = svbcax_u64 (z0, z1, z2),
+               z0 = svbcax (z0, z1, z2))
+
+/*
+** bcax_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_u64_tied2, svuint64_t,
+               z0 = svbcax_u64 (z1, z0, z2),
+               z0 = svbcax (z1, z0, z2))
+
+/*
+** bcax_u64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_u64_tied3, svuint64_t,
+               z0 = svbcax_u64 (z1, z2, z0),
+               z0 = svbcax (z1, z2, z0))
+
+/*
+** bcax_u64_untied:
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, z3\.d|z3\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_u64_untied, svuint64_t,
+               z0 = svbcax_u64 (z1, z2, z3),
+               z0 = svbcax (z1, z2, z3))
+
+/*
+** bcax_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     bcax    z0\.d, z0\.d, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = svbcax_n_u64 (z0, z1, x0),
+                z0 = svbcax (z0, z1, x0))
+
+/*
+** bcax_x0_u64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (\1, \2|\2, \1)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_x0_u64_tied2, svuint64_t, uint64_t,
+                z0 = svbcax_n_u64 (z1, z0, x0),
+                z0 = svbcax (z1, z0, x0))
+
+/*
+** bcax_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = svbcax_n_u64 (z1, z2, x0),
+                z0 = svbcax (z1, z2, x0))
+
+/*
+** bcax_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     bcax    z0\.d, z0\.d, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_u64_tied1, svuint64_t,
+               z0 = svbcax_n_u64 (z0, z1, 11),
+               z0 = svbcax (z0, z1, 11))
+
+/*
+** bcax_11_u64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (\1, \2|\2, \1)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_u64_tied2, svuint64_t,
+               z0 = svbcax_n_u64 (z1, z0, 11),
+               z0 = svbcax (z1, z0, 11))
+
+/*
+** bcax_11_u64_untied: { xfail *-*-*}
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_u64_untied, svuint64_t,
+               z0 = svbcax_n_u64 (z1, z2, 11),
+               z0 = svbcax (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bcax_u8.c
new file mode 100644 (file)
index 0000000..0957d58
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bcax_u8_tied1:
+**     bcax    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_u8_tied1, svuint8_t,
+               z0 = svbcax_u8 (z0, z1, z2),
+               z0 = svbcax (z0, z1, z2))
+
+/*
+** bcax_u8_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_u8_tied2, svuint8_t,
+               z0 = svbcax_u8 (z1, z0, z2),
+               z0 = svbcax (z1, z0, z2))
+
+/*
+** bcax_u8_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1|\1, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_u8_tied3, svuint8_t,
+               z0 = svbcax_u8 (z1, z2, z0),
+               z0 = svbcax (z1, z2, z0))
+
+/*
+** bcax_u8_untied:
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, z3\.d|z3\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_u8_untied, svuint8_t,
+               z0 = svbcax_u8 (z1, z2, z3),
+               z0 = svbcax (z1, z2, z3))
+
+/*
+** bcax_w0_u8_tied1:
+**     mov     (z[0-9]+)\.b, w0
+**     bcax    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_w0_u8_tied1, svuint8_t, uint8_t,
+                z0 = svbcax_n_u8 (z0, z1, x0),
+                z0 = svbcax (z0, z1, x0))
+
+/*
+** bcax_w0_u8_tied2:
+**     mov     (z[0-9]+)\.b, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (\1\.d, \2|\2, \1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_w0_u8_tied2, svuint8_t, uint8_t,
+                z0 = svbcax_n_u8 (z1, z0, x0),
+                z0 = svbcax (z1, z0, x0))
+
+/*
+** bcax_w0_u8_untied: { xfail *-*-*}
+**     mov     (z[0-9]+)\.b, w0
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1\.d|\1\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (bcax_w0_u8_untied, svuint8_t, uint8_t,
+                z0 = svbcax_n_u8 (z1, z2, x0),
+                z0 = svbcax (z1, z2, x0))
+
+/*
+** bcax_11_u8_tied1:
+**     mov     (z[0-9]+)\.b, #11
+**     bcax    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_u8_tied1, svuint8_t,
+               z0 = svbcax_n_u8 (z0, z1, 11),
+               z0 = svbcax (z0, z1, 11))
+
+/*
+** bcax_11_u8_tied2:
+**     mov     (z[0-9]+)\.b, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (\1\.d, \2|\2, \1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_u8_tied2, svuint8_t,
+               z0 = svbcax_n_u8 (z1, z0, 11),
+               z0 = svbcax (z1, z0, 11))
+
+/*
+** bcax_11_u8_untied: { xfail *-*-*}
+**     mov     (z[0-9]+)\.b, #11
+**     movprfx z0, z1
+**     bcax    z0\.d, z0\.d, (z2\.d, \1\.d|\1\.d, z2\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (bcax_11_u8_untied, svuint8_t,
+               z0 = svbcax_n_u8 (z1, z2, 11),
+               z0 = svbcax (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u16.c
new file mode 100644 (file)
index 0000000..1423085
--- /dev/null
@@ -0,0 +1,72 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-bitperm"
+
+/*
+** bdep_u16_tied1:
+**     bdep    z0\.h, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_u16_tied1, svuint16_t,
+               z0 = svbdep_u16 (z0, z1),
+               z0 = svbdep (z0, z1))
+
+/*
+** bdep_u16_tied2:
+**     bdep    z0\.h, z1\.h, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_u16_tied2, svuint16_t,
+               z0 = svbdep_u16 (z1, z0),
+               z0 = svbdep (z1, z0))
+
+/*
+** bdep_u16_untied:
+**     bdep    z0\.h, z1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_u16_untied, svuint16_t,
+               z0 = svbdep_u16 (z1, z2),
+               z0 = svbdep (z1, z2))
+
+/*
+** bdep_w0_u16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     bdep    z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bdep_w0_u16_tied1, svuint16_t, uint16_t,
+                z0 = svbdep_n_u16 (z0, x0),
+                z0 = svbdep (z0, x0))
+
+/*
+** bdep_w0_u16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     bdep    z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bdep_w0_u16_untied, svuint16_t, uint16_t,
+                z0 = svbdep_n_u16 (z1, x0),
+                z0 = svbdep (z1, x0))
+
+/*
+** bdep_11_u16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     bdep    z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_11_u16_tied1, svuint16_t,
+               z0 = svbdep_n_u16 (z0, 11),
+               z0 = svbdep (z0, 11))
+
+/*
+** bdep_11_u16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     bdep    z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_11_u16_untied, svuint16_t,
+               z0 = svbdep_n_u16 (z1, 11),
+               z0 = svbdep (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u32.c
new file mode 100644 (file)
index 0000000..7f08df4
--- /dev/null
@@ -0,0 +1,72 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-bitperm"
+
+/*
+** bdep_u32_tied1:
+**     bdep    z0\.s, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_u32_tied1, svuint32_t,
+               z0 = svbdep_u32 (z0, z1),
+               z0 = svbdep (z0, z1))
+
+/*
+** bdep_u32_tied2:
+**     bdep    z0\.s, z1\.s, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_u32_tied2, svuint32_t,
+               z0 = svbdep_u32 (z1, z0),
+               z0 = svbdep (z1, z0))
+
+/*
+** bdep_u32_untied:
+**     bdep    z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_u32_untied, svuint32_t,
+               z0 = svbdep_u32 (z1, z2),
+               z0 = svbdep (z1, z2))
+
+/*
+** bdep_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     bdep    z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bdep_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = svbdep_n_u32 (z0, x0),
+                z0 = svbdep (z0, x0))
+
+/*
+** bdep_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     bdep    z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bdep_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = svbdep_n_u32 (z1, x0),
+                z0 = svbdep (z1, x0))
+
+/*
+** bdep_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     bdep    z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_11_u32_tied1, svuint32_t,
+               z0 = svbdep_n_u32 (z0, 11),
+               z0 = svbdep (z0, 11))
+
+/*
+** bdep_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     bdep    z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_11_u32_untied, svuint32_t,
+               z0 = svbdep_n_u32 (z1, 11),
+               z0 = svbdep (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u64.c
new file mode 100644 (file)
index 0000000..7f7cbbe
--- /dev/null
@@ -0,0 +1,72 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-bitperm"
+
+/*
+** bdep_u64_tied1:
+**     bdep    z0\.d, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_u64_tied1, svuint64_t,
+               z0 = svbdep_u64 (z0, z1),
+               z0 = svbdep (z0, z1))
+
+/*
+** bdep_u64_tied2:
+**     bdep    z0\.d, z1\.d, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_u64_tied2, svuint64_t,
+               z0 = svbdep_u64 (z1, z0),
+               z0 = svbdep (z1, z0))
+
+/*
+** bdep_u64_untied:
+**     bdep    z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_u64_untied, svuint64_t,
+               z0 = svbdep_u64 (z1, z2),
+               z0 = svbdep (z1, z2))
+
+/*
+** bdep_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     bdep    z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bdep_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = svbdep_n_u64 (z0, x0),
+                z0 = svbdep (z0, x0))
+
+/*
+** bdep_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     bdep    z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bdep_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = svbdep_n_u64 (z1, x0),
+                z0 = svbdep (z1, x0))
+
+/*
+** bdep_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     bdep    z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_11_u64_tied1, svuint64_t,
+               z0 = svbdep_n_u64 (z0, 11),
+               z0 = svbdep (z0, 11))
+
+/*
+** bdep_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     bdep    z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_11_u64_untied, svuint64_t,
+               z0 = svbdep_n_u64 (z1, 11),
+               z0 = svbdep (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bdep_u8.c
new file mode 100644 (file)
index 0000000..b420323
--- /dev/null
@@ -0,0 +1,72 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-bitperm"
+
+/*
+** bdep_u8_tied1:
+**     bdep    z0\.b, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_u8_tied1, svuint8_t,
+               z0 = svbdep_u8 (z0, z1),
+               z0 = svbdep (z0, z1))
+
+/*
+** bdep_u8_tied2:
+**     bdep    z0\.b, z1\.b, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_u8_tied2, svuint8_t,
+               z0 = svbdep_u8 (z1, z0),
+               z0 = svbdep (z1, z0))
+
+/*
+** bdep_u8_untied:
+**     bdep    z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_u8_untied, svuint8_t,
+               z0 = svbdep_u8 (z1, z2),
+               z0 = svbdep (z1, z2))
+
+/*
+** bdep_w0_u8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     bdep    z0\.b, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bdep_w0_u8_tied1, svuint8_t, uint8_t,
+                z0 = svbdep_n_u8 (z0, x0),
+                z0 = svbdep (z0, x0))
+
+/*
+** bdep_w0_u8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     bdep    z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bdep_w0_u8_untied, svuint8_t, uint8_t,
+                z0 = svbdep_n_u8 (z1, x0),
+                z0 = svbdep (z1, x0))
+
+/*
+** bdep_11_u8_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     bdep    z0\.b, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_11_u8_tied1, svuint8_t,
+               z0 = svbdep_n_u8 (z0, 11),
+               z0 = svbdep (z0, 11))
+
+/*
+** bdep_11_u8_untied:
+**     mov     (z[0-9]+\.b), #11
+**     bdep    z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bdep_11_u8_untied, svuint8_t,
+               z0 = svbdep_n_u8 (z1, 11),
+               z0 = svbdep (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u16.c
new file mode 100644 (file)
index 0000000..50a6479
--- /dev/null
@@ -0,0 +1,72 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-bitperm"
+
+/*
+** bext_u16_tied1:
+**     bext    z0\.h, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (bext_u16_tied1, svuint16_t,
+               z0 = svbext_u16 (z0, z1),
+               z0 = svbext (z0, z1))
+
+/*
+** bext_u16_tied2:
+**     bext    z0\.h, z1\.h, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (bext_u16_tied2, svuint16_t,
+               z0 = svbext_u16 (z1, z0),
+               z0 = svbext (z1, z0))
+
+/*
+** bext_u16_untied:
+**     bext    z0\.h, z1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (bext_u16_untied, svuint16_t,
+               z0 = svbext_u16 (z1, z2),
+               z0 = svbext (z1, z2))
+
+/*
+** bext_w0_u16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     bext    z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bext_w0_u16_tied1, svuint16_t, uint16_t,
+                z0 = svbext_n_u16 (z0, x0),
+                z0 = svbext (z0, x0))
+
+/*
+** bext_w0_u16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     bext    z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bext_w0_u16_untied, svuint16_t, uint16_t,
+                z0 = svbext_n_u16 (z1, x0),
+                z0 = svbext (z1, x0))
+
+/*
+** bext_11_u16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     bext    z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bext_11_u16_tied1, svuint16_t,
+               z0 = svbext_n_u16 (z0, 11),
+               z0 = svbext (z0, 11))
+
+/*
+** bext_11_u16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     bext    z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bext_11_u16_untied, svuint16_t,
+               z0 = svbext_n_u16 (z1, 11),
+               z0 = svbext (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u32.c
new file mode 100644 (file)
index 0000000..9f98b84
--- /dev/null
@@ -0,0 +1,72 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-bitperm"
+
+/*
+** bext_u32_tied1:
+**     bext    z0\.s, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (bext_u32_tied1, svuint32_t,
+               z0 = svbext_u32 (z0, z1),
+               z0 = svbext (z0, z1))
+
+/*
+** bext_u32_tied2:
+**     bext    z0\.s, z1\.s, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (bext_u32_tied2, svuint32_t,
+               z0 = svbext_u32 (z1, z0),
+               z0 = svbext (z1, z0))
+
+/*
+** bext_u32_untied:
+**     bext    z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (bext_u32_untied, svuint32_t,
+               z0 = svbext_u32 (z1, z2),
+               z0 = svbext (z1, z2))
+
+/*
+** bext_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     bext    z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bext_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = svbext_n_u32 (z0, x0),
+                z0 = svbext (z0, x0))
+
+/*
+** bext_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     bext    z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bext_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = svbext_n_u32 (z1, x0),
+                z0 = svbext (z1, x0))
+
+/*
+** bext_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     bext    z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bext_11_u32_tied1, svuint32_t,
+               z0 = svbext_n_u32 (z0, 11),
+               z0 = svbext (z0, 11))
+
+/*
+** bext_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     bext    z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bext_11_u32_untied, svuint32_t,
+               z0 = svbext_n_u32 (z1, 11),
+               z0 = svbext (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u64.c
new file mode 100644 (file)
index 0000000..9dbaec1
--- /dev/null
@@ -0,0 +1,72 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-bitperm"
+
+/*
+** bext_u64_tied1:
+**     bext    z0\.d, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bext_u64_tied1, svuint64_t,
+               z0 = svbext_u64 (z0, z1),
+               z0 = svbext (z0, z1))
+
+/*
+** bext_u64_tied2:
+**     bext    z0\.d, z1\.d, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bext_u64_tied2, svuint64_t,
+               z0 = svbext_u64 (z1, z0),
+               z0 = svbext (z1, z0))
+
+/*
+** bext_u64_untied:
+**     bext    z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bext_u64_untied, svuint64_t,
+               z0 = svbext_u64 (z1, z2),
+               z0 = svbext (z1, z2))
+
+/*
+** bext_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     bext    z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bext_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = svbext_n_u64 (z0, x0),
+                z0 = svbext (z0, x0))
+
+/*
+** bext_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     bext    z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bext_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = svbext_n_u64 (z1, x0),
+                z0 = svbext (z1, x0))
+
+/*
+** bext_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     bext    z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bext_11_u64_tied1, svuint64_t,
+               z0 = svbext_n_u64 (z0, 11),
+               z0 = svbext (z0, 11))
+
+/*
+** bext_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     bext    z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bext_11_u64_untied, svuint64_t,
+               z0 = svbext_n_u64 (z1, 11),
+               z0 = svbext (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bext_u8.c
new file mode 100644 (file)
index 0000000..81ed5a4
--- /dev/null
@@ -0,0 +1,72 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-bitperm"
+
+/*
+** bext_u8_tied1:
+**     bext    z0\.b, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (bext_u8_tied1, svuint8_t,
+               z0 = svbext_u8 (z0, z1),
+               z0 = svbext (z0, z1))
+
+/*
+** bext_u8_tied2:
+**     bext    z0\.b, z1\.b, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (bext_u8_tied2, svuint8_t,
+               z0 = svbext_u8 (z1, z0),
+               z0 = svbext (z1, z0))
+
+/*
+** bext_u8_untied:
+**     bext    z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (bext_u8_untied, svuint8_t,
+               z0 = svbext_u8 (z1, z2),
+               z0 = svbext (z1, z2))
+
+/*
+** bext_w0_u8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     bext    z0\.b, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bext_w0_u8_tied1, svuint8_t, uint8_t,
+                z0 = svbext_n_u8 (z0, x0),
+                z0 = svbext (z0, x0))
+
+/*
+** bext_w0_u8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     bext    z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bext_w0_u8_untied, svuint8_t, uint8_t,
+                z0 = svbext_n_u8 (z1, x0),
+                z0 = svbext (z1, x0))
+
+/*
+** bext_11_u8_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     bext    z0\.b, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bext_11_u8_tied1, svuint8_t,
+               z0 = svbext_n_u8 (z0, 11),
+               z0 = svbext (z0, 11))
+
+/*
+** bext_11_u8_untied:
+**     mov     (z[0-9]+\.b), #11
+**     bext    z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bext_11_u8_untied, svuint8_t,
+               z0 = svbext_n_u8 (z1, 11),
+               z0 = svbext (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u16.c
new file mode 100644 (file)
index 0000000..70aeae3
--- /dev/null
@@ -0,0 +1,72 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-bitperm"
+
+/*
+** bgrp_u16_tied1:
+**     bgrp    z0\.h, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_u16_tied1, svuint16_t,
+               z0 = svbgrp_u16 (z0, z1),
+               z0 = svbgrp (z0, z1))
+
+/*
+** bgrp_u16_tied2:
+**     bgrp    z0\.h, z1\.h, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_u16_tied2, svuint16_t,
+               z0 = svbgrp_u16 (z1, z0),
+               z0 = svbgrp (z1, z0))
+
+/*
+** bgrp_u16_untied:
+**     bgrp    z0\.h, z1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_u16_untied, svuint16_t,
+               z0 = svbgrp_u16 (z1, z2),
+               z0 = svbgrp (z1, z2))
+
+/*
+** bgrp_w0_u16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     bgrp    z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bgrp_w0_u16_tied1, svuint16_t, uint16_t,
+                z0 = svbgrp_n_u16 (z0, x0),
+                z0 = svbgrp (z0, x0))
+
+/*
+** bgrp_w0_u16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     bgrp    z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bgrp_w0_u16_untied, svuint16_t, uint16_t,
+                z0 = svbgrp_n_u16 (z1, x0),
+                z0 = svbgrp (z1, x0))
+
+/*
+** bgrp_11_u16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     bgrp    z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_11_u16_tied1, svuint16_t,
+               z0 = svbgrp_n_u16 (z0, 11),
+               z0 = svbgrp (z0, 11))
+
+/*
+** bgrp_11_u16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     bgrp    z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_11_u16_untied, svuint16_t,
+               z0 = svbgrp_n_u16 (z1, 11),
+               z0 = svbgrp (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u32.c
new file mode 100644 (file)
index 0000000..6e19e38
--- /dev/null
@@ -0,0 +1,72 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-bitperm"
+
+/*
+** bgrp_u32_tied1:
+**     bgrp    z0\.s, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_u32_tied1, svuint32_t,
+               z0 = svbgrp_u32 (z0, z1),
+               z0 = svbgrp (z0, z1))
+
+/*
+** bgrp_u32_tied2:
+**     bgrp    z0\.s, z1\.s, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_u32_tied2, svuint32_t,
+               z0 = svbgrp_u32 (z1, z0),
+               z0 = svbgrp (z1, z0))
+
+/*
+** bgrp_u32_untied:
+**     bgrp    z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_u32_untied, svuint32_t,
+               z0 = svbgrp_u32 (z1, z2),
+               z0 = svbgrp (z1, z2))
+
+/*
+** bgrp_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     bgrp    z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bgrp_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = svbgrp_n_u32 (z0, x0),
+                z0 = svbgrp (z0, x0))
+
+/*
+** bgrp_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     bgrp    z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bgrp_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = svbgrp_n_u32 (z1, x0),
+                z0 = svbgrp (z1, x0))
+
+/*
+** bgrp_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     bgrp    z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_11_u32_tied1, svuint32_t,
+               z0 = svbgrp_n_u32 (z0, 11),
+               z0 = svbgrp (z0, 11))
+
+/*
+** bgrp_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     bgrp    z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_11_u32_untied, svuint32_t,
+               z0 = svbgrp_n_u32 (z1, 11),
+               z0 = svbgrp (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u64.c
new file mode 100644 (file)
index 0000000..27fa40f
--- /dev/null
@@ -0,0 +1,72 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-bitperm"
+
+/*
+** bgrp_u64_tied1:
+**     bgrp    z0\.d, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_u64_tied1, svuint64_t,
+               z0 = svbgrp_u64 (z0, z1),
+               z0 = svbgrp (z0, z1))
+
+/*
+** bgrp_u64_tied2:
+**     bgrp    z0\.d, z1\.d, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_u64_tied2, svuint64_t,
+               z0 = svbgrp_u64 (z1, z0),
+               z0 = svbgrp (z1, z0))
+
+/*
+** bgrp_u64_untied:
+**     bgrp    z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_u64_untied, svuint64_t,
+               z0 = svbgrp_u64 (z1, z2),
+               z0 = svbgrp (z1, z2))
+
+/*
+** bgrp_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     bgrp    z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bgrp_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = svbgrp_n_u64 (z0, x0),
+                z0 = svbgrp (z0, x0))
+
+/*
+** bgrp_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     bgrp    z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bgrp_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = svbgrp_n_u64 (z1, x0),
+                z0 = svbgrp (z1, x0))
+
+/*
+** bgrp_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     bgrp    z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_11_u64_tied1, svuint64_t,
+               z0 = svbgrp_n_u64 (z0, 11),
+               z0 = svbgrp (z0, 11))
+
+/*
+** bgrp_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     bgrp    z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_11_u64_untied, svuint64_t,
+               z0 = svbgrp_n_u64 (z1, 11),
+               z0 = svbgrp (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bgrp_u8.c
new file mode 100644 (file)
index 0000000..b667e03
--- /dev/null
@@ -0,0 +1,72 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-bitperm"
+
+/*
+** bgrp_u8_tied1:
+**     bgrp    z0\.b, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_u8_tied1, svuint8_t,
+               z0 = svbgrp_u8 (z0, z1),
+               z0 = svbgrp (z0, z1))
+
+/*
+** bgrp_u8_tied2:
+**     bgrp    z0\.b, z1\.b, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_u8_tied2, svuint8_t,
+               z0 = svbgrp_u8 (z1, z0),
+               z0 = svbgrp (z1, z0))
+
+/*
+** bgrp_u8_untied:
+**     bgrp    z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_u8_untied, svuint8_t,
+               z0 = svbgrp_u8 (z1, z2),
+               z0 = svbgrp (z1, z2))
+
+/*
+** bgrp_w0_u8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     bgrp    z0\.b, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bgrp_w0_u8_tied1, svuint8_t, uint8_t,
+                z0 = svbgrp_n_u8 (z0, x0),
+                z0 = svbgrp (z0, x0))
+
+/*
+** bgrp_w0_u8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     bgrp    z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bgrp_w0_u8_untied, svuint8_t, uint8_t,
+                z0 = svbgrp_n_u8 (z1, x0),
+                z0 = svbgrp (z1, x0))
+
+/*
+** bgrp_11_u8_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     bgrp    z0\.b, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_11_u8_tied1, svuint8_t,
+               z0 = svbgrp_n_u8 (z0, 11),
+               z0 = svbgrp (z0, 11))
+
+/*
+** bgrp_11_u8_untied:
+**     mov     (z[0-9]+\.b), #11
+**     bgrp    z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bgrp_11_u8_untied, svuint8_t,
+               z0 = svbgrp_n_u8 (z1, 11),
+               z0 = svbgrp (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_s16.c
new file mode 100644 (file)
index 0000000..efe4f03
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl1n_s16_tied1:
+**     bsl1n   z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_s16_tied1, svint16_t,
+               z0 = svbsl1n_s16 (z0, z1, z2),
+               z0 = svbsl1n (z0, z1, z2))
+
+/*
+** bsl1n_s16_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_s16_tied2, svint16_t,
+               z0 = svbsl1n_s16 (z1, z0, z2),
+               z0 = svbsl1n (z1, z0, z2))
+
+/*
+** bsl1n_s16_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_s16_tied3, svint16_t,
+               z0 = svbsl1n_s16 (z1, z2, z0),
+               z0 = svbsl1n (z1, z2, z0))
+
+/*
+** bsl1n_s16_untied:
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_s16_untied, svint16_t,
+               z0 = svbsl1n_s16 (z1, z2, z3),
+               z0 = svbsl1n (z1, z2, z3))
+
+/*
+** bsl1n_w0_s16_tied1:
+**     mov     (z[0-9]+)\.h, w0
+**     bsl1n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_w0_s16_tied1, svint16_t, int16_t,
+                z0 = svbsl1n_n_s16 (z0, z1, x0),
+                z0 = svbsl1n (z0, z1, x0))
+
+/*
+** bsl1n_w0_s16_tied2:
+**     mov     (z[0-9]+)\.h, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_w0_s16_tied2, svint16_t, int16_t,
+                z0 = svbsl1n_n_s16 (z1, z0, x0),
+                z0 = svbsl1n (z1, z0, x0))
+
+/*
+** bsl1n_w0_s16_untied:
+**     mov     (z[0-9]+)\.h, w0
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_w0_s16_untied, svint16_t, int16_t,
+                z0 = svbsl1n_n_s16 (z1, z2, x0),
+                z0 = svbsl1n (z1, z2, x0))
+
+/*
+** bsl1n_11_s16_tied1:
+**     mov     (z[0-9]+)\.h, #11
+**     bsl1n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_s16_tied1, svint16_t,
+               z0 = svbsl1n_n_s16 (z0, z1, 11),
+               z0 = svbsl1n (z0, z1, 11))
+
+/*
+** bsl1n_11_s16_tied2:
+**     mov     (z[0-9]+)\.h, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_s16_tied2, svint16_t,
+               z0 = svbsl1n_n_s16 (z1, z0, 11),
+               z0 = svbsl1n (z1, z0, 11))
+
+/*
+** bsl1n_11_s16_untied:
+**     mov     (z[0-9]+)\.h, #11
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_s16_untied, svint16_t,
+               z0 = svbsl1n_n_s16 (z1, z2, 11),
+               z0 = svbsl1n (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_s32.c
new file mode 100644 (file)
index 0000000..84a5d01
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl1n_s32_tied1:
+**     bsl1n   z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_s32_tied1, svint32_t,
+               z0 = svbsl1n_s32 (z0, z1, z2),
+               z0 = svbsl1n (z0, z1, z2))
+
+/*
+** bsl1n_s32_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_s32_tied2, svint32_t,
+               z0 = svbsl1n_s32 (z1, z0, z2),
+               z0 = svbsl1n (z1, z0, z2))
+
+/*
+** bsl1n_s32_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_s32_tied3, svint32_t,
+               z0 = svbsl1n_s32 (z1, z2, z0),
+               z0 = svbsl1n (z1, z2, z0))
+
+/*
+** bsl1n_s32_untied:
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_s32_untied, svint32_t,
+               z0 = svbsl1n_s32 (z1, z2, z3),
+               z0 = svbsl1n (z1, z2, z3))
+
+/*
+** bsl1n_w0_s32_tied1:
+**     mov     (z[0-9]+)\.s, w0
+**     bsl1n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_w0_s32_tied1, svint32_t, int32_t,
+                z0 = svbsl1n_n_s32 (z0, z1, x0),
+                z0 = svbsl1n (z0, z1, x0))
+
+/*
+** bsl1n_w0_s32_tied2:
+**     mov     (z[0-9]+)\.s, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_w0_s32_tied2, svint32_t, int32_t,
+                z0 = svbsl1n_n_s32 (z1, z0, x0),
+                z0 = svbsl1n (z1, z0, x0))
+
+/*
+** bsl1n_w0_s32_untied:
+**     mov     (z[0-9]+)\.s, w0
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_w0_s32_untied, svint32_t, int32_t,
+                z0 = svbsl1n_n_s32 (z1, z2, x0),
+                z0 = svbsl1n (z1, z2, x0))
+
+/*
+** bsl1n_11_s32_tied1:
+**     mov     (z[0-9]+)\.s, #11
+**     bsl1n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_s32_tied1, svint32_t,
+               z0 = svbsl1n_n_s32 (z0, z1, 11),
+               z0 = svbsl1n (z0, z1, 11))
+
+/*
+** bsl1n_11_s32_tied2:
+**     mov     (z[0-9]+)\.s, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_s32_tied2, svint32_t,
+               z0 = svbsl1n_n_s32 (z1, z0, 11),
+               z0 = svbsl1n (z1, z0, 11))
+
+/*
+** bsl1n_11_s32_untied:
+**     mov     (z[0-9]+)\.s, #11
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_s32_untied, svint32_t,
+               z0 = svbsl1n_n_s32 (z1, z2, 11),
+               z0 = svbsl1n (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_s64.c
new file mode 100644 (file)
index 0000000..aed7b05
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl1n_s64_tied1:
+**     bsl1n   z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_s64_tied1, svint64_t,
+               z0 = svbsl1n_s64 (z0, z1, z2),
+               z0 = svbsl1n (z0, z1, z2))
+
+/*
+** bsl1n_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_s64_tied2, svint64_t,
+               z0 = svbsl1n_s64 (z1, z0, z2),
+               z0 = svbsl1n (z1, z0, z2))
+
+/*
+** bsl1n_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_s64_tied3, svint64_t,
+               z0 = svbsl1n_s64 (z1, z2, z0),
+               z0 = svbsl1n (z1, z2, z0))
+
+/*
+** bsl1n_s64_untied:
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_s64_untied, svint64_t,
+               z0 = svbsl1n_s64 (z1, z2, z3),
+               z0 = svbsl1n (z1, z2, z3))
+
+/*
+** bsl1n_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     bsl1n   z0\.d, z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_x0_s64_tied1, svint64_t, int64_t,
+                z0 = svbsl1n_n_s64 (z0, z1, x0),
+                z0 = svbsl1n (z0, z1, x0))
+
+/*
+** bsl1n_x0_s64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_x0_s64_tied2, svint64_t, int64_t,
+                z0 = svbsl1n_n_s64 (z1, z0, x0),
+                z0 = svbsl1n (z1, z0, x0))
+
+/*
+** bsl1n_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_x0_s64_untied, svint64_t, int64_t,
+                z0 = svbsl1n_n_s64 (z1, z2, x0),
+                z0 = svbsl1n (z1, z2, x0))
+
+/*
+** bsl1n_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     bsl1n   z0\.d, z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_s64_tied1, svint64_t,
+               z0 = svbsl1n_n_s64 (z0, z1, 11),
+               z0 = svbsl1n (z0, z1, 11))
+
+/*
+** bsl1n_11_s64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_s64_tied2, svint64_t,
+               z0 = svbsl1n_n_s64 (z1, z0, 11),
+               z0 = svbsl1n (z1, z0, 11))
+
+/*
+** bsl1n_11_s64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_s64_untied, svint64_t,
+               z0 = svbsl1n_n_s64 (z1, z2, 11),
+               z0 = svbsl1n (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_s8.c
new file mode 100644 (file)
index 0000000..998186c
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl1n_s8_tied1:
+**     bsl1n   z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_s8_tied1, svint8_t,
+               z0 = svbsl1n_s8 (z0, z1, z2),
+               z0 = svbsl1n (z0, z1, z2))
+
+/*
+** bsl1n_s8_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_s8_tied2, svint8_t,
+               z0 = svbsl1n_s8 (z1, z0, z2),
+               z0 = svbsl1n (z1, z0, z2))
+
+/*
+** bsl1n_s8_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_s8_tied3, svint8_t,
+               z0 = svbsl1n_s8 (z1, z2, z0),
+               z0 = svbsl1n (z1, z2, z0))
+
+/*
+** bsl1n_s8_untied:
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_s8_untied, svint8_t,
+               z0 = svbsl1n_s8 (z1, z2, z3),
+               z0 = svbsl1n (z1, z2, z3))
+
+/*
+** bsl1n_w0_s8_tied1:
+**     mov     (z[0-9]+)\.b, w0
+**     bsl1n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_w0_s8_tied1, svint8_t, int8_t,
+                z0 = svbsl1n_n_s8 (z0, z1, x0),
+                z0 = svbsl1n (z0, z1, x0))
+
+/*
+** bsl1n_w0_s8_tied2:
+**     mov     (z[0-9]+)\.b, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_w0_s8_tied2, svint8_t, int8_t,
+                z0 = svbsl1n_n_s8 (z1, z0, x0),
+                z0 = svbsl1n (z1, z0, x0))
+
+/*
+** bsl1n_w0_s8_untied:
+**     mov     (z[0-9]+)\.b, w0
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_w0_s8_untied, svint8_t, int8_t,
+                z0 = svbsl1n_n_s8 (z1, z2, x0),
+                z0 = svbsl1n (z1, z2, x0))
+
+/*
+** bsl1n_11_s8_tied1:
+**     mov     (z[0-9]+)\.b, #11
+**     bsl1n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_s8_tied1, svint8_t,
+               z0 = svbsl1n_n_s8 (z0, z1, 11),
+               z0 = svbsl1n (z0, z1, 11))
+
+/*
+** bsl1n_11_s8_tied2:
+**     mov     (z[0-9]+)\.b, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_s8_tied2, svint8_t,
+               z0 = svbsl1n_n_s8 (z1, z0, 11),
+               z0 = svbsl1n (z1, z0, 11))
+
+/*
+** bsl1n_11_s8_untied:
+**     mov     (z[0-9]+)\.b, #11
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_s8_untied, svint8_t,
+               z0 = svbsl1n_n_s8 (z1, z2, 11),
+               z0 = svbsl1n (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_u16.c
new file mode 100644 (file)
index 0000000..2e66c59
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl1n_u16_tied1:
+**     bsl1n   z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_u16_tied1, svuint16_t,
+               z0 = svbsl1n_u16 (z0, z1, z2),
+               z0 = svbsl1n (z0, z1, z2))
+
+/*
+** bsl1n_u16_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_u16_tied2, svuint16_t,
+               z0 = svbsl1n_u16 (z1, z0, z2),
+               z0 = svbsl1n (z1, z0, z2))
+
+/*
+** bsl1n_u16_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_u16_tied3, svuint16_t,
+               z0 = svbsl1n_u16 (z1, z2, z0),
+               z0 = svbsl1n (z1, z2, z0))
+
+/*
+** bsl1n_u16_untied:
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_u16_untied, svuint16_t,
+               z0 = svbsl1n_u16 (z1, z2, z3),
+               z0 = svbsl1n (z1, z2, z3))
+
+/*
+** bsl1n_w0_u16_tied1:
+**     mov     (z[0-9]+)\.h, w0
+**     bsl1n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_w0_u16_tied1, svuint16_t, uint16_t,
+                z0 = svbsl1n_n_u16 (z0, z1, x0),
+                z0 = svbsl1n (z0, z1, x0))
+
+/*
+** bsl1n_w0_u16_tied2:
+**     mov     (z[0-9]+)\.h, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_w0_u16_tied2, svuint16_t, uint16_t,
+                z0 = svbsl1n_n_u16 (z1, z0, x0),
+                z0 = svbsl1n (z1, z0, x0))
+
+/*
+** bsl1n_w0_u16_untied:
+**     mov     (z[0-9]+)\.h, w0
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_w0_u16_untied, svuint16_t, uint16_t,
+                z0 = svbsl1n_n_u16 (z1, z2, x0),
+                z0 = svbsl1n (z1, z2, x0))
+
+/*
+** bsl1n_11_u16_tied1:
+**     mov     (z[0-9]+)\.h, #11
+**     bsl1n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_u16_tied1, svuint16_t,
+               z0 = svbsl1n_n_u16 (z0, z1, 11),
+               z0 = svbsl1n (z0, z1, 11))
+
+/*
+** bsl1n_11_u16_tied2:
+**     mov     (z[0-9]+)\.h, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_u16_tied2, svuint16_t,
+               z0 = svbsl1n_n_u16 (z1, z0, 11),
+               z0 = svbsl1n (z1, z0, 11))
+
+/*
+** bsl1n_11_u16_untied:
+**     mov     (z[0-9]+)\.h, #11
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_u16_untied, svuint16_t,
+               z0 = svbsl1n_n_u16 (z1, z2, 11),
+               z0 = svbsl1n (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_u32.c
new file mode 100644 (file)
index 0000000..ef214bc
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl1n_u32_tied1:
+**     bsl1n   z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_u32_tied1, svuint32_t,
+               z0 = svbsl1n_u32 (z0, z1, z2),
+               z0 = svbsl1n (z0, z1, z2))
+
+/*
+** bsl1n_u32_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_u32_tied2, svuint32_t,
+               z0 = svbsl1n_u32 (z1, z0, z2),
+               z0 = svbsl1n (z1, z0, z2))
+
+/*
+** bsl1n_u32_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_u32_tied3, svuint32_t,
+               z0 = svbsl1n_u32 (z1, z2, z0),
+               z0 = svbsl1n (z1, z2, z0))
+
+/*
+** bsl1n_u32_untied:
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_u32_untied, svuint32_t,
+               z0 = svbsl1n_u32 (z1, z2, z3),
+               z0 = svbsl1n (z1, z2, z3))
+
+/*
+** bsl1n_w0_u32_tied1:
+**     mov     (z[0-9]+)\.s, w0
+**     bsl1n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = svbsl1n_n_u32 (z0, z1, x0),
+                z0 = svbsl1n (z0, z1, x0))
+
+/*
+** bsl1n_w0_u32_tied2:
+**     mov     (z[0-9]+)\.s, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_w0_u32_tied2, svuint32_t, uint32_t,
+                z0 = svbsl1n_n_u32 (z1, z0, x0),
+                z0 = svbsl1n (z1, z0, x0))
+
+/*
+** bsl1n_w0_u32_untied:
+**     mov     (z[0-9]+)\.s, w0
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = svbsl1n_n_u32 (z1, z2, x0),
+                z0 = svbsl1n (z1, z2, x0))
+
+/*
+** bsl1n_11_u32_tied1:
+**     mov     (z[0-9]+)\.s, #11
+**     bsl1n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_u32_tied1, svuint32_t,
+               z0 = svbsl1n_n_u32 (z0, z1, 11),
+               z0 = svbsl1n (z0, z1, 11))
+
+/*
+** bsl1n_11_u32_tied2:
+**     mov     (z[0-9]+)\.s, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_u32_tied2, svuint32_t,
+               z0 = svbsl1n_n_u32 (z1, z0, 11),
+               z0 = svbsl1n (z1, z0, 11))
+
+/*
+** bsl1n_11_u32_untied:
+**     mov     (z[0-9]+)\.s, #11
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_u32_untied, svuint32_t,
+               z0 = svbsl1n_n_u32 (z1, z2, 11),
+               z0 = svbsl1n (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_u64.c
new file mode 100644 (file)
index 0000000..7cf271d
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl1n_u64_tied1:
+**     bsl1n   z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_u64_tied1, svuint64_t,
+               z0 = svbsl1n_u64 (z0, z1, z2),
+               z0 = svbsl1n (z0, z1, z2))
+
+/*
+** bsl1n_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_u64_tied2, svuint64_t,
+               z0 = svbsl1n_u64 (z1, z0, z2),
+               z0 = svbsl1n (z1, z0, z2))
+
+/*
+** bsl1n_u64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_u64_tied3, svuint64_t,
+               z0 = svbsl1n_u64 (z1, z2, z0),
+               z0 = svbsl1n (z1, z2, z0))
+
+/*
+** bsl1n_u64_untied:
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_u64_untied, svuint64_t,
+               z0 = svbsl1n_u64 (z1, z2, z3),
+               z0 = svbsl1n (z1, z2, z3))
+
+/*
+** bsl1n_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     bsl1n   z0\.d, z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = svbsl1n_n_u64 (z0, z1, x0),
+                z0 = svbsl1n (z0, z1, x0))
+
+/*
+** bsl1n_x0_u64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_x0_u64_tied2, svuint64_t, uint64_t,
+                z0 = svbsl1n_n_u64 (z1, z0, x0),
+                z0 = svbsl1n (z1, z0, x0))
+
+/*
+** bsl1n_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = svbsl1n_n_u64 (z1, z2, x0),
+                z0 = svbsl1n (z1, z2, x0))
+
+/*
+** bsl1n_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     bsl1n   z0\.d, z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_u64_tied1, svuint64_t,
+               z0 = svbsl1n_n_u64 (z0, z1, 11),
+               z0 = svbsl1n (z0, z1, 11))
+
+/*
+** bsl1n_11_u64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_u64_tied2, svuint64_t,
+               z0 = svbsl1n_n_u64 (z1, z0, 11),
+               z0 = svbsl1n (z1, z0, 11))
+
+/*
+** bsl1n_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_u64_untied, svuint64_t,
+               z0 = svbsl1n_n_u64 (z1, z2, 11),
+               z0 = svbsl1n (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl1n_u8.c
new file mode 100644 (file)
index 0000000..74a79cb
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl1n_u8_tied1:
+**     bsl1n   z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_u8_tied1, svuint8_t,
+               z0 = svbsl1n_u8 (z0, z1, z2),
+               z0 = svbsl1n (z0, z1, z2))
+
+/*
+** bsl1n_u8_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_u8_tied2, svuint8_t,
+               z0 = svbsl1n_u8 (z1, z0, z2),
+               z0 = svbsl1n (z1, z0, z2))
+
+/*
+** bsl1n_u8_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_u8_tied3, svuint8_t,
+               z0 = svbsl1n_u8 (z1, z2, z0),
+               z0 = svbsl1n (z1, z2, z0))
+
+/*
+** bsl1n_u8_untied:
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_u8_untied, svuint8_t,
+               z0 = svbsl1n_u8 (z1, z2, z3),
+               z0 = svbsl1n (z1, z2, z3))
+
+/*
+** bsl1n_w0_u8_tied1:
+**     mov     (z[0-9]+)\.b, w0
+**     bsl1n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_w0_u8_tied1, svuint8_t, uint8_t,
+                z0 = svbsl1n_n_u8 (z0, z1, x0),
+                z0 = svbsl1n (z0, z1, x0))
+
+/*
+** bsl1n_w0_u8_tied2:
+**     mov     (z[0-9]+)\.b, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_w0_u8_tied2, svuint8_t, uint8_t,
+                z0 = svbsl1n_n_u8 (z1, z0, x0),
+                z0 = svbsl1n (z1, z0, x0))
+
+/*
+** bsl1n_w0_u8_untied:
+**     mov     (z[0-9]+)\.b, w0
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl1n_w0_u8_untied, svuint8_t, uint8_t,
+                z0 = svbsl1n_n_u8 (z1, z2, x0),
+                z0 = svbsl1n (z1, z2, x0))
+
+/*
+** bsl1n_11_u8_tied1:
+**     mov     (z[0-9]+)\.b, #11
+**     bsl1n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_u8_tied1, svuint8_t,
+               z0 = svbsl1n_n_u8 (z0, z1, 11),
+               z0 = svbsl1n (z0, z1, 11))
+
+/*
+** bsl1n_11_u8_tied2:
+**     mov     (z[0-9]+)\.b, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_u8_tied2, svuint8_t,
+               z0 = svbsl1n_n_u8 (z1, z0, 11),
+               z0 = svbsl1n (z1, z0, 11))
+
+/*
+** bsl1n_11_u8_untied:
+**     mov     (z[0-9]+)\.b, #11
+**     movprfx z0, z1
+**     bsl1n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl1n_11_u8_untied, svuint8_t,
+               z0 = svbsl1n_n_u8 (z1, z2, 11),
+               z0 = svbsl1n (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_s16.c
new file mode 100644 (file)
index 0000000..01fd135
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl2n_s16_tied1:
+**     bsl2n   z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_s16_tied1, svint16_t,
+               z0 = svbsl2n_s16 (z0, z1, z2),
+               z0 = svbsl2n (z0, z1, z2))
+
+/*
+** bsl2n_s16_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_s16_tied2, svint16_t,
+               z0 = svbsl2n_s16 (z1, z0, z2),
+               z0 = svbsl2n (z1, z0, z2))
+
+/*
+** bsl2n_s16_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_s16_tied3, svint16_t,
+               z0 = svbsl2n_s16 (z1, z2, z0),
+               z0 = svbsl2n (z1, z2, z0))
+
+/*
+** bsl2n_s16_untied:
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_s16_untied, svint16_t,
+               z0 = svbsl2n_s16 (z1, z2, z3),
+               z0 = svbsl2n (z1, z2, z3))
+
+/*
+** bsl2n_w0_s16_tied1:
+**     mov     (z[0-9]+)\.h, w0
+**     bsl2n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_w0_s16_tied1, svint16_t, int16_t,
+                z0 = svbsl2n_n_s16 (z0, z1, x0),
+                z0 = svbsl2n (z0, z1, x0))
+
+/*
+** bsl2n_w0_s16_tied2:
+**     mov     (z[0-9]+)\.h, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_w0_s16_tied2, svint16_t, int16_t,
+                z0 = svbsl2n_n_s16 (z1, z0, x0),
+                z0 = svbsl2n (z1, z0, x0))
+
+/*
+** bsl2n_w0_s16_untied:
+**     mov     (z[0-9]+)\.h, w0
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_w0_s16_untied, svint16_t, int16_t,
+                z0 = svbsl2n_n_s16 (z1, z2, x0),
+                z0 = svbsl2n (z1, z2, x0))
+
+/*
+** bsl2n_11_s16_tied1:
+**     mov     (z[0-9]+)\.h, #11
+**     bsl2n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_s16_tied1, svint16_t,
+               z0 = svbsl2n_n_s16 (z0, z1, 11),
+               z0 = svbsl2n (z0, z1, 11))
+
+/*
+** bsl2n_11_s16_tied2:
+**     mov     (z[0-9]+)\.h, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_s16_tied2, svint16_t,
+               z0 = svbsl2n_n_s16 (z1, z0, 11),
+               z0 = svbsl2n (z1, z0, 11))
+
+/*
+** bsl2n_11_s16_untied:
+**     mov     (z[0-9]+)\.h, #11
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_s16_untied, svint16_t,
+               z0 = svbsl2n_n_s16 (z1, z2, 11),
+               z0 = svbsl2n (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_s32.c
new file mode 100644 (file)
index 0000000..f90d142
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl2n_s32_tied1:
+**     bsl2n   z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_s32_tied1, svint32_t,
+               z0 = svbsl2n_s32 (z0, z1, z2),
+               z0 = svbsl2n (z0, z1, z2))
+
+/*
+** bsl2n_s32_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_s32_tied2, svint32_t,
+               z0 = svbsl2n_s32 (z1, z0, z2),
+               z0 = svbsl2n (z1, z0, z2))
+
+/*
+** bsl2n_s32_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_s32_tied3, svint32_t,
+               z0 = svbsl2n_s32 (z1, z2, z0),
+               z0 = svbsl2n (z1, z2, z0))
+
+/*
+** bsl2n_s32_untied:
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_s32_untied, svint32_t,
+               z0 = svbsl2n_s32 (z1, z2, z3),
+               z0 = svbsl2n (z1, z2, z3))
+
+/*
+** bsl2n_w0_s32_tied1:
+**     mov     (z[0-9]+)\.s, w0
+**     bsl2n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_w0_s32_tied1, svint32_t, int32_t,
+                z0 = svbsl2n_n_s32 (z0, z1, x0),
+                z0 = svbsl2n (z0, z1, x0))
+
+/*
+** bsl2n_w0_s32_tied2:
+**     mov     (z[0-9]+)\.s, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_w0_s32_tied2, svint32_t, int32_t,
+                z0 = svbsl2n_n_s32 (z1, z0, x0),
+                z0 = svbsl2n (z1, z0, x0))
+
+/*
+** bsl2n_w0_s32_untied:
+**     mov     (z[0-9]+)\.s, w0
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_w0_s32_untied, svint32_t, int32_t,
+                z0 = svbsl2n_n_s32 (z1, z2, x0),
+                z0 = svbsl2n (z1, z2, x0))
+
+/*
+** bsl2n_11_s32_tied1:
+**     mov     (z[0-9]+)\.s, #11
+**     bsl2n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_s32_tied1, svint32_t,
+               z0 = svbsl2n_n_s32 (z0, z1, 11),
+               z0 = svbsl2n (z0, z1, 11))
+
+/*
+** bsl2n_11_s32_tied2:
+**     mov     (z[0-9]+)\.s, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_s32_tied2, svint32_t,
+               z0 = svbsl2n_n_s32 (z1, z0, 11),
+               z0 = svbsl2n (z1, z0, 11))
+
+/*
+** bsl2n_11_s32_untied:
+**     mov     (z[0-9]+)\.s, #11
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_s32_untied, svint32_t,
+               z0 = svbsl2n_n_s32 (z1, z2, 11),
+               z0 = svbsl2n (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_s64.c
new file mode 100644 (file)
index 0000000..ca971ed
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl2n_s64_tied1:
+**     bsl2n   z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_s64_tied1, svint64_t,
+               z0 = svbsl2n_s64 (z0, z1, z2),
+               z0 = svbsl2n (z0, z1, z2))
+
+/*
+** bsl2n_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_s64_tied2, svint64_t,
+               z0 = svbsl2n_s64 (z1, z0, z2),
+               z0 = svbsl2n (z1, z0, z2))
+
+/*
+** bsl2n_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_s64_tied3, svint64_t,
+               z0 = svbsl2n_s64 (z1, z2, z0),
+               z0 = svbsl2n (z1, z2, z0))
+
+/*
+** bsl2n_s64_untied:
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_s64_untied, svint64_t,
+               z0 = svbsl2n_s64 (z1, z2, z3),
+               z0 = svbsl2n (z1, z2, z3))
+
+/*
+** bsl2n_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     bsl2n   z0\.d, z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_x0_s64_tied1, svint64_t, int64_t,
+                z0 = svbsl2n_n_s64 (z0, z1, x0),
+                z0 = svbsl2n (z0, z1, x0))
+
+/*
+** bsl2n_x0_s64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_x0_s64_tied2, svint64_t, int64_t,
+                z0 = svbsl2n_n_s64 (z1, z0, x0),
+                z0 = svbsl2n (z1, z0, x0))
+
+/*
+** bsl2n_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_x0_s64_untied, svint64_t, int64_t,
+                z0 = svbsl2n_n_s64 (z1, z2, x0),
+                z0 = svbsl2n (z1, z2, x0))
+
+/*
+** bsl2n_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     bsl2n   z0\.d, z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_s64_tied1, svint64_t,
+               z0 = svbsl2n_n_s64 (z0, z1, 11),
+               z0 = svbsl2n (z0, z1, 11))
+
+/*
+** bsl2n_11_s64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_s64_tied2, svint64_t,
+               z0 = svbsl2n_n_s64 (z1, z0, 11),
+               z0 = svbsl2n (z1, z0, 11))
+
+/*
+** bsl2n_11_s64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_s64_untied, svint64_t,
+               z0 = svbsl2n_n_s64 (z1, z2, 11),
+               z0 = svbsl2n (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_s8.c
new file mode 100644 (file)
index 0000000..0f10131
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl2n_s8_tied1:
+**     bsl2n   z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_s8_tied1, svint8_t,
+               z0 = svbsl2n_s8 (z0, z1, z2),
+               z0 = svbsl2n (z0, z1, z2))
+
+/*
+** bsl2n_s8_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_s8_tied2, svint8_t,
+               z0 = svbsl2n_s8 (z1, z0, z2),
+               z0 = svbsl2n (z1, z0, z2))
+
+/*
+** bsl2n_s8_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_s8_tied3, svint8_t,
+               z0 = svbsl2n_s8 (z1, z2, z0),
+               z0 = svbsl2n (z1, z2, z0))
+
+/*
+** bsl2n_s8_untied:
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_s8_untied, svint8_t,
+               z0 = svbsl2n_s8 (z1, z2, z3),
+               z0 = svbsl2n (z1, z2, z3))
+
+/*
+** bsl2n_w0_s8_tied1:
+**     mov     (z[0-9]+)\.b, w0
+**     bsl2n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_w0_s8_tied1, svint8_t, int8_t,
+                z0 = svbsl2n_n_s8 (z0, z1, x0),
+                z0 = svbsl2n (z0, z1, x0))
+
+/*
+** bsl2n_w0_s8_tied2:
+**     mov     (z[0-9]+)\.b, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_w0_s8_tied2, svint8_t, int8_t,
+                z0 = svbsl2n_n_s8 (z1, z0, x0),
+                z0 = svbsl2n (z1, z0, x0))
+
+/*
+** bsl2n_w0_s8_untied:
+**     mov     (z[0-9]+)\.b, w0
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_w0_s8_untied, svint8_t, int8_t,
+                z0 = svbsl2n_n_s8 (z1, z2, x0),
+                z0 = svbsl2n (z1, z2, x0))
+
+/*
+** bsl2n_11_s8_tied1:
+**     mov     (z[0-9]+)\.b, #11
+**     bsl2n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_s8_tied1, svint8_t,
+               z0 = svbsl2n_n_s8 (z0, z1, 11),
+               z0 = svbsl2n (z0, z1, 11))
+
+/*
+** bsl2n_11_s8_tied2:
+**     mov     (z[0-9]+)\.b, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_s8_tied2, svint8_t,
+               z0 = svbsl2n_n_s8 (z1, z0, 11),
+               z0 = svbsl2n (z1, z0, 11))
+
+/*
+** bsl2n_11_s8_untied:
+**     mov     (z[0-9]+)\.b, #11
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_s8_untied, svint8_t,
+               z0 = svbsl2n_n_s8 (z1, z2, 11),
+               z0 = svbsl2n (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_u16.c
new file mode 100644 (file)
index 0000000..9e827ae
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl2n_u16_tied1:
+**     bsl2n   z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_u16_tied1, svuint16_t,
+               z0 = svbsl2n_u16 (z0, z1, z2),
+               z0 = svbsl2n (z0, z1, z2))
+
+/*
+** bsl2n_u16_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_u16_tied2, svuint16_t,
+               z0 = svbsl2n_u16 (z1, z0, z2),
+               z0 = svbsl2n (z1, z0, z2))
+
+/*
+** bsl2n_u16_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_u16_tied3, svuint16_t,
+               z0 = svbsl2n_u16 (z1, z2, z0),
+               z0 = svbsl2n (z1, z2, z0))
+
+/*
+** bsl2n_u16_untied:
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_u16_untied, svuint16_t,
+               z0 = svbsl2n_u16 (z1, z2, z3),
+               z0 = svbsl2n (z1, z2, z3))
+
+/*
+** bsl2n_w0_u16_tied1:
+**     mov     (z[0-9]+)\.h, w0
+**     bsl2n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_w0_u16_tied1, svuint16_t, uint16_t,
+                z0 = svbsl2n_n_u16 (z0, z1, x0),
+                z0 = svbsl2n (z0, z1, x0))
+
+/*
+** bsl2n_w0_u16_tied2:
+**     mov     (z[0-9]+)\.h, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_w0_u16_tied2, svuint16_t, uint16_t,
+                z0 = svbsl2n_n_u16 (z1, z0, x0),
+                z0 = svbsl2n (z1, z0, x0))
+
+/*
+** bsl2n_w0_u16_untied:
+**     mov     (z[0-9]+)\.h, w0
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_w0_u16_untied, svuint16_t, uint16_t,
+                z0 = svbsl2n_n_u16 (z1, z2, x0),
+                z0 = svbsl2n (z1, z2, x0))
+
+/*
+** bsl2n_11_u16_tied1:
+**     mov     (z[0-9]+)\.h, #11
+**     bsl2n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_u16_tied1, svuint16_t,
+               z0 = svbsl2n_n_u16 (z0, z1, 11),
+               z0 = svbsl2n (z0, z1, 11))
+
+/*
+** bsl2n_11_u16_tied2:
+**     mov     (z[0-9]+)\.h, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_u16_tied2, svuint16_t,
+               z0 = svbsl2n_n_u16 (z1, z0, 11),
+               z0 = svbsl2n (z1, z0, 11))
+
+/*
+** bsl2n_11_u16_untied:
+**     mov     (z[0-9]+)\.h, #11
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_u16_untied, svuint16_t,
+               z0 = svbsl2n_n_u16 (z1, z2, 11),
+               z0 = svbsl2n (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_u32.c
new file mode 100644 (file)
index 0000000..7863250
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl2n_u32_tied1:
+**     bsl2n   z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_u32_tied1, svuint32_t,
+               z0 = svbsl2n_u32 (z0, z1, z2),
+               z0 = svbsl2n (z0, z1, z2))
+
+/*
+** bsl2n_u32_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_u32_tied2, svuint32_t,
+               z0 = svbsl2n_u32 (z1, z0, z2),
+               z0 = svbsl2n (z1, z0, z2))
+
+/*
+** bsl2n_u32_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_u32_tied3, svuint32_t,
+               z0 = svbsl2n_u32 (z1, z2, z0),
+               z0 = svbsl2n (z1, z2, z0))
+
+/*
+** bsl2n_u32_untied:
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_u32_untied, svuint32_t,
+               z0 = svbsl2n_u32 (z1, z2, z3),
+               z0 = svbsl2n (z1, z2, z3))
+
+/*
+** bsl2n_w0_u32_tied1:
+**     mov     (z[0-9]+)\.s, w0
+**     bsl2n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = svbsl2n_n_u32 (z0, z1, x0),
+                z0 = svbsl2n (z0, z1, x0))
+
+/*
+** bsl2n_w0_u32_tied2:
+**     mov     (z[0-9]+)\.s, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_w0_u32_tied2, svuint32_t, uint32_t,
+                z0 = svbsl2n_n_u32 (z1, z0, x0),
+                z0 = svbsl2n (z1, z0, x0))
+
+/*
+** bsl2n_w0_u32_untied:
+**     mov     (z[0-9]+)\.s, w0
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = svbsl2n_n_u32 (z1, z2, x0),
+                z0 = svbsl2n (z1, z2, x0))
+
+/*
+** bsl2n_11_u32_tied1:
+**     mov     (z[0-9]+)\.s, #11
+**     bsl2n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_u32_tied1, svuint32_t,
+               z0 = svbsl2n_n_u32 (z0, z1, 11),
+               z0 = svbsl2n (z0, z1, 11))
+
+/*
+** bsl2n_11_u32_tied2:
+**     mov     (z[0-9]+)\.s, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_u32_tied2, svuint32_t,
+               z0 = svbsl2n_n_u32 (z1, z0, 11),
+               z0 = svbsl2n (z1, z0, 11))
+
+/*
+** bsl2n_11_u32_untied:
+**     mov     (z[0-9]+)\.s, #11
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_u32_untied, svuint32_t,
+               z0 = svbsl2n_n_u32 (z1, z2, 11),
+               z0 = svbsl2n (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_u64.c
new file mode 100644 (file)
index 0000000..31cbec9
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl2n_u64_tied1:
+**     bsl2n   z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_u64_tied1, svuint64_t,
+               z0 = svbsl2n_u64 (z0, z1, z2),
+               z0 = svbsl2n (z0, z1, z2))
+
+/*
+** bsl2n_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_u64_tied2, svuint64_t,
+               z0 = svbsl2n_u64 (z1, z0, z2),
+               z0 = svbsl2n (z1, z0, z2))
+
+/*
+** bsl2n_u64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_u64_tied3, svuint64_t,
+               z0 = svbsl2n_u64 (z1, z2, z0),
+               z0 = svbsl2n (z1, z2, z0))
+
+/*
+** bsl2n_u64_untied:
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_u64_untied, svuint64_t,
+               z0 = svbsl2n_u64 (z1, z2, z3),
+               z0 = svbsl2n (z1, z2, z3))
+
+/*
+** bsl2n_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     bsl2n   z0\.d, z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = svbsl2n_n_u64 (z0, z1, x0),
+                z0 = svbsl2n (z0, z1, x0))
+
+/*
+** bsl2n_x0_u64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_x0_u64_tied2, svuint64_t, uint64_t,
+                z0 = svbsl2n_n_u64 (z1, z0, x0),
+                z0 = svbsl2n (z1, z0, x0))
+
+/*
+** bsl2n_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = svbsl2n_n_u64 (z1, z2, x0),
+                z0 = svbsl2n (z1, z2, x0))
+
+/*
+** bsl2n_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     bsl2n   z0\.d, z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_u64_tied1, svuint64_t,
+               z0 = svbsl2n_n_u64 (z0, z1, 11),
+               z0 = svbsl2n (z0, z1, 11))
+
+/*
+** bsl2n_11_u64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_u64_tied2, svuint64_t,
+               z0 = svbsl2n_n_u64 (z1, z0, 11),
+               z0 = svbsl2n (z1, z0, 11))
+
+/*
+** bsl2n_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_u64_untied, svuint64_t,
+               z0 = svbsl2n_n_u64 (z1, z2, 11),
+               z0 = svbsl2n (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl2n_u8.c
new file mode 100644 (file)
index 0000000..ee745cd
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl2n_u8_tied1:
+**     bsl2n   z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_u8_tied1, svuint8_t,
+               z0 = svbsl2n_u8 (z0, z1, z2),
+               z0 = svbsl2n (z0, z1, z2))
+
+/*
+** bsl2n_u8_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_u8_tied2, svuint8_t,
+               z0 = svbsl2n_u8 (z1, z0, z2),
+               z0 = svbsl2n (z1, z0, z2))
+
+/*
+** bsl2n_u8_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_u8_tied3, svuint8_t,
+               z0 = svbsl2n_u8 (z1, z2, z0),
+               z0 = svbsl2n (z1, z2, z0))
+
+/*
+** bsl2n_u8_untied:
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_u8_untied, svuint8_t,
+               z0 = svbsl2n_u8 (z1, z2, z3),
+               z0 = svbsl2n (z1, z2, z3))
+
+/*
+** bsl2n_w0_u8_tied1:
+**     mov     (z[0-9]+)\.b, w0
+**     bsl2n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_w0_u8_tied1, svuint8_t, uint8_t,
+                z0 = svbsl2n_n_u8 (z0, z1, x0),
+                z0 = svbsl2n (z0, z1, x0))
+
+/*
+** bsl2n_w0_u8_tied2:
+**     mov     (z[0-9]+)\.b, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_w0_u8_tied2, svuint8_t, uint8_t,
+                z0 = svbsl2n_n_u8 (z1, z0, x0),
+                z0 = svbsl2n (z1, z0, x0))
+
+/*
+** bsl2n_w0_u8_untied:
+**     mov     (z[0-9]+)\.b, w0
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl2n_w0_u8_untied, svuint8_t, uint8_t,
+                z0 = svbsl2n_n_u8 (z1, z2, x0),
+                z0 = svbsl2n (z1, z2, x0))
+
+/*
+** bsl2n_11_u8_tied1:
+**     mov     (z[0-9]+)\.b, #11
+**     bsl2n   z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_u8_tied1, svuint8_t,
+               z0 = svbsl2n_n_u8 (z0, z1, 11),
+               z0 = svbsl2n (z0, z1, 11))
+
+/*
+** bsl2n_11_u8_tied2:
+**     mov     (z[0-9]+)\.b, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_u8_tied2, svuint8_t,
+               z0 = svbsl2n_n_u8 (z1, z0, 11),
+               z0 = svbsl2n (z1, z0, 11))
+
+/*
+** bsl2n_11_u8_untied:
+**     mov     (z[0-9]+)\.b, #11
+**     movprfx z0, z1
+**     bsl2n   z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl2n_11_u8_untied, svuint8_t,
+               z0 = svbsl2n_n_u8 (z1, z2, 11),
+               z0 = svbsl2n (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_s16.c
new file mode 100644 (file)
index 0000000..5754616
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl_s16_tied1:
+**     bsl     z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_s16_tied1, svint16_t,
+               z0 = svbsl_s16 (z0, z1, z2),
+               z0 = svbsl (z0, z1, z2))
+
+/*
+** bsl_s16_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_s16_tied2, svint16_t,
+               z0 = svbsl_s16 (z1, z0, z2),
+               z0 = svbsl (z1, z0, z2))
+
+/*
+** bsl_s16_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_s16_tied3, svint16_t,
+               z0 = svbsl_s16 (z1, z2, z0),
+               z0 = svbsl (z1, z2, z0))
+
+/*
+** bsl_s16_untied:
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_s16_untied, svint16_t,
+               z0 = svbsl_s16 (z1, z2, z3),
+               z0 = svbsl (z1, z2, z3))
+
+/*
+** bsl_w0_s16_tied1:
+**     mov     (z[0-9]+)\.h, w0
+**     bsl     z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_w0_s16_tied1, svint16_t, int16_t,
+                z0 = svbsl_n_s16 (z0, z1, x0),
+                z0 = svbsl (z0, z1, x0))
+
+/*
+** bsl_w0_s16_tied2:
+**     mov     (z[0-9]+)\.h, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_w0_s16_tied2, svint16_t, int16_t,
+                z0 = svbsl_n_s16 (z1, z0, x0),
+                z0 = svbsl (z1, z0, x0))
+
+/*
+** bsl_w0_s16_untied:
+**     mov     (z[0-9]+)\.h, w0
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_w0_s16_untied, svint16_t, int16_t,
+                z0 = svbsl_n_s16 (z1, z2, x0),
+                z0 = svbsl (z1, z2, x0))
+
+/*
+** bsl_11_s16_tied1:
+**     mov     (z[0-9]+)\.h, #11
+**     bsl     z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_s16_tied1, svint16_t,
+               z0 = svbsl_n_s16 (z0, z1, 11),
+               z0 = svbsl (z0, z1, 11))
+
+/*
+** bsl_11_s16_tied2:
+**     mov     (z[0-9]+)\.h, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_s16_tied2, svint16_t,
+               z0 = svbsl_n_s16 (z1, z0, 11),
+               z0 = svbsl (z1, z0, 11))
+
+/*
+** bsl_11_s16_untied:
+**     mov     (z[0-9]+)\.h, #11
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_s16_untied, svint16_t,
+               z0 = svbsl_n_s16 (z1, z2, 11),
+               z0 = svbsl (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_s32.c
new file mode 100644 (file)
index 0000000..7847778
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl_s32_tied1:
+**     bsl     z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_s32_tied1, svint32_t,
+               z0 = svbsl_s32 (z0, z1, z2),
+               z0 = svbsl (z0, z1, z2))
+
+/*
+** bsl_s32_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_s32_tied2, svint32_t,
+               z0 = svbsl_s32 (z1, z0, z2),
+               z0 = svbsl (z1, z0, z2))
+
+/*
+** bsl_s32_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_s32_tied3, svint32_t,
+               z0 = svbsl_s32 (z1, z2, z0),
+               z0 = svbsl (z1, z2, z0))
+
+/*
+** bsl_s32_untied:
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_s32_untied, svint32_t,
+               z0 = svbsl_s32 (z1, z2, z3),
+               z0 = svbsl (z1, z2, z3))
+
+/*
+** bsl_w0_s32_tied1:
+**     mov     (z[0-9]+)\.s, w0
+**     bsl     z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_w0_s32_tied1, svint32_t, int32_t,
+                z0 = svbsl_n_s32 (z0, z1, x0),
+                z0 = svbsl (z0, z1, x0))
+
+/*
+** bsl_w0_s32_tied2:
+**     mov     (z[0-9]+)\.s, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_w0_s32_tied2, svint32_t, int32_t,
+                z0 = svbsl_n_s32 (z1, z0, x0),
+                z0 = svbsl (z1, z0, x0))
+
+/*
+** bsl_w0_s32_untied:
+**     mov     (z[0-9]+)\.s, w0
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_w0_s32_untied, svint32_t, int32_t,
+                z0 = svbsl_n_s32 (z1, z2, x0),
+                z0 = svbsl (z1, z2, x0))
+
+/*
+** bsl_11_s32_tied1:
+**     mov     (z[0-9]+)\.s, #11
+**     bsl     z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_s32_tied1, svint32_t,
+               z0 = svbsl_n_s32 (z0, z1, 11),
+               z0 = svbsl (z0, z1, 11))
+
+/*
+** bsl_11_s32_tied2:
+**     mov     (z[0-9]+)\.s, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_s32_tied2, svint32_t,
+               z0 = svbsl_n_s32 (z1, z0, 11),
+               z0 = svbsl (z1, z0, 11))
+
+/*
+** bsl_11_s32_untied:
+**     mov     (z[0-9]+)\.s, #11
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_s32_untied, svint32_t,
+               z0 = svbsl_n_s32 (z1, z2, 11),
+               z0 = svbsl (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_s64.c
new file mode 100644 (file)
index 0000000..6bd4b17
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl_s64_tied1:
+**     bsl     z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_s64_tied1, svint64_t,
+               z0 = svbsl_s64 (z0, z1, z2),
+               z0 = svbsl (z0, z1, z2))
+
+/*
+** bsl_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_s64_tied2, svint64_t,
+               z0 = svbsl_s64 (z1, z0, z2),
+               z0 = svbsl (z1, z0, z2))
+
+/*
+** bsl_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_s64_tied3, svint64_t,
+               z0 = svbsl_s64 (z1, z2, z0),
+               z0 = svbsl (z1, z2, z0))
+
+/*
+** bsl_s64_untied:
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_s64_untied, svint64_t,
+               z0 = svbsl_s64 (z1, z2, z3),
+               z0 = svbsl (z1, z2, z3))
+
+/*
+** bsl_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     bsl     z0\.d, z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_x0_s64_tied1, svint64_t, int64_t,
+                z0 = svbsl_n_s64 (z0, z1, x0),
+                z0 = svbsl (z0, z1, x0))
+
+/*
+** bsl_x0_s64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_x0_s64_tied2, svint64_t, int64_t,
+                z0 = svbsl_n_s64 (z1, z0, x0),
+                z0 = svbsl (z1, z0, x0))
+
+/*
+** bsl_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_x0_s64_untied, svint64_t, int64_t,
+                z0 = svbsl_n_s64 (z1, z2, x0),
+                z0 = svbsl (z1, z2, x0))
+
+/*
+** bsl_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     bsl     z0\.d, z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_s64_tied1, svint64_t,
+               z0 = svbsl_n_s64 (z0, z1, 11),
+               z0 = svbsl (z0, z1, 11))
+
+/*
+** bsl_11_s64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_s64_tied2, svint64_t,
+               z0 = svbsl_n_s64 (z1, z0, 11),
+               z0 = svbsl (z1, z0, 11))
+
+/*
+** bsl_11_s64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_s64_untied, svint64_t,
+               z0 = svbsl_n_s64 (z1, z2, 11),
+               z0 = svbsl (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_s8.c
new file mode 100644 (file)
index 0000000..49a30ef
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl_s8_tied1:
+**     bsl     z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_s8_tied1, svint8_t,
+               z0 = svbsl_s8 (z0, z1, z2),
+               z0 = svbsl (z0, z1, z2))
+
+/*
+** bsl_s8_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_s8_tied2, svint8_t,
+               z0 = svbsl_s8 (z1, z0, z2),
+               z0 = svbsl (z1, z0, z2))
+
+/*
+** bsl_s8_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_s8_tied3, svint8_t,
+               z0 = svbsl_s8 (z1, z2, z0),
+               z0 = svbsl (z1, z2, z0))
+
+/*
+** bsl_s8_untied:
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_s8_untied, svint8_t,
+               z0 = svbsl_s8 (z1, z2, z3),
+               z0 = svbsl (z1, z2, z3))
+
+/*
+** bsl_w0_s8_tied1:
+**     mov     (z[0-9]+)\.b, w0
+**     bsl     z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_w0_s8_tied1, svint8_t, int8_t,
+                z0 = svbsl_n_s8 (z0, z1, x0),
+                z0 = svbsl (z0, z1, x0))
+
+/*
+** bsl_w0_s8_tied2:
+**     mov     (z[0-9]+)\.b, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_w0_s8_tied2, svint8_t, int8_t,
+                z0 = svbsl_n_s8 (z1, z0, x0),
+                z0 = svbsl (z1, z0, x0))
+
+/*
+** bsl_w0_s8_untied:
+**     mov     (z[0-9]+)\.b, w0
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_w0_s8_untied, svint8_t, int8_t,
+                z0 = svbsl_n_s8 (z1, z2, x0),
+                z0 = svbsl (z1, z2, x0))
+
+/*
+** bsl_11_s8_tied1:
+**     mov     (z[0-9]+)\.b, #11
+**     bsl     z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_s8_tied1, svint8_t,
+               z0 = svbsl_n_s8 (z0, z1, 11),
+               z0 = svbsl (z0, z1, 11))
+
+/*
+** bsl_11_s8_tied2:
+**     mov     (z[0-9]+)\.b, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_s8_tied2, svint8_t,
+               z0 = svbsl_n_s8 (z1, z0, 11),
+               z0 = svbsl (z1, z0, 11))
+
+/*
+** bsl_11_s8_untied:
+**     mov     (z[0-9]+)\.b, #11
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_s8_untied, svint8_t,
+               z0 = svbsl_n_s8 (z1, z2, 11),
+               z0 = svbsl (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_u16.c
new file mode 100644 (file)
index 0000000..f73e31f
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl_u16_tied1:
+**     bsl     z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_u16_tied1, svuint16_t,
+               z0 = svbsl_u16 (z0, z1, z2),
+               z0 = svbsl (z0, z1, z2))
+
+/*
+** bsl_u16_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_u16_tied2, svuint16_t,
+               z0 = svbsl_u16 (z1, z0, z2),
+               z0 = svbsl (z1, z0, z2))
+
+/*
+** bsl_u16_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_u16_tied3, svuint16_t,
+               z0 = svbsl_u16 (z1, z2, z0),
+               z0 = svbsl (z1, z2, z0))
+
+/*
+** bsl_u16_untied:
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_u16_untied, svuint16_t,
+               z0 = svbsl_u16 (z1, z2, z3),
+               z0 = svbsl (z1, z2, z3))
+
+/*
+** bsl_w0_u16_tied1:
+**     mov     (z[0-9]+)\.h, w0
+**     bsl     z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_w0_u16_tied1, svuint16_t, uint16_t,
+                z0 = svbsl_n_u16 (z0, z1, x0),
+                z0 = svbsl (z0, z1, x0))
+
+/*
+** bsl_w0_u16_tied2:
+**     mov     (z[0-9]+)\.h, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_w0_u16_tied2, svuint16_t, uint16_t,
+                z0 = svbsl_n_u16 (z1, z0, x0),
+                z0 = svbsl (z1, z0, x0))
+
+/*
+** bsl_w0_u16_untied:
+**     mov     (z[0-9]+)\.h, w0
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_w0_u16_untied, svuint16_t, uint16_t,
+                z0 = svbsl_n_u16 (z1, z2, x0),
+                z0 = svbsl (z1, z2, x0))
+
+/*
+** bsl_11_u16_tied1:
+**     mov     (z[0-9]+)\.h, #11
+**     bsl     z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_u16_tied1, svuint16_t,
+               z0 = svbsl_n_u16 (z0, z1, 11),
+               z0 = svbsl (z0, z1, 11))
+
+/*
+** bsl_11_u16_tied2:
+**     mov     (z[0-9]+)\.h, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_u16_tied2, svuint16_t,
+               z0 = svbsl_n_u16 (z1, z0, 11),
+               z0 = svbsl (z1, z0, 11))
+
+/*
+** bsl_11_u16_untied:
+**     mov     (z[0-9]+)\.h, #11
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_u16_untied, svuint16_t,
+               z0 = svbsl_n_u16 (z1, z2, 11),
+               z0 = svbsl (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_u32.c
new file mode 100644 (file)
index 0000000..0d70529
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl_u32_tied1:
+**     bsl     z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_u32_tied1, svuint32_t,
+               z0 = svbsl_u32 (z0, z1, z2),
+               z0 = svbsl (z0, z1, z2))
+
+/*
+** bsl_u32_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_u32_tied2, svuint32_t,
+               z0 = svbsl_u32 (z1, z0, z2),
+               z0 = svbsl (z1, z0, z2))
+
+/*
+** bsl_u32_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_u32_tied3, svuint32_t,
+               z0 = svbsl_u32 (z1, z2, z0),
+               z0 = svbsl (z1, z2, z0))
+
+/*
+** bsl_u32_untied:
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_u32_untied, svuint32_t,
+               z0 = svbsl_u32 (z1, z2, z3),
+               z0 = svbsl (z1, z2, z3))
+
+/*
+** bsl_w0_u32_tied1:
+**     mov     (z[0-9]+)\.s, w0
+**     bsl     z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = svbsl_n_u32 (z0, z1, x0),
+                z0 = svbsl (z0, z1, x0))
+
+/*
+** bsl_w0_u32_tied2:
+**     mov     (z[0-9]+)\.s, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_w0_u32_tied2, svuint32_t, uint32_t,
+                z0 = svbsl_n_u32 (z1, z0, x0),
+                z0 = svbsl (z1, z0, x0))
+
+/*
+** bsl_w0_u32_untied:
+**     mov     (z[0-9]+)\.s, w0
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = svbsl_n_u32 (z1, z2, x0),
+                z0 = svbsl (z1, z2, x0))
+
+/*
+** bsl_11_u32_tied1:
+**     mov     (z[0-9]+)\.s, #11
+**     bsl     z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_u32_tied1, svuint32_t,
+               z0 = svbsl_n_u32 (z0, z1, 11),
+               z0 = svbsl (z0, z1, 11))
+
+/*
+** bsl_11_u32_tied2:
+**     mov     (z[0-9]+)\.s, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_u32_tied2, svuint32_t,
+               z0 = svbsl_n_u32 (z1, z0, 11),
+               z0 = svbsl (z1, z0, 11))
+
+/*
+** bsl_11_u32_untied:
+**     mov     (z[0-9]+)\.s, #11
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_u32_untied, svuint32_t,
+               z0 = svbsl_n_u32 (z1, z2, 11),
+               z0 = svbsl (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_u64.c
new file mode 100644 (file)
index 0000000..41882ab
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl_u64_tied1:
+**     bsl     z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_u64_tied1, svuint64_t,
+               z0 = svbsl_u64 (z0, z1, z2),
+               z0 = svbsl (z0, z1, z2))
+
+/*
+** bsl_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_u64_tied2, svuint64_t,
+               z0 = svbsl_u64 (z1, z0, z2),
+               z0 = svbsl (z1, z0, z2))
+
+/*
+** bsl_u64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_u64_tied3, svuint64_t,
+               z0 = svbsl_u64 (z1, z2, z0),
+               z0 = svbsl (z1, z2, z0))
+
+/*
+** bsl_u64_untied:
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_u64_untied, svuint64_t,
+               z0 = svbsl_u64 (z1, z2, z3),
+               z0 = svbsl (z1, z2, z3))
+
+/*
+** bsl_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     bsl     z0\.d, z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = svbsl_n_u64 (z0, z1, x0),
+                z0 = svbsl (z0, z1, x0))
+
+/*
+** bsl_x0_u64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_x0_u64_tied2, svuint64_t, uint64_t,
+                z0 = svbsl_n_u64 (z1, z0, x0),
+                z0 = svbsl (z1, z0, x0))
+
+/*
+** bsl_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = svbsl_n_u64 (z1, z2, x0),
+                z0 = svbsl (z1, z2, x0))
+
+/*
+** bsl_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     bsl     z0\.d, z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_u64_tied1, svuint64_t,
+               z0 = svbsl_n_u64 (z0, z1, 11),
+               z0 = svbsl (z0, z1, 11))
+
+/*
+** bsl_11_u64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_u64_tied2, svuint64_t,
+               z0 = svbsl_n_u64 (z1, z0, 11),
+               z0 = svbsl (z1, z0, 11))
+
+/*
+** bsl_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_u64_untied, svuint64_t,
+               z0 = svbsl_n_u64 (z1, z2, 11),
+               z0 = svbsl (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/bsl_u8.c
new file mode 100644 (file)
index 0000000..db36282
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** bsl_u8_tied1:
+**     bsl     z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_u8_tied1, svuint8_t,
+               z0 = svbsl_u8 (z0, z1, z2),
+               z0 = svbsl (z0, z1, z2))
+
+/*
+** bsl_u8_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_u8_tied2, svuint8_t,
+               z0 = svbsl_u8 (z1, z0, z2),
+               z0 = svbsl (z1, z0, z2))
+
+/*
+** bsl_u8_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_u8_tied3, svuint8_t,
+               z0 = svbsl_u8 (z1, z2, z0),
+               z0 = svbsl (z1, z2, z0))
+
+/*
+** bsl_u8_untied:
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_u8_untied, svuint8_t,
+               z0 = svbsl_u8 (z1, z2, z3),
+               z0 = svbsl (z1, z2, z3))
+
+/*
+** bsl_w0_u8_tied1:
+**     mov     (z[0-9]+)\.b, w0
+**     bsl     z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_w0_u8_tied1, svuint8_t, uint8_t,
+                z0 = svbsl_n_u8 (z0, z1, x0),
+                z0 = svbsl (z0, z1, x0))
+
+/*
+** bsl_w0_u8_tied2:
+**     mov     (z[0-9]+)\.b, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_w0_u8_tied2, svuint8_t, uint8_t,
+                z0 = svbsl_n_u8 (z1, z0, x0),
+                z0 = svbsl (z1, z0, x0))
+
+/*
+** bsl_w0_u8_untied:
+**     mov     (z[0-9]+)\.b, w0
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (bsl_w0_u8_untied, svuint8_t, uint8_t,
+                z0 = svbsl_n_u8 (z1, z2, x0),
+                z0 = svbsl (z1, z2, x0))
+
+/*
+** bsl_11_u8_tied1:
+**     mov     (z[0-9]+)\.b, #11
+**     bsl     z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_u8_tied1, svuint8_t,
+               z0 = svbsl_n_u8 (z0, z1, 11),
+               z0 = svbsl (z0, z1, 11))
+
+/*
+** bsl_11_u8_tied2:
+**     mov     (z[0-9]+)\.b, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_u8_tied2, svuint8_t,
+               z0 = svbsl_n_u8 (z1, z0, 11),
+               z0 = svbsl (z1, z0, 11))
+
+/*
+** bsl_11_u8_untied:
+**     mov     (z[0-9]+)\.b, #11
+**     movprfx z0, z1
+**     bsl     z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (bsl_11_u8_untied, svuint8_t,
+               z0 = svbsl_n_u8 (z1, z2, 11),
+               z0 = svbsl (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_s16.c
new file mode 100644 (file)
index 0000000..7632cee
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cadd_90_s16_tied1:
+**     cadd    z0\.h, z0\.h, z1\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_s16_tied1, svint16_t,
+               z0 = svcadd_s16 (z0, z1, 90),
+               z0 = svcadd (z0, z1, 90))
+
+/*
+** cadd_90_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cadd    z0\.h, z0\.h, \1\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_s16_tied2, svint16_t,
+               z0 = svcadd_s16 (z1, z0, 90),
+               z0 = svcadd (z1, z0, 90))
+
+/*
+** cadd_90_s16_untied:
+**     movprfx z0, z1
+**     cadd    z0\.h, z0\.h, z2\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_s16_untied, svint16_t,
+               z0 = svcadd_s16 (z1, z2, 90),
+               z0 = svcadd (z1, z2, 90))
+
+/*
+** cadd_270_s16_tied1:
+**     cadd    z0\.h, z0\.h, z1\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_s16_tied1, svint16_t,
+               z0 = svcadd_s16 (z0, z1, 270),
+               z0 = svcadd (z0, z1, 270))
+
+/*
+** cadd_270_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cadd    z0\.h, z0\.h, \1\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_s16_tied2, svint16_t,
+               z0 = svcadd_s16 (z1, z0, 270),
+               z0 = svcadd (z1, z0, 270))
+
+/*
+** cadd_270_s16_untied:
+**     movprfx z0, z1
+**     cadd    z0\.h, z0\.h, z2\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_s16_untied, svint16_t,
+               z0 = svcadd_s16 (z1, z2, 270),
+               z0 = svcadd (z1, z2, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_s32.c
new file mode 100644 (file)
index 0000000..0288680
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cadd_90_s32_tied1:
+**     cadd    z0\.s, z0\.s, z1\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_s32_tied1, svint32_t,
+               z0 = svcadd_s32 (z0, z1, 90),
+               z0 = svcadd (z0, z1, 90))
+
+/*
+** cadd_90_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cadd    z0\.s, z0\.s, \1\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_s32_tied2, svint32_t,
+               z0 = svcadd_s32 (z1, z0, 90),
+               z0 = svcadd (z1, z0, 90))
+
+/*
+** cadd_90_s32_untied:
+**     movprfx z0, z1
+**     cadd    z0\.s, z0\.s, z2\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_s32_untied, svint32_t,
+               z0 = svcadd_s32 (z1, z2, 90),
+               z0 = svcadd (z1, z2, 90))
+
+/*
+** cadd_270_s32_tied1:
+**     cadd    z0\.s, z0\.s, z1\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_s32_tied1, svint32_t,
+               z0 = svcadd_s32 (z0, z1, 270),
+               z0 = svcadd (z0, z1, 270))
+
+/*
+** cadd_270_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cadd    z0\.s, z0\.s, \1\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_s32_tied2, svint32_t,
+               z0 = svcadd_s32 (z1, z0, 270),
+               z0 = svcadd (z1, z0, 270))
+
+/*
+** cadd_270_s32_untied:
+**     movprfx z0, z1
+**     cadd    z0\.s, z0\.s, z2\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_s32_untied, svint32_t,
+               z0 = svcadd_s32 (z1, z2, 270),
+               z0 = svcadd (z1, z2, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_s64.c
new file mode 100644 (file)
index 0000000..5bea27f
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cadd_90_s64_tied1:
+**     cadd    z0\.d, z0\.d, z1\.d, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_s64_tied1, svint64_t,
+               z0 = svcadd_s64 (z0, z1, 90),
+               z0 = svcadd (z0, z1, 90))
+
+/*
+** cadd_90_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cadd    z0\.d, z0\.d, \1, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_s64_tied2, svint64_t,
+               z0 = svcadd_s64 (z1, z0, 90),
+               z0 = svcadd (z1, z0, 90))
+
+/*
+** cadd_90_s64_untied:
+**     movprfx z0, z1
+**     cadd    z0\.d, z0\.d, z2\.d, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_s64_untied, svint64_t,
+               z0 = svcadd_s64 (z1, z2, 90),
+               z0 = svcadd (z1, z2, 90))
+
+/*
+** cadd_270_s64_tied1:
+**     cadd    z0\.d, z0\.d, z1\.d, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_s64_tied1, svint64_t,
+               z0 = svcadd_s64 (z0, z1, 270),
+               z0 = svcadd (z0, z1, 270))
+
+/*
+** cadd_270_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cadd    z0\.d, z0\.d, \1, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_s64_tied2, svint64_t,
+               z0 = svcadd_s64 (z1, z0, 270),
+               z0 = svcadd (z1, z0, 270))
+
+/*
+** cadd_270_s64_untied:
+**     movprfx z0, z1
+**     cadd    z0\.d, z0\.d, z2\.d, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_s64_untied, svint64_t,
+               z0 = svcadd_s64 (z1, z2, 270),
+               z0 = svcadd (z1, z2, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_s8.c
new file mode 100644 (file)
index 0000000..cf42766
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cadd_90_s8_tied1:
+**     cadd    z0\.b, z0\.b, z1\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_s8_tied1, svint8_t,
+               z0 = svcadd_s8 (z0, z1, 90),
+               z0 = svcadd (z0, z1, 90))
+
+/*
+** cadd_90_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cadd    z0\.b, z0\.b, \1\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_s8_tied2, svint8_t,
+               z0 = svcadd_s8 (z1, z0, 90),
+               z0 = svcadd (z1, z0, 90))
+
+/*
+** cadd_90_s8_untied:
+**     movprfx z0, z1
+**     cadd    z0\.b, z0\.b, z2\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_s8_untied, svint8_t,
+               z0 = svcadd_s8 (z1, z2, 90),
+               z0 = svcadd (z1, z2, 90))
+
+/*
+** cadd_270_s8_tied1:
+**     cadd    z0\.b, z0\.b, z1\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_s8_tied1, svint8_t,
+               z0 = svcadd_s8 (z0, z1, 270),
+               z0 = svcadd (z0, z1, 270))
+
+/*
+** cadd_270_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cadd    z0\.b, z0\.b, \1\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_s8_tied2, svint8_t,
+               z0 = svcadd_s8 (z1, z0, 270),
+               z0 = svcadd (z1, z0, 270))
+
+/*
+** cadd_270_s8_untied:
+**     movprfx z0, z1
+**     cadd    z0\.b, z0\.b, z2\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_s8_untied, svint8_t,
+               z0 = svcadd_s8 (z1, z2, 270),
+               z0 = svcadd (z1, z2, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_u16.c
new file mode 100644 (file)
index 0000000..882b88f
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cadd_90_u16_tied1:
+**     cadd    z0\.h, z0\.h, z1\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_u16_tied1, svuint16_t,
+               z0 = svcadd_u16 (z0, z1, 90),
+               z0 = svcadd (z0, z1, 90))
+
+/*
+** cadd_90_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cadd    z0\.h, z0\.h, \1\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_u16_tied2, svuint16_t,
+               z0 = svcadd_u16 (z1, z0, 90),
+               z0 = svcadd (z1, z0, 90))
+
+/*
+** cadd_90_u16_untied:
+**     movprfx z0, z1
+**     cadd    z0\.h, z0\.h, z2\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_u16_untied, svuint16_t,
+               z0 = svcadd_u16 (z1, z2, 90),
+               z0 = svcadd (z1, z2, 90))
+
+/*
+** cadd_270_u16_tied1:
+**     cadd    z0\.h, z0\.h, z1\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_u16_tied1, svuint16_t,
+               z0 = svcadd_u16 (z0, z1, 270),
+               z0 = svcadd (z0, z1, 270))
+
+/*
+** cadd_270_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cadd    z0\.h, z0\.h, \1\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_u16_tied2, svuint16_t,
+               z0 = svcadd_u16 (z1, z0, 270),
+               z0 = svcadd (z1, z0, 270))
+
+/*
+** cadd_270_u16_untied:
+**     movprfx z0, z1
+**     cadd    z0\.h, z0\.h, z2\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_u16_untied, svuint16_t,
+               z0 = svcadd_u16 (z1, z2, 270),
+               z0 = svcadd (z1, z2, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_u32.c
new file mode 100644 (file)
index 0000000..4c460ff
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cadd_90_u32_tied1:
+**     cadd    z0\.s, z0\.s, z1\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_u32_tied1, svuint32_t,
+               z0 = svcadd_u32 (z0, z1, 90),
+               z0 = svcadd (z0, z1, 90))
+
+/*
+** cadd_90_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cadd    z0\.s, z0\.s, \1\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_u32_tied2, svuint32_t,
+               z0 = svcadd_u32 (z1, z0, 90),
+               z0 = svcadd (z1, z0, 90))
+
+/*
+** cadd_90_u32_untied:
+**     movprfx z0, z1
+**     cadd    z0\.s, z0\.s, z2\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_u32_untied, svuint32_t,
+               z0 = svcadd_u32 (z1, z2, 90),
+               z0 = svcadd (z1, z2, 90))
+
+/*
+** cadd_270_u32_tied1:
+**     cadd    z0\.s, z0\.s, z1\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_u32_tied1, svuint32_t,
+               z0 = svcadd_u32 (z0, z1, 270),
+               z0 = svcadd (z0, z1, 270))
+
+/*
+** cadd_270_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cadd    z0\.s, z0\.s, \1\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_u32_tied2, svuint32_t,
+               z0 = svcadd_u32 (z1, z0, 270),
+               z0 = svcadd (z1, z0, 270))
+
+/*
+** cadd_270_u32_untied:
+**     movprfx z0, z1
+**     cadd    z0\.s, z0\.s, z2\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_u32_untied, svuint32_t,
+               z0 = svcadd_u32 (z1, z2, 270),
+               z0 = svcadd (z1, z2, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_u64.c
new file mode 100644 (file)
index 0000000..0ca98c2
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cadd_90_u64_tied1:
+**     cadd    z0\.d, z0\.d, z1\.d, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_u64_tied1, svuint64_t,
+               z0 = svcadd_u64 (z0, z1, 90),
+               z0 = svcadd (z0, z1, 90))
+
+/*
+** cadd_90_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cadd    z0\.d, z0\.d, \1, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_u64_tied2, svuint64_t,
+               z0 = svcadd_u64 (z1, z0, 90),
+               z0 = svcadd (z1, z0, 90))
+
+/*
+** cadd_90_u64_untied:
+**     movprfx z0, z1
+**     cadd    z0\.d, z0\.d, z2\.d, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_u64_untied, svuint64_t,
+               z0 = svcadd_u64 (z1, z2, 90),
+               z0 = svcadd (z1, z2, 90))
+
+/*
+** cadd_270_u64_tied1:
+**     cadd    z0\.d, z0\.d, z1\.d, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_u64_tied1, svuint64_t,
+               z0 = svcadd_u64 (z0, z1, 270),
+               z0 = svcadd (z0, z1, 270))
+
+/*
+** cadd_270_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cadd    z0\.d, z0\.d, \1, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_u64_tied2, svuint64_t,
+               z0 = svcadd_u64 (z1, z0, 270),
+               z0 = svcadd (z1, z0, 270))
+
+/*
+** cadd_270_u64_untied:
+**     movprfx z0, z1
+**     cadd    z0\.d, z0\.d, z2\.d, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_u64_untied, svuint64_t,
+               z0 = svcadd_u64 (z1, z2, 270),
+               z0 = svcadd (z1, z2, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cadd_u8.c
new file mode 100644 (file)
index 0000000..59908d4
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cadd_90_u8_tied1:
+**     cadd    z0\.b, z0\.b, z1\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_u8_tied1, svuint8_t,
+               z0 = svcadd_u8 (z0, z1, 90),
+               z0 = svcadd (z0, z1, 90))
+
+/*
+** cadd_90_u8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cadd    z0\.b, z0\.b, \1\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_u8_tied2, svuint8_t,
+               z0 = svcadd_u8 (z1, z0, 90),
+               z0 = svcadd (z1, z0, 90))
+
+/*
+** cadd_90_u8_untied:
+**     movprfx z0, z1
+**     cadd    z0\.b, z0\.b, z2\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_90_u8_untied, svuint8_t,
+               z0 = svcadd_u8 (z1, z2, 90),
+               z0 = svcadd (z1, z2, 90))
+
+/*
+** cadd_270_u8_tied1:
+**     cadd    z0\.b, z0\.b, z1\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_u8_tied1, svuint8_t,
+               z0 = svcadd_u8 (z0, z1, 270),
+               z0 = svcadd (z0, z1, 270))
+
+/*
+** cadd_270_u8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cadd    z0\.b, z0\.b, \1\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_u8_tied2, svuint8_t,
+               z0 = svcadd_u8 (z1, z0, 270),
+               z0 = svcadd (z1, z0, 270))
+
+/*
+** cadd_270_u8_untied:
+**     movprfx z0, z1
+**     cadd    z0\.b, z0\.b, z2\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cadd_270_u8_untied, svuint8_t,
+               z0 = svcadd_u8 (z1, z2, 270),
+               z0 = svcadd (z1, z2, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cdot_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cdot_lane_s32.c
new file mode 100644 (file)
index 0000000..ebd114c
--- /dev/null
@@ -0,0 +1,198 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cdot_lane_0_0_s32_tied1:
+**     cdot    z0\.s, z4\.b, z5\.b\[0\], #0
+**     ret
+*/
+TEST_DUAL_Z (cdot_lane_0_0_s32_tied1, svint32_t, svint8_t,
+            z0 = svcdot_lane_s32 (z0, z4, z5, 0, 0),
+            z0 = svcdot_lane (z0, z4, z5, 0, 0))
+
+/*
+** cdot_lane_0_0_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.s, \1\.b, z1\.b\[0\], #0
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_lane_0_0_s32_tied2, svint32_t, svint8_t,
+                z0_res = svcdot_lane_s32 (z4, z0, z1, 0, 0),
+                z0_res = svcdot_lane (z4, z0, z1, 0, 0))
+
+/*
+** cdot_lane_0_0_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.s, z1\.b, \1\.b\[0\], #0
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_lane_0_0_s32_tied3, svint32_t, svint8_t,
+                z0_res = svcdot_lane_s32 (z4, z1, z0, 0, 0),
+                z0_res = svcdot_lane (z4, z1, z0, 0, 0))
+
+/*
+** cdot_lane_0_0_s32_untied:
+**     movprfx z0, z1
+**     cdot    z0\.s, z4\.b, z5\.b\[0\], #0
+**     ret
+*/
+TEST_DUAL_Z (cdot_lane_0_0_s32_untied, svint32_t, svint8_t,
+            z0 = svcdot_lane_s32 (z1, z4, z5, 0, 0),
+            z0 = svcdot_lane (z1, z4, z5, 0, 0))
+
+/*
+** cdot_lane_0_90_s32_tied1:
+**     cdot    z0\.s, z4\.b, z5\.b\[0\], #90
+**     ret
+*/
+TEST_DUAL_Z (cdot_lane_0_90_s32_tied1, svint32_t, svint8_t,
+            z0 = svcdot_lane_s32 (z0, z4, z5, 0, 90),
+            z0 = svcdot_lane (z0, z4, z5, 0, 90))
+
+/*
+** cdot_lane_0_90_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.s, \1\.b, z1\.b\[0\], #90
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_lane_0_90_s32_tied2, svint32_t, svint8_t,
+                z0_res = svcdot_lane_s32 (z4, z0, z1, 0, 90),
+                z0_res = svcdot_lane (z4, z0, z1, 0, 90))
+
+/*
+** cdot_lane_0_90_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.s, z1\.b, \1\.b\[0\], #90
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_lane_0_90_s32_tied3, svint32_t, svint8_t,
+                z0_res = svcdot_lane_s32 (z4, z1, z0, 0, 90),
+                z0_res = svcdot_lane (z4, z1, z0, 0, 90))
+
+/*
+** cdot_lane_0_90_s32_untied:
+**     movprfx z0, z1
+**     cdot    z0\.s, z4\.b, z5\.b\[0\], #90
+**     ret
+*/
+TEST_DUAL_Z (cdot_lane_0_90_s32_untied, svint32_t, svint8_t,
+            z0 = svcdot_lane_s32 (z1, z4, z5, 0, 90),
+            z0 = svcdot_lane (z1, z4, z5, 0, 90))
+
+/*
+** cdot_lane_0_180_s32_tied1:
+**     cdot    z0\.s, z4\.b, z5\.b\[0\], #180
+**     ret
+*/
+TEST_DUAL_Z (cdot_lane_0_180_s32_tied1, svint32_t, svint8_t,
+            z0 = svcdot_lane_s32 (z0, z4, z5, 0, 180),
+            z0 = svcdot_lane (z0, z4, z5, 0, 180))
+
+/*
+** cdot_lane_0_180_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.s, \1\.b, z1\.b\[0\], #180
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_lane_0_180_s32_tied2, svint32_t, svint8_t,
+                z0_res = svcdot_lane_s32 (z4, z0, z1, 0, 180),
+                z0_res = svcdot_lane (z4, z0, z1, 0, 180))
+
+/*
+** cdot_lane_0_180_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.s, z1\.b, \1\.b\[0\], #180
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_lane_0_180_s32_tied3, svint32_t, svint8_t,
+                z0_res = svcdot_lane_s32 (z4, z1, z0, 0, 180),
+                z0_res = svcdot_lane (z4, z1, z0, 0, 180))
+
+/*
+** cdot_lane_0_180_s32_untied:
+**     movprfx z0, z1
+**     cdot    z0\.s, z4\.b, z5\.b\[0\], #180
+**     ret
+*/
+TEST_DUAL_Z (cdot_lane_0_180_s32_untied, svint32_t, svint8_t,
+            z0 = svcdot_lane_s32 (z1, z4, z5, 0, 180),
+            z0 = svcdot_lane (z1, z4, z5, 0, 180))
+
+/*
+** cdot_lane_0_270_s32_tied1:
+**     cdot    z0\.s, z4\.b, z5\.b\[0\], #270
+**     ret
+*/
+TEST_DUAL_Z (cdot_lane_0_270_s32_tied1, svint32_t, svint8_t,
+            z0 = svcdot_lane_s32 (z0, z4, z5, 0, 270),
+            z0 = svcdot_lane (z0, z4, z5, 0, 270))
+
+/*
+** cdot_lane_0_270_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.s, \1\.b, z1\.b\[0\], #270
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_lane_0_270_s32_tied2, svint32_t, svint8_t,
+                z0_res = svcdot_lane_s32 (z4, z0, z1, 0, 270),
+                z0_res = svcdot_lane (z4, z0, z1, 0, 270))
+
+/*
+** cdot_lane_0_270_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.s, z1\.b, \1\.b\[0\], #270
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_lane_0_270_s32_tied3, svint32_t, svint8_t,
+                z0_res = svcdot_lane_s32 (z4, z1, z0, 0, 270),
+                z0_res = svcdot_lane (z4, z1, z0, 0, 270))
+
+/*
+** cdot_lane_0_270_s32_untied:
+**     movprfx z0, z1
+**     cdot    z0\.s, z4\.b, z5\.b\[0\], #270
+**     ret
+*/
+TEST_DUAL_Z (cdot_lane_0_270_s32_untied, svint32_t, svint8_t,
+            z0 = svcdot_lane_s32 (z1, z4, z5, 0, 270),
+            z0 = svcdot_lane (z1, z4, z5, 0, 270))
+
+/*
+** cdot_lane_1_s32:
+**     cdot    z0\.s, z4\.b, z5\.b\[1\], #0
+**     ret
+*/
+TEST_DUAL_Z (cdot_lane_1_s32, svint32_t, svint8_t,
+            z0 = svcdot_lane_s32 (z0, z4, z5, 1, 0),
+            z0 = svcdot_lane (z0, z4, z5, 1, 0))
+
+/*
+** cdot_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     cdot    z0\.s, z1\.b, \1\.b\[1\], #0
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (cdot_lane_z8_s32, svint32_t, svint8_t, z8,
+                   z0 = svcdot_lane_s32 (z0, z1, z8, 1, 0),
+                   z0 = svcdot_lane (z0, z1, z8, 1, 0))
+
+/*
+** cdot_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     cdot    z0\.s, z1\.b, \1\.b\[1\], #0
+**     ret
+*/
+TEST_DUAL_LANE_REG (cdot_lane_z16_s32, svint32_t, svint8_t, z16,
+                   z0 = svcdot_lane_s32 (z0, z1, z16, 1, 0),
+                   z0 = svcdot_lane (z0, z1, z16, 1, 0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cdot_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cdot_lane_s64.c
new file mode 100644 (file)
index 0000000..12a9f58
--- /dev/null
@@ -0,0 +1,188 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cdot_lane_0_0_s64_tied1:
+**     cdot    z0\.d, z4\.h, z5\.h\[0\], #0
+**     ret
+*/
+TEST_DUAL_Z (cdot_lane_0_0_s64_tied1, svint64_t, svint16_t,
+            z0 = svcdot_lane_s64 (z0, z4, z5, 0, 0),
+            z0 = svcdot_lane (z0, z4, z5, 0, 0))
+
+/*
+** cdot_lane_0_0_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.d, \1\.h, z1\.h\[0\], #0
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_lane_0_0_s64_tied2, svint64_t, svint16_t,
+                z0_res = svcdot_lane_s64 (z4, z0, z1, 0, 0),
+                z0_res = svcdot_lane (z4, z0, z1, 0, 0))
+
+/*
+** cdot_lane_0_0_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.d, z1\.h, \1\.h\[0\], #0
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_lane_0_0_s64_tied3, svint64_t, svint16_t,
+                z0_res = svcdot_lane_s64 (z4, z1, z0, 0, 0),
+                z0_res = svcdot_lane (z4, z1, z0, 0, 0))
+
+/*
+** cdot_lane_0_0_s64_untied:
+**     movprfx z0, z1
+**     cdot    z0\.d, z4\.h, z5\.h\[0\], #0
+**     ret
+*/
+TEST_DUAL_Z (cdot_lane_0_0_s64_untied, svint64_t, svint16_t,
+            z0 = svcdot_lane_s64 (z1, z4, z5, 0, 0),
+            z0 = svcdot_lane (z1, z4, z5, 0, 0))
+
+/*
+** cdot_lane_0_90_s64_tied1:
+**     cdot    z0\.d, z4\.h, z5\.h\[0\], #90
+**     ret
+*/
+TEST_DUAL_Z (cdot_lane_0_90_s64_tied1, svint64_t, svint16_t,
+            z0 = svcdot_lane_s64 (z0, z4, z5, 0, 90),
+            z0 = svcdot_lane (z0, z4, z5, 0, 90))
+
+/*
+** cdot_lane_0_90_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.d, \1\.h, z1\.h\[0\], #90
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_lane_0_90_s64_tied2, svint64_t, svint16_t,
+                z0_res = svcdot_lane_s64 (z4, z0, z1, 0, 90),
+                z0_res = svcdot_lane (z4, z0, z1, 0, 90))
+
+/*
+** cdot_lane_0_90_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.d, z1\.h, \1\.h\[0\], #90
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_lane_0_90_s64_tied3, svint64_t, svint16_t,
+                z0_res = svcdot_lane_s64 (z4, z1, z0, 0, 90),
+                z0_res = svcdot_lane (z4, z1, z0, 0, 90))
+
+/*
+** cdot_lane_0_90_s64_untied:
+**     movprfx z0, z1
+**     cdot    z0\.d, z4\.h, z5\.h\[0\], #90
+**     ret
+*/
+TEST_DUAL_Z (cdot_lane_0_90_s64_untied, svint64_t, svint16_t,
+            z0 = svcdot_lane_s64 (z1, z4, z5, 0, 90),
+            z0 = svcdot_lane (z1, z4, z5, 0, 90))
+
+/*
+** cdot_lane_0_180_s64_tied1:
+**     cdot    z0\.d, z4\.h, z5\.h\[0\], #180
+**     ret
+*/
+TEST_DUAL_Z (cdot_lane_0_180_s64_tied1, svint64_t, svint16_t,
+            z0 = svcdot_lane_s64 (z0, z4, z5, 0, 180),
+            z0 = svcdot_lane (z0, z4, z5, 0, 180))
+
+/*
+** cdot_lane_0_180_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.d, \1\.h, z1\.h\[0\], #180
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_lane_0_180_s64_tied2, svint64_t, svint16_t,
+                z0_res = svcdot_lane_s64 (z4, z0, z1, 0, 180),
+                z0_res = svcdot_lane (z4, z0, z1, 0, 180))
+
+/*
+** cdot_lane_0_180_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.d, z1\.h, \1\.h\[0\], #180
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_lane_0_180_s64_tied3, svint64_t, svint16_t,
+                z0_res = svcdot_lane_s64 (z4, z1, z0, 0, 180),
+                z0_res = svcdot_lane (z4, z1, z0, 0, 180))
+
+/*
+** cdot_lane_0_180_s64_untied:
+**     movprfx z0, z1
+**     cdot    z0\.d, z4\.h, z5\.h\[0\], #180
+**     ret
+*/
+TEST_DUAL_Z (cdot_lane_0_180_s64_untied, svint64_t, svint16_t,
+            z0 = svcdot_lane_s64 (z1, z4, z5, 0, 180),
+            z0 = svcdot_lane (z1, z4, z5, 0, 180))
+
+/*
+** cdot_lane_0_270_s64_tied1:
+**     cdot    z0\.d, z4\.h, z5\.h\[0\], #270
+**     ret
+*/
+TEST_DUAL_Z (cdot_lane_0_270_s64_tied1, svint64_t, svint16_t,
+            z0 = svcdot_lane_s64 (z0, z4, z5, 0, 270),
+            z0 = svcdot_lane (z0, z4, z5, 0, 270))
+
+/*
+** cdot_lane_0_270_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.d, \1\.h, z1\.h\[0\], #270
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_lane_0_270_s64_tied2, svint64_t, svint16_t,
+                z0_res = svcdot_lane_s64 (z4, z0, z1, 0, 270),
+                z0_res = svcdot_lane (z4, z0, z1, 0, 270))
+
+/*
+** cdot_lane_0_270_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.d, z1\.h, \1\.h\[0\], #270
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_lane_0_270_s64_tied3, svint64_t, svint16_t,
+                z0_res = svcdot_lane_s64 (z4, z1, z0, 0, 270),
+                z0_res = svcdot_lane (z4, z1, z0, 0, 270))
+
+/*
+** cdot_lane_0_270_s64_untied:
+**     movprfx z0, z1
+**     cdot    z0\.d, z4\.h, z5\.h\[0\], #270
+**     ret
+*/
+TEST_DUAL_Z (cdot_lane_0_270_s64_untied, svint64_t, svint16_t,
+            z0 = svcdot_lane_s64 (z1, z4, z5, 0, 270),
+            z0 = svcdot_lane (z1, z4, z5, 0, 270))
+
+/*
+** cdot_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     cdot    z0\.d, z1\.h, z15\.h\[1\], #0
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (cdot_lane_z15_s64, svint64_t, svint16_t, z15,
+                   z0 = svcdot_lane_s64 (z0, z1, z15, 1, 0),
+                   z0 = svcdot_lane (z0, z1, z15, 1, 0))
+
+/*
+** cdot_lane_z16_s64:
+**     mov     (z[0-9]|z1[0-5])\.d, z16\.d
+**     cdot    z0\.d, z1\.h, \1\.h\[1\], #0
+**     ret
+*/
+TEST_DUAL_LANE_REG (cdot_lane_z16_s64, svint64_t, svint16_t, z16,
+                   z0 = svcdot_lane_s64 (z0, z1, z16, 1, 0),
+                   z0 = svcdot_lane (z0, z1, z16, 1, 0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cdot_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cdot_s32.c
new file mode 100644 (file)
index 0000000..c8c0c7a
--- /dev/null
@@ -0,0 +1,167 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cdot_0_s32_tied1:
+**     cdot    z0\.s, z4\.b, z5\.b, #0
+**     ret
+*/
+TEST_DUAL_Z (cdot_0_s32_tied1, svint32_t, svint8_t,
+            z0 = svcdot_s32 (z0, z4, z5, 0),
+            z0 = svcdot (z0, z4, z5, 0))
+
+/*
+** cdot_0_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.s, \1\.b, z1\.b, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_0_s32_tied2, svint32_t, svint8_t,
+                z0_res = svcdot_s32 (z4, z0, z1, 0),
+                z0_res = svcdot (z4, z0, z1, 0))
+
+/*
+** cdot_0_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.s, z1\.b, \1\.b, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_0_s32_tied3, svint32_t, svint8_t,
+                z0_res = svcdot_s32 (z4, z1, z0, 0),
+                z0_res = svcdot (z4, z1, z0, 0))
+
+/*
+** cdot_0_s32_untied:
+**     movprfx z0, z1
+**     cdot    z0\.s, z4\.b, z5\.b, #0
+**     ret
+*/
+TEST_DUAL_Z (cdot_0_s32_untied, svint32_t, svint8_t,
+            z0 = svcdot_s32 (z1, z4, z5, 0),
+            z0 = svcdot (z1, z4, z5, 0))
+
+/*
+** cdot_90_s32_tied1:
+**     cdot    z0\.s, z4\.b, z5\.b, #90
+**     ret
+*/
+TEST_DUAL_Z (cdot_90_s32_tied1, svint32_t, svint8_t,
+            z0 = svcdot_s32 (z0, z4, z5, 90),
+            z0 = svcdot (z0, z4, z5, 90))
+
+/*
+** cdot_90_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.s, \1\.b, z1\.b, #90
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_90_s32_tied2, svint32_t, svint8_t,
+                z0_res = svcdot_s32 (z4, z0, z1, 90),
+                z0_res = svcdot (z4, z0, z1, 90))
+
+/*
+** cdot_90_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.s, z1\.b, \1\.b, #90
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_90_s32_tied3, svint32_t, svint8_t,
+                z0_res = svcdot_s32 (z4, z1, z0, 90),
+                z0_res = svcdot (z4, z1, z0, 90))
+
+/*
+** cdot_90_s32_untied:
+**     movprfx z0, z1
+**     cdot    z0\.s, z4\.b, z5\.b, #90
+**     ret
+*/
+TEST_DUAL_Z (cdot_90_s32_untied, svint32_t, svint8_t,
+            z0 = svcdot_s32 (z1, z4, z5, 90),
+            z0 = svcdot (z1, z4, z5, 90))
+
+/*
+** cdot_180_s32_tied1:
+**     cdot    z0\.s, z4\.b, z5\.b, #180
+**     ret
+*/
+TEST_DUAL_Z (cdot_180_s32_tied1, svint32_t, svint8_t,
+            z0 = svcdot_s32 (z0, z4, z5, 180),
+            z0 = svcdot (z0, z4, z5, 180))
+
+/*
+** cdot_180_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.s, \1\.b, z1\.b, #180
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_180_s32_tied2, svint32_t, svint8_t,
+                z0_res = svcdot_s32 (z4, z0, z1, 180),
+                z0_res = svcdot (z4, z0, z1, 180))
+
+/*
+** cdot_180_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.s, z1\.b, \1\.b, #180
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_180_s32_tied3, svint32_t, svint8_t,
+                z0_res = svcdot_s32 (z4, z1, z0, 180),
+                z0_res = svcdot (z4, z1, z0, 180))
+
+/*
+** cdot_180_s32_untied:
+**     movprfx z0, z1
+**     cdot    z0\.s, z4\.b, z5\.b, #180
+**     ret
+*/
+TEST_DUAL_Z (cdot_180_s32_untied, svint32_t, svint8_t,
+            z0 = svcdot_s32 (z1, z4, z5, 180),
+            z0 = svcdot (z1, z4, z5, 180))
+
+/*
+** cdot_270_s32_tied1:
+**     cdot    z0\.s, z4\.b, z5\.b, #270
+**     ret
+*/
+TEST_DUAL_Z (cdot_270_s32_tied1, svint32_t, svint8_t,
+            z0 = svcdot_s32 (z0, z4, z5, 270),
+            z0 = svcdot (z0, z4, z5, 270))
+
+/*
+** cdot_270_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.s, \1\.b, z1\.b, #270
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_270_s32_tied2, svint32_t, svint8_t,
+                z0_res = svcdot_s32 (z4, z0, z1, 270),
+                z0_res = svcdot (z4, z0, z1, 270))
+
+/*
+** cdot_270_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.s, z1\.b, \1\.b, #270
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_270_s32_tied3, svint32_t, svint8_t,
+                z0_res = svcdot_s32 (z4, z1, z0, 270),
+                z0_res = svcdot (z4, z1, z0, 270))
+
+/*
+** cdot_270_s32_untied:
+**     movprfx z0, z1
+**     cdot    z0\.s, z4\.b, z5\.b, #270
+**     ret
+*/
+TEST_DUAL_Z (cdot_270_s32_untied, svint32_t, svint8_t,
+            z0 = svcdot_s32 (z1, z4, z5, 270),
+            z0 = svcdot (z1, z4, z5, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cdot_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cdot_s64.c
new file mode 100644 (file)
index 0000000..cf1ddcd
--- /dev/null
@@ -0,0 +1,167 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cdot_0_s64_tied1:
+**     cdot    z0\.d, z4\.h, z5\.h, #0
+**     ret
+*/
+TEST_DUAL_Z (cdot_0_s64_tied1, svint64_t, svint16_t,
+            z0 = svcdot_s64 (z0, z4, z5, 0),
+            z0 = svcdot (z0, z4, z5, 0))
+
+/*
+** cdot_0_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.d, \1\.h, z1\.h, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_0_s64_tied2, svint64_t, svint16_t,
+                z0_res = svcdot_s64 (z4, z0, z1, 0),
+                z0_res = svcdot (z4, z0, z1, 0))
+
+/*
+** cdot_0_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.d, z1\.h, \1\.h, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_0_s64_tied3, svint64_t, svint16_t,
+                z0_res = svcdot_s64 (z4, z1, z0, 0),
+                z0_res = svcdot (z4, z1, z0, 0))
+
+/*
+** cdot_0_s64_untied:
+**     movprfx z0, z1
+**     cdot    z0\.d, z4\.h, z5\.h, #0
+**     ret
+*/
+TEST_DUAL_Z (cdot_0_s64_untied, svint64_t, svint16_t,
+            z0 = svcdot_s64 (z1, z4, z5, 0),
+            z0 = svcdot (z1, z4, z5, 0))
+
+/*
+** cdot_90_s64_tied1:
+**     cdot    z0\.d, z4\.h, z5\.h, #90
+**     ret
+*/
+TEST_DUAL_Z (cdot_90_s64_tied1, svint64_t, svint16_t,
+            z0 = svcdot_s64 (z0, z4, z5, 90),
+            z0 = svcdot (z0, z4, z5, 90))
+
+/*
+** cdot_90_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.d, \1\.h, z1\.h, #90
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_90_s64_tied2, svint64_t, svint16_t,
+                z0_res = svcdot_s64 (z4, z0, z1, 90),
+                z0_res = svcdot (z4, z0, z1, 90))
+
+/*
+** cdot_90_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.d, z1\.h, \1\.h, #90
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_90_s64_tied3, svint64_t, svint16_t,
+                z0_res = svcdot_s64 (z4, z1, z0, 90),
+                z0_res = svcdot (z4, z1, z0, 90))
+
+/*
+** cdot_90_s64_untied:
+**     movprfx z0, z1
+**     cdot    z0\.d, z4\.h, z5\.h, #90
+**     ret
+*/
+TEST_DUAL_Z (cdot_90_s64_untied, svint64_t, svint16_t,
+            z0 = svcdot_s64 (z1, z4, z5, 90),
+            z0 = svcdot (z1, z4, z5, 90))
+
+/*
+** cdot_180_s64_tied1:
+**     cdot    z0\.d, z4\.h, z5\.h, #180
+**     ret
+*/
+TEST_DUAL_Z (cdot_180_s64_tied1, svint64_t, svint16_t,
+            z0 = svcdot_s64 (z0, z4, z5, 180),
+            z0 = svcdot (z0, z4, z5, 180))
+
+/*
+** cdot_180_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.d, \1\.h, z1\.h, #180
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_180_s64_tied2, svint64_t, svint16_t,
+                z0_res = svcdot_s64 (z4, z0, z1, 180),
+                z0_res = svcdot (z4, z0, z1, 180))
+
+/*
+** cdot_180_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.d, z1\.h, \1\.h, #180
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_180_s64_tied3, svint64_t, svint16_t,
+                z0_res = svcdot_s64 (z4, z1, z0, 180),
+                z0_res = svcdot (z4, z1, z0, 180))
+
+/*
+** cdot_180_s64_untied:
+**     movprfx z0, z1
+**     cdot    z0\.d, z4\.h, z5\.h, #180
+**     ret
+*/
+TEST_DUAL_Z (cdot_180_s64_untied, svint64_t, svint16_t,
+            z0 = svcdot_s64 (z1, z4, z5, 180),
+            z0 = svcdot (z1, z4, z5, 180))
+
+/*
+** cdot_270_s64_tied1:
+**     cdot    z0\.d, z4\.h, z5\.h, #270
+**     ret
+*/
+TEST_DUAL_Z (cdot_270_s64_tied1, svint64_t, svint16_t,
+            z0 = svcdot_s64 (z0, z4, z5, 270),
+            z0 = svcdot (z0, z4, z5, 270))
+
+/*
+** cdot_270_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.d, \1\.h, z1\.h, #270
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_270_s64_tied2, svint64_t, svint16_t,
+                z0_res = svcdot_s64 (z4, z0, z1, 270),
+                z0_res = svcdot (z4, z0, z1, 270))
+
+/*
+** cdot_270_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     cdot    z0\.d, z1\.h, \1\.h, #270
+**     ret
+*/
+TEST_DUAL_Z_REV (cdot_270_s64_tied3, svint64_t, svint16_t,
+                z0_res = svcdot_s64 (z4, z1, z0, 270),
+                z0_res = svcdot (z4, z1, z0, 270))
+
+/*
+** cdot_270_s64_untied:
+**     movprfx z0, z1
+**     cdot    z0\.d, z4\.h, z5\.h, #270
+**     ret
+*/
+TEST_DUAL_Z (cdot_270_s64_untied, svint64_t, svint16_t,
+            z0 = svcdot_s64 (z1, z4, z5, 270),
+            z0 = svcdot (z1, z4, z5, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_lane_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_lane_s16.c
new file mode 100644 (file)
index 0000000..429f916
--- /dev/null
@@ -0,0 +1,216 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cmla_lane_0_0_s16_tied1:
+**     cmla    z0\.h, z1\.h, z2\.h\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_0_s16_tied1, svint16_t,
+               z0 = svcmla_lane_s16 (z0, z1, z2, 0, 0),
+               z0 = svcmla_lane (z0, z1, z2, 0, 0))
+
+/*
+** cmla_lane_0_0_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, \1\.h, z2\.h\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_0_s16_tied2, svint16_t,
+               z0 = svcmla_lane_s16 (z1, z0, z2, 0, 0),
+               z0 = svcmla_lane (z1, z0, z2, 0, 0))
+
+/*
+** cmla_lane_0_0_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, \1\.h\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_0_s16_tied3, svint16_t,
+               z0 = svcmla_lane_s16 (z1, z2, z0, 0, 0),
+               z0 = svcmla_lane (z1, z2, z0, 0, 0))
+
+/*
+** cmla_lane_0_0_s16_untied:
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, z3\.h\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_0_s16_untied, svint16_t,
+               z0 = svcmla_lane_s16 (z1, z2, z3, 0, 0),
+               z0 = svcmla_lane (z1, z2, z3, 0, 0))
+
+/*
+** cmla_lane_0_90_s16_tied1:
+**     cmla    z0\.h, z1\.h, z2\.h\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_90_s16_tied1, svint16_t,
+               z0 = svcmla_lane_s16 (z0, z1, z2, 0, 90),
+               z0 = svcmla_lane (z0, z1, z2, 0, 90))
+
+/*
+** cmla_lane_0_90_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, \1\.h, z2\.h\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_90_s16_tied2, svint16_t,
+               z0 = svcmla_lane_s16 (z1, z0, z2, 0, 90),
+               z0 = svcmla_lane (z1, z0, z2, 0, 90))
+
+/*
+** cmla_lane_0_90_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, \1\.h\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_90_s16_tied3, svint16_t,
+               z0 = svcmla_lane_s16 (z1, z2, z0, 0, 90),
+               z0 = svcmla_lane (z1, z2, z0, 0, 90))
+
+/*
+** cmla_lane_0_90_s16_untied:
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, z3\.h\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_90_s16_untied, svint16_t,
+               z0 = svcmla_lane_s16 (z1, z2, z3, 0, 90),
+               z0 = svcmla_lane (z1, z2, z3, 0, 90))
+
+/*
+** cmla_lane_0_180_s16_tied1:
+**     cmla    z0\.h, z1\.h, z2\.h\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_180_s16_tied1, svint16_t,
+               z0 = svcmla_lane_s16 (z0, z1, z2, 0, 180),
+               z0 = svcmla_lane (z0, z1, z2, 0, 180))
+
+/*
+** cmla_lane_0_180_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, \1\.h, z2\.h\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_180_s16_tied2, svint16_t,
+               z0 = svcmla_lane_s16 (z1, z0, z2, 0, 180),
+               z0 = svcmla_lane (z1, z0, z2, 0, 180))
+
+/*
+** cmla_lane_0_180_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, \1\.h\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_180_s16_tied3, svint16_t,
+               z0 = svcmla_lane_s16 (z1, z2, z0, 0, 180),
+               z0 = svcmla_lane (z1, z2, z0, 0, 180))
+
+/*
+** cmla_lane_0_180_s16_untied:
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, z3\.h\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_180_s16_untied, svint16_t,
+               z0 = svcmla_lane_s16 (z1, z2, z3, 0, 180),
+               z0 = svcmla_lane (z1, z2, z3, 0, 180))
+
+/*
+** cmla_lane_0_270_s16_tied1:
+**     cmla    z0\.h, z1\.h, z2\.h\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_270_s16_tied1, svint16_t,
+               z0 = svcmla_lane_s16 (z0, z1, z2, 0, 270),
+               z0 = svcmla_lane (z0, z1, z2, 0, 270))
+
+/*
+** cmla_lane_0_270_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, \1\.h, z2\.h\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_270_s16_tied2, svint16_t,
+               z0 = svcmla_lane_s16 (z1, z0, z2, 0, 270),
+               z0 = svcmla_lane (z1, z0, z2, 0, 270))
+
+/*
+** cmla_lane_0_270_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, \1\.h\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_270_s16_tied3, svint16_t,
+               z0 = svcmla_lane_s16 (z1, z2, z0, 0, 270),
+               z0 = svcmla_lane (z1, z2, z0, 0, 270))
+
+/*
+** cmla_lane_0_270_s16_untied:
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, z3\.h\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_270_s16_untied, svint16_t,
+               z0 = svcmla_lane_s16 (z1, z2, z3, 0, 270),
+               z0 = svcmla_lane (z1, z2, z3, 0, 270))
+
+/*
+** cmla_lane_1_s16:
+**     cmla    z0\.h, z1\.h, z2\.h\[1\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_1_s16, svint16_t,
+               z0 = svcmla_lane_s16 (z0, z1, z2, 1, 0),
+               z0 = svcmla_lane (z0, z1, z2, 1, 0))
+
+/*
+** cmla_lane_2_s16:
+**     cmla    z0\.h, z1\.h, z2\.h\[2\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_2_s16, svint16_t,
+               z0 = svcmla_lane_s16 (z0, z1, z2, 2, 0),
+               z0 = svcmla_lane (z0, z1, z2, 2, 0))
+
+/*
+** cmla_lane_3_s16:
+**     cmla    z0\.h, z1\.h, z2\.h\[3\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_3_s16, svint16_t,
+               z0 = svcmla_lane_s16 (z0, z1, z2, 3, 0),
+               z0 = svcmla_lane (z0, z1, z2, 3, 0))
+
+/*
+** cmla_lane_z8_s16:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     cmla    z0\.h, z1\.h, \1\.h\[1\], #0
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (cmla_lane_z8_s16, svint16_t, svint16_t, z8,
+                   z0 = svcmla_lane_s16 (z0, z1, z8, 1, 0),
+                   z0 = svcmla_lane (z0, z1, z8, 1, 0))
+
+/*
+** cmla_lane_z16_s16:
+**     mov     (z[0-7])\.d, z16\.d
+**     cmla    z0\.h, z1\.h, \1\.h\[1\], #0
+**     ret
+*/
+TEST_DUAL_LANE_REG (cmla_lane_z16_s16, svint16_t, svint16_t, z16,
+                   z0 = svcmla_lane_s16 (z0, z1, z16, 1, 0),
+                   z0 = svcmla_lane (z0, z1, z16, 1, 0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_lane_s32.c
new file mode 100644 (file)
index 0000000..ed58940
--- /dev/null
@@ -0,0 +1,198 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cmla_lane_0_0_s32_tied1:
+**     cmla    z0\.s, z1\.s, z2\.s\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_0_s32_tied1, svint32_t,
+               z0 = svcmla_lane_s32 (z0, z1, z2, 0, 0),
+               z0 = svcmla_lane (z0, z1, z2, 0, 0))
+
+/*
+** cmla_lane_0_0_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, \1\.s, z2\.s\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_0_s32_tied2, svint32_t,
+               z0 = svcmla_lane_s32 (z1, z0, z2, 0, 0),
+               z0 = svcmla_lane (z1, z0, z2, 0, 0))
+
+/*
+** cmla_lane_0_0_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, \1\.s\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_0_s32_tied3, svint32_t,
+               z0 = svcmla_lane_s32 (z1, z2, z0, 0, 0),
+               z0 = svcmla_lane (z1, z2, z0, 0, 0))
+
+/*
+** cmla_lane_0_0_s32_untied:
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, z3\.s\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_0_s32_untied, svint32_t,
+               z0 = svcmla_lane_s32 (z1, z2, z3, 0, 0),
+               z0 = svcmla_lane (z1, z2, z3, 0, 0))
+
+/*
+** cmla_lane_0_90_s32_tied1:
+**     cmla    z0\.s, z1\.s, z2\.s\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_90_s32_tied1, svint32_t,
+               z0 = svcmla_lane_s32 (z0, z1, z2, 0, 90),
+               z0 = svcmla_lane (z0, z1, z2, 0, 90))
+
+/*
+** cmla_lane_0_90_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, \1\.s, z2\.s\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_90_s32_tied2, svint32_t,
+               z0 = svcmla_lane_s32 (z1, z0, z2, 0, 90),
+               z0 = svcmla_lane (z1, z0, z2, 0, 90))
+
+/*
+** cmla_lane_0_90_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, \1\.s\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_90_s32_tied3, svint32_t,
+               z0 = svcmla_lane_s32 (z1, z2, z0, 0, 90),
+               z0 = svcmla_lane (z1, z2, z0, 0, 90))
+
+/*
+** cmla_lane_0_90_s32_untied:
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, z3\.s\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_90_s32_untied, svint32_t,
+               z0 = svcmla_lane_s32 (z1, z2, z3, 0, 90),
+               z0 = svcmla_lane (z1, z2, z3, 0, 90))
+
+/*
+** cmla_lane_0_180_s32_tied1:
+**     cmla    z0\.s, z1\.s, z2\.s\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_180_s32_tied1, svint32_t,
+               z0 = svcmla_lane_s32 (z0, z1, z2, 0, 180),
+               z0 = svcmla_lane (z0, z1, z2, 0, 180))
+
+/*
+** cmla_lane_0_180_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, \1\.s, z2\.s\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_180_s32_tied2, svint32_t,
+               z0 = svcmla_lane_s32 (z1, z0, z2, 0, 180),
+               z0 = svcmla_lane (z1, z0, z2, 0, 180))
+
+/*
+** cmla_lane_0_180_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, \1\.s\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_180_s32_tied3, svint32_t,
+               z0 = svcmla_lane_s32 (z1, z2, z0, 0, 180),
+               z0 = svcmla_lane (z1, z2, z0, 0, 180))
+
+/*
+** cmla_lane_0_180_s32_untied:
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, z3\.s\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_180_s32_untied, svint32_t,
+               z0 = svcmla_lane_s32 (z1, z2, z3, 0, 180),
+               z0 = svcmla_lane (z1, z2, z3, 0, 180))
+
+/*
+** cmla_lane_0_270_s32_tied1:
+**     cmla    z0\.s, z1\.s, z2\.s\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_270_s32_tied1, svint32_t,
+               z0 = svcmla_lane_s32 (z0, z1, z2, 0, 270),
+               z0 = svcmla_lane (z0, z1, z2, 0, 270))
+
+/*
+** cmla_lane_0_270_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, \1\.s, z2\.s\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_270_s32_tied2, svint32_t,
+               z0 = svcmla_lane_s32 (z1, z0, z2, 0, 270),
+               z0 = svcmla_lane (z1, z0, z2, 0, 270))
+
+/*
+** cmla_lane_0_270_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, \1\.s\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_270_s32_tied3, svint32_t,
+               z0 = svcmla_lane_s32 (z1, z2, z0, 0, 270),
+               z0 = svcmla_lane (z1, z2, z0, 0, 270))
+
+/*
+** cmla_lane_0_270_s32_untied:
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, z3\.s\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_270_s32_untied, svint32_t,
+               z0 = svcmla_lane_s32 (z1, z2, z3, 0, 270),
+               z0 = svcmla_lane (z1, z2, z3, 0, 270))
+
+/*
+** cmla_lane_1_s32:
+**     cmla    z0\.s, z1\.s, z2\.s\[1\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_1_s32, svint32_t,
+               z0 = svcmla_lane_s32 (z0, z1, z2, 1, 0),
+               z0 = svcmla_lane (z0, z1, z2, 1, 0))
+
+/*
+** cmla_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     cmla    z0\.s, z1\.s, \1\.s\[1\], #0
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (cmla_lane_z8_s32, svint32_t, svint32_t, z8,
+                   z0 = svcmla_lane_s32 (z0, z1, z8, 1, 0),
+                   z0 = svcmla_lane (z0, z1, z8, 1, 0))
+
+/*
+** cmla_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     cmla    z0\.s, z1\.s, \1\.s\[1\], #0
+**     ret
+*/
+TEST_DUAL_LANE_REG (cmla_lane_z16_s32, svint32_t, svint32_t, z16,
+                   z0 = svcmla_lane_s32 (z0, z1, z16, 1, 0),
+                   z0 = svcmla_lane (z0, z1, z16, 1, 0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_lane_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_lane_u16.c
new file mode 100644 (file)
index 0000000..43c405b
--- /dev/null
@@ -0,0 +1,216 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cmla_lane_0_0_u16_tied1:
+**     cmla    z0\.h, z1\.h, z2\.h\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_0_u16_tied1, svuint16_t,
+               z0 = svcmla_lane_u16 (z0, z1, z2, 0, 0),
+               z0 = svcmla_lane (z0, z1, z2, 0, 0))
+
+/*
+** cmla_lane_0_0_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, \1\.h, z2\.h\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_0_u16_tied2, svuint16_t,
+               z0 = svcmla_lane_u16 (z1, z0, z2, 0, 0),
+               z0 = svcmla_lane (z1, z0, z2, 0, 0))
+
+/*
+** cmla_lane_0_0_u16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, \1\.h\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_0_u16_tied3, svuint16_t,
+               z0 = svcmla_lane_u16 (z1, z2, z0, 0, 0),
+               z0 = svcmla_lane (z1, z2, z0, 0, 0))
+
+/*
+** cmla_lane_0_0_u16_untied:
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, z3\.h\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_0_u16_untied, svuint16_t,
+               z0 = svcmla_lane_u16 (z1, z2, z3, 0, 0),
+               z0 = svcmla_lane (z1, z2, z3, 0, 0))
+
+/*
+** cmla_lane_0_90_u16_tied1:
+**     cmla    z0\.h, z1\.h, z2\.h\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_90_u16_tied1, svuint16_t,
+               z0 = svcmla_lane_u16 (z0, z1, z2, 0, 90),
+               z0 = svcmla_lane (z0, z1, z2, 0, 90))
+
+/*
+** cmla_lane_0_90_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, \1\.h, z2\.h\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_90_u16_tied2, svuint16_t,
+               z0 = svcmla_lane_u16 (z1, z0, z2, 0, 90),
+               z0 = svcmla_lane (z1, z0, z2, 0, 90))
+
+/*
+** cmla_lane_0_90_u16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, \1\.h\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_90_u16_tied3, svuint16_t,
+               z0 = svcmla_lane_u16 (z1, z2, z0, 0, 90),
+               z0 = svcmla_lane (z1, z2, z0, 0, 90))
+
+/*
+** cmla_lane_0_90_u16_untied:
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, z3\.h\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_90_u16_untied, svuint16_t,
+               z0 = svcmla_lane_u16 (z1, z2, z3, 0, 90),
+               z0 = svcmla_lane (z1, z2, z3, 0, 90))
+
+/*
+** cmla_lane_0_180_u16_tied1:
+**     cmla    z0\.h, z1\.h, z2\.h\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_180_u16_tied1, svuint16_t,
+               z0 = svcmla_lane_u16 (z0, z1, z2, 0, 180),
+               z0 = svcmla_lane (z0, z1, z2, 0, 180))
+
+/*
+** cmla_lane_0_180_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, \1\.h, z2\.h\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_180_u16_tied2, svuint16_t,
+               z0 = svcmla_lane_u16 (z1, z0, z2, 0, 180),
+               z0 = svcmla_lane (z1, z0, z2, 0, 180))
+
+/*
+** cmla_lane_0_180_u16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, \1\.h\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_180_u16_tied3, svuint16_t,
+               z0 = svcmla_lane_u16 (z1, z2, z0, 0, 180),
+               z0 = svcmla_lane (z1, z2, z0, 0, 180))
+
+/*
+** cmla_lane_0_180_u16_untied:
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, z3\.h\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_180_u16_untied, svuint16_t,
+               z0 = svcmla_lane_u16 (z1, z2, z3, 0, 180),
+               z0 = svcmla_lane (z1, z2, z3, 0, 180))
+
+/*
+** cmla_lane_0_270_u16_tied1:
+**     cmla    z0\.h, z1\.h, z2\.h\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_270_u16_tied1, svuint16_t,
+               z0 = svcmla_lane_u16 (z0, z1, z2, 0, 270),
+               z0 = svcmla_lane (z0, z1, z2, 0, 270))
+
+/*
+** cmla_lane_0_270_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, \1\.h, z2\.h\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_270_u16_tied2, svuint16_t,
+               z0 = svcmla_lane_u16 (z1, z0, z2, 0, 270),
+               z0 = svcmla_lane (z1, z0, z2, 0, 270))
+
+/*
+** cmla_lane_0_270_u16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, \1\.h\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_270_u16_tied3, svuint16_t,
+               z0 = svcmla_lane_u16 (z1, z2, z0, 0, 270),
+               z0 = svcmla_lane (z1, z2, z0, 0, 270))
+
+/*
+** cmla_lane_0_270_u16_untied:
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, z3\.h\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_270_u16_untied, svuint16_t,
+               z0 = svcmla_lane_u16 (z1, z2, z3, 0, 270),
+               z0 = svcmla_lane (z1, z2, z3, 0, 270))
+
+/*
+** cmla_lane_1_u16:
+**     cmla    z0\.h, z1\.h, z2\.h\[1\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_1_u16, svuint16_t,
+               z0 = svcmla_lane_u16 (z0, z1, z2, 1, 0),
+               z0 = svcmla_lane (z0, z1, z2, 1, 0))
+
+/*
+** cmla_lane_2_u16:
+**     cmla    z0\.h, z1\.h, z2\.h\[2\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_2_u16, svuint16_t,
+               z0 = svcmla_lane_u16 (z0, z1, z2, 2, 0),
+               z0 = svcmla_lane (z0, z1, z2, 2, 0))
+
+/*
+** cmla_lane_3_u16:
+**     cmla    z0\.h, z1\.h, z2\.h\[3\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_3_u16, svuint16_t,
+               z0 = svcmla_lane_u16 (z0, z1, z2, 3, 0),
+               z0 = svcmla_lane (z0, z1, z2, 3, 0))
+
+/*
+** cmla_lane_z8_u16:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     cmla    z0\.h, z1\.h, \1\.h\[1\], #0
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (cmla_lane_z8_u16, svuint16_t, svuint16_t, z8,
+                   z0 = svcmla_lane_u16 (z0, z1, z8, 1, 0),
+                   z0 = svcmla_lane (z0, z1, z8, 1, 0))
+
+/*
+** cmla_lane_z16_u16:
+**     mov     (z[0-7])\.d, z16\.d
+**     cmla    z0\.h, z1\.h, \1\.h\[1\], #0
+**     ret
+*/
+TEST_DUAL_LANE_REG (cmla_lane_z16_u16, svuint16_t, svuint16_t, z16,
+                   z0 = svcmla_lane_u16 (z0, z1, z16, 1, 0),
+                   z0 = svcmla_lane (z0, z1, z16, 1, 0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_lane_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_lane_u32.c
new file mode 100644 (file)
index 0000000..d5d52eb
--- /dev/null
@@ -0,0 +1,198 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cmla_lane_0_0_u32_tied1:
+**     cmla    z0\.s, z1\.s, z2\.s\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_0_u32_tied1, svuint32_t,
+               z0 = svcmla_lane_u32 (z0, z1, z2, 0, 0),
+               z0 = svcmla_lane (z0, z1, z2, 0, 0))
+
+/*
+** cmla_lane_0_0_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, \1\.s, z2\.s\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_0_u32_tied2, svuint32_t,
+               z0 = svcmla_lane_u32 (z1, z0, z2, 0, 0),
+               z0 = svcmla_lane (z1, z0, z2, 0, 0))
+
+/*
+** cmla_lane_0_0_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, \1\.s\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_0_u32_tied3, svuint32_t,
+               z0 = svcmla_lane_u32 (z1, z2, z0, 0, 0),
+               z0 = svcmla_lane (z1, z2, z0, 0, 0))
+
+/*
+** cmla_lane_0_0_u32_untied:
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, z3\.s\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_0_u32_untied, svuint32_t,
+               z0 = svcmla_lane_u32 (z1, z2, z3, 0, 0),
+               z0 = svcmla_lane (z1, z2, z3, 0, 0))
+
+/*
+** cmla_lane_0_90_u32_tied1:
+**     cmla    z0\.s, z1\.s, z2\.s\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_90_u32_tied1, svuint32_t,
+               z0 = svcmla_lane_u32 (z0, z1, z2, 0, 90),
+               z0 = svcmla_lane (z0, z1, z2, 0, 90))
+
+/*
+** cmla_lane_0_90_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, \1\.s, z2\.s\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_90_u32_tied2, svuint32_t,
+               z0 = svcmla_lane_u32 (z1, z0, z2, 0, 90),
+               z0 = svcmla_lane (z1, z0, z2, 0, 90))
+
+/*
+** cmla_lane_0_90_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, \1\.s\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_90_u32_tied3, svuint32_t,
+               z0 = svcmla_lane_u32 (z1, z2, z0, 0, 90),
+               z0 = svcmla_lane (z1, z2, z0, 0, 90))
+
+/*
+** cmla_lane_0_90_u32_untied:
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, z3\.s\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_90_u32_untied, svuint32_t,
+               z0 = svcmla_lane_u32 (z1, z2, z3, 0, 90),
+               z0 = svcmla_lane (z1, z2, z3, 0, 90))
+
+/*
+** cmla_lane_0_180_u32_tied1:
+**     cmla    z0\.s, z1\.s, z2\.s\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_180_u32_tied1, svuint32_t,
+               z0 = svcmla_lane_u32 (z0, z1, z2, 0, 180),
+               z0 = svcmla_lane (z0, z1, z2, 0, 180))
+
+/*
+** cmla_lane_0_180_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, \1\.s, z2\.s\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_180_u32_tied2, svuint32_t,
+               z0 = svcmla_lane_u32 (z1, z0, z2, 0, 180),
+               z0 = svcmla_lane (z1, z0, z2, 0, 180))
+
+/*
+** cmla_lane_0_180_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, \1\.s\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_180_u32_tied3, svuint32_t,
+               z0 = svcmla_lane_u32 (z1, z2, z0, 0, 180),
+               z0 = svcmla_lane (z1, z2, z0, 0, 180))
+
+/*
+** cmla_lane_0_180_u32_untied:
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, z3\.s\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_180_u32_untied, svuint32_t,
+               z0 = svcmla_lane_u32 (z1, z2, z3, 0, 180),
+               z0 = svcmla_lane (z1, z2, z3, 0, 180))
+
+/*
+** cmla_lane_0_270_u32_tied1:
+**     cmla    z0\.s, z1\.s, z2\.s\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_270_u32_tied1, svuint32_t,
+               z0 = svcmla_lane_u32 (z0, z1, z2, 0, 270),
+               z0 = svcmla_lane (z0, z1, z2, 0, 270))
+
+/*
+** cmla_lane_0_270_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, \1\.s, z2\.s\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_270_u32_tied2, svuint32_t,
+               z0 = svcmla_lane_u32 (z1, z0, z2, 0, 270),
+               z0 = svcmla_lane (z1, z0, z2, 0, 270))
+
+/*
+** cmla_lane_0_270_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, \1\.s\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_270_u32_tied3, svuint32_t,
+               z0 = svcmla_lane_u32 (z1, z2, z0, 0, 270),
+               z0 = svcmla_lane (z1, z2, z0, 0, 270))
+
+/*
+** cmla_lane_0_270_u32_untied:
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, z3\.s\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_0_270_u32_untied, svuint32_t,
+               z0 = svcmla_lane_u32 (z1, z2, z3, 0, 270),
+               z0 = svcmla_lane (z1, z2, z3, 0, 270))
+
+/*
+** cmla_lane_1_u32:
+**     cmla    z0\.s, z1\.s, z2\.s\[1\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_lane_1_u32, svuint32_t,
+               z0 = svcmla_lane_u32 (z0, z1, z2, 1, 0),
+               z0 = svcmla_lane (z0, z1, z2, 1, 0))
+
+/*
+** cmla_lane_z8_u32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     cmla    z0\.s, z1\.s, \1\.s\[1\], #0
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (cmla_lane_z8_u32, svuint32_t, svuint32_t, z8,
+                   z0 = svcmla_lane_u32 (z0, z1, z8, 1, 0),
+                   z0 = svcmla_lane (z0, z1, z8, 1, 0))
+
+/*
+** cmla_lane_z16_u32:
+**     mov     (z[0-7])\.d, z16\.d
+**     cmla    z0\.s, z1\.s, \1\.s\[1\], #0
+**     ret
+*/
+TEST_DUAL_LANE_REG (cmla_lane_z16_u32, svuint32_t, svuint32_t, z16,
+                   z0 = svcmla_lane_u32 (z0, z1, z16, 1, 0),
+                   z0 = svcmla_lane (z0, z1, z16, 1, 0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_s16.c
new file mode 100644 (file)
index 0000000..dc2aed9
--- /dev/null
@@ -0,0 +1,167 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cmla_0_s16_tied1:
+**     cmla    z0\.h, z1\.h, z2\.h, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_s16_tied1, svint16_t,
+               z0 = svcmla_s16 (z0, z1, z2, 0),
+               z0 = svcmla (z0, z1, z2, 0))
+
+/*
+** cmla_0_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, \1\.h, z2\.h, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_s16_tied2, svint16_t,
+               z0 = svcmla_s16 (z1, z0, z2, 0),
+               z0 = svcmla (z1, z0, z2, 0))
+
+/*
+** cmla_0_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, \1\.h, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_s16_tied3, svint16_t,
+               z0 = svcmla_s16 (z1, z2, z0, 0),
+               z0 = svcmla (z1, z2, z0, 0))
+
+/*
+** cmla_0_s16_untied:
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, z3\.h, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_s16_untied, svint16_t,
+               z0 = svcmla_s16 (z1, z2, z3, 0),
+               z0 = svcmla (z1, z2, z3, 0))
+
+/*
+** cmla_90_s16_tied1:
+**     cmla    z0\.h, z1\.h, z2\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_s16_tied1, svint16_t,
+               z0 = svcmla_s16 (z0, z1, z2, 90),
+               z0 = svcmla (z0, z1, z2, 90))
+
+/*
+** cmla_90_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, \1\.h, z2\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_s16_tied2, svint16_t,
+               z0 = svcmla_s16 (z1, z0, z2, 90),
+               z0 = svcmla (z1, z0, z2, 90))
+
+/*
+** cmla_90_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, \1\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_s16_tied3, svint16_t,
+               z0 = svcmla_s16 (z1, z2, z0, 90),
+               z0 = svcmla (z1, z2, z0, 90))
+
+/*
+** cmla_90_s16_untied:
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, z3\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_s16_untied, svint16_t,
+               z0 = svcmla_s16 (z1, z2, z3, 90),
+               z0 = svcmla (z1, z2, z3, 90))
+
+/*
+** cmla_180_s16_tied1:
+**     cmla    z0\.h, z1\.h, z2\.h, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_s16_tied1, svint16_t,
+               z0 = svcmla_s16 (z0, z1, z2, 180),
+               z0 = svcmla (z0, z1, z2, 180))
+
+/*
+** cmla_180_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, \1\.h, z2\.h, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_s16_tied2, svint16_t,
+               z0 = svcmla_s16 (z1, z0, z2, 180),
+               z0 = svcmla (z1, z0, z2, 180))
+
+/*
+** cmla_180_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, \1\.h, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_s16_tied3, svint16_t,
+               z0 = svcmla_s16 (z1, z2, z0, 180),
+               z0 = svcmla (z1, z2, z0, 180))
+
+/*
+** cmla_180_s16_untied:
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, z3\.h, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_s16_untied, svint16_t,
+               z0 = svcmla_s16 (z1, z2, z3, 180),
+               z0 = svcmla (z1, z2, z3, 180))
+
+/*
+** cmla_270_s16_tied1:
+**     cmla    z0\.h, z1\.h, z2\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_s16_tied1, svint16_t,
+               z0 = svcmla_s16 (z0, z1, z2, 270),
+               z0 = svcmla (z0, z1, z2, 270))
+
+/*
+** cmla_270_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, \1\.h, z2\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_s16_tied2, svint16_t,
+               z0 = svcmla_s16 (z1, z0, z2, 270),
+               z0 = svcmla (z1, z0, z2, 270))
+
+/*
+** cmla_270_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, \1\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_s16_tied3, svint16_t,
+               z0 = svcmla_s16 (z1, z2, z0, 270),
+               z0 = svcmla (z1, z2, z0, 270))
+
+/*
+** cmla_270_s16_untied:
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, z3\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_s16_untied, svint16_t,
+               z0 = svcmla_s16 (z1, z2, z3, 270),
+               z0 = svcmla (z1, z2, z3, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_s32.c
new file mode 100644 (file)
index 0000000..1389727
--- /dev/null
@@ -0,0 +1,167 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cmla_0_s32_tied1:
+**     cmla    z0\.s, z1\.s, z2\.s, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_s32_tied1, svint32_t,
+               z0 = svcmla_s32 (z0, z1, z2, 0),
+               z0 = svcmla (z0, z1, z2, 0))
+
+/*
+** cmla_0_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, \1\.s, z2\.s, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_s32_tied2, svint32_t,
+               z0 = svcmla_s32 (z1, z0, z2, 0),
+               z0 = svcmla (z1, z0, z2, 0))
+
+/*
+** cmla_0_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, \1\.s, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_s32_tied3, svint32_t,
+               z0 = svcmla_s32 (z1, z2, z0, 0),
+               z0 = svcmla (z1, z2, z0, 0))
+
+/*
+** cmla_0_s32_untied:
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, z3\.s, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_s32_untied, svint32_t,
+               z0 = svcmla_s32 (z1, z2, z3, 0),
+               z0 = svcmla (z1, z2, z3, 0))
+
+/*
+** cmla_90_s32_tied1:
+**     cmla    z0\.s, z1\.s, z2\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_s32_tied1, svint32_t,
+               z0 = svcmla_s32 (z0, z1, z2, 90),
+               z0 = svcmla (z0, z1, z2, 90))
+
+/*
+** cmla_90_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, \1\.s, z2\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_s32_tied2, svint32_t,
+               z0 = svcmla_s32 (z1, z0, z2, 90),
+               z0 = svcmla (z1, z0, z2, 90))
+
+/*
+** cmla_90_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, \1\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_s32_tied3, svint32_t,
+               z0 = svcmla_s32 (z1, z2, z0, 90),
+               z0 = svcmla (z1, z2, z0, 90))
+
+/*
+** cmla_90_s32_untied:
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, z3\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_s32_untied, svint32_t,
+               z0 = svcmla_s32 (z1, z2, z3, 90),
+               z0 = svcmla (z1, z2, z3, 90))
+
+/*
+** cmla_180_s32_tied1:
+**     cmla    z0\.s, z1\.s, z2\.s, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_s32_tied1, svint32_t,
+               z0 = svcmla_s32 (z0, z1, z2, 180),
+               z0 = svcmla (z0, z1, z2, 180))
+
+/*
+** cmla_180_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, \1\.s, z2\.s, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_s32_tied2, svint32_t,
+               z0 = svcmla_s32 (z1, z0, z2, 180),
+               z0 = svcmla (z1, z0, z2, 180))
+
+/*
+** cmla_180_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, \1\.s, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_s32_tied3, svint32_t,
+               z0 = svcmla_s32 (z1, z2, z0, 180),
+               z0 = svcmla (z1, z2, z0, 180))
+
+/*
+** cmla_180_s32_untied:
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, z3\.s, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_s32_untied, svint32_t,
+               z0 = svcmla_s32 (z1, z2, z3, 180),
+               z0 = svcmla (z1, z2, z3, 180))
+
+/*
+** cmla_270_s32_tied1:
+**     cmla    z0\.s, z1\.s, z2\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_s32_tied1, svint32_t,
+               z0 = svcmla_s32 (z0, z1, z2, 270),
+               z0 = svcmla (z0, z1, z2, 270))
+
+/*
+** cmla_270_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, \1\.s, z2\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_s32_tied2, svint32_t,
+               z0 = svcmla_s32 (z1, z0, z2, 270),
+               z0 = svcmla (z1, z0, z2, 270))
+
+/*
+** cmla_270_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, \1\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_s32_tied3, svint32_t,
+               z0 = svcmla_s32 (z1, z2, z0, 270),
+               z0 = svcmla (z1, z2, z0, 270))
+
+/*
+** cmla_270_s32_untied:
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, z3\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_s32_untied, svint32_t,
+               z0 = svcmla_s32 (z1, z2, z3, 270),
+               z0 = svcmla (z1, z2, z3, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_s64.c
new file mode 100644 (file)
index 0000000..2e28fc3
--- /dev/null
@@ -0,0 +1,167 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cmla_0_s64_tied1:
+**     cmla    z0\.d, z1\.d, z2\.d, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_s64_tied1, svint64_t,
+               z0 = svcmla_s64 (z0, z1, z2, 0),
+               z0 = svcmla (z0, z1, z2, 0))
+
+/*
+** cmla_0_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.d, \1, z2\.d, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_s64_tied2, svint64_t,
+               z0 = svcmla_s64 (z1, z0, z2, 0),
+               z0 = svcmla (z1, z0, z2, 0))
+
+/*
+** cmla_0_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.d, z2\.d, \1, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_s64_tied3, svint64_t,
+               z0 = svcmla_s64 (z1, z2, z0, 0),
+               z0 = svcmla (z1, z2, z0, 0))
+
+/*
+** cmla_0_s64_untied:
+**     movprfx z0, z1
+**     cmla    z0\.d, z2\.d, z3\.d, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_s64_untied, svint64_t,
+               z0 = svcmla_s64 (z1, z2, z3, 0),
+               z0 = svcmla (z1, z2, z3, 0))
+
+/*
+** cmla_90_s64_tied1:
+**     cmla    z0\.d, z1\.d, z2\.d, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_s64_tied1, svint64_t,
+               z0 = svcmla_s64 (z0, z1, z2, 90),
+               z0 = svcmla (z0, z1, z2, 90))
+
+/*
+** cmla_90_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.d, \1, z2\.d, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_s64_tied2, svint64_t,
+               z0 = svcmla_s64 (z1, z0, z2, 90),
+               z0 = svcmla (z1, z0, z2, 90))
+
+/*
+** cmla_90_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.d, z2\.d, \1, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_s64_tied3, svint64_t,
+               z0 = svcmla_s64 (z1, z2, z0, 90),
+               z0 = svcmla (z1, z2, z0, 90))
+
+/*
+** cmla_90_s64_untied:
+**     movprfx z0, z1
+**     cmla    z0\.d, z2\.d, z3\.d, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_s64_untied, svint64_t,
+               z0 = svcmla_s64 (z1, z2, z3, 90),
+               z0 = svcmla (z1, z2, z3, 90))
+
+/*
+** cmla_180_s64_tied1:
+**     cmla    z0\.d, z1\.d, z2\.d, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_s64_tied1, svint64_t,
+               z0 = svcmla_s64 (z0, z1, z2, 180),
+               z0 = svcmla (z0, z1, z2, 180))
+
+/*
+** cmla_180_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.d, \1, z2\.d, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_s64_tied2, svint64_t,
+               z0 = svcmla_s64 (z1, z0, z2, 180),
+               z0 = svcmla (z1, z0, z2, 180))
+
+/*
+** cmla_180_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.d, z2\.d, \1, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_s64_tied3, svint64_t,
+               z0 = svcmla_s64 (z1, z2, z0, 180),
+               z0 = svcmla (z1, z2, z0, 180))
+
+/*
+** cmla_180_s64_untied:
+**     movprfx z0, z1
+**     cmla    z0\.d, z2\.d, z3\.d, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_s64_untied, svint64_t,
+               z0 = svcmla_s64 (z1, z2, z3, 180),
+               z0 = svcmla (z1, z2, z3, 180))
+
+/*
+** cmla_270_s64_tied1:
+**     cmla    z0\.d, z1\.d, z2\.d, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_s64_tied1, svint64_t,
+               z0 = svcmla_s64 (z0, z1, z2, 270),
+               z0 = svcmla (z0, z1, z2, 270))
+
+/*
+** cmla_270_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.d, \1, z2\.d, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_s64_tied2, svint64_t,
+               z0 = svcmla_s64 (z1, z0, z2, 270),
+               z0 = svcmla (z1, z0, z2, 270))
+
+/*
+** cmla_270_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.d, z2\.d, \1, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_s64_tied3, svint64_t,
+               z0 = svcmla_s64 (z1, z2, z0, 270),
+               z0 = svcmla (z1, z2, z0, 270))
+
+/*
+** cmla_270_s64_untied:
+**     movprfx z0, z1
+**     cmla    z0\.d, z2\.d, z3\.d, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_s64_untied, svint64_t,
+               z0 = svcmla_s64 (z1, z2, z3, 270),
+               z0 = svcmla (z1, z2, z3, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_s8.c
new file mode 100644 (file)
index 0000000..3150632
--- /dev/null
@@ -0,0 +1,167 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cmla_0_s8_tied1:
+**     cmla    z0\.b, z1\.b, z2\.b, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_s8_tied1, svint8_t,
+               z0 = svcmla_s8 (z0, z1, z2, 0),
+               z0 = svcmla (z0, z1, z2, 0))
+
+/*
+** cmla_0_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.b, \1\.b, z2\.b, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_s8_tied2, svint8_t,
+               z0 = svcmla_s8 (z1, z0, z2, 0),
+               z0 = svcmla (z1, z0, z2, 0))
+
+/*
+** cmla_0_s8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.b, z2\.b, \1\.b, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_s8_tied3, svint8_t,
+               z0 = svcmla_s8 (z1, z2, z0, 0),
+               z0 = svcmla (z1, z2, z0, 0))
+
+/*
+** cmla_0_s8_untied:
+**     movprfx z0, z1
+**     cmla    z0\.b, z2\.b, z3\.b, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_s8_untied, svint8_t,
+               z0 = svcmla_s8 (z1, z2, z3, 0),
+               z0 = svcmla (z1, z2, z3, 0))
+
+/*
+** cmla_90_s8_tied1:
+**     cmla    z0\.b, z1\.b, z2\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_s8_tied1, svint8_t,
+               z0 = svcmla_s8 (z0, z1, z2, 90),
+               z0 = svcmla (z0, z1, z2, 90))
+
+/*
+** cmla_90_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.b, \1\.b, z2\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_s8_tied2, svint8_t,
+               z0 = svcmla_s8 (z1, z0, z2, 90),
+               z0 = svcmla (z1, z0, z2, 90))
+
+/*
+** cmla_90_s8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.b, z2\.b, \1\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_s8_tied3, svint8_t,
+               z0 = svcmla_s8 (z1, z2, z0, 90),
+               z0 = svcmla (z1, z2, z0, 90))
+
+/*
+** cmla_90_s8_untied:
+**     movprfx z0, z1
+**     cmla    z0\.b, z2\.b, z3\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_s8_untied, svint8_t,
+               z0 = svcmla_s8 (z1, z2, z3, 90),
+               z0 = svcmla (z1, z2, z3, 90))
+
+/*
+** cmla_180_s8_tied1:
+**     cmla    z0\.b, z1\.b, z2\.b, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_s8_tied1, svint8_t,
+               z0 = svcmla_s8 (z0, z1, z2, 180),
+               z0 = svcmla (z0, z1, z2, 180))
+
+/*
+** cmla_180_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.b, \1\.b, z2\.b, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_s8_tied2, svint8_t,
+               z0 = svcmla_s8 (z1, z0, z2, 180),
+               z0 = svcmla (z1, z0, z2, 180))
+
+/*
+** cmla_180_s8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.b, z2\.b, \1\.b, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_s8_tied3, svint8_t,
+               z0 = svcmla_s8 (z1, z2, z0, 180),
+               z0 = svcmla (z1, z2, z0, 180))
+
+/*
+** cmla_180_s8_untied:
+**     movprfx z0, z1
+**     cmla    z0\.b, z2\.b, z3\.b, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_s8_untied, svint8_t,
+               z0 = svcmla_s8 (z1, z2, z3, 180),
+               z0 = svcmla (z1, z2, z3, 180))
+
+/*
+** cmla_270_s8_tied1:
+**     cmla    z0\.b, z1\.b, z2\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_s8_tied1, svint8_t,
+               z0 = svcmla_s8 (z0, z1, z2, 270),
+               z0 = svcmla (z0, z1, z2, 270))
+
+/*
+** cmla_270_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.b, \1\.b, z2\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_s8_tied2, svint8_t,
+               z0 = svcmla_s8 (z1, z0, z2, 270),
+               z0 = svcmla (z1, z0, z2, 270))
+
+/*
+** cmla_270_s8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.b, z2\.b, \1\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_s8_tied3, svint8_t,
+               z0 = svcmla_s8 (z1, z2, z0, 270),
+               z0 = svcmla (z1, z2, z0, 270))
+
+/*
+** cmla_270_s8_untied:
+**     movprfx z0, z1
+**     cmla    z0\.b, z2\.b, z3\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_s8_untied, svint8_t,
+               z0 = svcmla_s8 (z1, z2, z3, 270),
+               z0 = svcmla (z1, z2, z3, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_u16.c
new file mode 100644 (file)
index 0000000..9a3b1d2
--- /dev/null
@@ -0,0 +1,167 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cmla_0_u16_tied1:
+**     cmla    z0\.h, z1\.h, z2\.h, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_u16_tied1, svuint16_t,
+               z0 = svcmla_u16 (z0, z1, z2, 0),
+               z0 = svcmla (z0, z1, z2, 0))
+
+/*
+** cmla_0_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, \1\.h, z2\.h, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_u16_tied2, svuint16_t,
+               z0 = svcmla_u16 (z1, z0, z2, 0),
+               z0 = svcmla (z1, z0, z2, 0))
+
+/*
+** cmla_0_u16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, \1\.h, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_u16_tied3, svuint16_t,
+               z0 = svcmla_u16 (z1, z2, z0, 0),
+               z0 = svcmla (z1, z2, z0, 0))
+
+/*
+** cmla_0_u16_untied:
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, z3\.h, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_u16_untied, svuint16_t,
+               z0 = svcmla_u16 (z1, z2, z3, 0),
+               z0 = svcmla (z1, z2, z3, 0))
+
+/*
+** cmla_90_u16_tied1:
+**     cmla    z0\.h, z1\.h, z2\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_u16_tied1, svuint16_t,
+               z0 = svcmla_u16 (z0, z1, z2, 90),
+               z0 = svcmla (z0, z1, z2, 90))
+
+/*
+** cmla_90_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, \1\.h, z2\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_u16_tied2, svuint16_t,
+               z0 = svcmla_u16 (z1, z0, z2, 90),
+               z0 = svcmla (z1, z0, z2, 90))
+
+/*
+** cmla_90_u16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, \1\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_u16_tied3, svuint16_t,
+               z0 = svcmla_u16 (z1, z2, z0, 90),
+               z0 = svcmla (z1, z2, z0, 90))
+
+/*
+** cmla_90_u16_untied:
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, z3\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_u16_untied, svuint16_t,
+               z0 = svcmla_u16 (z1, z2, z3, 90),
+               z0 = svcmla (z1, z2, z3, 90))
+
+/*
+** cmla_180_u16_tied1:
+**     cmla    z0\.h, z1\.h, z2\.h, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_u16_tied1, svuint16_t,
+               z0 = svcmla_u16 (z0, z1, z2, 180),
+               z0 = svcmla (z0, z1, z2, 180))
+
+/*
+** cmla_180_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, \1\.h, z2\.h, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_u16_tied2, svuint16_t,
+               z0 = svcmla_u16 (z1, z0, z2, 180),
+               z0 = svcmla (z1, z0, z2, 180))
+
+/*
+** cmla_180_u16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, \1\.h, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_u16_tied3, svuint16_t,
+               z0 = svcmla_u16 (z1, z2, z0, 180),
+               z0 = svcmla (z1, z2, z0, 180))
+
+/*
+** cmla_180_u16_untied:
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, z3\.h, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_u16_untied, svuint16_t,
+               z0 = svcmla_u16 (z1, z2, z3, 180),
+               z0 = svcmla (z1, z2, z3, 180))
+
+/*
+** cmla_270_u16_tied1:
+**     cmla    z0\.h, z1\.h, z2\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_u16_tied1, svuint16_t,
+               z0 = svcmla_u16 (z0, z1, z2, 270),
+               z0 = svcmla (z0, z1, z2, 270))
+
+/*
+** cmla_270_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, \1\.h, z2\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_u16_tied2, svuint16_t,
+               z0 = svcmla_u16 (z1, z0, z2, 270),
+               z0 = svcmla (z1, z0, z2, 270))
+
+/*
+** cmla_270_u16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, \1\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_u16_tied3, svuint16_t,
+               z0 = svcmla_u16 (z1, z2, z0, 270),
+               z0 = svcmla (z1, z2, z0, 270))
+
+/*
+** cmla_270_u16_untied:
+**     movprfx z0, z1
+**     cmla    z0\.h, z2\.h, z3\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_u16_untied, svuint16_t,
+               z0 = svcmla_u16 (z1, z2, z3, 270),
+               z0 = svcmla (z1, z2, z3, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_u32.c
new file mode 100644 (file)
index 0000000..eadcd3b
--- /dev/null
@@ -0,0 +1,167 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cmla_0_u32_tied1:
+**     cmla    z0\.s, z1\.s, z2\.s, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_u32_tied1, svuint32_t,
+               z0 = svcmla_u32 (z0, z1, z2, 0),
+               z0 = svcmla (z0, z1, z2, 0))
+
+/*
+** cmla_0_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, \1\.s, z2\.s, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_u32_tied2, svuint32_t,
+               z0 = svcmla_u32 (z1, z0, z2, 0),
+               z0 = svcmla (z1, z0, z2, 0))
+
+/*
+** cmla_0_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, \1\.s, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_u32_tied3, svuint32_t,
+               z0 = svcmla_u32 (z1, z2, z0, 0),
+               z0 = svcmla (z1, z2, z0, 0))
+
+/*
+** cmla_0_u32_untied:
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, z3\.s, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_u32_untied, svuint32_t,
+               z0 = svcmla_u32 (z1, z2, z3, 0),
+               z0 = svcmla (z1, z2, z3, 0))
+
+/*
+** cmla_90_u32_tied1:
+**     cmla    z0\.s, z1\.s, z2\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_u32_tied1, svuint32_t,
+               z0 = svcmla_u32 (z0, z1, z2, 90),
+               z0 = svcmla (z0, z1, z2, 90))
+
+/*
+** cmla_90_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, \1\.s, z2\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_u32_tied2, svuint32_t,
+               z0 = svcmla_u32 (z1, z0, z2, 90),
+               z0 = svcmla (z1, z0, z2, 90))
+
+/*
+** cmla_90_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, \1\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_u32_tied3, svuint32_t,
+               z0 = svcmla_u32 (z1, z2, z0, 90),
+               z0 = svcmla (z1, z2, z0, 90))
+
+/*
+** cmla_90_u32_untied:
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, z3\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_u32_untied, svuint32_t,
+               z0 = svcmla_u32 (z1, z2, z3, 90),
+               z0 = svcmla (z1, z2, z3, 90))
+
+/*
+** cmla_180_u32_tied1:
+**     cmla    z0\.s, z1\.s, z2\.s, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_u32_tied1, svuint32_t,
+               z0 = svcmla_u32 (z0, z1, z2, 180),
+               z0 = svcmla (z0, z1, z2, 180))
+
+/*
+** cmla_180_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, \1\.s, z2\.s, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_u32_tied2, svuint32_t,
+               z0 = svcmla_u32 (z1, z0, z2, 180),
+               z0 = svcmla (z1, z0, z2, 180))
+
+/*
+** cmla_180_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, \1\.s, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_u32_tied3, svuint32_t,
+               z0 = svcmla_u32 (z1, z2, z0, 180),
+               z0 = svcmla (z1, z2, z0, 180))
+
+/*
+** cmla_180_u32_untied:
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, z3\.s, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_u32_untied, svuint32_t,
+               z0 = svcmla_u32 (z1, z2, z3, 180),
+               z0 = svcmla (z1, z2, z3, 180))
+
+/*
+** cmla_270_u32_tied1:
+**     cmla    z0\.s, z1\.s, z2\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_u32_tied1, svuint32_t,
+               z0 = svcmla_u32 (z0, z1, z2, 270),
+               z0 = svcmla (z0, z1, z2, 270))
+
+/*
+** cmla_270_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, \1\.s, z2\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_u32_tied2, svuint32_t,
+               z0 = svcmla_u32 (z1, z0, z2, 270),
+               z0 = svcmla (z1, z0, z2, 270))
+
+/*
+** cmla_270_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, \1\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_u32_tied3, svuint32_t,
+               z0 = svcmla_u32 (z1, z2, z0, 270),
+               z0 = svcmla (z1, z2, z0, 270))
+
+/*
+** cmla_270_u32_untied:
+**     movprfx z0, z1
+**     cmla    z0\.s, z2\.s, z3\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_u32_untied, svuint32_t,
+               z0 = svcmla_u32 (z1, z2, z3, 270),
+               z0 = svcmla (z1, z2, z3, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_u64.c
new file mode 100644 (file)
index 0000000..ccf0591
--- /dev/null
@@ -0,0 +1,167 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cmla_0_u64_tied1:
+**     cmla    z0\.d, z1\.d, z2\.d, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_u64_tied1, svuint64_t,
+               z0 = svcmla_u64 (z0, z1, z2, 0),
+               z0 = svcmla (z0, z1, z2, 0))
+
+/*
+** cmla_0_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.d, \1, z2\.d, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_u64_tied2, svuint64_t,
+               z0 = svcmla_u64 (z1, z0, z2, 0),
+               z0 = svcmla (z1, z0, z2, 0))
+
+/*
+** cmla_0_u64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.d, z2\.d, \1, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_u64_tied3, svuint64_t,
+               z0 = svcmla_u64 (z1, z2, z0, 0),
+               z0 = svcmla (z1, z2, z0, 0))
+
+/*
+** cmla_0_u64_untied:
+**     movprfx z0, z1
+**     cmla    z0\.d, z2\.d, z3\.d, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_u64_untied, svuint64_t,
+               z0 = svcmla_u64 (z1, z2, z3, 0),
+               z0 = svcmla (z1, z2, z3, 0))
+
+/*
+** cmla_90_u64_tied1:
+**     cmla    z0\.d, z1\.d, z2\.d, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_u64_tied1, svuint64_t,
+               z0 = svcmla_u64 (z0, z1, z2, 90),
+               z0 = svcmla (z0, z1, z2, 90))
+
+/*
+** cmla_90_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.d, \1, z2\.d, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_u64_tied2, svuint64_t,
+               z0 = svcmla_u64 (z1, z0, z2, 90),
+               z0 = svcmla (z1, z0, z2, 90))
+
+/*
+** cmla_90_u64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.d, z2\.d, \1, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_u64_tied3, svuint64_t,
+               z0 = svcmla_u64 (z1, z2, z0, 90),
+               z0 = svcmla (z1, z2, z0, 90))
+
+/*
+** cmla_90_u64_untied:
+**     movprfx z0, z1
+**     cmla    z0\.d, z2\.d, z3\.d, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_u64_untied, svuint64_t,
+               z0 = svcmla_u64 (z1, z2, z3, 90),
+               z0 = svcmla (z1, z2, z3, 90))
+
+/*
+** cmla_180_u64_tied1:
+**     cmla    z0\.d, z1\.d, z2\.d, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_u64_tied1, svuint64_t,
+               z0 = svcmla_u64 (z0, z1, z2, 180),
+               z0 = svcmla (z0, z1, z2, 180))
+
+/*
+** cmla_180_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.d, \1, z2\.d, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_u64_tied2, svuint64_t,
+               z0 = svcmla_u64 (z1, z0, z2, 180),
+               z0 = svcmla (z1, z0, z2, 180))
+
+/*
+** cmla_180_u64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.d, z2\.d, \1, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_u64_tied3, svuint64_t,
+               z0 = svcmla_u64 (z1, z2, z0, 180),
+               z0 = svcmla (z1, z2, z0, 180))
+
+/*
+** cmla_180_u64_untied:
+**     movprfx z0, z1
+**     cmla    z0\.d, z2\.d, z3\.d, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_u64_untied, svuint64_t,
+               z0 = svcmla_u64 (z1, z2, z3, 180),
+               z0 = svcmla (z1, z2, z3, 180))
+
+/*
+** cmla_270_u64_tied1:
+**     cmla    z0\.d, z1\.d, z2\.d, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_u64_tied1, svuint64_t,
+               z0 = svcmla_u64 (z0, z1, z2, 270),
+               z0 = svcmla (z0, z1, z2, 270))
+
+/*
+** cmla_270_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.d, \1, z2\.d, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_u64_tied2, svuint64_t,
+               z0 = svcmla_u64 (z1, z0, z2, 270),
+               z0 = svcmla (z1, z0, z2, 270))
+
+/*
+** cmla_270_u64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.d, z2\.d, \1, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_u64_tied3, svuint64_t,
+               z0 = svcmla_u64 (z1, z2, z0, 270),
+               z0 = svcmla (z1, z2, z0, 270))
+
+/*
+** cmla_270_u64_untied:
+**     movprfx z0, z1
+**     cmla    z0\.d, z2\.d, z3\.d, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_u64_untied, svuint64_t,
+               z0 = svcmla_u64 (z1, z2, z3, 270),
+               z0 = svcmla (z1, z2, z3, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cmla_u8.c
new file mode 100644 (file)
index 0000000..be92311
--- /dev/null
@@ -0,0 +1,167 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cmla_0_u8_tied1:
+**     cmla    z0\.b, z1\.b, z2\.b, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_u8_tied1, svuint8_t,
+               z0 = svcmla_u8 (z0, z1, z2, 0),
+               z0 = svcmla (z0, z1, z2, 0))
+
+/*
+** cmla_0_u8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.b, \1\.b, z2\.b, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_u8_tied2, svuint8_t,
+               z0 = svcmla_u8 (z1, z0, z2, 0),
+               z0 = svcmla (z1, z0, z2, 0))
+
+/*
+** cmla_0_u8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.b, z2\.b, \1\.b, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_u8_tied3, svuint8_t,
+               z0 = svcmla_u8 (z1, z2, z0, 0),
+               z0 = svcmla (z1, z2, z0, 0))
+
+/*
+** cmla_0_u8_untied:
+**     movprfx z0, z1
+**     cmla    z0\.b, z2\.b, z3\.b, #0
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_0_u8_untied, svuint8_t,
+               z0 = svcmla_u8 (z1, z2, z3, 0),
+               z0 = svcmla (z1, z2, z3, 0))
+
+/*
+** cmla_90_u8_tied1:
+**     cmla    z0\.b, z1\.b, z2\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_u8_tied1, svuint8_t,
+               z0 = svcmla_u8 (z0, z1, z2, 90),
+               z0 = svcmla (z0, z1, z2, 90))
+
+/*
+** cmla_90_u8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.b, \1\.b, z2\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_u8_tied2, svuint8_t,
+               z0 = svcmla_u8 (z1, z0, z2, 90),
+               z0 = svcmla (z1, z0, z2, 90))
+
+/*
+** cmla_90_u8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.b, z2\.b, \1\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_u8_tied3, svuint8_t,
+               z0 = svcmla_u8 (z1, z2, z0, 90),
+               z0 = svcmla (z1, z2, z0, 90))
+
+/*
+** cmla_90_u8_untied:
+**     movprfx z0, z1
+**     cmla    z0\.b, z2\.b, z3\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_90_u8_untied, svuint8_t,
+               z0 = svcmla_u8 (z1, z2, z3, 90),
+               z0 = svcmla (z1, z2, z3, 90))
+
+/*
+** cmla_180_u8_tied1:
+**     cmla    z0\.b, z1\.b, z2\.b, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_u8_tied1, svuint8_t,
+               z0 = svcmla_u8 (z0, z1, z2, 180),
+               z0 = svcmla (z0, z1, z2, 180))
+
+/*
+** cmla_180_u8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.b, \1\.b, z2\.b, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_u8_tied2, svuint8_t,
+               z0 = svcmla_u8 (z1, z0, z2, 180),
+               z0 = svcmla (z1, z0, z2, 180))
+
+/*
+** cmla_180_u8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.b, z2\.b, \1\.b, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_u8_tied3, svuint8_t,
+               z0 = svcmla_u8 (z1, z2, z0, 180),
+               z0 = svcmla (z1, z2, z0, 180))
+
+/*
+** cmla_180_u8_untied:
+**     movprfx z0, z1
+**     cmla    z0\.b, z2\.b, z3\.b, #180
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_180_u8_untied, svuint8_t,
+               z0 = svcmla_u8 (z1, z2, z3, 180),
+               z0 = svcmla (z1, z2, z3, 180))
+
+/*
+** cmla_270_u8_tied1:
+**     cmla    z0\.b, z1\.b, z2\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_u8_tied1, svuint8_t,
+               z0 = svcmla_u8 (z0, z1, z2, 270),
+               z0 = svcmla (z0, z1, z2, 270))
+
+/*
+** cmla_270_u8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.b, \1\.b, z2\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_u8_tied2, svuint8_t,
+               z0 = svcmla_u8 (z1, z0, z2, 270),
+               z0 = svcmla (z1, z0, z2, 270))
+
+/*
+** cmla_270_u8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     cmla    z0\.b, z2\.b, \1\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_u8_tied3, svuint8_t,
+               z0 = svcmla_u8 (z1, z2, z0, 270),
+               z0 = svcmla (z1, z2, z0, 270))
+
+/*
+** cmla_270_u8_untied:
+**     movprfx z0, z1
+**     cmla    z0\.b, z2\.b, z3\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (cmla_270_u8_untied, svuint8_t,
+               z0 = svcmla_u8 (z1, z2, z3, 270),
+               z0 = svcmla (z1, z2, z3, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cvtlt_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cvtlt_f32.c
new file mode 100644 (file)
index 0000000..911defa
--- /dev/null
@@ -0,0 +1,72 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cvtlt_f32_f16_m_tied1:
+**     fcvtlt  z0\.s, p0/m, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (cvtlt_f32_f16_m_tied1, svfloat32_t, svfloat16_t,
+            z0 = svcvtlt_f32_f16_m (z0, p0, z4),
+            z0 = svcvtlt_f32_m (z0, p0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (cvtlt_f32_f16_m_tied2, svfloat32_t, svfloat16_t,
+                z0_res = svcvtlt_f32_f16_m (z4, p0, z0),
+                z0_res = svcvtlt_f32_m (z4, p0, z0))
+
+/*
+** cvtlt_f32_f16_m_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     fcvtlt  z0\.s, p0/m, z4\.h
+** |
+**     fcvtlt  z1\.s, p0/m, z4\.h
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (cvtlt_f32_f16_m_untied, svfloat32_t, svfloat16_t,
+            z0 = svcvtlt_f32_f16_m (z1, p0, z4),
+            z0 = svcvtlt_f32_m (z1, p0, z4))
+
+/*
+** cvtlt_f32_f16_x_tied1:
+**     fcvtlt  z0\.s, p0/m, z0\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (cvtlt_f32_f16_x_tied1, svfloat32_t, svfloat16_t,
+                z0_res = svcvtlt_f32_f16_x (p0, z0),
+                z0_res = svcvtlt_f32_x (p0, z0))
+
+/*
+** cvtlt_f32_f16_x_untied:
+**     fcvtlt  z0\.s, p0/m, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (cvtlt_f32_f16_x_untied, svfloat32_t, svfloat16_t,
+            z0 = svcvtlt_f32_f16_x (p0, z4),
+            z0 = svcvtlt_f32_x (p0, z4))
+
+/*
+** ptrue_cvtlt_f32_f16_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_DUAL_Z_REV (ptrue_cvtlt_f32_f16_x_tied1, svfloat32_t, svfloat16_t,
+                z0_res = svcvtlt_f32_f16_x (svptrue_b32 (), z0),
+                z0_res = svcvtlt_f32_x (svptrue_b32 (), z0))
+
+/*
+** ptrue_cvtlt_f32_f16_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_DUAL_Z (ptrue_cvtlt_f32_f16_x_untied, svfloat32_t, svfloat16_t,
+            z0 = svcvtlt_f32_f16_x (svptrue_b32 (), z4),
+            z0 = svcvtlt_f32_x (svptrue_b32 (), z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cvtlt_f64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cvtlt_f64.c
new file mode 100644 (file)
index 0000000..c34947b
--- /dev/null
@@ -0,0 +1,72 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cvtlt_f64_f32_m_tied1:
+**     fcvtlt  z0\.d, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (cvtlt_f64_f32_m_tied1, svfloat64_t, svfloat32_t,
+            z0 = svcvtlt_f64_f32_m (z0, p0, z4),
+            z0 = svcvtlt_f64_m (z0, p0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (cvtlt_f64_f32_m_tied2, svfloat64_t, svfloat32_t,
+                z0_res = svcvtlt_f64_f32_m (z4, p0, z0),
+                z0_res = svcvtlt_f64_m (z4, p0, z0))
+
+/*
+** cvtlt_f64_f32_m_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     fcvtlt  z0\.d, p0/m, z4\.s
+** |
+**     fcvtlt  z1\.d, p0/m, z4\.s
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (cvtlt_f64_f32_m_untied, svfloat64_t, svfloat32_t,
+            z0 = svcvtlt_f64_f32_m (z1, p0, z4),
+            z0 = svcvtlt_f64_m (z1, p0, z4))
+
+/*
+** cvtlt_f64_f32_x_tied1:
+**     fcvtlt  z0\.d, p0/m, z0\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (cvtlt_f64_f32_x_tied1, svfloat64_t, svfloat32_t,
+                z0_res = svcvtlt_f64_f32_x (p0, z0),
+                z0_res = svcvtlt_f64_x (p0, z0))
+
+/*
+** cvtlt_f64_f32_x_untied:
+**     fcvtlt  z0\.d, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (cvtlt_f64_f32_x_untied, svfloat64_t, svfloat32_t,
+            z0 = svcvtlt_f64_f32_x (p0, z4),
+            z0 = svcvtlt_f64_x (p0, z4))
+
+/*
+** ptrue_cvtlt_f64_f32_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_DUAL_Z_REV (ptrue_cvtlt_f64_f32_x_tied1, svfloat64_t, svfloat32_t,
+                z0_res = svcvtlt_f64_f32_x (svptrue_b64 (), z0),
+                z0_res = svcvtlt_f64_x (svptrue_b64 (), z0))
+
+/*
+** ptrue_cvtlt_f64_f32_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_DUAL_Z (ptrue_cvtlt_f64_f32_x_untied, svfloat64_t, svfloat32_t,
+            z0 = svcvtlt_f64_f32_x (svptrue_b64 (), z4),
+            z0 = svcvtlt_f64_x (svptrue_b64 (), z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cvtnt_f16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cvtnt_f16.c
new file mode 100644 (file)
index 0000000..a7960e3
--- /dev/null
@@ -0,0 +1,88 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cvtnt_f16_f32_m_tied1:
+**     fcvtnt  z0\.h, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (cvtnt_f16_f32_m_tied1, svfloat16_t, svfloat32_t,
+            z0 = svcvtnt_f16_f32_m (z0, p0, z4),
+            z0 = svcvtnt_f16_m (z0, p0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (cvtnt_f16_f32_m_tied2, svfloat16_t, svfloat32_t,
+                z0_res = svcvtnt_f16_f32_m (z4, p0, z0),
+                z0_res = svcvtnt_f16_m (z4, p0, z0))
+
+/*
+** cvtnt_f16_f32_m_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     fcvtnt  z0\.h, p0/m, z4\.s
+** |
+**     fcvtnt  z1\.h, p0/m, z4\.s
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (cvtnt_f16_f32_m_untied, svfloat16_t, svfloat32_t,
+            z0 = svcvtnt_f16_f32_m (z1, p0, z4),
+            z0 = svcvtnt_f16_m (z1, p0, z4))
+
+/*
+** cvtnt_f16_f32_x_tied1:
+**     fcvtnt  z0\.h, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (cvtnt_f16_f32_x_tied1, svfloat16_t, svfloat32_t,
+            z0 = svcvtnt_f16_f32_x (z0, p0, z4),
+            z0 = svcvtnt_f16_x (z0, p0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (cvtnt_f16_f32_x_tied2, svfloat16_t, svfloat32_t,
+                z0_res = svcvtnt_f16_f32_x (z4, p0, z0),
+                z0_res = svcvtnt_f16_x (z4, p0, z0))
+
+/*
+** cvtnt_f16_f32_x_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     fcvtnt  z0\.h, p0/m, z4\.s
+** |
+**     fcvtnt  z1\.h, p0/m, z4\.s
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (cvtnt_f16_f32_x_untied, svfloat16_t, svfloat32_t,
+            z0 = svcvtnt_f16_f32_x (z1, p0, z4),
+            z0 = svcvtnt_f16_x (z1, p0, z4))
+
+/*
+** ptrue_cvtnt_f16_f32_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_DUAL_Z (ptrue_cvtnt_f16_f32_x_tied1, svfloat16_t, svfloat32_t,
+            z0 = svcvtnt_f16_f32_x (z0, svptrue_b32 (), z4),
+            z0 = svcvtnt_f16_x (z0, svptrue_b32 (), z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (ptrue_cvtnt_f16_f32_x_tied2, svfloat16_t, svfloat32_t,
+                z0_res = svcvtnt_f16_f32_x (z4, svptrue_b32 (), z0),
+                z0_res = svcvtnt_f16_x (z4, svptrue_b32 (), z0))
+
+/*
+** ptrue_cvtnt_f16_f32_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_DUAL_Z (ptrue_cvtnt_f16_f32_x_untied, svfloat16_t, svfloat32_t,
+            z0 = svcvtnt_f16_f32_x (z1, svptrue_b32 (), z4),
+            z0 = svcvtnt_f16_x (z1, svptrue_b32 (), z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cvtnt_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cvtnt_f32.c
new file mode 100644 (file)
index 0000000..44fb30f
--- /dev/null
@@ -0,0 +1,88 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cvtnt_f32_f64_m_tied1:
+**     fcvtnt  z0\.s, p0/m, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (cvtnt_f32_f64_m_tied1, svfloat32_t, svfloat64_t,
+            z0 = svcvtnt_f32_f64_m (z0, p0, z4),
+            z0 = svcvtnt_f32_m (z0, p0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (cvtnt_f32_f64_m_tied2, svfloat32_t, svfloat64_t,
+                z0_res = svcvtnt_f32_f64_m (z4, p0, z0),
+                z0_res = svcvtnt_f32_m (z4, p0, z0))
+
+/*
+** cvtnt_f32_f64_m_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     fcvtnt  z0\.s, p0/m, z4\.d
+** |
+**     fcvtnt  z1\.s, p0/m, z4\.d
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (cvtnt_f32_f64_m_untied, svfloat32_t, svfloat64_t,
+            z0 = svcvtnt_f32_f64_m (z1, p0, z4),
+            z0 = svcvtnt_f32_m (z1, p0, z4))
+
+/*
+** cvtnt_f32_f64_x_tied1:
+**     fcvtnt  z0\.s, p0/m, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (cvtnt_f32_f64_x_tied1, svfloat32_t, svfloat64_t,
+            z0 = svcvtnt_f32_f64_x (z0, p0, z4),
+            z0 = svcvtnt_f32_x (z0, p0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (cvtnt_f32_f64_x_tied2, svfloat32_t, svfloat64_t,
+                z0_res = svcvtnt_f32_f64_x (z4, p0, z0),
+                z0_res = svcvtnt_f32_x (z4, p0, z0))
+
+/*
+** cvtnt_f32_f64_x_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     fcvtnt  z0\.s, p0/m, z4\.d
+** |
+**     fcvtnt  z1\.s, p0/m, z4\.d
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (cvtnt_f32_f64_x_untied, svfloat32_t, svfloat64_t,
+            z0 = svcvtnt_f32_f64_x (z1, p0, z4),
+            z0 = svcvtnt_f32_x (z1, p0, z4))
+
+/*
+** ptrue_cvtnt_f32_f64_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_DUAL_Z (ptrue_cvtnt_f32_f64_x_tied1, svfloat32_t, svfloat64_t,
+            z0 = svcvtnt_f32_f64_x (z0, svptrue_b64 (), z4),
+            z0 = svcvtnt_f32_x (z0, svptrue_b64 (), z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (ptrue_cvtnt_f32_f64_x_tied2, svfloat32_t, svfloat64_t,
+                z0_res = svcvtnt_f32_f64_x (z4, svptrue_b64 (), z0),
+                z0_res = svcvtnt_f32_x (z4, svptrue_b64 (), z0))
+
+/*
+** ptrue_cvtnt_f32_f64_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_DUAL_Z (ptrue_cvtnt_f32_f64_x_untied, svfloat32_t, svfloat64_t,
+            z0 = svcvtnt_f32_f64_x (z1, svptrue_b64 (), z4),
+            z0 = svcvtnt_f32_x (z1, svptrue_b64 (), z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cvtx_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cvtx_f32.c
new file mode 100644 (file)
index 0000000..21724c8
--- /dev/null
@@ -0,0 +1,94 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cvtx_f32_f64_m_tied1:
+**     fcvtx   z0\.s, p0/m, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (cvtx_f32_f64_m_tied1, svfloat32_t, svfloat64_t,
+            z0 = svcvtx_f32_f64_m (z0, p0, z4),
+            z0 = svcvtx_f32_m (z0, p0, z4))
+
+/*
+** cvtx_f32_f64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z4
+**     fcvtx   z0\.s, p0/m, \1
+**     ret
+*/
+TEST_DUAL_Z_REV (cvtx_f32_f64_m_tied2, svfloat32_t, svfloat64_t,
+                z0_res = svcvtx_f32_f64_m (z4, p0, z0),
+                z0_res = svcvtx_f32_m (z4, p0, z0))
+
+/*
+** cvtx_f32_f64_m_untied:
+**     movprfx z0, z1
+**     fcvtx   z0\.s, p0/m, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (cvtx_f32_f64_m_untied, svfloat32_t, svfloat64_t,
+            z0 = svcvtx_f32_f64_m (z1, p0, z4),
+            z0 = svcvtx_f32_m (z1, p0, z4))
+
+/*
+** cvtx_f32_f64_z_tied1:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0\.d, p0/z, \1
+**     fcvtx   z0\.s, p0/m, \1
+**     ret
+*/
+TEST_DUAL_Z_REV (cvtx_f32_f64_z_tied1, svfloat32_t, svfloat64_t,
+                z0_res = svcvtx_f32_f64_z (p0, z0),
+                z0_res = svcvtx_f32_z (p0, z0))
+
+/*
+** cvtx_f32_f64_z_untied:
+**     movprfx z0\.d, p0/z, z4\.d
+**     fcvtx   z0\.s, p0/m, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (cvtx_f32_f64_z_untied, svfloat32_t, svfloat64_t,
+            z0 = svcvtx_f32_f64_z (p0, z4),
+            z0 = svcvtx_f32_z (p0, z4))
+
+/*
+** cvtx_f32_f64_x_tied1:
+**     fcvtx   z0\.s, p0/m, z0\.d
+**     ret
+*/
+TEST_DUAL_Z_REV (cvtx_f32_f64_x_tied1, svfloat32_t, svfloat64_t,
+                z0_res = svcvtx_f32_f64_x (p0, z0),
+                z0_res = svcvtx_f32_x (p0, z0))
+
+/*
+** cvtx_f32_f64_x_untied:
+**     fcvtx   z0\.s, p0/m, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (cvtx_f32_f64_x_untied, svfloat32_t, svfloat64_t,
+            z0 = svcvtx_f32_f64_x (p0, z4),
+            z0 = svcvtx_f32_x (p0, z4))
+
+/*
+** ptrue_cvtx_f32_f64_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_DUAL_Z_REV (ptrue_cvtx_f32_f64_x_tied1, svfloat32_t, svfloat64_t,
+                z0_res = svcvtx_f32_f64_x (svptrue_b64 (), z0),
+                z0_res = svcvtx_f32_x (svptrue_b64 (), z0))
+
+/*
+** ptrue_cvtx_f32_f64_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_DUAL_Z (ptrue_cvtx_f32_f64_x_untied, svfloat32_t, svfloat64_t,
+            z0 = svcvtx_f32_f64_x (svptrue_b64 (), z4),
+            z0 = svcvtx_f32_x (svptrue_b64 (), z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cvtxnt_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/cvtxnt_f32.c
new file mode 100644 (file)
index 0000000..38aa38e
--- /dev/null
@@ -0,0 +1,88 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** cvtxnt_f32_f64_m_tied1:
+**     fcvtxnt z0\.s, p0/m, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (cvtxnt_f32_f64_m_tied1, svfloat32_t, svfloat64_t,
+            z0 = svcvtxnt_f32_f64_m (z0, p0, z4),
+            z0 = svcvtxnt_f32_m (z0, p0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (cvtxnt_f32_f64_m_tied2, svfloat32_t, svfloat64_t,
+                z0_res = svcvtxnt_f32_f64_m (z4, p0, z0),
+                z0_res = svcvtxnt_f32_m (z4, p0, z0))
+
+/*
+** cvtxnt_f32_f64_m_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     fcvtxnt z0\.s, p0/m, z4\.d
+** |
+**     fcvtxnt z1\.s, p0/m, z4\.d
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (cvtxnt_f32_f64_m_untied, svfloat32_t, svfloat64_t,
+            z0 = svcvtxnt_f32_f64_m (z1, p0, z4),
+            z0 = svcvtxnt_f32_m (z1, p0, z4))
+
+/*
+** cvtxnt_f32_f64_x_tied1:
+**     fcvtxnt z0\.s, p0/m, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (cvtxnt_f32_f64_x_tied1, svfloat32_t, svfloat64_t,
+            z0 = svcvtxnt_f32_f64_x (z0, p0, z4),
+            z0 = svcvtxnt_f32_x (z0, p0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (cvtxnt_f32_f64_x_tied2, svfloat32_t, svfloat64_t,
+                z0_res = svcvtxnt_f32_f64_x (z4, p0, z0),
+                z0_res = svcvtxnt_f32_x (z4, p0, z0))
+
+/*
+** cvtxnt_f32_f64_x_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     fcvtxnt z0\.s, p0/m, z4\.d
+** |
+**     fcvtxnt z1\.s, p0/m, z4\.d
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (cvtxnt_f32_f64_x_untied, svfloat32_t, svfloat64_t,
+            z0 = svcvtxnt_f32_f64_x (z1, p0, z4),
+            z0 = svcvtxnt_f32_x (z1, p0, z4))
+
+/*
+** ptrue_cvtxnt_f32_f64_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_DUAL_Z (ptrue_cvtxnt_f32_f64_x_tied1, svfloat32_t, svfloat64_t,
+            z0 = svcvtxnt_f32_f64_x (z0, svptrue_b64 (), z4),
+            z0 = svcvtxnt_f32_x (z0, svptrue_b64 (), z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (ptrue_cvtxnt_f32_f64_x_tied2, svfloat32_t, svfloat64_t,
+                z0_res = svcvtxnt_f32_f64_x (z4, svptrue_b64 (), z0),
+                z0_res = svcvtxnt_f32_x (z4, svptrue_b64 (), z0))
+
+/*
+** ptrue_cvtxnt_f32_f64_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_DUAL_Z (ptrue_cvtxnt_f32_f64_x_untied, svfloat32_t, svfloat64_t,
+            z0 = svcvtxnt_f32_f64_x (z1, svptrue_b64 (), z4),
+            z0 = svcvtxnt_f32_x (z1, svptrue_b64 (), z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_s16.c
new file mode 100644 (file)
index 0000000..48e99a8
--- /dev/null
@@ -0,0 +1,108 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eor3_s16_tied1:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_s16_tied1, svint16_t,
+               z0 = sveor3_s16 (z0, z1, z2),
+               z0 = sveor3 (z0, z1, z2))
+
+/*
+** eor3_s16_tied2:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_s16_tied2, svint16_t,
+               z0 = sveor3_s16 (z1, z0, z2),
+               z0 = sveor3 (z1, z0, z2))
+
+/*
+** eor3_s16_tied3:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_s16_tied3, svint16_t,
+               z0 = sveor3_s16 (z1, z2, z0),
+               z0 = sveor3 (z1, z2, z0))
+
+/*
+** eor3_s16_untied:
+** (
+**     movprfx z0, z1
+**     eor3    z0\.d, z0\.d, (z2\.d, z3\.d|z3\.d, z2\.d)
+** |
+**     movprfx z0, z2
+**     eor3    z0\.d, z0\.d, (z1\.d, z3\.d|z3\.d, z1\.d)
+** |
+**     movprfx z0, z3
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_s16_untied, svint16_t,
+               z0 = sveor3_s16 (z1, z2, z3),
+               z0 = sveor3 (z1, z2, z3))
+
+/*
+** eor3_w0_s16_tied1:
+**     mov     (z[0-9]+)\.h, w0
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_w0_s16_tied1, svint16_t, int16_t,
+                z0 = sveor3_n_s16 (z0, z1, x0),
+                z0 = sveor3 (z0, z1, x0))
+
+/*
+** eor3_w0_s16_tied2:
+**     mov     (z[0-9]+)\.h, w0
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_w0_s16_tied2, svint16_t, int16_t,
+                z0 = sveor3_n_s16 (z1, z0, x0),
+                z0 = sveor3 (z1, z0, x0))
+
+/*
+** eor3_w0_s16_untied:
+**     mov     z0\.h, w0
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_w0_s16_untied, svint16_t, int16_t,
+                z0 = sveor3_n_s16 (z1, z2, x0),
+                z0 = sveor3 (z1, z2, x0))
+
+/*
+** eor3_11_s16_tied1:
+**     mov     (z[0-9]+)\.h, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_s16_tied1, svint16_t,
+               z0 = sveor3_n_s16 (z0, z1, 11),
+               z0 = sveor3 (z0, z1, 11))
+
+/*
+** eor3_11_s16_tied2:
+**     mov     (z[0-9]+)\.h, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_s16_tied2, svint16_t,
+               z0 = sveor3_n_s16 (z1, z0, 11),
+               z0 = sveor3 (z1, z0, 11))
+
+/*
+** eor3_11_s16_untied:
+**     mov     z0\.h, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_s16_untied, svint16_t,
+               z0 = sveor3_n_s16 (z1, z2, 11),
+               z0 = sveor3 (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_s32.c
new file mode 100644 (file)
index 0000000..1a62f9d
--- /dev/null
@@ -0,0 +1,108 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eor3_s32_tied1:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_s32_tied1, svint32_t,
+               z0 = sveor3_s32 (z0, z1, z2),
+               z0 = sveor3 (z0, z1, z2))
+
+/*
+** eor3_s32_tied2:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_s32_tied2, svint32_t,
+               z0 = sveor3_s32 (z1, z0, z2),
+               z0 = sveor3 (z1, z0, z2))
+
+/*
+** eor3_s32_tied3:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_s32_tied3, svint32_t,
+               z0 = sveor3_s32 (z1, z2, z0),
+               z0 = sveor3 (z1, z2, z0))
+
+/*
+** eor3_s32_untied:
+** (
+**     movprfx z0, z1
+**     eor3    z0\.d, z0\.d, (z2\.d, z3\.d|z3\.d, z2\.d)
+** |
+**     movprfx z0, z2
+**     eor3    z0\.d, z0\.d, (z1\.d, z3\.d|z3\.d, z1\.d)
+** |
+**     movprfx z0, z3
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_s32_untied, svint32_t,
+               z0 = sveor3_s32 (z1, z2, z3),
+               z0 = sveor3 (z1, z2, z3))
+
+/*
+** eor3_w0_s32_tied1:
+**     mov     (z[0-9]+)\.s, w0
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_w0_s32_tied1, svint32_t, int32_t,
+                z0 = sveor3_n_s32 (z0, z1, x0),
+                z0 = sveor3 (z0, z1, x0))
+
+/*
+** eor3_w0_s32_tied2:
+**     mov     (z[0-9]+)\.s, w0
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_w0_s32_tied2, svint32_t, int32_t,
+                z0 = sveor3_n_s32 (z1, z0, x0),
+                z0 = sveor3 (z1, z0, x0))
+
+/*
+** eor3_w0_s32_untied:
+**     mov     z0\.s, w0
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_w0_s32_untied, svint32_t, int32_t,
+                z0 = sveor3_n_s32 (z1, z2, x0),
+                z0 = sveor3 (z1, z2, x0))
+
+/*
+** eor3_11_s32_tied1:
+**     mov     (z[0-9]+)\.s, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_s32_tied1, svint32_t,
+               z0 = sveor3_n_s32 (z0, z1, 11),
+               z0 = sveor3 (z0, z1, 11))
+
+/*
+** eor3_11_s32_tied2:
+**     mov     (z[0-9]+)\.s, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_s32_tied2, svint32_t,
+               z0 = sveor3_n_s32 (z1, z0, 11),
+               z0 = sveor3 (z1, z0, 11))
+
+/*
+** eor3_11_s32_untied:
+**     mov     z0\.s, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_s32_untied, svint32_t,
+               z0 = sveor3_n_s32 (z1, z2, 11),
+               z0 = sveor3 (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_s64.c
new file mode 100644 (file)
index 0000000..36b57bf
--- /dev/null
@@ -0,0 +1,108 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eor3_s64_tied1:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_s64_tied1, svint64_t,
+               z0 = sveor3_s64 (z0, z1, z2),
+               z0 = sveor3 (z0, z1, z2))
+
+/*
+** eor3_s64_tied2:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_s64_tied2, svint64_t,
+               z0 = sveor3_s64 (z1, z0, z2),
+               z0 = sveor3 (z1, z0, z2))
+
+/*
+** eor3_s64_tied3:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_s64_tied3, svint64_t,
+               z0 = sveor3_s64 (z1, z2, z0),
+               z0 = sveor3 (z1, z2, z0))
+
+/*
+** eor3_s64_untied:
+** (
+**     movprfx z0, z1
+**     eor3    z0\.d, z0\.d, (z2\.d, z3\.d|z3\.d, z2\.d)
+** |
+**     movprfx z0, z2
+**     eor3    z0\.d, z0\.d, (z1\.d, z3\.d|z3\.d, z1\.d)
+** |
+**     movprfx z0, z3
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_s64_untied, svint64_t,
+               z0 = sveor3_s64 (z1, z2, z3),
+               z0 = sveor3 (z1, z2, z3))
+
+/*
+** eor3_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     eor3    z0\.d, z0\.d, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_x0_s64_tied1, svint64_t, int64_t,
+                z0 = sveor3_n_s64 (z0, z1, x0),
+                z0 = sveor3 (z0, z1, x0))
+
+/*
+** eor3_x0_s64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     eor3    z0\.d, z0\.d, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_x0_s64_tied2, svint64_t, int64_t,
+                z0 = sveor3_n_s64 (z1, z0, x0),
+                z0 = sveor3 (z1, z0, x0))
+
+/*
+** eor3_x0_s64_untied:
+**     mov     z0\.d, x0
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_x0_s64_untied, svint64_t, int64_t,
+                z0 = sveor3_n_s64 (z1, z2, x0),
+                z0 = sveor3 (z1, z2, x0))
+
+/*
+** eor3_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     eor3    z0\.d, z0\.d, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_s64_tied1, svint64_t,
+               z0 = sveor3_n_s64 (z0, z1, 11),
+               z0 = sveor3 (z0, z1, 11))
+
+/*
+** eor3_11_s64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     eor3    z0\.d, z0\.d, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_s64_tied2, svint64_t,
+               z0 = sveor3_n_s64 (z1, z0, 11),
+               z0 = sveor3 (z1, z0, 11))
+
+/*
+** eor3_11_s64_untied:
+**     mov     z0\.d, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_s64_untied, svint64_t,
+               z0 = sveor3_n_s64 (z1, z2, 11),
+               z0 = sveor3 (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_s8.c
new file mode 100644 (file)
index 0000000..e9dc149
--- /dev/null
@@ -0,0 +1,108 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eor3_s8_tied1:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_s8_tied1, svint8_t,
+               z0 = sveor3_s8 (z0, z1, z2),
+               z0 = sveor3 (z0, z1, z2))
+
+/*
+** eor3_s8_tied2:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_s8_tied2, svint8_t,
+               z0 = sveor3_s8 (z1, z0, z2),
+               z0 = sveor3 (z1, z0, z2))
+
+/*
+** eor3_s8_tied3:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_s8_tied3, svint8_t,
+               z0 = sveor3_s8 (z1, z2, z0),
+               z0 = sveor3 (z1, z2, z0))
+
+/*
+** eor3_s8_untied:
+** (
+**     movprfx z0, z1
+**     eor3    z0\.d, z0\.d, (z2\.d, z3\.d|z3\.d, z2\.d)
+** |
+**     movprfx z0, z2
+**     eor3    z0\.d, z0\.d, (z1\.d, z3\.d|z3\.d, z1\.d)
+** |
+**     movprfx z0, z3
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_s8_untied, svint8_t,
+               z0 = sveor3_s8 (z1, z2, z3),
+               z0 = sveor3 (z1, z2, z3))
+
+/*
+** eor3_w0_s8_tied1:
+**     mov     (z[0-9]+)\.b, w0
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_w0_s8_tied1, svint8_t, int8_t,
+                z0 = sveor3_n_s8 (z0, z1, x0),
+                z0 = sveor3 (z0, z1, x0))
+
+/*
+** eor3_w0_s8_tied2:
+**     mov     (z[0-9]+)\.b, w0
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_w0_s8_tied2, svint8_t, int8_t,
+                z0 = sveor3_n_s8 (z1, z0, x0),
+                z0 = sveor3 (z1, z0, x0))
+
+/*
+** eor3_w0_s8_untied:
+**     mov     z0\.b, w0
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_w0_s8_untied, svint8_t, int8_t,
+                z0 = sveor3_n_s8 (z1, z2, x0),
+                z0 = sveor3 (z1, z2, x0))
+
+/*
+** eor3_11_s8_tied1:
+**     mov     (z[0-9]+)\.b, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_s8_tied1, svint8_t,
+               z0 = sveor3_n_s8 (z0, z1, 11),
+               z0 = sveor3 (z0, z1, 11))
+
+/*
+** eor3_11_s8_tied2:
+**     mov     (z[0-9]+)\.b, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_s8_tied2, svint8_t,
+               z0 = sveor3_n_s8 (z1, z0, 11),
+               z0 = sveor3 (z1, z0, 11))
+
+/*
+** eor3_11_s8_untied:
+**     mov     z0\.b, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_s8_untied, svint8_t,
+               z0 = sveor3_n_s8 (z1, z2, 11),
+               z0 = sveor3 (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_u16.c
new file mode 100644 (file)
index 0000000..95b4097
--- /dev/null
@@ -0,0 +1,108 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eor3_u16_tied1:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_u16_tied1, svuint16_t,
+               z0 = sveor3_u16 (z0, z1, z2),
+               z0 = sveor3 (z0, z1, z2))
+
+/*
+** eor3_u16_tied2:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_u16_tied2, svuint16_t,
+               z0 = sveor3_u16 (z1, z0, z2),
+               z0 = sveor3 (z1, z0, z2))
+
+/*
+** eor3_u16_tied3:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_u16_tied3, svuint16_t,
+               z0 = sveor3_u16 (z1, z2, z0),
+               z0 = sveor3 (z1, z2, z0))
+
+/*
+** eor3_u16_untied:
+** (
+**     movprfx z0, z1
+**     eor3    z0\.d, z0\.d, (z2\.d, z3\.d|z3\.d, z2\.d)
+** |
+**     movprfx z0, z2
+**     eor3    z0\.d, z0\.d, (z1\.d, z3\.d|z3\.d, z1\.d)
+** |
+**     movprfx z0, z3
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_u16_untied, svuint16_t,
+               z0 = sveor3_u16 (z1, z2, z3),
+               z0 = sveor3 (z1, z2, z3))
+
+/*
+** eor3_w0_u16_tied1:
+**     mov     (z[0-9]+)\.h, w0
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_w0_u16_tied1, svuint16_t, uint16_t,
+                z0 = sveor3_n_u16 (z0, z1, x0),
+                z0 = sveor3 (z0, z1, x0))
+
+/*
+** eor3_w0_u16_tied2:
+**     mov     (z[0-9]+)\.h, w0
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_w0_u16_tied2, svuint16_t, uint16_t,
+                z0 = sveor3_n_u16 (z1, z0, x0),
+                z0 = sveor3 (z1, z0, x0))
+
+/*
+** eor3_w0_u16_untied:
+**     mov     z0\.h, w0
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_w0_u16_untied, svuint16_t, uint16_t,
+                z0 = sveor3_n_u16 (z1, z2, x0),
+                z0 = sveor3 (z1, z2, x0))
+
+/*
+** eor3_11_u16_tied1:
+**     mov     (z[0-9]+)\.h, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_u16_tied1, svuint16_t,
+               z0 = sveor3_n_u16 (z0, z1, 11),
+               z0 = sveor3 (z0, z1, 11))
+
+/*
+** eor3_11_u16_tied2:
+**     mov     (z[0-9]+)\.h, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_u16_tied2, svuint16_t,
+               z0 = sveor3_n_u16 (z1, z0, 11),
+               z0 = sveor3 (z1, z0, 11))
+
+/*
+** eor3_11_u16_untied:
+**     mov     z0\.h, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_u16_untied, svuint16_t,
+               z0 = sveor3_n_u16 (z1, z2, 11),
+               z0 = sveor3 (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_u32.c
new file mode 100644 (file)
index 0000000..e9665bc
--- /dev/null
@@ -0,0 +1,108 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eor3_u32_tied1:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_u32_tied1, svuint32_t,
+               z0 = sveor3_u32 (z0, z1, z2),
+               z0 = sveor3 (z0, z1, z2))
+
+/*
+** eor3_u32_tied2:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_u32_tied2, svuint32_t,
+               z0 = sveor3_u32 (z1, z0, z2),
+               z0 = sveor3 (z1, z0, z2))
+
+/*
+** eor3_u32_tied3:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_u32_tied3, svuint32_t,
+               z0 = sveor3_u32 (z1, z2, z0),
+               z0 = sveor3 (z1, z2, z0))
+
+/*
+** eor3_u32_untied:
+** (
+**     movprfx z0, z1
+**     eor3    z0\.d, z0\.d, (z2\.d, z3\.d|z3\.d, z2\.d)
+** |
+**     movprfx z0, z2
+**     eor3    z0\.d, z0\.d, (z1\.d, z3\.d|z3\.d, z1\.d)
+** |
+**     movprfx z0, z3
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_u32_untied, svuint32_t,
+               z0 = sveor3_u32 (z1, z2, z3),
+               z0 = sveor3 (z1, z2, z3))
+
+/*
+** eor3_w0_u32_tied1:
+**     mov     (z[0-9]+)\.s, w0
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = sveor3_n_u32 (z0, z1, x0),
+                z0 = sveor3 (z0, z1, x0))
+
+/*
+** eor3_w0_u32_tied2:
+**     mov     (z[0-9]+)\.s, w0
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_w0_u32_tied2, svuint32_t, uint32_t,
+                z0 = sveor3_n_u32 (z1, z0, x0),
+                z0 = sveor3 (z1, z0, x0))
+
+/*
+** eor3_w0_u32_untied:
+**     mov     z0\.s, w0
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = sveor3_n_u32 (z1, z2, x0),
+                z0 = sveor3 (z1, z2, x0))
+
+/*
+** eor3_11_u32_tied1:
+**     mov     (z[0-9]+)\.s, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_u32_tied1, svuint32_t,
+               z0 = sveor3_n_u32 (z0, z1, 11),
+               z0 = sveor3 (z0, z1, 11))
+
+/*
+** eor3_11_u32_tied2:
+**     mov     (z[0-9]+)\.s, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_u32_tied2, svuint32_t,
+               z0 = sveor3_n_u32 (z1, z0, 11),
+               z0 = sveor3 (z1, z0, 11))
+
+/*
+** eor3_11_u32_untied:
+**     mov     z0\.s, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_u32_untied, svuint32_t,
+               z0 = sveor3_n_u32 (z1, z2, 11),
+               z0 = sveor3 (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_u64.c
new file mode 100644 (file)
index 0000000..6de1ee0
--- /dev/null
@@ -0,0 +1,108 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eor3_u64_tied1:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_u64_tied1, svuint64_t,
+               z0 = sveor3_u64 (z0, z1, z2),
+               z0 = sveor3 (z0, z1, z2))
+
+/*
+** eor3_u64_tied2:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_u64_tied2, svuint64_t,
+               z0 = sveor3_u64 (z1, z0, z2),
+               z0 = sveor3 (z1, z0, z2))
+
+/*
+** eor3_u64_tied3:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_u64_tied3, svuint64_t,
+               z0 = sveor3_u64 (z1, z2, z0),
+               z0 = sveor3 (z1, z2, z0))
+
+/*
+** eor3_u64_untied:
+** (
+**     movprfx z0, z1
+**     eor3    z0\.d, z0\.d, (z2\.d, z3\.d|z3\.d, z2\.d)
+** |
+**     movprfx z0, z2
+**     eor3    z0\.d, z0\.d, (z1\.d, z3\.d|z3\.d, z1\.d)
+** |
+**     movprfx z0, z3
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_u64_untied, svuint64_t,
+               z0 = sveor3_u64 (z1, z2, z3),
+               z0 = sveor3 (z1, z2, z3))
+
+/*
+** eor3_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     eor3    z0\.d, z0\.d, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = sveor3_n_u64 (z0, z1, x0),
+                z0 = sveor3 (z0, z1, x0))
+
+/*
+** eor3_x0_u64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     eor3    z0\.d, z0\.d, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_x0_u64_tied2, svuint64_t, uint64_t,
+                z0 = sveor3_n_u64 (z1, z0, x0),
+                z0 = sveor3 (z1, z0, x0))
+
+/*
+** eor3_x0_u64_untied:
+**     mov     z0\.d, x0
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = sveor3_n_u64 (z1, z2, x0),
+                z0 = sveor3 (z1, z2, x0))
+
+/*
+** eor3_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     eor3    z0\.d, z0\.d, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_u64_tied1, svuint64_t,
+               z0 = sveor3_n_u64 (z0, z1, 11),
+               z0 = sveor3 (z0, z1, 11))
+
+/*
+** eor3_11_u64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     eor3    z0\.d, z0\.d, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_u64_tied2, svuint64_t,
+               z0 = sveor3_n_u64 (z1, z0, 11),
+               z0 = sveor3 (z1, z0, 11))
+
+/*
+** eor3_11_u64_untied:
+**     mov     z0\.d, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_u64_untied, svuint64_t,
+               z0 = sveor3_n_u64 (z1, z2, 11),
+               z0 = sveor3 (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eor3_u8.c
new file mode 100644 (file)
index 0000000..ac55a27
--- /dev/null
@@ -0,0 +1,108 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eor3_u8_tied1:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_u8_tied1, svuint8_t,
+               z0 = sveor3_u8 (z0, z1, z2),
+               z0 = sveor3 (z0, z1, z2))
+
+/*
+** eor3_u8_tied2:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_u8_tied2, svuint8_t,
+               z0 = sveor3_u8 (z1, z0, z2),
+               z0 = sveor3 (z1, z0, z2))
+
+/*
+** eor3_u8_tied3:
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_u8_tied3, svuint8_t,
+               z0 = sveor3_u8 (z1, z2, z0),
+               z0 = sveor3 (z1, z2, z0))
+
+/*
+** eor3_u8_untied:
+** (
+**     movprfx z0, z1
+**     eor3    z0\.d, z0\.d, (z2\.d, z3\.d|z3\.d, z2\.d)
+** |
+**     movprfx z0, z2
+**     eor3    z0\.d, z0\.d, (z1\.d, z3\.d|z3\.d, z1\.d)
+** |
+**     movprfx z0, z3
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_u8_untied, svuint8_t,
+               z0 = sveor3_u8 (z1, z2, z3),
+               z0 = sveor3 (z1, z2, z3))
+
+/*
+** eor3_w0_u8_tied1:
+**     mov     (z[0-9]+)\.b, w0
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_w0_u8_tied1, svuint8_t, uint8_t,
+                z0 = sveor3_n_u8 (z0, z1, x0),
+                z0 = sveor3 (z0, z1, x0))
+
+/*
+** eor3_w0_u8_tied2:
+**     mov     (z[0-9]+)\.b, w0
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_w0_u8_tied2, svuint8_t, uint8_t,
+                z0 = sveor3_n_u8 (z1, z0, x0),
+                z0 = sveor3 (z1, z0, x0))
+
+/*
+** eor3_w0_u8_untied:
+**     mov     z0\.b, w0
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (eor3_w0_u8_untied, svuint8_t, uint8_t,
+                z0 = sveor3_n_u8 (z1, z2, x0),
+                z0 = sveor3 (z1, z2, x0))
+
+/*
+** eor3_11_u8_tied1:
+**     mov     (z[0-9]+)\.b, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_u8_tied1, svuint8_t,
+               z0 = sveor3_n_u8 (z0, z1, 11),
+               z0 = sveor3 (z0, z1, 11))
+
+/*
+** eor3_11_u8_tied2:
+**     mov     (z[0-9]+)\.b, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, \1\.d|\1\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_u8_tied2, svuint8_t,
+               z0 = sveor3_n_u8 (z1, z0, 11),
+               z0 = sveor3 (z1, z0, 11))
+
+/*
+** eor3_11_u8_untied:
+**     mov     z0\.b, #11
+**     eor3    z0\.d, z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (eor3_11_u8_untied, svuint8_t,
+               z0 = sveor3_n_u8 (z1, z2, 11),
+               z0 = sveor3 (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_s16.c
new file mode 100644 (file)
index 0000000..24dbab3
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eorbt_s16_tied1:
+**     eorbt   z0\.h, z1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_s16_tied1, svint16_t,
+               z0 = sveorbt_s16 (z0, z1, z2),
+               z0 = sveorbt (z0, z1, z2))
+
+/*
+** eorbt_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.h, \1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_s16_tied2, svint16_t,
+               z0 = sveorbt_s16 (z1, z0, z2),
+               z0 = sveorbt (z1, z0, z2))
+
+/*
+** eorbt_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.h, z2\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_s16_tied3, svint16_t,
+               z0 = sveorbt_s16 (z1, z2, z0),
+               z0 = sveorbt (z1, z2, z0))
+
+/*
+** eorbt_s16_untied:
+**     movprfx z0, z1
+**     eorbt   z0\.h, z2\.h, z3\.h
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_s16_untied, svint16_t,
+               z0 = sveorbt_s16 (z1, z2, z3),
+               z0 = sveorbt (z1, z2, z3))
+
+/*
+** eorbt_w0_s16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     eorbt   z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_w0_s16_tied1, svint16_t, int16_t,
+                z0 = sveorbt_n_s16 (z0, z1, x0),
+                z0 = sveorbt (z0, z1, x0))
+
+/*
+** eorbt_w0_s16_tied2:
+**     mov     (z[0-9]+\.h), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.h, \2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_w0_s16_tied2, svint16_t, int16_t,
+                z0 = sveorbt_n_s16 (z1, z0, x0),
+                z0 = sveorbt (z1, z0, x0))
+
+/*
+** eorbt_w0_s16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     eorbt   z0\.h, z2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_w0_s16_untied, svint16_t, int16_t,
+                z0 = sveorbt_n_s16 (z1, z2, x0),
+                z0 = sveorbt (z1, z2, x0))
+
+/*
+** eorbt_11_s16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     eorbt   z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_s16_tied1, svint16_t,
+               z0 = sveorbt_n_s16 (z0, z1, 11),
+               z0 = sveorbt (z0, z1, 11))
+
+/*
+** eorbt_11_s16_tied2:
+**     mov     (z[0-9]+\.h), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.h, \2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_s16_tied2, svint16_t,
+               z0 = sveorbt_n_s16 (z1, z0, 11),
+               z0 = sveorbt (z1, z0, 11))
+
+/*
+** eorbt_11_s16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     eorbt   z0\.h, z2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_s16_untied, svint16_t,
+               z0 = sveorbt_n_s16 (z1, z2, 11),
+               z0 = sveorbt (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_s32.c
new file mode 100644 (file)
index 0000000..872f402
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eorbt_s32_tied1:
+**     eorbt   z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_s32_tied1, svint32_t,
+               z0 = sveorbt_s32 (z0, z1, z2),
+               z0 = sveorbt (z0, z1, z2))
+
+/*
+** eorbt_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.s, \1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_s32_tied2, svint32_t,
+               z0 = sveorbt_s32 (z1, z0, z2),
+               z0 = sveorbt (z1, z0, z2))
+
+/*
+** eorbt_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.s, z2\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_s32_tied3, svint32_t,
+               z0 = sveorbt_s32 (z1, z2, z0),
+               z0 = sveorbt (z1, z2, z0))
+
+/*
+** eorbt_s32_untied:
+**     movprfx z0, z1
+**     eorbt   z0\.s, z2\.s, z3\.s
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_s32_untied, svint32_t,
+               z0 = sveorbt_s32 (z1, z2, z3),
+               z0 = sveorbt (z1, z2, z3))
+
+/*
+** eorbt_w0_s32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     eorbt   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_w0_s32_tied1, svint32_t, int32_t,
+                z0 = sveorbt_n_s32 (z0, z1, x0),
+                z0 = sveorbt (z0, z1, x0))
+
+/*
+** eorbt_w0_s32_tied2:
+**     mov     (z[0-9]+\.s), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_w0_s32_tied2, svint32_t, int32_t,
+                z0 = sveorbt_n_s32 (z1, z0, x0),
+                z0 = sveorbt (z1, z0, x0))
+
+/*
+** eorbt_w0_s32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     eorbt   z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_w0_s32_untied, svint32_t, int32_t,
+                z0 = sveorbt_n_s32 (z1, z2, x0),
+                z0 = sveorbt (z1, z2, x0))
+
+/*
+** eorbt_11_s32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     eorbt   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_s32_tied1, svint32_t,
+               z0 = sveorbt_n_s32 (z0, z1, 11),
+               z0 = sveorbt (z0, z1, 11))
+
+/*
+** eorbt_11_s32_tied2:
+**     mov     (z[0-9]+\.s), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_s32_tied2, svint32_t,
+               z0 = sveorbt_n_s32 (z1, z0, 11),
+               z0 = sveorbt (z1, z0, 11))
+
+/*
+** eorbt_11_s32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     eorbt   z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_s32_untied, svint32_t,
+               z0 = sveorbt_n_s32 (z1, z2, 11),
+               z0 = sveorbt (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_s64.c
new file mode 100644 (file)
index 0000000..6620852
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eorbt_s64_tied1:
+**     eorbt   z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_s64_tied1, svint64_t,
+               z0 = sveorbt_s64 (z0, z1, z2),
+               z0 = sveorbt (z0, z1, z2))
+
+/*
+** eorbt_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_s64_tied2, svint64_t,
+               z0 = sveorbt_s64 (z1, z0, z2),
+               z0 = sveorbt (z1, z0, z2))
+
+/*
+** eorbt_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_s64_tied3, svint64_t,
+               z0 = sveorbt_s64 (z1, z2, z0),
+               z0 = sveorbt (z1, z2, z0))
+
+/*
+** eorbt_s64_untied:
+**     movprfx z0, z1
+**     eorbt   z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_s64_untied, svint64_t,
+               z0 = sveorbt_s64 (z1, z2, z3),
+               z0 = sveorbt (z1, z2, z3))
+
+/*
+** eorbt_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     eorbt   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_x0_s64_tied1, svint64_t, int64_t,
+                z0 = sveorbt_n_s64 (z0, z1, x0),
+                z0 = sveorbt (z0, z1, x0))
+
+/*
+** eorbt_x0_s64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_x0_s64_tied2, svint64_t, int64_t,
+                z0 = sveorbt_n_s64 (z1, z0, x0),
+                z0 = sveorbt (z1, z0, x0))
+
+/*
+** eorbt_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     eorbt   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_x0_s64_untied, svint64_t, int64_t,
+                z0 = sveorbt_n_s64 (z1, z2, x0),
+                z0 = sveorbt (z1, z2, x0))
+
+/*
+** eorbt_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     eorbt   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_s64_tied1, svint64_t,
+               z0 = sveorbt_n_s64 (z0, z1, 11),
+               z0 = sveorbt (z0, z1, 11))
+
+/*
+** eorbt_11_s64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_s64_tied2, svint64_t,
+               z0 = sveorbt_n_s64 (z1, z0, 11),
+               z0 = sveorbt (z1, z0, 11))
+
+/*
+** eorbt_11_s64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     eorbt   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_s64_untied, svint64_t,
+               z0 = sveorbt_n_s64 (z1, z2, 11),
+               z0 = sveorbt (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_s8.c
new file mode 100644 (file)
index 0000000..361c327
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eorbt_s8_tied1:
+**     eorbt   z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_s8_tied1, svint8_t,
+               z0 = sveorbt_s8 (z0, z1, z2),
+               z0 = sveorbt (z0, z1, z2))
+
+/*
+** eorbt_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.b, \1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_s8_tied2, svint8_t,
+               z0 = sveorbt_s8 (z1, z0, z2),
+               z0 = sveorbt (z1, z0, z2))
+
+/*
+** eorbt_s8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.b, z2\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_s8_tied3, svint8_t,
+               z0 = sveorbt_s8 (z1, z2, z0),
+               z0 = sveorbt (z1, z2, z0))
+
+/*
+** eorbt_s8_untied:
+**     movprfx z0, z1
+**     eorbt   z0\.b, z2\.b, z3\.b
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_s8_untied, svint8_t,
+               z0 = sveorbt_s8 (z1, z2, z3),
+               z0 = sveorbt (z1, z2, z3))
+
+/*
+** eorbt_w0_s8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     eorbt   z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_w0_s8_tied1, svint8_t, int8_t,
+                z0 = sveorbt_n_s8 (z0, z1, x0),
+                z0 = sveorbt (z0, z1, x0))
+
+/*
+** eorbt_w0_s8_tied2:
+**     mov     (z[0-9]+\.b), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.b, \2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_w0_s8_tied2, svint8_t, int8_t,
+                z0 = sveorbt_n_s8 (z1, z0, x0),
+                z0 = sveorbt (z1, z0, x0))
+
+/*
+** eorbt_w0_s8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     eorbt   z0\.b, z2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_w0_s8_untied, svint8_t, int8_t,
+                z0 = sveorbt_n_s8 (z1, z2, x0),
+                z0 = sveorbt (z1, z2, x0))
+
+/*
+** eorbt_11_s8_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     eorbt   z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_s8_tied1, svint8_t,
+               z0 = sveorbt_n_s8 (z0, z1, 11),
+               z0 = sveorbt (z0, z1, 11))
+
+/*
+** eorbt_11_s8_tied2:
+**     mov     (z[0-9]+\.b), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.b, \2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_s8_tied2, svint8_t,
+               z0 = sveorbt_n_s8 (z1, z0, 11),
+               z0 = sveorbt (z1, z0, 11))
+
+/*
+** eorbt_11_s8_untied:
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     eorbt   z0\.b, z2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_s8_untied, svint8_t,
+               z0 = sveorbt_n_s8 (z1, z2, 11),
+               z0 = sveorbt (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_u16.c
new file mode 100644 (file)
index 0000000..26e806e
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eorbt_u16_tied1:
+**     eorbt   z0\.h, z1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_u16_tied1, svuint16_t,
+               z0 = sveorbt_u16 (z0, z1, z2),
+               z0 = sveorbt (z0, z1, z2))
+
+/*
+** eorbt_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.h, \1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_u16_tied2, svuint16_t,
+               z0 = sveorbt_u16 (z1, z0, z2),
+               z0 = sveorbt (z1, z0, z2))
+
+/*
+** eorbt_u16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.h, z2\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_u16_tied3, svuint16_t,
+               z0 = sveorbt_u16 (z1, z2, z0),
+               z0 = sveorbt (z1, z2, z0))
+
+/*
+** eorbt_u16_untied:
+**     movprfx z0, z1
+**     eorbt   z0\.h, z2\.h, z3\.h
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_u16_untied, svuint16_t,
+               z0 = sveorbt_u16 (z1, z2, z3),
+               z0 = sveorbt (z1, z2, z3))
+
+/*
+** eorbt_w0_u16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     eorbt   z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_w0_u16_tied1, svuint16_t, uint16_t,
+                z0 = sveorbt_n_u16 (z0, z1, x0),
+                z0 = sveorbt (z0, z1, x0))
+
+/*
+** eorbt_w0_u16_tied2:
+**     mov     (z[0-9]+\.h), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.h, \2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_w0_u16_tied2, svuint16_t, uint16_t,
+                z0 = sveorbt_n_u16 (z1, z0, x0),
+                z0 = sveorbt (z1, z0, x0))
+
+/*
+** eorbt_w0_u16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     eorbt   z0\.h, z2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_w0_u16_untied, svuint16_t, uint16_t,
+                z0 = sveorbt_n_u16 (z1, z2, x0),
+                z0 = sveorbt (z1, z2, x0))
+
+/*
+** eorbt_11_u16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     eorbt   z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_u16_tied1, svuint16_t,
+               z0 = sveorbt_n_u16 (z0, z1, 11),
+               z0 = sveorbt (z0, z1, 11))
+
+/*
+** eorbt_11_u16_tied2:
+**     mov     (z[0-9]+\.h), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.h, \2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_u16_tied2, svuint16_t,
+               z0 = sveorbt_n_u16 (z1, z0, 11),
+               z0 = sveorbt (z1, z0, 11))
+
+/*
+** eorbt_11_u16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     eorbt   z0\.h, z2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_u16_untied, svuint16_t,
+               z0 = sveorbt_n_u16 (z1, z2, 11),
+               z0 = sveorbt (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_u32.c
new file mode 100644 (file)
index 0000000..edf7a00
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eorbt_u32_tied1:
+**     eorbt   z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_u32_tied1, svuint32_t,
+               z0 = sveorbt_u32 (z0, z1, z2),
+               z0 = sveorbt (z0, z1, z2))
+
+/*
+** eorbt_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.s, \1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_u32_tied2, svuint32_t,
+               z0 = sveorbt_u32 (z1, z0, z2),
+               z0 = sveorbt (z1, z0, z2))
+
+/*
+** eorbt_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.s, z2\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_u32_tied3, svuint32_t,
+               z0 = sveorbt_u32 (z1, z2, z0),
+               z0 = sveorbt (z1, z2, z0))
+
+/*
+** eorbt_u32_untied:
+**     movprfx z0, z1
+**     eorbt   z0\.s, z2\.s, z3\.s
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_u32_untied, svuint32_t,
+               z0 = sveorbt_u32 (z1, z2, z3),
+               z0 = sveorbt (z1, z2, z3))
+
+/*
+** eorbt_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     eorbt   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = sveorbt_n_u32 (z0, z1, x0),
+                z0 = sveorbt (z0, z1, x0))
+
+/*
+** eorbt_w0_u32_tied2:
+**     mov     (z[0-9]+\.s), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_w0_u32_tied2, svuint32_t, uint32_t,
+                z0 = sveorbt_n_u32 (z1, z0, x0),
+                z0 = sveorbt (z1, z0, x0))
+
+/*
+** eorbt_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     eorbt   z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = sveorbt_n_u32 (z1, z2, x0),
+                z0 = sveorbt (z1, z2, x0))
+
+/*
+** eorbt_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     eorbt   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_u32_tied1, svuint32_t,
+               z0 = sveorbt_n_u32 (z0, z1, 11),
+               z0 = sveorbt (z0, z1, 11))
+
+/*
+** eorbt_11_u32_tied2:
+**     mov     (z[0-9]+\.s), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_u32_tied2, svuint32_t,
+               z0 = sveorbt_n_u32 (z1, z0, 11),
+               z0 = sveorbt (z1, z0, 11))
+
+/*
+** eorbt_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     eorbt   z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_u32_untied, svuint32_t,
+               z0 = sveorbt_n_u32 (z1, z2, 11),
+               z0 = sveorbt (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_u64.c
new file mode 100644 (file)
index 0000000..6112e91
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eorbt_u64_tied1:
+**     eorbt   z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_u64_tied1, svuint64_t,
+               z0 = sveorbt_u64 (z0, z1, z2),
+               z0 = sveorbt (z0, z1, z2))
+
+/*
+** eorbt_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_u64_tied2, svuint64_t,
+               z0 = sveorbt_u64 (z1, z0, z2),
+               z0 = sveorbt (z1, z0, z2))
+
+/*
+** eorbt_u64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_u64_tied3, svuint64_t,
+               z0 = sveorbt_u64 (z1, z2, z0),
+               z0 = sveorbt (z1, z2, z0))
+
+/*
+** eorbt_u64_untied:
+**     movprfx z0, z1
+**     eorbt   z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_u64_untied, svuint64_t,
+               z0 = sveorbt_u64 (z1, z2, z3),
+               z0 = sveorbt (z1, z2, z3))
+
+/*
+** eorbt_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     eorbt   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = sveorbt_n_u64 (z0, z1, x0),
+                z0 = sveorbt (z0, z1, x0))
+
+/*
+** eorbt_x0_u64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_x0_u64_tied2, svuint64_t, uint64_t,
+                z0 = sveorbt_n_u64 (z1, z0, x0),
+                z0 = sveorbt (z1, z0, x0))
+
+/*
+** eorbt_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     eorbt   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = sveorbt_n_u64 (z1, z2, x0),
+                z0 = sveorbt (z1, z2, x0))
+
+/*
+** eorbt_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     eorbt   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_u64_tied1, svuint64_t,
+               z0 = sveorbt_n_u64 (z0, z1, 11),
+               z0 = sveorbt (z0, z1, 11))
+
+/*
+** eorbt_11_u64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_u64_tied2, svuint64_t,
+               z0 = sveorbt_n_u64 (z1, z0, 11),
+               z0 = sveorbt (z1, z0, 11))
+
+/*
+** eorbt_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     eorbt   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_u64_untied, svuint64_t,
+               z0 = sveorbt_n_u64 (z1, z2, 11),
+               z0 = sveorbt (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eorbt_u8.c
new file mode 100644 (file)
index 0000000..9040424
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eorbt_u8_tied1:
+**     eorbt   z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_u8_tied1, svuint8_t,
+               z0 = sveorbt_u8 (z0, z1, z2),
+               z0 = sveorbt (z0, z1, z2))
+
+/*
+** eorbt_u8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.b, \1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_u8_tied2, svuint8_t,
+               z0 = sveorbt_u8 (z1, z0, z2),
+               z0 = sveorbt (z1, z0, z2))
+
+/*
+** eorbt_u8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.b, z2\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_u8_tied3, svuint8_t,
+               z0 = sveorbt_u8 (z1, z2, z0),
+               z0 = sveorbt (z1, z2, z0))
+
+/*
+** eorbt_u8_untied:
+**     movprfx z0, z1
+**     eorbt   z0\.b, z2\.b, z3\.b
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_u8_untied, svuint8_t,
+               z0 = sveorbt_u8 (z1, z2, z3),
+               z0 = sveorbt (z1, z2, z3))
+
+/*
+** eorbt_w0_u8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     eorbt   z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_w0_u8_tied1, svuint8_t, uint8_t,
+                z0 = sveorbt_n_u8 (z0, z1, x0),
+                z0 = sveorbt (z0, z1, x0))
+
+/*
+** eorbt_w0_u8_tied2:
+**     mov     (z[0-9]+\.b), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.b, \2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_w0_u8_tied2, svuint8_t, uint8_t,
+                z0 = sveorbt_n_u8 (z1, z0, x0),
+                z0 = sveorbt (z1, z0, x0))
+
+/*
+** eorbt_w0_u8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     eorbt   z0\.b, z2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eorbt_w0_u8_untied, svuint8_t, uint8_t,
+                z0 = sveorbt_n_u8 (z1, z2, x0),
+                z0 = sveorbt (z1, z2, x0))
+
+/*
+** eorbt_11_u8_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     eorbt   z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_u8_tied1, svuint8_t,
+               z0 = sveorbt_n_u8 (z0, z1, 11),
+               z0 = sveorbt (z0, z1, 11))
+
+/*
+** eorbt_11_u8_tied2:
+**     mov     (z[0-9]+\.b), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eorbt   z0\.b, \2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_u8_tied2, svuint8_t,
+               z0 = sveorbt_n_u8 (z1, z0, 11),
+               z0 = sveorbt (z1, z0, 11))
+
+/*
+** eorbt_11_u8_untied:
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     eorbt   z0\.b, z2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eorbt_11_u8_untied, svuint8_t,
+               z0 = sveorbt_n_u8 (z1, z2, 11),
+               z0 = sveorbt (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_s16.c
new file mode 100644 (file)
index 0000000..c85c1a6
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eortb_s16_tied1:
+**     eortb   z0\.h, z1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_s16_tied1, svint16_t,
+               z0 = sveortb_s16 (z0, z1, z2),
+               z0 = sveortb (z0, z1, z2))
+
+/*
+** eortb_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.h, \1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_s16_tied2, svint16_t,
+               z0 = sveortb_s16 (z1, z0, z2),
+               z0 = sveortb (z1, z0, z2))
+
+/*
+** eortb_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.h, z2\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_s16_tied3, svint16_t,
+               z0 = sveortb_s16 (z1, z2, z0),
+               z0 = sveortb (z1, z2, z0))
+
+/*
+** eortb_s16_untied:
+**     movprfx z0, z1
+**     eortb   z0\.h, z2\.h, z3\.h
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_s16_untied, svint16_t,
+               z0 = sveortb_s16 (z1, z2, z3),
+               z0 = sveortb (z1, z2, z3))
+
+/*
+** eortb_w0_s16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     eortb   z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_w0_s16_tied1, svint16_t, int16_t,
+                z0 = sveortb_n_s16 (z0, z1, x0),
+                z0 = sveortb (z0, z1, x0))
+
+/*
+** eortb_w0_s16_tied2:
+**     mov     (z[0-9]+\.h), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.h, \2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_w0_s16_tied2, svint16_t, int16_t,
+                z0 = sveortb_n_s16 (z1, z0, x0),
+                z0 = sveortb (z1, z0, x0))
+
+/*
+** eortb_w0_s16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     eortb   z0\.h, z2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_w0_s16_untied, svint16_t, int16_t,
+                z0 = sveortb_n_s16 (z1, z2, x0),
+                z0 = sveortb (z1, z2, x0))
+
+/*
+** eortb_11_s16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     eortb   z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_s16_tied1, svint16_t,
+               z0 = sveortb_n_s16 (z0, z1, 11),
+               z0 = sveortb (z0, z1, 11))
+
+/*
+** eortb_11_s16_tied2:
+**     mov     (z[0-9]+\.h), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.h, \2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_s16_tied2, svint16_t,
+               z0 = sveortb_n_s16 (z1, z0, 11),
+               z0 = sveortb (z1, z0, 11))
+
+/*
+** eortb_11_s16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     eortb   z0\.h, z2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_s16_untied, svint16_t,
+               z0 = sveortb_n_s16 (z1, z2, 11),
+               z0 = sveortb (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_s32.c
new file mode 100644 (file)
index 0000000..8afb0bf
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eortb_s32_tied1:
+**     eortb   z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_s32_tied1, svint32_t,
+               z0 = sveortb_s32 (z0, z1, z2),
+               z0 = sveortb (z0, z1, z2))
+
+/*
+** eortb_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.s, \1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_s32_tied2, svint32_t,
+               z0 = sveortb_s32 (z1, z0, z2),
+               z0 = sveortb (z1, z0, z2))
+
+/*
+** eortb_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.s, z2\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_s32_tied3, svint32_t,
+               z0 = sveortb_s32 (z1, z2, z0),
+               z0 = sveortb (z1, z2, z0))
+
+/*
+** eortb_s32_untied:
+**     movprfx z0, z1
+**     eortb   z0\.s, z2\.s, z3\.s
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_s32_untied, svint32_t,
+               z0 = sveortb_s32 (z1, z2, z3),
+               z0 = sveortb (z1, z2, z3))
+
+/*
+** eortb_w0_s32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     eortb   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_w0_s32_tied1, svint32_t, int32_t,
+                z0 = sveortb_n_s32 (z0, z1, x0),
+                z0 = sveortb (z0, z1, x0))
+
+/*
+** eortb_w0_s32_tied2:
+**     mov     (z[0-9]+\.s), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_w0_s32_tied2, svint32_t, int32_t,
+                z0 = sveortb_n_s32 (z1, z0, x0),
+                z0 = sveortb (z1, z0, x0))
+
+/*
+** eortb_w0_s32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     eortb   z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_w0_s32_untied, svint32_t, int32_t,
+                z0 = sveortb_n_s32 (z1, z2, x0),
+                z0 = sveortb (z1, z2, x0))
+
+/*
+** eortb_11_s32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     eortb   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_s32_tied1, svint32_t,
+               z0 = sveortb_n_s32 (z0, z1, 11),
+               z0 = sveortb (z0, z1, 11))
+
+/*
+** eortb_11_s32_tied2:
+**     mov     (z[0-9]+\.s), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_s32_tied2, svint32_t,
+               z0 = sveortb_n_s32 (z1, z0, 11),
+               z0 = sveortb (z1, z0, 11))
+
+/*
+** eortb_11_s32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     eortb   z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_s32_untied, svint32_t,
+               z0 = sveortb_n_s32 (z1, z2, 11),
+               z0 = sveortb (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_s64.c
new file mode 100644 (file)
index 0000000..da58d70
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eortb_s64_tied1:
+**     eortb   z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_s64_tied1, svint64_t,
+               z0 = sveortb_s64 (z0, z1, z2),
+               z0 = sveortb (z0, z1, z2))
+
+/*
+** eortb_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_s64_tied2, svint64_t,
+               z0 = sveortb_s64 (z1, z0, z2),
+               z0 = sveortb (z1, z0, z2))
+
+/*
+** eortb_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_s64_tied3, svint64_t,
+               z0 = sveortb_s64 (z1, z2, z0),
+               z0 = sveortb (z1, z2, z0))
+
+/*
+** eortb_s64_untied:
+**     movprfx z0, z1
+**     eortb   z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_s64_untied, svint64_t,
+               z0 = sveortb_s64 (z1, z2, z3),
+               z0 = sveortb (z1, z2, z3))
+
+/*
+** eortb_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     eortb   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_x0_s64_tied1, svint64_t, int64_t,
+                z0 = sveortb_n_s64 (z0, z1, x0),
+                z0 = sveortb (z0, z1, x0))
+
+/*
+** eortb_x0_s64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_x0_s64_tied2, svint64_t, int64_t,
+                z0 = sveortb_n_s64 (z1, z0, x0),
+                z0 = sveortb (z1, z0, x0))
+
+/*
+** eortb_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     eortb   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_x0_s64_untied, svint64_t, int64_t,
+                z0 = sveortb_n_s64 (z1, z2, x0),
+                z0 = sveortb (z1, z2, x0))
+
+/*
+** eortb_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     eortb   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_s64_tied1, svint64_t,
+               z0 = sveortb_n_s64 (z0, z1, 11),
+               z0 = sveortb (z0, z1, 11))
+
+/*
+** eortb_11_s64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_s64_tied2, svint64_t,
+               z0 = sveortb_n_s64 (z1, z0, 11),
+               z0 = sveortb (z1, z0, 11))
+
+/*
+** eortb_11_s64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     eortb   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_s64_untied, svint64_t,
+               z0 = sveortb_n_s64 (z1, z2, 11),
+               z0 = sveortb (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_s8.c
new file mode 100644 (file)
index 0000000..3764603
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eortb_s8_tied1:
+**     eortb   z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_s8_tied1, svint8_t,
+               z0 = sveortb_s8 (z0, z1, z2),
+               z0 = sveortb (z0, z1, z2))
+
+/*
+** eortb_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.b, \1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_s8_tied2, svint8_t,
+               z0 = sveortb_s8 (z1, z0, z2),
+               z0 = sveortb (z1, z0, z2))
+
+/*
+** eortb_s8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.b, z2\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_s8_tied3, svint8_t,
+               z0 = sveortb_s8 (z1, z2, z0),
+               z0 = sveortb (z1, z2, z0))
+
+/*
+** eortb_s8_untied:
+**     movprfx z0, z1
+**     eortb   z0\.b, z2\.b, z3\.b
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_s8_untied, svint8_t,
+               z0 = sveortb_s8 (z1, z2, z3),
+               z0 = sveortb (z1, z2, z3))
+
+/*
+** eortb_w0_s8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     eortb   z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_w0_s8_tied1, svint8_t, int8_t,
+                z0 = sveortb_n_s8 (z0, z1, x0),
+                z0 = sveortb (z0, z1, x0))
+
+/*
+** eortb_w0_s8_tied2:
+**     mov     (z[0-9]+\.b), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.b, \2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_w0_s8_tied2, svint8_t, int8_t,
+                z0 = sveortb_n_s8 (z1, z0, x0),
+                z0 = sveortb (z1, z0, x0))
+
+/*
+** eortb_w0_s8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     eortb   z0\.b, z2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_w0_s8_untied, svint8_t, int8_t,
+                z0 = sveortb_n_s8 (z1, z2, x0),
+                z0 = sveortb (z1, z2, x0))
+
+/*
+** eortb_11_s8_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     eortb   z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_s8_tied1, svint8_t,
+               z0 = sveortb_n_s8 (z0, z1, 11),
+               z0 = sveortb (z0, z1, 11))
+
+/*
+** eortb_11_s8_tied2:
+**     mov     (z[0-9]+\.b), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.b, \2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_s8_tied2, svint8_t,
+               z0 = sveortb_n_s8 (z1, z0, 11),
+               z0 = sveortb (z1, z0, 11))
+
+/*
+** eortb_11_s8_untied:
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     eortb   z0\.b, z2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_s8_untied, svint8_t,
+               z0 = sveortb_n_s8 (z1, z2, 11),
+               z0 = sveortb (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_u16.c
new file mode 100644 (file)
index 0000000..89eb171
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eortb_u16_tied1:
+**     eortb   z0\.h, z1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_u16_tied1, svuint16_t,
+               z0 = sveortb_u16 (z0, z1, z2),
+               z0 = sveortb (z0, z1, z2))
+
+/*
+** eortb_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.h, \1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_u16_tied2, svuint16_t,
+               z0 = sveortb_u16 (z1, z0, z2),
+               z0 = sveortb (z1, z0, z2))
+
+/*
+** eortb_u16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.h, z2\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_u16_tied3, svuint16_t,
+               z0 = sveortb_u16 (z1, z2, z0),
+               z0 = sveortb (z1, z2, z0))
+
+/*
+** eortb_u16_untied:
+**     movprfx z0, z1
+**     eortb   z0\.h, z2\.h, z3\.h
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_u16_untied, svuint16_t,
+               z0 = sveortb_u16 (z1, z2, z3),
+               z0 = sveortb (z1, z2, z3))
+
+/*
+** eortb_w0_u16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     eortb   z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_w0_u16_tied1, svuint16_t, uint16_t,
+                z0 = sveortb_n_u16 (z0, z1, x0),
+                z0 = sveortb (z0, z1, x0))
+
+/*
+** eortb_w0_u16_tied2:
+**     mov     (z[0-9]+\.h), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.h, \2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_w0_u16_tied2, svuint16_t, uint16_t,
+                z0 = sveortb_n_u16 (z1, z0, x0),
+                z0 = sveortb (z1, z0, x0))
+
+/*
+** eortb_w0_u16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     eortb   z0\.h, z2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_w0_u16_untied, svuint16_t, uint16_t,
+                z0 = sveortb_n_u16 (z1, z2, x0),
+                z0 = sveortb (z1, z2, x0))
+
+/*
+** eortb_11_u16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     eortb   z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_u16_tied1, svuint16_t,
+               z0 = sveortb_n_u16 (z0, z1, 11),
+               z0 = sveortb (z0, z1, 11))
+
+/*
+** eortb_11_u16_tied2:
+**     mov     (z[0-9]+\.h), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.h, \2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_u16_tied2, svuint16_t,
+               z0 = sveortb_n_u16 (z1, z0, 11),
+               z0 = sveortb (z1, z0, 11))
+
+/*
+** eortb_11_u16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     eortb   z0\.h, z2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_u16_untied, svuint16_t,
+               z0 = sveortb_n_u16 (z1, z2, 11),
+               z0 = sveortb (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_u32.c
new file mode 100644 (file)
index 0000000..39c7df6
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eortb_u32_tied1:
+**     eortb   z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_u32_tied1, svuint32_t,
+               z0 = sveortb_u32 (z0, z1, z2),
+               z0 = sveortb (z0, z1, z2))
+
+/*
+** eortb_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.s, \1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_u32_tied2, svuint32_t,
+               z0 = sveortb_u32 (z1, z0, z2),
+               z0 = sveortb (z1, z0, z2))
+
+/*
+** eortb_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.s, z2\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_u32_tied3, svuint32_t,
+               z0 = sveortb_u32 (z1, z2, z0),
+               z0 = sveortb (z1, z2, z0))
+
+/*
+** eortb_u32_untied:
+**     movprfx z0, z1
+**     eortb   z0\.s, z2\.s, z3\.s
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_u32_untied, svuint32_t,
+               z0 = sveortb_u32 (z1, z2, z3),
+               z0 = sveortb (z1, z2, z3))
+
+/*
+** eortb_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     eortb   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = sveortb_n_u32 (z0, z1, x0),
+                z0 = sveortb (z0, z1, x0))
+
+/*
+** eortb_w0_u32_tied2:
+**     mov     (z[0-9]+\.s), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_w0_u32_tied2, svuint32_t, uint32_t,
+                z0 = sveortb_n_u32 (z1, z0, x0),
+                z0 = sveortb (z1, z0, x0))
+
+/*
+** eortb_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     eortb   z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = sveortb_n_u32 (z1, z2, x0),
+                z0 = sveortb (z1, z2, x0))
+
+/*
+** eortb_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     eortb   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_u32_tied1, svuint32_t,
+               z0 = sveortb_n_u32 (z0, z1, 11),
+               z0 = sveortb (z0, z1, 11))
+
+/*
+** eortb_11_u32_tied2:
+**     mov     (z[0-9]+\.s), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_u32_tied2, svuint32_t,
+               z0 = sveortb_n_u32 (z1, z0, 11),
+               z0 = sveortb (z1, z0, 11))
+
+/*
+** eortb_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     eortb   z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_u32_untied, svuint32_t,
+               z0 = sveortb_n_u32 (z1, z2, 11),
+               z0 = sveortb (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_u64.c
new file mode 100644 (file)
index 0000000..33a0649
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eortb_u64_tied1:
+**     eortb   z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_u64_tied1, svuint64_t,
+               z0 = sveortb_u64 (z0, z1, z2),
+               z0 = sveortb (z0, z1, z2))
+
+/*
+** eortb_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_u64_tied2, svuint64_t,
+               z0 = sveortb_u64 (z1, z0, z2),
+               z0 = sveortb (z1, z0, z2))
+
+/*
+** eortb_u64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_u64_tied3, svuint64_t,
+               z0 = sveortb_u64 (z1, z2, z0),
+               z0 = sveortb (z1, z2, z0))
+
+/*
+** eortb_u64_untied:
+**     movprfx z0, z1
+**     eortb   z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_u64_untied, svuint64_t,
+               z0 = sveortb_u64 (z1, z2, z3),
+               z0 = sveortb (z1, z2, z3))
+
+/*
+** eortb_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     eortb   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = sveortb_n_u64 (z0, z1, x0),
+                z0 = sveortb (z0, z1, x0))
+
+/*
+** eortb_x0_u64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_x0_u64_tied2, svuint64_t, uint64_t,
+                z0 = sveortb_n_u64 (z1, z0, x0),
+                z0 = sveortb (z1, z0, x0))
+
+/*
+** eortb_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     eortb   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = sveortb_n_u64 (z1, z2, x0),
+                z0 = sveortb (z1, z2, x0))
+
+/*
+** eortb_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     eortb   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_u64_tied1, svuint64_t,
+               z0 = sveortb_n_u64 (z0, z1, 11),
+               z0 = sveortb (z0, z1, 11))
+
+/*
+** eortb_11_u64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_u64_tied2, svuint64_t,
+               z0 = sveortb_n_u64 (z1, z0, 11),
+               z0 = sveortb (z1, z0, 11))
+
+/*
+** eortb_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     eortb   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_u64_untied, svuint64_t,
+               z0 = sveortb_n_u64 (z1, z2, 11),
+               z0 = sveortb (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/eortb_u8.c
new file mode 100644 (file)
index 0000000..952d202
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** eortb_u8_tied1:
+**     eortb   z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_u8_tied1, svuint8_t,
+               z0 = sveortb_u8 (z0, z1, z2),
+               z0 = sveortb (z0, z1, z2))
+
+/*
+** eortb_u8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.b, \1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_u8_tied2, svuint8_t,
+               z0 = sveortb_u8 (z1, z0, z2),
+               z0 = sveortb (z1, z0, z2))
+
+/*
+** eortb_u8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.b, z2\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_u8_tied3, svuint8_t,
+               z0 = sveortb_u8 (z1, z2, z0),
+               z0 = sveortb (z1, z2, z0))
+
+/*
+** eortb_u8_untied:
+**     movprfx z0, z1
+**     eortb   z0\.b, z2\.b, z3\.b
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_u8_untied, svuint8_t,
+               z0 = sveortb_u8 (z1, z2, z3),
+               z0 = sveortb (z1, z2, z3))
+
+/*
+** eortb_w0_u8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     eortb   z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_w0_u8_tied1, svuint8_t, uint8_t,
+                z0 = sveortb_n_u8 (z0, z1, x0),
+                z0 = sveortb (z0, z1, x0))
+
+/*
+** eortb_w0_u8_tied2:
+**     mov     (z[0-9]+\.b), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.b, \2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_w0_u8_tied2, svuint8_t, uint8_t,
+                z0 = sveortb_n_u8 (z1, z0, x0),
+                z0 = sveortb (z1, z0, x0))
+
+/*
+** eortb_w0_u8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     eortb   z0\.b, z2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (eortb_w0_u8_untied, svuint8_t, uint8_t,
+                z0 = sveortb_n_u8 (z1, z2, x0),
+                z0 = sveortb (z1, z2, x0))
+
+/*
+** eortb_11_u8_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     eortb   z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_u8_tied1, svuint8_t,
+               z0 = sveortb_n_u8 (z0, z1, 11),
+               z0 = sveortb (z0, z1, 11))
+
+/*
+** eortb_11_u8_tied2:
+**     mov     (z[0-9]+\.b), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     eortb   z0\.b, \2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_u8_tied2, svuint8_t,
+               z0 = sveortb_n_u8 (z1, z0, 11),
+               z0 = sveortb (z1, z0, 11))
+
+/*
+** eortb_11_u8_untied:
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     eortb   z0\.b, z2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (eortb_11_u8_untied, svuint8_t,
+               z0 = sveortb_n_u8 (z1, z2, 11),
+               z0 = sveortb (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_s16.c
new file mode 100644 (file)
index 0000000..dbc239d
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hadd_s16_m_tied1:
+**     shadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s16_m_tied1, svint16_t,
+               z0 = svhadd_s16_m (p0, z0, z1),
+               z0 = svhadd_m (p0, z0, z1))
+
+/*
+** hadd_s16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     shadd   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s16_m_tied2, svint16_t,
+               z0 = svhadd_s16_m (p0, z1, z0),
+               z0 = svhadd_m (p0, z1, z0))
+
+/*
+** hadd_s16_m_untied:
+**     movprfx z0, z1
+**     shadd   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s16_m_untied, svint16_t,
+               z0 = svhadd_s16_m (p0, z1, z2),
+               z0 = svhadd_m (p0, z1, z2))
+
+/*
+** hadd_w0_s16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     shadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_s16_m_tied1, svint16_t, int16_t,
+                z0 = svhadd_n_s16_m (p0, z0, x0),
+                z0 = svhadd_m (p0, z0, x0))
+
+/*
+** hadd_w0_s16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     shadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_s16_m_untied, svint16_t, int16_t,
+                z0 = svhadd_n_s16_m (p0, z1, x0),
+                z0 = svhadd_m (p0, z1, x0))
+
+/*
+** hadd_11_s16_m_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     shadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s16_m_tied1, svint16_t,
+               z0 = svhadd_n_s16_m (p0, z0, 11),
+               z0 = svhadd_m (p0, z0, 11))
+
+/*
+** hadd_11_s16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     shadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s16_m_untied, svint16_t,
+               z0 = svhadd_n_s16_m (p0, z1, 11),
+               z0 = svhadd_m (p0, z1, 11))
+
+/*
+** hadd_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     shadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s16_z_tied1, svint16_t,
+               z0 = svhadd_s16_z (p0, z0, z1),
+               z0 = svhadd_z (p0, z0, z1))
+
+/*
+** hadd_s16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     shadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s16_z_tied2, svint16_t,
+               z0 = svhadd_s16_z (p0, z1, z0),
+               z0 = svhadd_z (p0, z1, z0))
+
+/*
+** hadd_s16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     shadd   z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0\.h, p0/z, z2\.h
+**     shadd   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s16_z_untied, svint16_t,
+               z0 = svhadd_s16_z (p0, z1, z2),
+               z0 = svhadd_z (p0, z1, z2))
+
+/*
+** hadd_w0_s16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     shadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_s16_z_tied1, svint16_t, int16_t,
+                z0 = svhadd_n_s16_z (p0, z0, x0),
+                z0 = svhadd_z (p0, z0, x0))
+
+/*
+** hadd_w0_s16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     shadd   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     shadd   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_s16_z_untied, svint16_t, int16_t,
+                z0 = svhadd_n_s16_z (p0, z1, x0),
+                z0 = svhadd_z (p0, z1, x0))
+
+/*
+** hadd_11_s16_z_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0\.h, p0/z, z0\.h
+**     shadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s16_z_tied1, svint16_t,
+               z0 = svhadd_n_s16_z (p0, z0, 11),
+               z0 = svhadd_z (p0, z0, 11))
+
+/*
+** hadd_11_s16_z_untied:
+**     mov     (z[0-9]+\.h), #11
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     shadd   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     shadd   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s16_z_untied, svint16_t,
+               z0 = svhadd_n_s16_z (p0, z1, 11),
+               z0 = svhadd_z (p0, z1, 11))
+
+/*
+** hadd_s16_x_tied1:
+**     shadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s16_x_tied1, svint16_t,
+               z0 = svhadd_s16_x (p0, z0, z1),
+               z0 = svhadd_x (p0, z0, z1))
+
+/*
+** hadd_s16_x_tied2:
+**     shadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s16_x_tied2, svint16_t,
+               z0 = svhadd_s16_x (p0, z1, z0),
+               z0 = svhadd_x (p0, z1, z0))
+
+/*
+** hadd_s16_x_untied:
+** (
+**     movprfx z0, z1
+**     shadd   z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0, z2
+**     shadd   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s16_x_untied, svint16_t,
+               z0 = svhadd_s16_x (p0, z1, z2),
+               z0 = svhadd_x (p0, z1, z2))
+
+/*
+** hadd_w0_s16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     shadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_s16_x_tied1, svint16_t, int16_t,
+                z0 = svhadd_n_s16_x (p0, z0, x0),
+                z0 = svhadd_x (p0, z0, x0))
+
+/*
+** hadd_w0_s16_x_untied:
+**     mov     z0\.h, w0
+**     shadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_s16_x_untied, svint16_t, int16_t,
+                z0 = svhadd_n_s16_x (p0, z1, x0),
+                z0 = svhadd_x (p0, z1, x0))
+
+/*
+** hadd_11_s16_x_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     shadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s16_x_tied1, svint16_t,
+               z0 = svhadd_n_s16_x (p0, z0, 11),
+               z0 = svhadd_x (p0, z0, 11))
+
+/*
+** hadd_11_s16_x_untied:
+**     mov     z0\.h, #11
+**     shadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s16_x_untied, svint16_t,
+               z0 = svhadd_n_s16_x (p0, z1, 11),
+               z0 = svhadd_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_s32.c
new file mode 100644 (file)
index 0000000..97ac80d
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hadd_s32_m_tied1:
+**     shadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s32_m_tied1, svint32_t,
+               z0 = svhadd_s32_m (p0, z0, z1),
+               z0 = svhadd_m (p0, z0, z1))
+
+/*
+** hadd_s32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     shadd   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s32_m_tied2, svint32_t,
+               z0 = svhadd_s32_m (p0, z1, z0),
+               z0 = svhadd_m (p0, z1, z0))
+
+/*
+** hadd_s32_m_untied:
+**     movprfx z0, z1
+**     shadd   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s32_m_untied, svint32_t,
+               z0 = svhadd_s32_m (p0, z1, z2),
+               z0 = svhadd_m (p0, z1, z2))
+
+/*
+** hadd_w0_s32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     shadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_s32_m_tied1, svint32_t, int32_t,
+                z0 = svhadd_n_s32_m (p0, z0, x0),
+                z0 = svhadd_m (p0, z0, x0))
+
+/*
+** hadd_w0_s32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     shadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_s32_m_untied, svint32_t, int32_t,
+                z0 = svhadd_n_s32_m (p0, z1, x0),
+                z0 = svhadd_m (p0, z1, x0))
+
+/*
+** hadd_11_s32_m_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     shadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s32_m_tied1, svint32_t,
+               z0 = svhadd_n_s32_m (p0, z0, 11),
+               z0 = svhadd_m (p0, z0, 11))
+
+/*
+** hadd_11_s32_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     shadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s32_m_untied, svint32_t,
+               z0 = svhadd_n_s32_m (p0, z1, 11),
+               z0 = svhadd_m (p0, z1, 11))
+
+/*
+** hadd_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     shadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s32_z_tied1, svint32_t,
+               z0 = svhadd_s32_z (p0, z0, z1),
+               z0 = svhadd_z (p0, z0, z1))
+
+/*
+** hadd_s32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     shadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s32_z_tied2, svint32_t,
+               z0 = svhadd_s32_z (p0, z1, z0),
+               z0 = svhadd_z (p0, z1, z0))
+
+/*
+** hadd_s32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     shadd   z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0\.s, p0/z, z2\.s
+**     shadd   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s32_z_untied, svint32_t,
+               z0 = svhadd_s32_z (p0, z1, z2),
+               z0 = svhadd_z (p0, z1, z2))
+
+/*
+** hadd_w0_s32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     shadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_s32_z_tied1, svint32_t, int32_t,
+                z0 = svhadd_n_s32_z (p0, z0, x0),
+                z0 = svhadd_z (p0, z0, x0))
+
+/*
+** hadd_w0_s32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     shadd   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     shadd   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_s32_z_untied, svint32_t, int32_t,
+                z0 = svhadd_n_s32_z (p0, z1, x0),
+                z0 = svhadd_z (p0, z1, x0))
+
+/*
+** hadd_11_s32_z_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0\.s, p0/z, z0\.s
+**     shadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s32_z_tied1, svint32_t,
+               z0 = svhadd_n_s32_z (p0, z0, 11),
+               z0 = svhadd_z (p0, z0, 11))
+
+/*
+** hadd_11_s32_z_untied:
+**     mov     (z[0-9]+\.s), #11
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     shadd   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     shadd   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s32_z_untied, svint32_t,
+               z0 = svhadd_n_s32_z (p0, z1, 11),
+               z0 = svhadd_z (p0, z1, 11))
+
+/*
+** hadd_s32_x_tied1:
+**     shadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s32_x_tied1, svint32_t,
+               z0 = svhadd_s32_x (p0, z0, z1),
+               z0 = svhadd_x (p0, z0, z1))
+
+/*
+** hadd_s32_x_tied2:
+**     shadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s32_x_tied2, svint32_t,
+               z0 = svhadd_s32_x (p0, z1, z0),
+               z0 = svhadd_x (p0, z1, z0))
+
+/*
+** hadd_s32_x_untied:
+** (
+**     movprfx z0, z1
+**     shadd   z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0, z2
+**     shadd   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s32_x_untied, svint32_t,
+               z0 = svhadd_s32_x (p0, z1, z2),
+               z0 = svhadd_x (p0, z1, z2))
+
+/*
+** hadd_w0_s32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     shadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_s32_x_tied1, svint32_t, int32_t,
+                z0 = svhadd_n_s32_x (p0, z0, x0),
+                z0 = svhadd_x (p0, z0, x0))
+
+/*
+** hadd_w0_s32_x_untied:
+**     mov     z0\.s, w0
+**     shadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_s32_x_untied, svint32_t, int32_t,
+                z0 = svhadd_n_s32_x (p0, z1, x0),
+                z0 = svhadd_x (p0, z1, x0))
+
+/*
+** hadd_11_s32_x_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     shadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s32_x_tied1, svint32_t,
+               z0 = svhadd_n_s32_x (p0, z0, 11),
+               z0 = svhadd_x (p0, z0, 11))
+
+/*
+** hadd_11_s32_x_untied:
+**     mov     z0\.s, #11
+**     shadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s32_x_untied, svint32_t,
+               z0 = svhadd_n_s32_x (p0, z1, 11),
+               z0 = svhadd_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_s64.c
new file mode 100644 (file)
index 0000000..b911491
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hadd_s64_m_tied1:
+**     shadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s64_m_tied1, svint64_t,
+               z0 = svhadd_s64_m (p0, z0, z1),
+               z0 = svhadd_m (p0, z0, z1))
+
+/*
+** hadd_s64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     shadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s64_m_tied2, svint64_t,
+               z0 = svhadd_s64_m (p0, z1, z0),
+               z0 = svhadd_m (p0, z1, z0))
+
+/*
+** hadd_s64_m_untied:
+**     movprfx z0, z1
+**     shadd   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s64_m_untied, svint64_t,
+               z0 = svhadd_s64_m (p0, z1, z2),
+               z0 = svhadd_m (p0, z1, z2))
+
+/*
+** hadd_x0_s64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     shadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_x0_s64_m_tied1, svint64_t, int64_t,
+                z0 = svhadd_n_s64_m (p0, z0, x0),
+                z0 = svhadd_m (p0, z0, x0))
+
+/*
+** hadd_x0_s64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     shadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_x0_s64_m_untied, svint64_t, int64_t,
+                z0 = svhadd_n_s64_m (p0, z1, x0),
+                z0 = svhadd_m (p0, z1, x0))
+
+/*
+** hadd_11_s64_m_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     shadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s64_m_tied1, svint64_t,
+               z0 = svhadd_n_s64_m (p0, z0, 11),
+               z0 = svhadd_m (p0, z0, 11))
+
+/*
+** hadd_11_s64_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     shadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s64_m_untied, svint64_t,
+               z0 = svhadd_n_s64_m (p0, z1, 11),
+               z0 = svhadd_m (p0, z1, 11))
+
+/*
+** hadd_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     shadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s64_z_tied1, svint64_t,
+               z0 = svhadd_s64_z (p0, z0, z1),
+               z0 = svhadd_z (p0, z0, z1))
+
+/*
+** hadd_s64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     shadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s64_z_tied2, svint64_t,
+               z0 = svhadd_s64_z (p0, z1, z0),
+               z0 = svhadd_z (p0, z1, z0))
+
+/*
+** hadd_s64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     shadd   z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0\.d, p0/z, z2\.d
+**     shadd   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s64_z_untied, svint64_t,
+               z0 = svhadd_s64_z (p0, z1, z2),
+               z0 = svhadd_z (p0, z1, z2))
+
+/*
+** hadd_x0_s64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     shadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_x0_s64_z_tied1, svint64_t, int64_t,
+                z0 = svhadd_n_s64_z (p0, z0, x0),
+                z0 = svhadd_z (p0, z0, x0))
+
+/*
+** hadd_x0_s64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     shadd   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     shadd   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_x0_s64_z_untied, svint64_t, int64_t,
+                z0 = svhadd_n_s64_z (p0, z1, x0),
+                z0 = svhadd_z (p0, z1, x0))
+
+/*
+** hadd_11_s64_z_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0\.d, p0/z, z0\.d
+**     shadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s64_z_tied1, svint64_t,
+               z0 = svhadd_n_s64_z (p0, z0, 11),
+               z0 = svhadd_z (p0, z0, 11))
+
+/*
+** hadd_11_s64_z_untied:
+**     mov     (z[0-9]+\.d), #11
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     shadd   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     shadd   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s64_z_untied, svint64_t,
+               z0 = svhadd_n_s64_z (p0, z1, 11),
+               z0 = svhadd_z (p0, z1, 11))
+
+/*
+** hadd_s64_x_tied1:
+**     shadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s64_x_tied1, svint64_t,
+               z0 = svhadd_s64_x (p0, z0, z1),
+               z0 = svhadd_x (p0, z0, z1))
+
+/*
+** hadd_s64_x_tied2:
+**     shadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s64_x_tied2, svint64_t,
+               z0 = svhadd_s64_x (p0, z1, z0),
+               z0 = svhadd_x (p0, z1, z0))
+
+/*
+** hadd_s64_x_untied:
+** (
+**     movprfx z0, z1
+**     shadd   z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0, z2
+**     shadd   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s64_x_untied, svint64_t,
+               z0 = svhadd_s64_x (p0, z1, z2),
+               z0 = svhadd_x (p0, z1, z2))
+
+/*
+** hadd_x0_s64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     shadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_x0_s64_x_tied1, svint64_t, int64_t,
+                z0 = svhadd_n_s64_x (p0, z0, x0),
+                z0 = svhadd_x (p0, z0, x0))
+
+/*
+** hadd_x0_s64_x_untied:
+**     mov     z0\.d, x0
+**     shadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_x0_s64_x_untied, svint64_t, int64_t,
+                z0 = svhadd_n_s64_x (p0, z1, x0),
+                z0 = svhadd_x (p0, z1, x0))
+
+/*
+** hadd_11_s64_x_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     shadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s64_x_tied1, svint64_t,
+               z0 = svhadd_n_s64_x (p0, z0, 11),
+               z0 = svhadd_x (p0, z0, 11))
+
+/*
+** hadd_11_s64_x_untied:
+**     mov     z0\.d, #11
+**     shadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s64_x_untied, svint64_t,
+               z0 = svhadd_n_s64_x (p0, z1, 11),
+               z0 = svhadd_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_s8.c
new file mode 100644 (file)
index 0000000..6d12a3c
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hadd_s8_m_tied1:
+**     shadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s8_m_tied1, svint8_t,
+               z0 = svhadd_s8_m (p0, z0, z1),
+               z0 = svhadd_m (p0, z0, z1))
+
+/*
+** hadd_s8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     shadd   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s8_m_tied2, svint8_t,
+               z0 = svhadd_s8_m (p0, z1, z0),
+               z0 = svhadd_m (p0, z1, z0))
+
+/*
+** hadd_s8_m_untied:
+**     movprfx z0, z1
+**     shadd   z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s8_m_untied, svint8_t,
+               z0 = svhadd_s8_m (p0, z1, z2),
+               z0 = svhadd_m (p0, z1, z2))
+
+/*
+** hadd_w0_s8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     shadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_s8_m_tied1, svint8_t, int8_t,
+                z0 = svhadd_n_s8_m (p0, z0, x0),
+                z0 = svhadd_m (p0, z0, x0))
+
+/*
+** hadd_w0_s8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     shadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_s8_m_untied, svint8_t, int8_t,
+                z0 = svhadd_n_s8_m (p0, z1, x0),
+                z0 = svhadd_m (p0, z1, x0))
+
+/*
+** hadd_11_s8_m_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     shadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s8_m_tied1, svint8_t,
+               z0 = svhadd_n_s8_m (p0, z0, 11),
+               z0 = svhadd_m (p0, z0, 11))
+
+/*
+** hadd_11_s8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     shadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s8_m_untied, svint8_t,
+               z0 = svhadd_n_s8_m (p0, z1, 11),
+               z0 = svhadd_m (p0, z1, 11))
+
+/*
+** hadd_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     shadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s8_z_tied1, svint8_t,
+               z0 = svhadd_s8_z (p0, z0, z1),
+               z0 = svhadd_z (p0, z0, z1))
+
+/*
+** hadd_s8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     shadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s8_z_tied2, svint8_t,
+               z0 = svhadd_s8_z (p0, z1, z0),
+               z0 = svhadd_z (p0, z1, z0))
+
+/*
+** hadd_s8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     shadd   z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0\.b, p0/z, z2\.b
+**     shadd   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s8_z_untied, svint8_t,
+               z0 = svhadd_s8_z (p0, z1, z2),
+               z0 = svhadd_z (p0, z1, z2))
+
+/*
+** hadd_w0_s8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     shadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_s8_z_tied1, svint8_t, int8_t,
+                z0 = svhadd_n_s8_z (p0, z0, x0),
+                z0 = svhadd_z (p0, z0, x0))
+
+/*
+** hadd_w0_s8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     shadd   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     shadd   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_s8_z_untied, svint8_t, int8_t,
+                z0 = svhadd_n_s8_z (p0, z1, x0),
+                z0 = svhadd_z (p0, z1, x0))
+
+/*
+** hadd_11_s8_z_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0\.b, p0/z, z0\.b
+**     shadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s8_z_tied1, svint8_t,
+               z0 = svhadd_n_s8_z (p0, z0, 11),
+               z0 = svhadd_z (p0, z0, 11))
+
+/*
+** hadd_11_s8_z_untied:
+**     mov     (z[0-9]+\.b), #11
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     shadd   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     shadd   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s8_z_untied, svint8_t,
+               z0 = svhadd_n_s8_z (p0, z1, 11),
+               z0 = svhadd_z (p0, z1, 11))
+
+/*
+** hadd_s8_x_tied1:
+**     shadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s8_x_tied1, svint8_t,
+               z0 = svhadd_s8_x (p0, z0, z1),
+               z0 = svhadd_x (p0, z0, z1))
+
+/*
+** hadd_s8_x_tied2:
+**     shadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s8_x_tied2, svint8_t,
+               z0 = svhadd_s8_x (p0, z1, z0),
+               z0 = svhadd_x (p0, z1, z0))
+
+/*
+** hadd_s8_x_untied:
+** (
+**     movprfx z0, z1
+**     shadd   z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0, z2
+**     shadd   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_s8_x_untied, svint8_t,
+               z0 = svhadd_s8_x (p0, z1, z2),
+               z0 = svhadd_x (p0, z1, z2))
+
+/*
+** hadd_w0_s8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     shadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_s8_x_tied1, svint8_t, int8_t,
+                z0 = svhadd_n_s8_x (p0, z0, x0),
+                z0 = svhadd_x (p0, z0, x0))
+
+/*
+** hadd_w0_s8_x_untied:
+**     mov     z0\.b, w0
+**     shadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_s8_x_untied, svint8_t, int8_t,
+                z0 = svhadd_n_s8_x (p0, z1, x0),
+                z0 = svhadd_x (p0, z1, x0))
+
+/*
+** hadd_11_s8_x_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     shadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s8_x_tied1, svint8_t,
+               z0 = svhadd_n_s8_x (p0, z0, 11),
+               z0 = svhadd_x (p0, z0, 11))
+
+/*
+** hadd_11_s8_x_untied:
+**     mov     z0\.b, #11
+**     shadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_s8_x_untied, svint8_t,
+               z0 = svhadd_n_s8_x (p0, z1, 11),
+               z0 = svhadd_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_u16.c
new file mode 100644 (file)
index 0000000..ff8bb9d
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hadd_u16_m_tied1:
+**     uhadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u16_m_tied1, svuint16_t,
+               z0 = svhadd_u16_m (p0, z0, z1),
+               z0 = svhadd_m (p0, z0, z1))
+
+/*
+** hadd_u16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uhadd   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u16_m_tied2, svuint16_t,
+               z0 = svhadd_u16_m (p0, z1, z0),
+               z0 = svhadd_m (p0, z1, z0))
+
+/*
+** hadd_u16_m_untied:
+**     movprfx z0, z1
+**     uhadd   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u16_m_untied, svuint16_t,
+               z0 = svhadd_u16_m (p0, z1, z2),
+               z0 = svhadd_m (p0, z1, z2))
+
+/*
+** hadd_w0_u16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uhadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_u16_m_tied1, svuint16_t, uint16_t,
+                z0 = svhadd_n_u16_m (p0, z0, x0),
+                z0 = svhadd_m (p0, z0, x0))
+
+/*
+** hadd_w0_u16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     uhadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_u16_m_untied, svuint16_t, uint16_t,
+                z0 = svhadd_n_u16_m (p0, z1, x0),
+                z0 = svhadd_m (p0, z1, x0))
+
+/*
+** hadd_11_u16_m_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     uhadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u16_m_tied1, svuint16_t,
+               z0 = svhadd_n_u16_m (p0, z0, 11),
+               z0 = svhadd_m (p0, z0, 11))
+
+/*
+** hadd_11_u16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     uhadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u16_m_untied, svuint16_t,
+               z0 = svhadd_n_u16_m (p0, z1, 11),
+               z0 = svhadd_m (p0, z1, 11))
+
+/*
+** hadd_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uhadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u16_z_tied1, svuint16_t,
+               z0 = svhadd_u16_z (p0, z0, z1),
+               z0 = svhadd_z (p0, z0, z1))
+
+/*
+** hadd_u16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uhadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u16_z_tied2, svuint16_t,
+               z0 = svhadd_u16_z (p0, z1, z0),
+               z0 = svhadd_z (p0, z1, z0))
+
+/*
+** hadd_u16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uhadd   z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0\.h, p0/z, z2\.h
+**     uhadd   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u16_z_untied, svuint16_t,
+               z0 = svhadd_u16_z (p0, z1, z2),
+               z0 = svhadd_z (p0, z1, z2))
+
+/*
+** hadd_w0_u16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     uhadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_u16_z_tied1, svuint16_t, uint16_t,
+                z0 = svhadd_n_u16_z (p0, z0, x0),
+                z0 = svhadd_z (p0, z0, x0))
+
+/*
+** hadd_w0_u16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uhadd   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     uhadd   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_u16_z_untied, svuint16_t, uint16_t,
+                z0 = svhadd_n_u16_z (p0, z1, x0),
+                z0 = svhadd_z (p0, z1, x0))
+
+/*
+** hadd_11_u16_z_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0\.h, p0/z, z0\.h
+**     uhadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u16_z_tied1, svuint16_t,
+               z0 = svhadd_n_u16_z (p0, z0, 11),
+               z0 = svhadd_z (p0, z0, 11))
+
+/*
+** hadd_11_u16_z_untied:
+**     mov     (z[0-9]+\.h), #11
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uhadd   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     uhadd   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u16_z_untied, svuint16_t,
+               z0 = svhadd_n_u16_z (p0, z1, 11),
+               z0 = svhadd_z (p0, z1, 11))
+
+/*
+** hadd_u16_x_tied1:
+**     uhadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u16_x_tied1, svuint16_t,
+               z0 = svhadd_u16_x (p0, z0, z1),
+               z0 = svhadd_x (p0, z0, z1))
+
+/*
+** hadd_u16_x_tied2:
+**     uhadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u16_x_tied2, svuint16_t,
+               z0 = svhadd_u16_x (p0, z1, z0),
+               z0 = svhadd_x (p0, z1, z0))
+
+/*
+** hadd_u16_x_untied:
+** (
+**     movprfx z0, z1
+**     uhadd   z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0, z2
+**     uhadd   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u16_x_untied, svuint16_t,
+               z0 = svhadd_u16_x (p0, z1, z2),
+               z0 = svhadd_x (p0, z1, z2))
+
+/*
+** hadd_w0_u16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uhadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_u16_x_tied1, svuint16_t, uint16_t,
+                z0 = svhadd_n_u16_x (p0, z0, x0),
+                z0 = svhadd_x (p0, z0, x0))
+
+/*
+** hadd_w0_u16_x_untied:
+**     mov     z0\.h, w0
+**     uhadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_u16_x_untied, svuint16_t, uint16_t,
+                z0 = svhadd_n_u16_x (p0, z1, x0),
+                z0 = svhadd_x (p0, z1, x0))
+
+/*
+** hadd_11_u16_x_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     uhadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u16_x_tied1, svuint16_t,
+               z0 = svhadd_n_u16_x (p0, z0, 11),
+               z0 = svhadd_x (p0, z0, 11))
+
+/*
+** hadd_11_u16_x_untied:
+**     mov     z0\.h, #11
+**     uhadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u16_x_untied, svuint16_t,
+               z0 = svhadd_n_u16_x (p0, z1, 11),
+               z0 = svhadd_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_u32.c
new file mode 100644 (file)
index 0000000..ddc5477
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hadd_u32_m_tied1:
+**     uhadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u32_m_tied1, svuint32_t,
+               z0 = svhadd_u32_m (p0, z0, z1),
+               z0 = svhadd_m (p0, z0, z1))
+
+/*
+** hadd_u32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uhadd   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u32_m_tied2, svuint32_t,
+               z0 = svhadd_u32_m (p0, z1, z0),
+               z0 = svhadd_m (p0, z1, z0))
+
+/*
+** hadd_u32_m_untied:
+**     movprfx z0, z1
+**     uhadd   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u32_m_untied, svuint32_t,
+               z0 = svhadd_u32_m (p0, z1, z2),
+               z0 = svhadd_m (p0, z1, z2))
+
+/*
+** hadd_w0_u32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uhadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_u32_m_tied1, svuint32_t, uint32_t,
+                z0 = svhadd_n_u32_m (p0, z0, x0),
+                z0 = svhadd_m (p0, z0, x0))
+
+/*
+** hadd_w0_u32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     uhadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_u32_m_untied, svuint32_t, uint32_t,
+                z0 = svhadd_n_u32_m (p0, z1, x0),
+                z0 = svhadd_m (p0, z1, x0))
+
+/*
+** hadd_11_u32_m_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     uhadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u32_m_tied1, svuint32_t,
+               z0 = svhadd_n_u32_m (p0, z0, 11),
+               z0 = svhadd_m (p0, z0, 11))
+
+/*
+** hadd_11_u32_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     uhadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u32_m_untied, svuint32_t,
+               z0 = svhadd_n_u32_m (p0, z1, 11),
+               z0 = svhadd_m (p0, z1, 11))
+
+/*
+** hadd_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uhadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u32_z_tied1, svuint32_t,
+               z0 = svhadd_u32_z (p0, z0, z1),
+               z0 = svhadd_z (p0, z0, z1))
+
+/*
+** hadd_u32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uhadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u32_z_tied2, svuint32_t,
+               z0 = svhadd_u32_z (p0, z1, z0),
+               z0 = svhadd_z (p0, z1, z0))
+
+/*
+** hadd_u32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uhadd   z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0\.s, p0/z, z2\.s
+**     uhadd   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u32_z_untied, svuint32_t,
+               z0 = svhadd_u32_z (p0, z1, z2),
+               z0 = svhadd_z (p0, z1, z2))
+
+/*
+** hadd_w0_u32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     uhadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_u32_z_tied1, svuint32_t, uint32_t,
+                z0 = svhadd_n_u32_z (p0, z0, x0),
+                z0 = svhadd_z (p0, z0, x0))
+
+/*
+** hadd_w0_u32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uhadd   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     uhadd   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_u32_z_untied, svuint32_t, uint32_t,
+                z0 = svhadd_n_u32_z (p0, z1, x0),
+                z0 = svhadd_z (p0, z1, x0))
+
+/*
+** hadd_11_u32_z_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0\.s, p0/z, z0\.s
+**     uhadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u32_z_tied1, svuint32_t,
+               z0 = svhadd_n_u32_z (p0, z0, 11),
+               z0 = svhadd_z (p0, z0, 11))
+
+/*
+** hadd_11_u32_z_untied:
+**     mov     (z[0-9]+\.s), #11
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uhadd   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     uhadd   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u32_z_untied, svuint32_t,
+               z0 = svhadd_n_u32_z (p0, z1, 11),
+               z0 = svhadd_z (p0, z1, 11))
+
+/*
+** hadd_u32_x_tied1:
+**     uhadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u32_x_tied1, svuint32_t,
+               z0 = svhadd_u32_x (p0, z0, z1),
+               z0 = svhadd_x (p0, z0, z1))
+
+/*
+** hadd_u32_x_tied2:
+**     uhadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u32_x_tied2, svuint32_t,
+               z0 = svhadd_u32_x (p0, z1, z0),
+               z0 = svhadd_x (p0, z1, z0))
+
+/*
+** hadd_u32_x_untied:
+** (
+**     movprfx z0, z1
+**     uhadd   z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0, z2
+**     uhadd   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u32_x_untied, svuint32_t,
+               z0 = svhadd_u32_x (p0, z1, z2),
+               z0 = svhadd_x (p0, z1, z2))
+
+/*
+** hadd_w0_u32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uhadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_u32_x_tied1, svuint32_t, uint32_t,
+                z0 = svhadd_n_u32_x (p0, z0, x0),
+                z0 = svhadd_x (p0, z0, x0))
+
+/*
+** hadd_w0_u32_x_untied:
+**     mov     z0\.s, w0
+**     uhadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_u32_x_untied, svuint32_t, uint32_t,
+                z0 = svhadd_n_u32_x (p0, z1, x0),
+                z0 = svhadd_x (p0, z1, x0))
+
+/*
+** hadd_11_u32_x_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     uhadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u32_x_tied1, svuint32_t,
+               z0 = svhadd_n_u32_x (p0, z0, 11),
+               z0 = svhadd_x (p0, z0, 11))
+
+/*
+** hadd_11_u32_x_untied:
+**     mov     z0\.s, #11
+**     uhadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u32_x_untied, svuint32_t,
+               z0 = svhadd_n_u32_x (p0, z1, 11),
+               z0 = svhadd_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_u64.c
new file mode 100644 (file)
index 0000000..6b07ae3
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hadd_u64_m_tied1:
+**     uhadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u64_m_tied1, svuint64_t,
+               z0 = svhadd_u64_m (p0, z0, z1),
+               z0 = svhadd_m (p0, z0, z1))
+
+/*
+** hadd_u64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     uhadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u64_m_tied2, svuint64_t,
+               z0 = svhadd_u64_m (p0, z1, z0),
+               z0 = svhadd_m (p0, z1, z0))
+
+/*
+** hadd_u64_m_untied:
+**     movprfx z0, z1
+**     uhadd   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u64_m_untied, svuint64_t,
+               z0 = svhadd_u64_m (p0, z1, z2),
+               z0 = svhadd_m (p0, z1, z2))
+
+/*
+** hadd_x0_u64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     uhadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_x0_u64_m_tied1, svuint64_t, uint64_t,
+                z0 = svhadd_n_u64_m (p0, z0, x0),
+                z0 = svhadd_m (p0, z0, x0))
+
+/*
+** hadd_x0_u64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     uhadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_x0_u64_m_untied, svuint64_t, uint64_t,
+                z0 = svhadd_n_u64_m (p0, z1, x0),
+                z0 = svhadd_m (p0, z1, x0))
+
+/*
+** hadd_11_u64_m_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     uhadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u64_m_tied1, svuint64_t,
+               z0 = svhadd_n_u64_m (p0, z0, 11),
+               z0 = svhadd_m (p0, z0, 11))
+
+/*
+** hadd_11_u64_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     uhadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u64_m_untied, svuint64_t,
+               z0 = svhadd_n_u64_m (p0, z1, 11),
+               z0 = svhadd_m (p0, z1, 11))
+
+/*
+** hadd_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uhadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u64_z_tied1, svuint64_t,
+               z0 = svhadd_u64_z (p0, z0, z1),
+               z0 = svhadd_z (p0, z0, z1))
+
+/*
+** hadd_u64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uhadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u64_z_tied2, svuint64_t,
+               z0 = svhadd_u64_z (p0, z1, z0),
+               z0 = svhadd_z (p0, z1, z0))
+
+/*
+** hadd_u64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uhadd   z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0\.d, p0/z, z2\.d
+**     uhadd   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u64_z_untied, svuint64_t,
+               z0 = svhadd_u64_z (p0, z1, z2),
+               z0 = svhadd_z (p0, z1, z2))
+
+/*
+** hadd_x0_u64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     uhadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_x0_u64_z_tied1, svuint64_t, uint64_t,
+                z0 = svhadd_n_u64_z (p0, z0, x0),
+                z0 = svhadd_z (p0, z0, x0))
+
+/*
+** hadd_x0_u64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uhadd   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     uhadd   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_x0_u64_z_untied, svuint64_t, uint64_t,
+                z0 = svhadd_n_u64_z (p0, z1, x0),
+                z0 = svhadd_z (p0, z1, x0))
+
+/*
+** hadd_11_u64_z_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0\.d, p0/z, z0\.d
+**     uhadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u64_z_tied1, svuint64_t,
+               z0 = svhadd_n_u64_z (p0, z0, 11),
+               z0 = svhadd_z (p0, z0, 11))
+
+/*
+** hadd_11_u64_z_untied:
+**     mov     (z[0-9]+\.d), #11
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uhadd   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     uhadd   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u64_z_untied, svuint64_t,
+               z0 = svhadd_n_u64_z (p0, z1, 11),
+               z0 = svhadd_z (p0, z1, 11))
+
+/*
+** hadd_u64_x_tied1:
+**     uhadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u64_x_tied1, svuint64_t,
+               z0 = svhadd_u64_x (p0, z0, z1),
+               z0 = svhadd_x (p0, z0, z1))
+
+/*
+** hadd_u64_x_tied2:
+**     uhadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u64_x_tied2, svuint64_t,
+               z0 = svhadd_u64_x (p0, z1, z0),
+               z0 = svhadd_x (p0, z1, z0))
+
+/*
+** hadd_u64_x_untied:
+** (
+**     movprfx z0, z1
+**     uhadd   z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0, z2
+**     uhadd   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u64_x_untied, svuint64_t,
+               z0 = svhadd_u64_x (p0, z1, z2),
+               z0 = svhadd_x (p0, z1, z2))
+
+/*
+** hadd_x0_u64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     uhadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_x0_u64_x_tied1, svuint64_t, uint64_t,
+                z0 = svhadd_n_u64_x (p0, z0, x0),
+                z0 = svhadd_x (p0, z0, x0))
+
+/*
+** hadd_x0_u64_x_untied:
+**     mov     z0\.d, x0
+**     uhadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_x0_u64_x_untied, svuint64_t, uint64_t,
+                z0 = svhadd_n_u64_x (p0, z1, x0),
+                z0 = svhadd_x (p0, z1, x0))
+
+/*
+** hadd_11_u64_x_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     uhadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u64_x_tied1, svuint64_t,
+               z0 = svhadd_n_u64_x (p0, z0, 11),
+               z0 = svhadd_x (p0, z0, 11))
+
+/*
+** hadd_11_u64_x_untied:
+**     mov     z0\.d, #11
+**     uhadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u64_x_untied, svuint64_t,
+               z0 = svhadd_n_u64_x (p0, z1, 11),
+               z0 = svhadd_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hadd_u8.c
new file mode 100644 (file)
index 0000000..eb61335
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hadd_u8_m_tied1:
+**     uhadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u8_m_tied1, svuint8_t,
+               z0 = svhadd_u8_m (p0, z0, z1),
+               z0 = svhadd_m (p0, z0, z1))
+
+/*
+** hadd_u8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uhadd   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u8_m_tied2, svuint8_t,
+               z0 = svhadd_u8_m (p0, z1, z0),
+               z0 = svhadd_m (p0, z1, z0))
+
+/*
+** hadd_u8_m_untied:
+**     movprfx z0, z1
+**     uhadd   z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u8_m_untied, svuint8_t,
+               z0 = svhadd_u8_m (p0, z1, z2),
+               z0 = svhadd_m (p0, z1, z2))
+
+/*
+** hadd_w0_u8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uhadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_u8_m_tied1, svuint8_t, uint8_t,
+                z0 = svhadd_n_u8_m (p0, z0, x0),
+                z0 = svhadd_m (p0, z0, x0))
+
+/*
+** hadd_w0_u8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     uhadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_u8_m_untied, svuint8_t, uint8_t,
+                z0 = svhadd_n_u8_m (p0, z1, x0),
+                z0 = svhadd_m (p0, z1, x0))
+
+/*
+** hadd_11_u8_m_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     uhadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u8_m_tied1, svuint8_t,
+               z0 = svhadd_n_u8_m (p0, z0, 11),
+               z0 = svhadd_m (p0, z0, 11))
+
+/*
+** hadd_11_u8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     uhadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u8_m_untied, svuint8_t,
+               z0 = svhadd_n_u8_m (p0, z1, 11),
+               z0 = svhadd_m (p0, z1, 11))
+
+/*
+** hadd_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uhadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u8_z_tied1, svuint8_t,
+               z0 = svhadd_u8_z (p0, z0, z1),
+               z0 = svhadd_z (p0, z0, z1))
+
+/*
+** hadd_u8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uhadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u8_z_tied2, svuint8_t,
+               z0 = svhadd_u8_z (p0, z1, z0),
+               z0 = svhadd_z (p0, z1, z0))
+
+/*
+** hadd_u8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uhadd   z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0\.b, p0/z, z2\.b
+**     uhadd   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u8_z_untied, svuint8_t,
+               z0 = svhadd_u8_z (p0, z1, z2),
+               z0 = svhadd_z (p0, z1, z2))
+
+/*
+** hadd_w0_u8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     uhadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_u8_z_tied1, svuint8_t, uint8_t,
+                z0 = svhadd_n_u8_z (p0, z0, x0),
+                z0 = svhadd_z (p0, z0, x0))
+
+/*
+** hadd_w0_u8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uhadd   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     uhadd   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_u8_z_untied, svuint8_t, uint8_t,
+                z0 = svhadd_n_u8_z (p0, z1, x0),
+                z0 = svhadd_z (p0, z1, x0))
+
+/*
+** hadd_11_u8_z_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0\.b, p0/z, z0\.b
+**     uhadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u8_z_tied1, svuint8_t,
+               z0 = svhadd_n_u8_z (p0, z0, 11),
+               z0 = svhadd_z (p0, z0, 11))
+
+/*
+** hadd_11_u8_z_untied:
+**     mov     (z[0-9]+\.b), #11
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uhadd   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     uhadd   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u8_z_untied, svuint8_t,
+               z0 = svhadd_n_u8_z (p0, z1, 11),
+               z0 = svhadd_z (p0, z1, 11))
+
+/*
+** hadd_u8_x_tied1:
+**     uhadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u8_x_tied1, svuint8_t,
+               z0 = svhadd_u8_x (p0, z0, z1),
+               z0 = svhadd_x (p0, z0, z1))
+
+/*
+** hadd_u8_x_tied2:
+**     uhadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u8_x_tied2, svuint8_t,
+               z0 = svhadd_u8_x (p0, z1, z0),
+               z0 = svhadd_x (p0, z1, z0))
+
+/*
+** hadd_u8_x_untied:
+** (
+**     movprfx z0, z1
+**     uhadd   z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0, z2
+**     uhadd   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_u8_x_untied, svuint8_t,
+               z0 = svhadd_u8_x (p0, z1, z2),
+               z0 = svhadd_x (p0, z1, z2))
+
+/*
+** hadd_w0_u8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uhadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_u8_x_tied1, svuint8_t, uint8_t,
+                z0 = svhadd_n_u8_x (p0, z0, x0),
+                z0 = svhadd_x (p0, z0, x0))
+
+/*
+** hadd_w0_u8_x_untied:
+**     mov     z0\.b, w0
+**     uhadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_ZX (hadd_w0_u8_x_untied, svuint8_t, uint8_t,
+                z0 = svhadd_n_u8_x (p0, z1, x0),
+                z0 = svhadd_x (p0, z1, x0))
+
+/*
+** hadd_11_u8_x_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     uhadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u8_x_tied1, svuint8_t,
+               z0 = svhadd_n_u8_x (p0, z0, 11),
+               z0 = svhadd_x (p0, z0, 11))
+
+/*
+** hadd_11_u8_x_untied:
+**     mov     z0\.b, #11
+**     uhadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hadd_11_u8_x_untied, svuint8_t,
+               z0 = svhadd_n_u8_x (p0, z1, 11),
+               z0 = svhadd_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/histcnt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/histcnt_s32.c
new file mode 100644 (file)
index 0000000..7bf783a
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** histcnt_s32_z_tied1:
+**     histcnt z0\.s, p0/z, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (histcnt_s32_z_tied1, svuint32_t, svint32_t,
+                   z0_res = svhistcnt_s32_z (p0, z0, z1),
+                   z0_res = svhistcnt_z (p0, z0, z1))
+
+/*
+** histcnt_s32_z_tied2:
+**     histcnt z0\.s, p0/z, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (histcnt_s32_z_tied2, svuint32_t, svint32_t,
+                   z0_res = svhistcnt_s32_z (p0, z1, z0),
+                   z0_res = svhistcnt_z (p0, z1, z0))
+
+/*
+** histcnt_s32_z_untied:
+**     histcnt z0\.s, p0/z, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (histcnt_s32_z_untied, svuint32_t, svint32_t,
+                   z0_res = svhistcnt_s32_z (p0, z1, z2),
+                   z0_res = svhistcnt_z (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/histcnt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/histcnt_s64.c
new file mode 100644 (file)
index 0000000..001f5f0
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** histcnt_s64_z_tied1:
+**     histcnt z0\.d, p0/z, z0\.d, z1\.d
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (histcnt_s64_z_tied1, svuint64_t, svint64_t,
+                   z0_res = svhistcnt_s64_z (p0, z0, z1),
+                   z0_res = svhistcnt_z (p0, z0, z1))
+
+/*
+** histcnt_s64_z_tied2:
+**     histcnt z0\.d, p0/z, z1\.d, z0\.d
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (histcnt_s64_z_tied2, svuint64_t, svint64_t,
+                   z0_res = svhistcnt_s64_z (p0, z1, z0),
+                   z0_res = svhistcnt_z (p0, z1, z0))
+
+/*
+** histcnt_s64_z_untied:
+**     histcnt z0\.d, p0/z, z1\.d, z2\.d
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (histcnt_s64_z_untied, svuint64_t, svint64_t,
+                   z0_res = svhistcnt_s64_z (p0, z1, z2),
+                   z0_res = svhistcnt_z (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/histcnt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/histcnt_u32.c
new file mode 100644 (file)
index 0000000..d93091a
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** histcnt_u32_z_tied1:
+**     histcnt z0\.s, p0/z, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (histcnt_u32_z_tied1, svuint32_t, svuint32_t,
+                   z0_res = svhistcnt_u32_z (p0, z0, z1),
+                   z0_res = svhistcnt_z (p0, z0, z1))
+
+/*
+** histcnt_u32_z_tied2:
+**     histcnt z0\.s, p0/z, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (histcnt_u32_z_tied2, svuint32_t, svuint32_t,
+                   z0_res = svhistcnt_u32_z (p0, z1, z0),
+                   z0_res = svhistcnt_z (p0, z1, z0))
+
+/*
+** histcnt_u32_z_untied:
+**     histcnt z0\.s, p0/z, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (histcnt_u32_z_untied, svuint32_t, svuint32_t,
+                   z0_res = svhistcnt_u32_z (p0, z1, z2),
+                   z0_res = svhistcnt_z (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/histcnt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/histcnt_u64.c
new file mode 100644 (file)
index 0000000..3b88980
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** histcnt_u64_z_tied1:
+**     histcnt z0\.d, p0/z, z0\.d, z1\.d
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (histcnt_u64_z_tied1, svuint64_t, svuint64_t,
+                   z0_res = svhistcnt_u64_z (p0, z0, z1),
+                   z0_res = svhistcnt_z (p0, z0, z1))
+
+/*
+** histcnt_u64_z_tied2:
+**     histcnt z0\.d, p0/z, z1\.d, z0\.d
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (histcnt_u64_z_tied2, svuint64_t, svuint64_t,
+                   z0_res = svhistcnt_u64_z (p0, z1, z0),
+                   z0_res = svhistcnt_z (p0, z1, z0))
+
+/*
+** histcnt_u64_z_untied:
+**     histcnt z0\.d, p0/z, z1\.d, z2\.d
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (histcnt_u64_z_untied, svuint64_t, svuint64_t,
+                   z0_res = svhistcnt_u64_z (p0, z1, z2),
+                   z0_res = svhistcnt_z (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/histseg_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/histseg_s8.c
new file mode 100644 (file)
index 0000000..380ccdf
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** histseg_s8_tied1:
+**     histseg z0\.b, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (histseg_s8_tied1, svuint8_t, svint8_t,
+                   z0_res = svhistseg_s8 (z0, z1),
+                   z0_res = svhistseg (z0, z1))
+
+/*
+** histseg_s8_tied2:
+**     histseg z0\.b, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (histseg_s8_tied2, svuint8_t, svint8_t,
+                   z0_res = svhistseg_s8 (z1, z0),
+                   z0_res = svhistseg (z1, z0))
+
+/*
+** histseg_s8_untied:
+**     histseg z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (histseg_s8_untied, svuint8_t, svint8_t,
+                   z0_res = svhistseg_s8 (z1, z2),
+                   z0_res = svhistseg (z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/histseg_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/histseg_u8.c
new file mode 100644 (file)
index 0000000..f43292f
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** histseg_u8_tied1:
+**     histseg z0\.b, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (histseg_u8_tied1, svuint8_t, svuint8_t,
+                   z0_res = svhistseg_u8 (z0, z1),
+                   z0_res = svhistseg (z0, z1))
+
+/*
+** histseg_u8_tied2:
+**     histseg z0\.b, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (histseg_u8_tied2, svuint8_t, svuint8_t,
+                   z0_res = svhistseg_u8 (z1, z0),
+                   z0_res = svhistseg (z1, z0))
+
+/*
+** histseg_u8_untied:
+**     histseg z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (histseg_u8_untied, svuint8_t, svuint8_t,
+                   z0_res = svhistseg_u8 (z1, z2),
+                   z0_res = svhistseg (z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_s16.c
new file mode 100644 (file)
index 0000000..2cc9afd
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hsub_s16_m_tied1:
+**     shsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s16_m_tied1, svint16_t,
+               z0 = svhsub_s16_m (p0, z0, z1),
+               z0 = svhsub_m (p0, z0, z1))
+
+/*
+** hsub_s16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     shsub   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s16_m_tied2, svint16_t,
+               z0 = svhsub_s16_m (p0, z1, z0),
+               z0 = svhsub_m (p0, z1, z0))
+
+/*
+** hsub_s16_m_untied:
+**     movprfx z0, z1
+**     shsub   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s16_m_untied, svint16_t,
+               z0 = svhsub_s16_m (p0, z1, z2),
+               z0 = svhsub_m (p0, z1, z2))
+
+/*
+** hsub_w0_s16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     shsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_s16_m_tied1, svint16_t, int16_t,
+                z0 = svhsub_n_s16_m (p0, z0, x0),
+                z0 = svhsub_m (p0, z0, x0))
+
+/*
+** hsub_w0_s16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     shsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_s16_m_untied, svint16_t, int16_t,
+                z0 = svhsub_n_s16_m (p0, z1, x0),
+                z0 = svhsub_m (p0, z1, x0))
+
+/*
+** hsub_11_s16_m_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     shsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s16_m_tied1, svint16_t,
+               z0 = svhsub_n_s16_m (p0, z0, 11),
+               z0 = svhsub_m (p0, z0, 11))
+
+/*
+** hsub_11_s16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     shsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s16_m_untied, svint16_t,
+               z0 = svhsub_n_s16_m (p0, z1, 11),
+               z0 = svhsub_m (p0, z1, 11))
+
+/*
+** hsub_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     shsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s16_z_tied1, svint16_t,
+               z0 = svhsub_s16_z (p0, z0, z1),
+               z0 = svhsub_z (p0, z0, z1))
+
+/*
+** hsub_s16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     shsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s16_z_tied2, svint16_t,
+               z0 = svhsub_s16_z (p0, z1, z0),
+               z0 = svhsub_z (p0, z1, z0))
+
+/*
+** hsub_s16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     shsub   z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0\.h, p0/z, z2\.h
+**     shsubr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s16_z_untied, svint16_t,
+               z0 = svhsub_s16_z (p0, z1, z2),
+               z0 = svhsub_z (p0, z1, z2))
+
+/*
+** hsub_w0_s16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     shsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_s16_z_tied1, svint16_t, int16_t,
+                z0 = svhsub_n_s16_z (p0, z0, x0),
+                z0 = svhsub_z (p0, z0, x0))
+
+/*
+** hsub_w0_s16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     shsub   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     shsubr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_s16_z_untied, svint16_t, int16_t,
+                z0 = svhsub_n_s16_z (p0, z1, x0),
+                z0 = svhsub_z (p0, z1, x0))
+
+/*
+** hsub_11_s16_z_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0\.h, p0/z, z0\.h
+**     shsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s16_z_tied1, svint16_t,
+               z0 = svhsub_n_s16_z (p0, z0, 11),
+               z0 = svhsub_z (p0, z0, 11))
+
+/*
+** hsub_11_s16_z_untied:
+**     mov     (z[0-9]+\.h), #11
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     shsub   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     shsubr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s16_z_untied, svint16_t,
+               z0 = svhsub_n_s16_z (p0, z1, 11),
+               z0 = svhsub_z (p0, z1, 11))
+
+/*
+** hsub_s16_x_tied1:
+**     shsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s16_x_tied1, svint16_t,
+               z0 = svhsub_s16_x (p0, z0, z1),
+               z0 = svhsub_x (p0, z0, z1))
+
+/*
+** hsub_s16_x_tied2:
+**     shsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s16_x_tied2, svint16_t,
+               z0 = svhsub_s16_x (p0, z1, z0),
+               z0 = svhsub_x (p0, z1, z0))
+
+/*
+** hsub_s16_x_untied:
+** (
+**     movprfx z0, z1
+**     shsub   z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0, z2
+**     shsubr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s16_x_untied, svint16_t,
+               z0 = svhsub_s16_x (p0, z1, z2),
+               z0 = svhsub_x (p0, z1, z2))
+
+/*
+** hsub_w0_s16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     shsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_s16_x_tied1, svint16_t, int16_t,
+                z0 = svhsub_n_s16_x (p0, z0, x0),
+                z0 = svhsub_x (p0, z0, x0))
+
+/*
+** hsub_w0_s16_x_untied:
+**     mov     z0\.h, w0
+**     shsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_s16_x_untied, svint16_t, int16_t,
+                z0 = svhsub_n_s16_x (p0, z1, x0),
+                z0 = svhsub_x (p0, z1, x0))
+
+/*
+** hsub_11_s16_x_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     shsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s16_x_tied1, svint16_t,
+               z0 = svhsub_n_s16_x (p0, z0, 11),
+               z0 = svhsub_x (p0, z0, 11))
+
+/*
+** hsub_11_s16_x_untied:
+**     mov     z0\.h, #11
+**     shsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s16_x_untied, svint16_t,
+               z0 = svhsub_n_s16_x (p0, z1, 11),
+               z0 = svhsub_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_s32.c
new file mode 100644 (file)
index 0000000..9d807a6
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hsub_s32_m_tied1:
+**     shsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s32_m_tied1, svint32_t,
+               z0 = svhsub_s32_m (p0, z0, z1),
+               z0 = svhsub_m (p0, z0, z1))
+
+/*
+** hsub_s32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     shsub   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s32_m_tied2, svint32_t,
+               z0 = svhsub_s32_m (p0, z1, z0),
+               z0 = svhsub_m (p0, z1, z0))
+
+/*
+** hsub_s32_m_untied:
+**     movprfx z0, z1
+**     shsub   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s32_m_untied, svint32_t,
+               z0 = svhsub_s32_m (p0, z1, z2),
+               z0 = svhsub_m (p0, z1, z2))
+
+/*
+** hsub_w0_s32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     shsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_s32_m_tied1, svint32_t, int32_t,
+                z0 = svhsub_n_s32_m (p0, z0, x0),
+                z0 = svhsub_m (p0, z0, x0))
+
+/*
+** hsub_w0_s32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     shsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_s32_m_untied, svint32_t, int32_t,
+                z0 = svhsub_n_s32_m (p0, z1, x0),
+                z0 = svhsub_m (p0, z1, x0))
+
+/*
+** hsub_11_s32_m_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     shsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s32_m_tied1, svint32_t,
+               z0 = svhsub_n_s32_m (p0, z0, 11),
+               z0 = svhsub_m (p0, z0, 11))
+
+/*
+** hsub_11_s32_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     shsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s32_m_untied, svint32_t,
+               z0 = svhsub_n_s32_m (p0, z1, 11),
+               z0 = svhsub_m (p0, z1, 11))
+
+/*
+** hsub_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     shsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s32_z_tied1, svint32_t,
+               z0 = svhsub_s32_z (p0, z0, z1),
+               z0 = svhsub_z (p0, z0, z1))
+
+/*
+** hsub_s32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     shsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s32_z_tied2, svint32_t,
+               z0 = svhsub_s32_z (p0, z1, z0),
+               z0 = svhsub_z (p0, z1, z0))
+
+/*
+** hsub_s32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     shsub   z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0\.s, p0/z, z2\.s
+**     shsubr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s32_z_untied, svint32_t,
+               z0 = svhsub_s32_z (p0, z1, z2),
+               z0 = svhsub_z (p0, z1, z2))
+
+/*
+** hsub_w0_s32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     shsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_s32_z_tied1, svint32_t, int32_t,
+                z0 = svhsub_n_s32_z (p0, z0, x0),
+                z0 = svhsub_z (p0, z0, x0))
+
+/*
+** hsub_w0_s32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     shsub   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     shsubr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_s32_z_untied, svint32_t, int32_t,
+                z0 = svhsub_n_s32_z (p0, z1, x0),
+                z0 = svhsub_z (p0, z1, x0))
+
+/*
+** hsub_11_s32_z_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0\.s, p0/z, z0\.s
+**     shsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s32_z_tied1, svint32_t,
+               z0 = svhsub_n_s32_z (p0, z0, 11),
+               z0 = svhsub_z (p0, z0, 11))
+
+/*
+** hsub_11_s32_z_untied:
+**     mov     (z[0-9]+\.s), #11
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     shsub   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     shsubr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s32_z_untied, svint32_t,
+               z0 = svhsub_n_s32_z (p0, z1, 11),
+               z0 = svhsub_z (p0, z1, 11))
+
+/*
+** hsub_s32_x_tied1:
+**     shsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s32_x_tied1, svint32_t,
+               z0 = svhsub_s32_x (p0, z0, z1),
+               z0 = svhsub_x (p0, z0, z1))
+
+/*
+** hsub_s32_x_tied2:
+**     shsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s32_x_tied2, svint32_t,
+               z0 = svhsub_s32_x (p0, z1, z0),
+               z0 = svhsub_x (p0, z1, z0))
+
+/*
+** hsub_s32_x_untied:
+** (
+**     movprfx z0, z1
+**     shsub   z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0, z2
+**     shsubr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s32_x_untied, svint32_t,
+               z0 = svhsub_s32_x (p0, z1, z2),
+               z0 = svhsub_x (p0, z1, z2))
+
+/*
+** hsub_w0_s32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     shsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_s32_x_tied1, svint32_t, int32_t,
+                z0 = svhsub_n_s32_x (p0, z0, x0),
+                z0 = svhsub_x (p0, z0, x0))
+
+/*
+** hsub_w0_s32_x_untied:
+**     mov     z0\.s, w0
+**     shsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_s32_x_untied, svint32_t, int32_t,
+                z0 = svhsub_n_s32_x (p0, z1, x0),
+                z0 = svhsub_x (p0, z1, x0))
+
+/*
+** hsub_11_s32_x_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     shsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s32_x_tied1, svint32_t,
+               z0 = svhsub_n_s32_x (p0, z0, 11),
+               z0 = svhsub_x (p0, z0, 11))
+
+/*
+** hsub_11_s32_x_untied:
+**     mov     z0\.s, #11
+**     shsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s32_x_untied, svint32_t,
+               z0 = svhsub_n_s32_x (p0, z1, 11),
+               z0 = svhsub_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_s64.c
new file mode 100644 (file)
index 0000000..5c6577b
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hsub_s64_m_tied1:
+**     shsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s64_m_tied1, svint64_t,
+               z0 = svhsub_s64_m (p0, z0, z1),
+               z0 = svhsub_m (p0, z0, z1))
+
+/*
+** hsub_s64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     shsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s64_m_tied2, svint64_t,
+               z0 = svhsub_s64_m (p0, z1, z0),
+               z0 = svhsub_m (p0, z1, z0))
+
+/*
+** hsub_s64_m_untied:
+**     movprfx z0, z1
+**     shsub   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s64_m_untied, svint64_t,
+               z0 = svhsub_s64_m (p0, z1, z2),
+               z0 = svhsub_m (p0, z1, z2))
+
+/*
+** hsub_x0_s64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     shsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_x0_s64_m_tied1, svint64_t, int64_t,
+                z0 = svhsub_n_s64_m (p0, z0, x0),
+                z0 = svhsub_m (p0, z0, x0))
+
+/*
+** hsub_x0_s64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     shsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_x0_s64_m_untied, svint64_t, int64_t,
+                z0 = svhsub_n_s64_m (p0, z1, x0),
+                z0 = svhsub_m (p0, z1, x0))
+
+/*
+** hsub_11_s64_m_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     shsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s64_m_tied1, svint64_t,
+               z0 = svhsub_n_s64_m (p0, z0, 11),
+               z0 = svhsub_m (p0, z0, 11))
+
+/*
+** hsub_11_s64_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     shsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s64_m_untied, svint64_t,
+               z0 = svhsub_n_s64_m (p0, z1, 11),
+               z0 = svhsub_m (p0, z1, 11))
+
+/*
+** hsub_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     shsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s64_z_tied1, svint64_t,
+               z0 = svhsub_s64_z (p0, z0, z1),
+               z0 = svhsub_z (p0, z0, z1))
+
+/*
+** hsub_s64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     shsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s64_z_tied2, svint64_t,
+               z0 = svhsub_s64_z (p0, z1, z0),
+               z0 = svhsub_z (p0, z1, z0))
+
+/*
+** hsub_s64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     shsub   z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0\.d, p0/z, z2\.d
+**     shsubr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s64_z_untied, svint64_t,
+               z0 = svhsub_s64_z (p0, z1, z2),
+               z0 = svhsub_z (p0, z1, z2))
+
+/*
+** hsub_x0_s64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     shsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_x0_s64_z_tied1, svint64_t, int64_t,
+                z0 = svhsub_n_s64_z (p0, z0, x0),
+                z0 = svhsub_z (p0, z0, x0))
+
+/*
+** hsub_x0_s64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     shsub   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     shsubr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_x0_s64_z_untied, svint64_t, int64_t,
+                z0 = svhsub_n_s64_z (p0, z1, x0),
+                z0 = svhsub_z (p0, z1, x0))
+
+/*
+** hsub_11_s64_z_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0\.d, p0/z, z0\.d
+**     shsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s64_z_tied1, svint64_t,
+               z0 = svhsub_n_s64_z (p0, z0, 11),
+               z0 = svhsub_z (p0, z0, 11))
+
+/*
+** hsub_11_s64_z_untied:
+**     mov     (z[0-9]+\.d), #11
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     shsub   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     shsubr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s64_z_untied, svint64_t,
+               z0 = svhsub_n_s64_z (p0, z1, 11),
+               z0 = svhsub_z (p0, z1, 11))
+
+/*
+** hsub_s64_x_tied1:
+**     shsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s64_x_tied1, svint64_t,
+               z0 = svhsub_s64_x (p0, z0, z1),
+               z0 = svhsub_x (p0, z0, z1))
+
+/*
+** hsub_s64_x_tied2:
+**     shsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s64_x_tied2, svint64_t,
+               z0 = svhsub_s64_x (p0, z1, z0),
+               z0 = svhsub_x (p0, z1, z0))
+
+/*
+** hsub_s64_x_untied:
+** (
+**     movprfx z0, z1
+**     shsub   z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0, z2
+**     shsubr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s64_x_untied, svint64_t,
+               z0 = svhsub_s64_x (p0, z1, z2),
+               z0 = svhsub_x (p0, z1, z2))
+
+/*
+** hsub_x0_s64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     shsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_x0_s64_x_tied1, svint64_t, int64_t,
+                z0 = svhsub_n_s64_x (p0, z0, x0),
+                z0 = svhsub_x (p0, z0, x0))
+
+/*
+** hsub_x0_s64_x_untied:
+**     mov     z0\.d, x0
+**     shsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_x0_s64_x_untied, svint64_t, int64_t,
+                z0 = svhsub_n_s64_x (p0, z1, x0),
+                z0 = svhsub_x (p0, z1, x0))
+
+/*
+** hsub_11_s64_x_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     shsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s64_x_tied1, svint64_t,
+               z0 = svhsub_n_s64_x (p0, z0, 11),
+               z0 = svhsub_x (p0, z0, 11))
+
+/*
+** hsub_11_s64_x_untied:
+**     mov     z0\.d, #11
+**     shsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s64_x_untied, svint64_t,
+               z0 = svhsub_n_s64_x (p0, z1, 11),
+               z0 = svhsub_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_s8.c
new file mode 100644 (file)
index 0000000..cdd37a2
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hsub_s8_m_tied1:
+**     shsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s8_m_tied1, svint8_t,
+               z0 = svhsub_s8_m (p0, z0, z1),
+               z0 = svhsub_m (p0, z0, z1))
+
+/*
+** hsub_s8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     shsub   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s8_m_tied2, svint8_t,
+               z0 = svhsub_s8_m (p0, z1, z0),
+               z0 = svhsub_m (p0, z1, z0))
+
+/*
+** hsub_s8_m_untied:
+**     movprfx z0, z1
+**     shsub   z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s8_m_untied, svint8_t,
+               z0 = svhsub_s8_m (p0, z1, z2),
+               z0 = svhsub_m (p0, z1, z2))
+
+/*
+** hsub_w0_s8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     shsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_s8_m_tied1, svint8_t, int8_t,
+                z0 = svhsub_n_s8_m (p0, z0, x0),
+                z0 = svhsub_m (p0, z0, x0))
+
+/*
+** hsub_w0_s8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     shsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_s8_m_untied, svint8_t, int8_t,
+                z0 = svhsub_n_s8_m (p0, z1, x0),
+                z0 = svhsub_m (p0, z1, x0))
+
+/*
+** hsub_11_s8_m_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     shsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s8_m_tied1, svint8_t,
+               z0 = svhsub_n_s8_m (p0, z0, 11),
+               z0 = svhsub_m (p0, z0, 11))
+
+/*
+** hsub_11_s8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     shsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s8_m_untied, svint8_t,
+               z0 = svhsub_n_s8_m (p0, z1, 11),
+               z0 = svhsub_m (p0, z1, 11))
+
+/*
+** hsub_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     shsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s8_z_tied1, svint8_t,
+               z0 = svhsub_s8_z (p0, z0, z1),
+               z0 = svhsub_z (p0, z0, z1))
+
+/*
+** hsub_s8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     shsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s8_z_tied2, svint8_t,
+               z0 = svhsub_s8_z (p0, z1, z0),
+               z0 = svhsub_z (p0, z1, z0))
+
+/*
+** hsub_s8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     shsub   z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0\.b, p0/z, z2\.b
+**     shsubr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s8_z_untied, svint8_t,
+               z0 = svhsub_s8_z (p0, z1, z2),
+               z0 = svhsub_z (p0, z1, z2))
+
+/*
+** hsub_w0_s8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     shsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_s8_z_tied1, svint8_t, int8_t,
+                z0 = svhsub_n_s8_z (p0, z0, x0),
+                z0 = svhsub_z (p0, z0, x0))
+
+/*
+** hsub_w0_s8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     shsub   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     shsubr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_s8_z_untied, svint8_t, int8_t,
+                z0 = svhsub_n_s8_z (p0, z1, x0),
+                z0 = svhsub_z (p0, z1, x0))
+
+/*
+** hsub_11_s8_z_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0\.b, p0/z, z0\.b
+**     shsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s8_z_tied1, svint8_t,
+               z0 = svhsub_n_s8_z (p0, z0, 11),
+               z0 = svhsub_z (p0, z0, 11))
+
+/*
+** hsub_11_s8_z_untied:
+**     mov     (z[0-9]+\.b), #11
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     shsub   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     shsubr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s8_z_untied, svint8_t,
+               z0 = svhsub_n_s8_z (p0, z1, 11),
+               z0 = svhsub_z (p0, z1, 11))
+
+/*
+** hsub_s8_x_tied1:
+**     shsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s8_x_tied1, svint8_t,
+               z0 = svhsub_s8_x (p0, z0, z1),
+               z0 = svhsub_x (p0, z0, z1))
+
+/*
+** hsub_s8_x_tied2:
+**     shsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s8_x_tied2, svint8_t,
+               z0 = svhsub_s8_x (p0, z1, z0),
+               z0 = svhsub_x (p0, z1, z0))
+
+/*
+** hsub_s8_x_untied:
+** (
+**     movprfx z0, z1
+**     shsub   z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0, z2
+**     shsubr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_s8_x_untied, svint8_t,
+               z0 = svhsub_s8_x (p0, z1, z2),
+               z0 = svhsub_x (p0, z1, z2))
+
+/*
+** hsub_w0_s8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     shsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_s8_x_tied1, svint8_t, int8_t,
+                z0 = svhsub_n_s8_x (p0, z0, x0),
+                z0 = svhsub_x (p0, z0, x0))
+
+/*
+** hsub_w0_s8_x_untied:
+**     mov     z0\.b, w0
+**     shsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_s8_x_untied, svint8_t, int8_t,
+                z0 = svhsub_n_s8_x (p0, z1, x0),
+                z0 = svhsub_x (p0, z1, x0))
+
+/*
+** hsub_11_s8_x_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     shsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s8_x_tied1, svint8_t,
+               z0 = svhsub_n_s8_x (p0, z0, 11),
+               z0 = svhsub_x (p0, z0, 11))
+
+/*
+** hsub_11_s8_x_untied:
+**     mov     z0\.b, #11
+**     shsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_s8_x_untied, svint8_t,
+               z0 = svhsub_n_s8_x (p0, z1, 11),
+               z0 = svhsub_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_u16.c
new file mode 100644 (file)
index 0000000..f80666c
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hsub_u16_m_tied1:
+**     uhsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u16_m_tied1, svuint16_t,
+               z0 = svhsub_u16_m (p0, z0, z1),
+               z0 = svhsub_m (p0, z0, z1))
+
+/*
+** hsub_u16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uhsub   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u16_m_tied2, svuint16_t,
+               z0 = svhsub_u16_m (p0, z1, z0),
+               z0 = svhsub_m (p0, z1, z0))
+
+/*
+** hsub_u16_m_untied:
+**     movprfx z0, z1
+**     uhsub   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u16_m_untied, svuint16_t,
+               z0 = svhsub_u16_m (p0, z1, z2),
+               z0 = svhsub_m (p0, z1, z2))
+
+/*
+** hsub_w0_u16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uhsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_u16_m_tied1, svuint16_t, uint16_t,
+                z0 = svhsub_n_u16_m (p0, z0, x0),
+                z0 = svhsub_m (p0, z0, x0))
+
+/*
+** hsub_w0_u16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     uhsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_u16_m_untied, svuint16_t, uint16_t,
+                z0 = svhsub_n_u16_m (p0, z1, x0),
+                z0 = svhsub_m (p0, z1, x0))
+
+/*
+** hsub_11_u16_m_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     uhsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u16_m_tied1, svuint16_t,
+               z0 = svhsub_n_u16_m (p0, z0, 11),
+               z0 = svhsub_m (p0, z0, 11))
+
+/*
+** hsub_11_u16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     uhsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u16_m_untied, svuint16_t,
+               z0 = svhsub_n_u16_m (p0, z1, 11),
+               z0 = svhsub_m (p0, z1, 11))
+
+/*
+** hsub_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uhsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u16_z_tied1, svuint16_t,
+               z0 = svhsub_u16_z (p0, z0, z1),
+               z0 = svhsub_z (p0, z0, z1))
+
+/*
+** hsub_u16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uhsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u16_z_tied2, svuint16_t,
+               z0 = svhsub_u16_z (p0, z1, z0),
+               z0 = svhsub_z (p0, z1, z0))
+
+/*
+** hsub_u16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uhsub   z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0\.h, p0/z, z2\.h
+**     uhsubr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u16_z_untied, svuint16_t,
+               z0 = svhsub_u16_z (p0, z1, z2),
+               z0 = svhsub_z (p0, z1, z2))
+
+/*
+** hsub_w0_u16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     uhsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_u16_z_tied1, svuint16_t, uint16_t,
+                z0 = svhsub_n_u16_z (p0, z0, x0),
+                z0 = svhsub_z (p0, z0, x0))
+
+/*
+** hsub_w0_u16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uhsub   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     uhsubr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_u16_z_untied, svuint16_t, uint16_t,
+                z0 = svhsub_n_u16_z (p0, z1, x0),
+                z0 = svhsub_z (p0, z1, x0))
+
+/*
+** hsub_11_u16_z_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0\.h, p0/z, z0\.h
+**     uhsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u16_z_tied1, svuint16_t,
+               z0 = svhsub_n_u16_z (p0, z0, 11),
+               z0 = svhsub_z (p0, z0, 11))
+
+/*
+** hsub_11_u16_z_untied:
+**     mov     (z[0-9]+\.h), #11
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uhsub   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     uhsubr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u16_z_untied, svuint16_t,
+               z0 = svhsub_n_u16_z (p0, z1, 11),
+               z0 = svhsub_z (p0, z1, 11))
+
+/*
+** hsub_u16_x_tied1:
+**     uhsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u16_x_tied1, svuint16_t,
+               z0 = svhsub_u16_x (p0, z0, z1),
+               z0 = svhsub_x (p0, z0, z1))
+
+/*
+** hsub_u16_x_tied2:
+**     uhsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u16_x_tied2, svuint16_t,
+               z0 = svhsub_u16_x (p0, z1, z0),
+               z0 = svhsub_x (p0, z1, z0))
+
+/*
+** hsub_u16_x_untied:
+** (
+**     movprfx z0, z1
+**     uhsub   z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0, z2
+**     uhsubr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u16_x_untied, svuint16_t,
+               z0 = svhsub_u16_x (p0, z1, z2),
+               z0 = svhsub_x (p0, z1, z2))
+
+/*
+** hsub_w0_u16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uhsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_u16_x_tied1, svuint16_t, uint16_t,
+                z0 = svhsub_n_u16_x (p0, z0, x0),
+                z0 = svhsub_x (p0, z0, x0))
+
+/*
+** hsub_w0_u16_x_untied:
+**     mov     z0\.h, w0
+**     uhsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_u16_x_untied, svuint16_t, uint16_t,
+                z0 = svhsub_n_u16_x (p0, z1, x0),
+                z0 = svhsub_x (p0, z1, x0))
+
+/*
+** hsub_11_u16_x_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     uhsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u16_x_tied1, svuint16_t,
+               z0 = svhsub_n_u16_x (p0, z0, 11),
+               z0 = svhsub_x (p0, z0, 11))
+
+/*
+** hsub_11_u16_x_untied:
+**     mov     z0\.h, #11
+**     uhsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u16_x_untied, svuint16_t,
+               z0 = svhsub_n_u16_x (p0, z1, 11),
+               z0 = svhsub_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_u32.c
new file mode 100644 (file)
index 0000000..b67c4e0
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hsub_u32_m_tied1:
+**     uhsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u32_m_tied1, svuint32_t,
+               z0 = svhsub_u32_m (p0, z0, z1),
+               z0 = svhsub_m (p0, z0, z1))
+
+/*
+** hsub_u32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uhsub   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u32_m_tied2, svuint32_t,
+               z0 = svhsub_u32_m (p0, z1, z0),
+               z0 = svhsub_m (p0, z1, z0))
+
+/*
+** hsub_u32_m_untied:
+**     movprfx z0, z1
+**     uhsub   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u32_m_untied, svuint32_t,
+               z0 = svhsub_u32_m (p0, z1, z2),
+               z0 = svhsub_m (p0, z1, z2))
+
+/*
+** hsub_w0_u32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uhsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_u32_m_tied1, svuint32_t, uint32_t,
+                z0 = svhsub_n_u32_m (p0, z0, x0),
+                z0 = svhsub_m (p0, z0, x0))
+
+/*
+** hsub_w0_u32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     uhsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_u32_m_untied, svuint32_t, uint32_t,
+                z0 = svhsub_n_u32_m (p0, z1, x0),
+                z0 = svhsub_m (p0, z1, x0))
+
+/*
+** hsub_11_u32_m_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     uhsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u32_m_tied1, svuint32_t,
+               z0 = svhsub_n_u32_m (p0, z0, 11),
+               z0 = svhsub_m (p0, z0, 11))
+
+/*
+** hsub_11_u32_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     uhsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u32_m_untied, svuint32_t,
+               z0 = svhsub_n_u32_m (p0, z1, 11),
+               z0 = svhsub_m (p0, z1, 11))
+
+/*
+** hsub_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uhsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u32_z_tied1, svuint32_t,
+               z0 = svhsub_u32_z (p0, z0, z1),
+               z0 = svhsub_z (p0, z0, z1))
+
+/*
+** hsub_u32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uhsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u32_z_tied2, svuint32_t,
+               z0 = svhsub_u32_z (p0, z1, z0),
+               z0 = svhsub_z (p0, z1, z0))
+
+/*
+** hsub_u32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uhsub   z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0\.s, p0/z, z2\.s
+**     uhsubr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u32_z_untied, svuint32_t,
+               z0 = svhsub_u32_z (p0, z1, z2),
+               z0 = svhsub_z (p0, z1, z2))
+
+/*
+** hsub_w0_u32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     uhsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_u32_z_tied1, svuint32_t, uint32_t,
+                z0 = svhsub_n_u32_z (p0, z0, x0),
+                z0 = svhsub_z (p0, z0, x0))
+
+/*
+** hsub_w0_u32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uhsub   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     uhsubr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_u32_z_untied, svuint32_t, uint32_t,
+                z0 = svhsub_n_u32_z (p0, z1, x0),
+                z0 = svhsub_z (p0, z1, x0))
+
+/*
+** hsub_11_u32_z_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0\.s, p0/z, z0\.s
+**     uhsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u32_z_tied1, svuint32_t,
+               z0 = svhsub_n_u32_z (p0, z0, 11),
+               z0 = svhsub_z (p0, z0, 11))
+
+/*
+** hsub_11_u32_z_untied:
+**     mov     (z[0-9]+\.s), #11
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uhsub   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     uhsubr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u32_z_untied, svuint32_t,
+               z0 = svhsub_n_u32_z (p0, z1, 11),
+               z0 = svhsub_z (p0, z1, 11))
+
+/*
+** hsub_u32_x_tied1:
+**     uhsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u32_x_tied1, svuint32_t,
+               z0 = svhsub_u32_x (p0, z0, z1),
+               z0 = svhsub_x (p0, z0, z1))
+
+/*
+** hsub_u32_x_tied2:
+**     uhsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u32_x_tied2, svuint32_t,
+               z0 = svhsub_u32_x (p0, z1, z0),
+               z0 = svhsub_x (p0, z1, z0))
+
+/*
+** hsub_u32_x_untied:
+** (
+**     movprfx z0, z1
+**     uhsub   z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0, z2
+**     uhsubr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u32_x_untied, svuint32_t,
+               z0 = svhsub_u32_x (p0, z1, z2),
+               z0 = svhsub_x (p0, z1, z2))
+
+/*
+** hsub_w0_u32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uhsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_u32_x_tied1, svuint32_t, uint32_t,
+                z0 = svhsub_n_u32_x (p0, z0, x0),
+                z0 = svhsub_x (p0, z0, x0))
+
+/*
+** hsub_w0_u32_x_untied:
+**     mov     z0\.s, w0
+**     uhsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_u32_x_untied, svuint32_t, uint32_t,
+                z0 = svhsub_n_u32_x (p0, z1, x0),
+                z0 = svhsub_x (p0, z1, x0))
+
+/*
+** hsub_11_u32_x_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     uhsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u32_x_tied1, svuint32_t,
+               z0 = svhsub_n_u32_x (p0, z0, 11),
+               z0 = svhsub_x (p0, z0, 11))
+
+/*
+** hsub_11_u32_x_untied:
+**     mov     z0\.s, #11
+**     uhsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u32_x_untied, svuint32_t,
+               z0 = svhsub_n_u32_x (p0, z1, 11),
+               z0 = svhsub_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_u64.c
new file mode 100644 (file)
index 0000000..c79c46e
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hsub_u64_m_tied1:
+**     uhsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u64_m_tied1, svuint64_t,
+               z0 = svhsub_u64_m (p0, z0, z1),
+               z0 = svhsub_m (p0, z0, z1))
+
+/*
+** hsub_u64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     uhsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u64_m_tied2, svuint64_t,
+               z0 = svhsub_u64_m (p0, z1, z0),
+               z0 = svhsub_m (p0, z1, z0))
+
+/*
+** hsub_u64_m_untied:
+**     movprfx z0, z1
+**     uhsub   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u64_m_untied, svuint64_t,
+               z0 = svhsub_u64_m (p0, z1, z2),
+               z0 = svhsub_m (p0, z1, z2))
+
+/*
+** hsub_x0_u64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     uhsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_x0_u64_m_tied1, svuint64_t, uint64_t,
+                z0 = svhsub_n_u64_m (p0, z0, x0),
+                z0 = svhsub_m (p0, z0, x0))
+
+/*
+** hsub_x0_u64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     uhsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_x0_u64_m_untied, svuint64_t, uint64_t,
+                z0 = svhsub_n_u64_m (p0, z1, x0),
+                z0 = svhsub_m (p0, z1, x0))
+
+/*
+** hsub_11_u64_m_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     uhsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u64_m_tied1, svuint64_t,
+               z0 = svhsub_n_u64_m (p0, z0, 11),
+               z0 = svhsub_m (p0, z0, 11))
+
+/*
+** hsub_11_u64_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     uhsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u64_m_untied, svuint64_t,
+               z0 = svhsub_n_u64_m (p0, z1, 11),
+               z0 = svhsub_m (p0, z1, 11))
+
+/*
+** hsub_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uhsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u64_z_tied1, svuint64_t,
+               z0 = svhsub_u64_z (p0, z0, z1),
+               z0 = svhsub_z (p0, z0, z1))
+
+/*
+** hsub_u64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uhsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u64_z_tied2, svuint64_t,
+               z0 = svhsub_u64_z (p0, z1, z0),
+               z0 = svhsub_z (p0, z1, z0))
+
+/*
+** hsub_u64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uhsub   z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0\.d, p0/z, z2\.d
+**     uhsubr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u64_z_untied, svuint64_t,
+               z0 = svhsub_u64_z (p0, z1, z2),
+               z0 = svhsub_z (p0, z1, z2))
+
+/*
+** hsub_x0_u64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     uhsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_x0_u64_z_tied1, svuint64_t, uint64_t,
+                z0 = svhsub_n_u64_z (p0, z0, x0),
+                z0 = svhsub_z (p0, z0, x0))
+
+/*
+** hsub_x0_u64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uhsub   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     uhsubr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_x0_u64_z_untied, svuint64_t, uint64_t,
+                z0 = svhsub_n_u64_z (p0, z1, x0),
+                z0 = svhsub_z (p0, z1, x0))
+
+/*
+** hsub_11_u64_z_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0\.d, p0/z, z0\.d
+**     uhsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u64_z_tied1, svuint64_t,
+               z0 = svhsub_n_u64_z (p0, z0, 11),
+               z0 = svhsub_z (p0, z0, 11))
+
+/*
+** hsub_11_u64_z_untied:
+**     mov     (z[0-9]+\.d), #11
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uhsub   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     uhsubr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u64_z_untied, svuint64_t,
+               z0 = svhsub_n_u64_z (p0, z1, 11),
+               z0 = svhsub_z (p0, z1, 11))
+
+/*
+** hsub_u64_x_tied1:
+**     uhsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u64_x_tied1, svuint64_t,
+               z0 = svhsub_u64_x (p0, z0, z1),
+               z0 = svhsub_x (p0, z0, z1))
+
+/*
+** hsub_u64_x_tied2:
+**     uhsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u64_x_tied2, svuint64_t,
+               z0 = svhsub_u64_x (p0, z1, z0),
+               z0 = svhsub_x (p0, z1, z0))
+
+/*
+** hsub_u64_x_untied:
+** (
+**     movprfx z0, z1
+**     uhsub   z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0, z2
+**     uhsubr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u64_x_untied, svuint64_t,
+               z0 = svhsub_u64_x (p0, z1, z2),
+               z0 = svhsub_x (p0, z1, z2))
+
+/*
+** hsub_x0_u64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     uhsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_x0_u64_x_tied1, svuint64_t, uint64_t,
+                z0 = svhsub_n_u64_x (p0, z0, x0),
+                z0 = svhsub_x (p0, z0, x0))
+
+/*
+** hsub_x0_u64_x_untied:
+**     mov     z0\.d, x0
+**     uhsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_x0_u64_x_untied, svuint64_t, uint64_t,
+                z0 = svhsub_n_u64_x (p0, z1, x0),
+                z0 = svhsub_x (p0, z1, x0))
+
+/*
+** hsub_11_u64_x_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     uhsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u64_x_tied1, svuint64_t,
+               z0 = svhsub_n_u64_x (p0, z0, 11),
+               z0 = svhsub_x (p0, z0, 11))
+
+/*
+** hsub_11_u64_x_untied:
+**     mov     z0\.d, #11
+**     uhsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u64_x_untied, svuint64_t,
+               z0 = svhsub_n_u64_x (p0, z1, 11),
+               z0 = svhsub_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsub_u8.c
new file mode 100644 (file)
index 0000000..a801132
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hsub_u8_m_tied1:
+**     uhsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u8_m_tied1, svuint8_t,
+               z0 = svhsub_u8_m (p0, z0, z1),
+               z0 = svhsub_m (p0, z0, z1))
+
+/*
+** hsub_u8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uhsub   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u8_m_tied2, svuint8_t,
+               z0 = svhsub_u8_m (p0, z1, z0),
+               z0 = svhsub_m (p0, z1, z0))
+
+/*
+** hsub_u8_m_untied:
+**     movprfx z0, z1
+**     uhsub   z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u8_m_untied, svuint8_t,
+               z0 = svhsub_u8_m (p0, z1, z2),
+               z0 = svhsub_m (p0, z1, z2))
+
+/*
+** hsub_w0_u8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uhsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_u8_m_tied1, svuint8_t, uint8_t,
+                z0 = svhsub_n_u8_m (p0, z0, x0),
+                z0 = svhsub_m (p0, z0, x0))
+
+/*
+** hsub_w0_u8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     uhsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_u8_m_untied, svuint8_t, uint8_t,
+                z0 = svhsub_n_u8_m (p0, z1, x0),
+                z0 = svhsub_m (p0, z1, x0))
+
+/*
+** hsub_11_u8_m_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     uhsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u8_m_tied1, svuint8_t,
+               z0 = svhsub_n_u8_m (p0, z0, 11),
+               z0 = svhsub_m (p0, z0, 11))
+
+/*
+** hsub_11_u8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     uhsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u8_m_untied, svuint8_t,
+               z0 = svhsub_n_u8_m (p0, z1, 11),
+               z0 = svhsub_m (p0, z1, 11))
+
+/*
+** hsub_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uhsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u8_z_tied1, svuint8_t,
+               z0 = svhsub_u8_z (p0, z0, z1),
+               z0 = svhsub_z (p0, z0, z1))
+
+/*
+** hsub_u8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uhsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u8_z_tied2, svuint8_t,
+               z0 = svhsub_u8_z (p0, z1, z0),
+               z0 = svhsub_z (p0, z1, z0))
+
+/*
+** hsub_u8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uhsub   z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0\.b, p0/z, z2\.b
+**     uhsubr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u8_z_untied, svuint8_t,
+               z0 = svhsub_u8_z (p0, z1, z2),
+               z0 = svhsub_z (p0, z1, z2))
+
+/*
+** hsub_w0_u8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     uhsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_u8_z_tied1, svuint8_t, uint8_t,
+                z0 = svhsub_n_u8_z (p0, z0, x0),
+                z0 = svhsub_z (p0, z0, x0))
+
+/*
+** hsub_w0_u8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uhsub   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     uhsubr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_u8_z_untied, svuint8_t, uint8_t,
+                z0 = svhsub_n_u8_z (p0, z1, x0),
+                z0 = svhsub_z (p0, z1, x0))
+
+/*
+** hsub_11_u8_z_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0\.b, p0/z, z0\.b
+**     uhsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u8_z_tied1, svuint8_t,
+               z0 = svhsub_n_u8_z (p0, z0, 11),
+               z0 = svhsub_z (p0, z0, 11))
+
+/*
+** hsub_11_u8_z_untied:
+**     mov     (z[0-9]+\.b), #11
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uhsub   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     uhsubr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u8_z_untied, svuint8_t,
+               z0 = svhsub_n_u8_z (p0, z1, 11),
+               z0 = svhsub_z (p0, z1, 11))
+
+/*
+** hsub_u8_x_tied1:
+**     uhsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u8_x_tied1, svuint8_t,
+               z0 = svhsub_u8_x (p0, z0, z1),
+               z0 = svhsub_x (p0, z0, z1))
+
+/*
+** hsub_u8_x_tied2:
+**     uhsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u8_x_tied2, svuint8_t,
+               z0 = svhsub_u8_x (p0, z1, z0),
+               z0 = svhsub_x (p0, z1, z0))
+
+/*
+** hsub_u8_x_untied:
+** (
+**     movprfx z0, z1
+**     uhsub   z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0, z2
+**     uhsubr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_u8_x_untied, svuint8_t,
+               z0 = svhsub_u8_x (p0, z1, z2),
+               z0 = svhsub_x (p0, z1, z2))
+
+/*
+** hsub_w0_u8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uhsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_u8_x_tied1, svuint8_t, uint8_t,
+                z0 = svhsub_n_u8_x (p0, z0, x0),
+                z0 = svhsub_x (p0, z0, x0))
+
+/*
+** hsub_w0_u8_x_untied:
+**     mov     z0\.b, w0
+**     uhsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_ZX (hsub_w0_u8_x_untied, svuint8_t, uint8_t,
+                z0 = svhsub_n_u8_x (p0, z1, x0),
+                z0 = svhsub_x (p0, z1, x0))
+
+/*
+** hsub_11_u8_x_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     uhsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u8_x_tied1, svuint8_t,
+               z0 = svhsub_n_u8_x (p0, z0, 11),
+               z0 = svhsub_x (p0, z0, 11))
+
+/*
+** hsub_11_u8_x_untied:
+**     mov     z0\.b, #11
+**     uhsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsub_11_u8_x_untied, svuint8_t,
+               z0 = svhsub_n_u8_x (p0, z1, 11),
+               z0 = svhsub_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_s16.c
new file mode 100644 (file)
index 0000000..af1bfdd
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hsubr_s16_m_tied1:
+**     shsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s16_m_tied1, svint16_t,
+               z0 = svhsubr_s16_m (p0, z0, z1),
+               z0 = svhsubr_m (p0, z0, z1))
+
+/*
+** hsubr_s16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     shsubr  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s16_m_tied2, svint16_t,
+               z0 = svhsubr_s16_m (p0, z1, z0),
+               z0 = svhsubr_m (p0, z1, z0))
+
+/*
+** hsubr_s16_m_untied:
+**     movprfx z0, z1
+**     shsubr  z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s16_m_untied, svint16_t,
+               z0 = svhsubr_s16_m (p0, z1, z2),
+               z0 = svhsubr_m (p0, z1, z2))
+
+/*
+** hsubr_w0_s16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     shsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_s16_m_tied1, svint16_t, int16_t,
+                z0 = svhsubr_n_s16_m (p0, z0, x0),
+                z0 = svhsubr_m (p0, z0, x0))
+
+/*
+** hsubr_w0_s16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     shsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_s16_m_untied, svint16_t, int16_t,
+                z0 = svhsubr_n_s16_m (p0, z1, x0),
+                z0 = svhsubr_m (p0, z1, x0))
+
+/*
+** hsubr_11_s16_m_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     shsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s16_m_tied1, svint16_t,
+               z0 = svhsubr_n_s16_m (p0, z0, 11),
+               z0 = svhsubr_m (p0, z0, 11))
+
+/*
+** hsubr_11_s16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     shsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s16_m_untied, svint16_t,
+               z0 = svhsubr_n_s16_m (p0, z1, 11),
+               z0 = svhsubr_m (p0, z1, 11))
+
+/*
+** hsubr_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     shsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s16_z_tied1, svint16_t,
+               z0 = svhsubr_s16_z (p0, z0, z1),
+               z0 = svhsubr_z (p0, z0, z1))
+
+/*
+** hsubr_s16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     shsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s16_z_tied2, svint16_t,
+               z0 = svhsubr_s16_z (p0, z1, z0),
+               z0 = svhsubr_z (p0, z1, z0))
+
+/*
+** hsubr_s16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     shsubr  z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0\.h, p0/z, z2\.h
+**     shsub   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s16_z_untied, svint16_t,
+               z0 = svhsubr_s16_z (p0, z1, z2),
+               z0 = svhsubr_z (p0, z1, z2))
+
+/*
+** hsubr_w0_s16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     shsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_s16_z_tied1, svint16_t, int16_t,
+                z0 = svhsubr_n_s16_z (p0, z0, x0),
+                z0 = svhsubr_z (p0, z0, x0))
+
+/*
+** hsubr_w0_s16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     shsubr  z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     shsub   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_s16_z_untied, svint16_t, int16_t,
+                z0 = svhsubr_n_s16_z (p0, z1, x0),
+                z0 = svhsubr_z (p0, z1, x0))
+
+/*
+** hsubr_11_s16_z_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0\.h, p0/z, z0\.h
+**     shsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s16_z_tied1, svint16_t,
+               z0 = svhsubr_n_s16_z (p0, z0, 11),
+               z0 = svhsubr_z (p0, z0, 11))
+
+/*
+** hsubr_11_s16_z_untied:
+**     mov     (z[0-9]+\.h), #11
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     shsubr  z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     shsub   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s16_z_untied, svint16_t,
+               z0 = svhsubr_n_s16_z (p0, z1, 11),
+               z0 = svhsubr_z (p0, z1, 11))
+
+/*
+** hsubr_s16_x_tied1:
+**     shsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s16_x_tied1, svint16_t,
+               z0 = svhsubr_s16_x (p0, z0, z1),
+               z0 = svhsubr_x (p0, z0, z1))
+
+/*
+** hsubr_s16_x_tied2:
+**     shsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s16_x_tied2, svint16_t,
+               z0 = svhsubr_s16_x (p0, z1, z0),
+               z0 = svhsubr_x (p0, z1, z0))
+
+/*
+** hsubr_s16_x_untied:
+** (
+**     movprfx z0, z1
+**     shsubr  z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0, z2
+**     shsub   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s16_x_untied, svint16_t,
+               z0 = svhsubr_s16_x (p0, z1, z2),
+               z0 = svhsubr_x (p0, z1, z2))
+
+/*
+** hsubr_w0_s16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     shsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_s16_x_tied1, svint16_t, int16_t,
+                z0 = svhsubr_n_s16_x (p0, z0, x0),
+                z0 = svhsubr_x (p0, z0, x0))
+
+/*
+** hsubr_w0_s16_x_untied:
+**     mov     z0\.h, w0
+**     shsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_s16_x_untied, svint16_t, int16_t,
+                z0 = svhsubr_n_s16_x (p0, z1, x0),
+                z0 = svhsubr_x (p0, z1, x0))
+
+/*
+** hsubr_11_s16_x_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     shsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s16_x_tied1, svint16_t,
+               z0 = svhsubr_n_s16_x (p0, z0, 11),
+               z0 = svhsubr_x (p0, z0, 11))
+
+/*
+** hsubr_11_s16_x_untied:
+**     mov     z0\.h, #11
+**     shsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s16_x_untied, svint16_t,
+               z0 = svhsubr_n_s16_x (p0, z1, 11),
+               z0 = svhsubr_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_s32.c
new file mode 100644 (file)
index 0000000..029a0c1
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hsubr_s32_m_tied1:
+**     shsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s32_m_tied1, svint32_t,
+               z0 = svhsubr_s32_m (p0, z0, z1),
+               z0 = svhsubr_m (p0, z0, z1))
+
+/*
+** hsubr_s32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     shsubr  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s32_m_tied2, svint32_t,
+               z0 = svhsubr_s32_m (p0, z1, z0),
+               z0 = svhsubr_m (p0, z1, z0))
+
+/*
+** hsubr_s32_m_untied:
+**     movprfx z0, z1
+**     shsubr  z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s32_m_untied, svint32_t,
+               z0 = svhsubr_s32_m (p0, z1, z2),
+               z0 = svhsubr_m (p0, z1, z2))
+
+/*
+** hsubr_w0_s32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     shsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_s32_m_tied1, svint32_t, int32_t,
+                z0 = svhsubr_n_s32_m (p0, z0, x0),
+                z0 = svhsubr_m (p0, z0, x0))
+
+/*
+** hsubr_w0_s32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     shsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_s32_m_untied, svint32_t, int32_t,
+                z0 = svhsubr_n_s32_m (p0, z1, x0),
+                z0 = svhsubr_m (p0, z1, x0))
+
+/*
+** hsubr_11_s32_m_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     shsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s32_m_tied1, svint32_t,
+               z0 = svhsubr_n_s32_m (p0, z0, 11),
+               z0 = svhsubr_m (p0, z0, 11))
+
+/*
+** hsubr_11_s32_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     shsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s32_m_untied, svint32_t,
+               z0 = svhsubr_n_s32_m (p0, z1, 11),
+               z0 = svhsubr_m (p0, z1, 11))
+
+/*
+** hsubr_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     shsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s32_z_tied1, svint32_t,
+               z0 = svhsubr_s32_z (p0, z0, z1),
+               z0 = svhsubr_z (p0, z0, z1))
+
+/*
+** hsubr_s32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     shsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s32_z_tied2, svint32_t,
+               z0 = svhsubr_s32_z (p0, z1, z0),
+               z0 = svhsubr_z (p0, z1, z0))
+
+/*
+** hsubr_s32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     shsubr  z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0\.s, p0/z, z2\.s
+**     shsub   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s32_z_untied, svint32_t,
+               z0 = svhsubr_s32_z (p0, z1, z2),
+               z0 = svhsubr_z (p0, z1, z2))
+
+/*
+** hsubr_w0_s32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     shsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_s32_z_tied1, svint32_t, int32_t,
+                z0 = svhsubr_n_s32_z (p0, z0, x0),
+                z0 = svhsubr_z (p0, z0, x0))
+
+/*
+** hsubr_w0_s32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     shsubr  z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     shsub   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_s32_z_untied, svint32_t, int32_t,
+                z0 = svhsubr_n_s32_z (p0, z1, x0),
+                z0 = svhsubr_z (p0, z1, x0))
+
+/*
+** hsubr_11_s32_z_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0\.s, p0/z, z0\.s
+**     shsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s32_z_tied1, svint32_t,
+               z0 = svhsubr_n_s32_z (p0, z0, 11),
+               z0 = svhsubr_z (p0, z0, 11))
+
+/*
+** hsubr_11_s32_z_untied:
+**     mov     (z[0-9]+\.s), #11
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     shsubr  z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     shsub   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s32_z_untied, svint32_t,
+               z0 = svhsubr_n_s32_z (p0, z1, 11),
+               z0 = svhsubr_z (p0, z1, 11))
+
+/*
+** hsubr_s32_x_tied1:
+**     shsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s32_x_tied1, svint32_t,
+               z0 = svhsubr_s32_x (p0, z0, z1),
+               z0 = svhsubr_x (p0, z0, z1))
+
+/*
+** hsubr_s32_x_tied2:
+**     shsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s32_x_tied2, svint32_t,
+               z0 = svhsubr_s32_x (p0, z1, z0),
+               z0 = svhsubr_x (p0, z1, z0))
+
+/*
+** hsubr_s32_x_untied:
+** (
+**     movprfx z0, z1
+**     shsubr  z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0, z2
+**     shsub   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s32_x_untied, svint32_t,
+               z0 = svhsubr_s32_x (p0, z1, z2),
+               z0 = svhsubr_x (p0, z1, z2))
+
+/*
+** hsubr_w0_s32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     shsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_s32_x_tied1, svint32_t, int32_t,
+                z0 = svhsubr_n_s32_x (p0, z0, x0),
+                z0 = svhsubr_x (p0, z0, x0))
+
+/*
+** hsubr_w0_s32_x_untied:
+**     mov     z0\.s, w0
+**     shsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_s32_x_untied, svint32_t, int32_t,
+                z0 = svhsubr_n_s32_x (p0, z1, x0),
+                z0 = svhsubr_x (p0, z1, x0))
+
+/*
+** hsubr_11_s32_x_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     shsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s32_x_tied1, svint32_t,
+               z0 = svhsubr_n_s32_x (p0, z0, 11),
+               z0 = svhsubr_x (p0, z0, 11))
+
+/*
+** hsubr_11_s32_x_untied:
+**     mov     z0\.s, #11
+**     shsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s32_x_untied, svint32_t,
+               z0 = svhsubr_n_s32_x (p0, z1, 11),
+               z0 = svhsubr_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_s64.c
new file mode 100644 (file)
index 0000000..7bddc71
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hsubr_s64_m_tied1:
+**     shsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s64_m_tied1, svint64_t,
+               z0 = svhsubr_s64_m (p0, z0, z1),
+               z0 = svhsubr_m (p0, z0, z1))
+
+/*
+** hsubr_s64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     shsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s64_m_tied2, svint64_t,
+               z0 = svhsubr_s64_m (p0, z1, z0),
+               z0 = svhsubr_m (p0, z1, z0))
+
+/*
+** hsubr_s64_m_untied:
+**     movprfx z0, z1
+**     shsubr  z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s64_m_untied, svint64_t,
+               z0 = svhsubr_s64_m (p0, z1, z2),
+               z0 = svhsubr_m (p0, z1, z2))
+
+/*
+** hsubr_x0_s64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     shsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_x0_s64_m_tied1, svint64_t, int64_t,
+                z0 = svhsubr_n_s64_m (p0, z0, x0),
+                z0 = svhsubr_m (p0, z0, x0))
+
+/*
+** hsubr_x0_s64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     shsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_x0_s64_m_untied, svint64_t, int64_t,
+                z0 = svhsubr_n_s64_m (p0, z1, x0),
+                z0 = svhsubr_m (p0, z1, x0))
+
+/*
+** hsubr_11_s64_m_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     shsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s64_m_tied1, svint64_t,
+               z0 = svhsubr_n_s64_m (p0, z0, 11),
+               z0 = svhsubr_m (p0, z0, 11))
+
+/*
+** hsubr_11_s64_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     shsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s64_m_untied, svint64_t,
+               z0 = svhsubr_n_s64_m (p0, z1, 11),
+               z0 = svhsubr_m (p0, z1, 11))
+
+/*
+** hsubr_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     shsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s64_z_tied1, svint64_t,
+               z0 = svhsubr_s64_z (p0, z0, z1),
+               z0 = svhsubr_z (p0, z0, z1))
+
+/*
+** hsubr_s64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     shsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s64_z_tied2, svint64_t,
+               z0 = svhsubr_s64_z (p0, z1, z0),
+               z0 = svhsubr_z (p0, z1, z0))
+
+/*
+** hsubr_s64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     shsubr  z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0\.d, p0/z, z2\.d
+**     shsub   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s64_z_untied, svint64_t,
+               z0 = svhsubr_s64_z (p0, z1, z2),
+               z0 = svhsubr_z (p0, z1, z2))
+
+/*
+** hsubr_x0_s64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     shsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_x0_s64_z_tied1, svint64_t, int64_t,
+                z0 = svhsubr_n_s64_z (p0, z0, x0),
+                z0 = svhsubr_z (p0, z0, x0))
+
+/*
+** hsubr_x0_s64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     shsubr  z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     shsub   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_x0_s64_z_untied, svint64_t, int64_t,
+                z0 = svhsubr_n_s64_z (p0, z1, x0),
+                z0 = svhsubr_z (p0, z1, x0))
+
+/*
+** hsubr_11_s64_z_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0\.d, p0/z, z0\.d
+**     shsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s64_z_tied1, svint64_t,
+               z0 = svhsubr_n_s64_z (p0, z0, 11),
+               z0 = svhsubr_z (p0, z0, 11))
+
+/*
+** hsubr_11_s64_z_untied:
+**     mov     (z[0-9]+\.d), #11
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     shsubr  z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     shsub   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s64_z_untied, svint64_t,
+               z0 = svhsubr_n_s64_z (p0, z1, 11),
+               z0 = svhsubr_z (p0, z1, 11))
+
+/*
+** hsubr_s64_x_tied1:
+**     shsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s64_x_tied1, svint64_t,
+               z0 = svhsubr_s64_x (p0, z0, z1),
+               z0 = svhsubr_x (p0, z0, z1))
+
+/*
+** hsubr_s64_x_tied2:
+**     shsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s64_x_tied2, svint64_t,
+               z0 = svhsubr_s64_x (p0, z1, z0),
+               z0 = svhsubr_x (p0, z1, z0))
+
+/*
+** hsubr_s64_x_untied:
+** (
+**     movprfx z0, z1
+**     shsubr  z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0, z2
+**     shsub   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s64_x_untied, svint64_t,
+               z0 = svhsubr_s64_x (p0, z1, z2),
+               z0 = svhsubr_x (p0, z1, z2))
+
+/*
+** hsubr_x0_s64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     shsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_x0_s64_x_tied1, svint64_t, int64_t,
+                z0 = svhsubr_n_s64_x (p0, z0, x0),
+                z0 = svhsubr_x (p0, z0, x0))
+
+/*
+** hsubr_x0_s64_x_untied:
+**     mov     z0\.d, x0
+**     shsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_x0_s64_x_untied, svint64_t, int64_t,
+                z0 = svhsubr_n_s64_x (p0, z1, x0),
+                z0 = svhsubr_x (p0, z1, x0))
+
+/*
+** hsubr_11_s64_x_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     shsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s64_x_tied1, svint64_t,
+               z0 = svhsubr_n_s64_x (p0, z0, 11),
+               z0 = svhsubr_x (p0, z0, 11))
+
+/*
+** hsubr_11_s64_x_untied:
+**     mov     z0\.d, #11
+**     shsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s64_x_untied, svint64_t,
+               z0 = svhsubr_n_s64_x (p0, z1, 11),
+               z0 = svhsubr_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_s8.c
new file mode 100644 (file)
index 0000000..9e3de23
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hsubr_s8_m_tied1:
+**     shsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s8_m_tied1, svint8_t,
+               z0 = svhsubr_s8_m (p0, z0, z1),
+               z0 = svhsubr_m (p0, z0, z1))
+
+/*
+** hsubr_s8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     shsubr  z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s8_m_tied2, svint8_t,
+               z0 = svhsubr_s8_m (p0, z1, z0),
+               z0 = svhsubr_m (p0, z1, z0))
+
+/*
+** hsubr_s8_m_untied:
+**     movprfx z0, z1
+**     shsubr  z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s8_m_untied, svint8_t,
+               z0 = svhsubr_s8_m (p0, z1, z2),
+               z0 = svhsubr_m (p0, z1, z2))
+
+/*
+** hsubr_w0_s8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     shsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_s8_m_tied1, svint8_t, int8_t,
+                z0 = svhsubr_n_s8_m (p0, z0, x0),
+                z0 = svhsubr_m (p0, z0, x0))
+
+/*
+** hsubr_w0_s8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     shsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_s8_m_untied, svint8_t, int8_t,
+                z0 = svhsubr_n_s8_m (p0, z1, x0),
+                z0 = svhsubr_m (p0, z1, x0))
+
+/*
+** hsubr_11_s8_m_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     shsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s8_m_tied1, svint8_t,
+               z0 = svhsubr_n_s8_m (p0, z0, 11),
+               z0 = svhsubr_m (p0, z0, 11))
+
+/*
+** hsubr_11_s8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     shsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s8_m_untied, svint8_t,
+               z0 = svhsubr_n_s8_m (p0, z1, 11),
+               z0 = svhsubr_m (p0, z1, 11))
+
+/*
+** hsubr_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     shsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s8_z_tied1, svint8_t,
+               z0 = svhsubr_s8_z (p0, z0, z1),
+               z0 = svhsubr_z (p0, z0, z1))
+
+/*
+** hsubr_s8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     shsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s8_z_tied2, svint8_t,
+               z0 = svhsubr_s8_z (p0, z1, z0),
+               z0 = svhsubr_z (p0, z1, z0))
+
+/*
+** hsubr_s8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     shsubr  z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0\.b, p0/z, z2\.b
+**     shsub   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s8_z_untied, svint8_t,
+               z0 = svhsubr_s8_z (p0, z1, z2),
+               z0 = svhsubr_z (p0, z1, z2))
+
+/*
+** hsubr_w0_s8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     shsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_s8_z_tied1, svint8_t, int8_t,
+                z0 = svhsubr_n_s8_z (p0, z0, x0),
+                z0 = svhsubr_z (p0, z0, x0))
+
+/*
+** hsubr_w0_s8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     shsubr  z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     shsub   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_s8_z_untied, svint8_t, int8_t,
+                z0 = svhsubr_n_s8_z (p0, z1, x0),
+                z0 = svhsubr_z (p0, z1, x0))
+
+/*
+** hsubr_11_s8_z_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0\.b, p0/z, z0\.b
+**     shsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s8_z_tied1, svint8_t,
+               z0 = svhsubr_n_s8_z (p0, z0, 11),
+               z0 = svhsubr_z (p0, z0, 11))
+
+/*
+** hsubr_11_s8_z_untied:
+**     mov     (z[0-9]+\.b), #11
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     shsubr  z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     shsub   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s8_z_untied, svint8_t,
+               z0 = svhsubr_n_s8_z (p0, z1, 11),
+               z0 = svhsubr_z (p0, z1, 11))
+
+/*
+** hsubr_s8_x_tied1:
+**     shsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s8_x_tied1, svint8_t,
+               z0 = svhsubr_s8_x (p0, z0, z1),
+               z0 = svhsubr_x (p0, z0, z1))
+
+/*
+** hsubr_s8_x_tied2:
+**     shsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s8_x_tied2, svint8_t,
+               z0 = svhsubr_s8_x (p0, z1, z0),
+               z0 = svhsubr_x (p0, z1, z0))
+
+/*
+** hsubr_s8_x_untied:
+** (
+**     movprfx z0, z1
+**     shsubr  z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0, z2
+**     shsub   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_s8_x_untied, svint8_t,
+               z0 = svhsubr_s8_x (p0, z1, z2),
+               z0 = svhsubr_x (p0, z1, z2))
+
+/*
+** hsubr_w0_s8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     shsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_s8_x_tied1, svint8_t, int8_t,
+                z0 = svhsubr_n_s8_x (p0, z0, x0),
+                z0 = svhsubr_x (p0, z0, x0))
+
+/*
+** hsubr_w0_s8_x_untied:
+**     mov     z0\.b, w0
+**     shsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_s8_x_untied, svint8_t, int8_t,
+                z0 = svhsubr_n_s8_x (p0, z1, x0),
+                z0 = svhsubr_x (p0, z1, x0))
+
+/*
+** hsubr_11_s8_x_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     shsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s8_x_tied1, svint8_t,
+               z0 = svhsubr_n_s8_x (p0, z0, 11),
+               z0 = svhsubr_x (p0, z0, 11))
+
+/*
+** hsubr_11_s8_x_untied:
+**     mov     z0\.b, #11
+**     shsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_s8_x_untied, svint8_t,
+               z0 = svhsubr_n_s8_x (p0, z1, 11),
+               z0 = svhsubr_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_u16.c
new file mode 100644 (file)
index 0000000..d1095de
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hsubr_u16_m_tied1:
+**     uhsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u16_m_tied1, svuint16_t,
+               z0 = svhsubr_u16_m (p0, z0, z1),
+               z0 = svhsubr_m (p0, z0, z1))
+
+/*
+** hsubr_u16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uhsubr  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u16_m_tied2, svuint16_t,
+               z0 = svhsubr_u16_m (p0, z1, z0),
+               z0 = svhsubr_m (p0, z1, z0))
+
+/*
+** hsubr_u16_m_untied:
+**     movprfx z0, z1
+**     uhsubr  z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u16_m_untied, svuint16_t,
+               z0 = svhsubr_u16_m (p0, z1, z2),
+               z0 = svhsubr_m (p0, z1, z2))
+
+/*
+** hsubr_w0_u16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uhsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_u16_m_tied1, svuint16_t, uint16_t,
+                z0 = svhsubr_n_u16_m (p0, z0, x0),
+                z0 = svhsubr_m (p0, z0, x0))
+
+/*
+** hsubr_w0_u16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     uhsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_u16_m_untied, svuint16_t, uint16_t,
+                z0 = svhsubr_n_u16_m (p0, z1, x0),
+                z0 = svhsubr_m (p0, z1, x0))
+
+/*
+** hsubr_11_u16_m_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     uhsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u16_m_tied1, svuint16_t,
+               z0 = svhsubr_n_u16_m (p0, z0, 11),
+               z0 = svhsubr_m (p0, z0, 11))
+
+/*
+** hsubr_11_u16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     uhsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u16_m_untied, svuint16_t,
+               z0 = svhsubr_n_u16_m (p0, z1, 11),
+               z0 = svhsubr_m (p0, z1, 11))
+
+/*
+** hsubr_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uhsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u16_z_tied1, svuint16_t,
+               z0 = svhsubr_u16_z (p0, z0, z1),
+               z0 = svhsubr_z (p0, z0, z1))
+
+/*
+** hsubr_u16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uhsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u16_z_tied2, svuint16_t,
+               z0 = svhsubr_u16_z (p0, z1, z0),
+               z0 = svhsubr_z (p0, z1, z0))
+
+/*
+** hsubr_u16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uhsubr  z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0\.h, p0/z, z2\.h
+**     uhsub   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u16_z_untied, svuint16_t,
+               z0 = svhsubr_u16_z (p0, z1, z2),
+               z0 = svhsubr_z (p0, z1, z2))
+
+/*
+** hsubr_w0_u16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     uhsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_u16_z_tied1, svuint16_t, uint16_t,
+                z0 = svhsubr_n_u16_z (p0, z0, x0),
+                z0 = svhsubr_z (p0, z0, x0))
+
+/*
+** hsubr_w0_u16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uhsubr  z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     uhsub   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_u16_z_untied, svuint16_t, uint16_t,
+                z0 = svhsubr_n_u16_z (p0, z1, x0),
+                z0 = svhsubr_z (p0, z1, x0))
+
+/*
+** hsubr_11_u16_z_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0\.h, p0/z, z0\.h
+**     uhsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u16_z_tied1, svuint16_t,
+               z0 = svhsubr_n_u16_z (p0, z0, 11),
+               z0 = svhsubr_z (p0, z0, 11))
+
+/*
+** hsubr_11_u16_z_untied:
+**     mov     (z[0-9]+\.h), #11
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uhsubr  z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     uhsub   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u16_z_untied, svuint16_t,
+               z0 = svhsubr_n_u16_z (p0, z1, 11),
+               z0 = svhsubr_z (p0, z1, 11))
+
+/*
+** hsubr_u16_x_tied1:
+**     uhsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u16_x_tied1, svuint16_t,
+               z0 = svhsubr_u16_x (p0, z0, z1),
+               z0 = svhsubr_x (p0, z0, z1))
+
+/*
+** hsubr_u16_x_tied2:
+**     uhsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u16_x_tied2, svuint16_t,
+               z0 = svhsubr_u16_x (p0, z1, z0),
+               z0 = svhsubr_x (p0, z1, z0))
+
+/*
+** hsubr_u16_x_untied:
+** (
+**     movprfx z0, z1
+**     uhsubr  z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0, z2
+**     uhsub   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u16_x_untied, svuint16_t,
+               z0 = svhsubr_u16_x (p0, z1, z2),
+               z0 = svhsubr_x (p0, z1, z2))
+
+/*
+** hsubr_w0_u16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uhsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_u16_x_tied1, svuint16_t, uint16_t,
+                z0 = svhsubr_n_u16_x (p0, z0, x0),
+                z0 = svhsubr_x (p0, z0, x0))
+
+/*
+** hsubr_w0_u16_x_untied:
+**     mov     z0\.h, w0
+**     uhsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_u16_x_untied, svuint16_t, uint16_t,
+                z0 = svhsubr_n_u16_x (p0, z1, x0),
+                z0 = svhsubr_x (p0, z1, x0))
+
+/*
+** hsubr_11_u16_x_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     uhsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u16_x_tied1, svuint16_t,
+               z0 = svhsubr_n_u16_x (p0, z0, 11),
+               z0 = svhsubr_x (p0, z0, 11))
+
+/*
+** hsubr_11_u16_x_untied:
+**     mov     z0\.h, #11
+**     uhsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u16_x_untied, svuint16_t,
+               z0 = svhsubr_n_u16_x (p0, z1, 11),
+               z0 = svhsubr_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_u32.c
new file mode 100644 (file)
index 0000000..dab1ce8
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hsubr_u32_m_tied1:
+**     uhsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u32_m_tied1, svuint32_t,
+               z0 = svhsubr_u32_m (p0, z0, z1),
+               z0 = svhsubr_m (p0, z0, z1))
+
+/*
+** hsubr_u32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uhsubr  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u32_m_tied2, svuint32_t,
+               z0 = svhsubr_u32_m (p0, z1, z0),
+               z0 = svhsubr_m (p0, z1, z0))
+
+/*
+** hsubr_u32_m_untied:
+**     movprfx z0, z1
+**     uhsubr  z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u32_m_untied, svuint32_t,
+               z0 = svhsubr_u32_m (p0, z1, z2),
+               z0 = svhsubr_m (p0, z1, z2))
+
+/*
+** hsubr_w0_u32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uhsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_u32_m_tied1, svuint32_t, uint32_t,
+                z0 = svhsubr_n_u32_m (p0, z0, x0),
+                z0 = svhsubr_m (p0, z0, x0))
+
+/*
+** hsubr_w0_u32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     uhsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_u32_m_untied, svuint32_t, uint32_t,
+                z0 = svhsubr_n_u32_m (p0, z1, x0),
+                z0 = svhsubr_m (p0, z1, x0))
+
+/*
+** hsubr_11_u32_m_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     uhsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u32_m_tied1, svuint32_t,
+               z0 = svhsubr_n_u32_m (p0, z0, 11),
+               z0 = svhsubr_m (p0, z0, 11))
+
+/*
+** hsubr_11_u32_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     uhsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u32_m_untied, svuint32_t,
+               z0 = svhsubr_n_u32_m (p0, z1, 11),
+               z0 = svhsubr_m (p0, z1, 11))
+
+/*
+** hsubr_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uhsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u32_z_tied1, svuint32_t,
+               z0 = svhsubr_u32_z (p0, z0, z1),
+               z0 = svhsubr_z (p0, z0, z1))
+
+/*
+** hsubr_u32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uhsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u32_z_tied2, svuint32_t,
+               z0 = svhsubr_u32_z (p0, z1, z0),
+               z0 = svhsubr_z (p0, z1, z0))
+
+/*
+** hsubr_u32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uhsubr  z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0\.s, p0/z, z2\.s
+**     uhsub   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u32_z_untied, svuint32_t,
+               z0 = svhsubr_u32_z (p0, z1, z2),
+               z0 = svhsubr_z (p0, z1, z2))
+
+/*
+** hsubr_w0_u32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     uhsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_u32_z_tied1, svuint32_t, uint32_t,
+                z0 = svhsubr_n_u32_z (p0, z0, x0),
+                z0 = svhsubr_z (p0, z0, x0))
+
+/*
+** hsubr_w0_u32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uhsubr  z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     uhsub   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_u32_z_untied, svuint32_t, uint32_t,
+                z0 = svhsubr_n_u32_z (p0, z1, x0),
+                z0 = svhsubr_z (p0, z1, x0))
+
+/*
+** hsubr_11_u32_z_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0\.s, p0/z, z0\.s
+**     uhsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u32_z_tied1, svuint32_t,
+               z0 = svhsubr_n_u32_z (p0, z0, 11),
+               z0 = svhsubr_z (p0, z0, 11))
+
+/*
+** hsubr_11_u32_z_untied:
+**     mov     (z[0-9]+\.s), #11
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uhsubr  z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     uhsub   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u32_z_untied, svuint32_t,
+               z0 = svhsubr_n_u32_z (p0, z1, 11),
+               z0 = svhsubr_z (p0, z1, 11))
+
+/*
+** hsubr_u32_x_tied1:
+**     uhsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u32_x_tied1, svuint32_t,
+               z0 = svhsubr_u32_x (p0, z0, z1),
+               z0 = svhsubr_x (p0, z0, z1))
+
+/*
+** hsubr_u32_x_tied2:
+**     uhsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u32_x_tied2, svuint32_t,
+               z0 = svhsubr_u32_x (p0, z1, z0),
+               z0 = svhsubr_x (p0, z1, z0))
+
+/*
+** hsubr_u32_x_untied:
+** (
+**     movprfx z0, z1
+**     uhsubr  z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0, z2
+**     uhsub   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u32_x_untied, svuint32_t,
+               z0 = svhsubr_u32_x (p0, z1, z2),
+               z0 = svhsubr_x (p0, z1, z2))
+
+/*
+** hsubr_w0_u32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uhsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_u32_x_tied1, svuint32_t, uint32_t,
+                z0 = svhsubr_n_u32_x (p0, z0, x0),
+                z0 = svhsubr_x (p0, z0, x0))
+
+/*
+** hsubr_w0_u32_x_untied:
+**     mov     z0\.s, w0
+**     uhsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_u32_x_untied, svuint32_t, uint32_t,
+                z0 = svhsubr_n_u32_x (p0, z1, x0),
+                z0 = svhsubr_x (p0, z1, x0))
+
+/*
+** hsubr_11_u32_x_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     uhsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u32_x_tied1, svuint32_t,
+               z0 = svhsubr_n_u32_x (p0, z0, 11),
+               z0 = svhsubr_x (p0, z0, 11))
+
+/*
+** hsubr_11_u32_x_untied:
+**     mov     z0\.s, #11
+**     uhsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u32_x_untied, svuint32_t,
+               z0 = svhsubr_n_u32_x (p0, z1, 11),
+               z0 = svhsubr_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_u64.c
new file mode 100644 (file)
index 0000000..b9243b5
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hsubr_u64_m_tied1:
+**     uhsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u64_m_tied1, svuint64_t,
+               z0 = svhsubr_u64_m (p0, z0, z1),
+               z0 = svhsubr_m (p0, z0, z1))
+
+/*
+** hsubr_u64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     uhsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u64_m_tied2, svuint64_t,
+               z0 = svhsubr_u64_m (p0, z1, z0),
+               z0 = svhsubr_m (p0, z1, z0))
+
+/*
+** hsubr_u64_m_untied:
+**     movprfx z0, z1
+**     uhsubr  z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u64_m_untied, svuint64_t,
+               z0 = svhsubr_u64_m (p0, z1, z2),
+               z0 = svhsubr_m (p0, z1, z2))
+
+/*
+** hsubr_x0_u64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     uhsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_x0_u64_m_tied1, svuint64_t, uint64_t,
+                z0 = svhsubr_n_u64_m (p0, z0, x0),
+                z0 = svhsubr_m (p0, z0, x0))
+
+/*
+** hsubr_x0_u64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     uhsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_x0_u64_m_untied, svuint64_t, uint64_t,
+                z0 = svhsubr_n_u64_m (p0, z1, x0),
+                z0 = svhsubr_m (p0, z1, x0))
+
+/*
+** hsubr_11_u64_m_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     uhsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u64_m_tied1, svuint64_t,
+               z0 = svhsubr_n_u64_m (p0, z0, 11),
+               z0 = svhsubr_m (p0, z0, 11))
+
+/*
+** hsubr_11_u64_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     uhsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u64_m_untied, svuint64_t,
+               z0 = svhsubr_n_u64_m (p0, z1, 11),
+               z0 = svhsubr_m (p0, z1, 11))
+
+/*
+** hsubr_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uhsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u64_z_tied1, svuint64_t,
+               z0 = svhsubr_u64_z (p0, z0, z1),
+               z0 = svhsubr_z (p0, z0, z1))
+
+/*
+** hsubr_u64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uhsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u64_z_tied2, svuint64_t,
+               z0 = svhsubr_u64_z (p0, z1, z0),
+               z0 = svhsubr_z (p0, z1, z0))
+
+/*
+** hsubr_u64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uhsubr  z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0\.d, p0/z, z2\.d
+**     uhsub   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u64_z_untied, svuint64_t,
+               z0 = svhsubr_u64_z (p0, z1, z2),
+               z0 = svhsubr_z (p0, z1, z2))
+
+/*
+** hsubr_x0_u64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     uhsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_x0_u64_z_tied1, svuint64_t, uint64_t,
+                z0 = svhsubr_n_u64_z (p0, z0, x0),
+                z0 = svhsubr_z (p0, z0, x0))
+
+/*
+** hsubr_x0_u64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uhsubr  z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     uhsub   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_x0_u64_z_untied, svuint64_t, uint64_t,
+                z0 = svhsubr_n_u64_z (p0, z1, x0),
+                z0 = svhsubr_z (p0, z1, x0))
+
+/*
+** hsubr_11_u64_z_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0\.d, p0/z, z0\.d
+**     uhsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u64_z_tied1, svuint64_t,
+               z0 = svhsubr_n_u64_z (p0, z0, 11),
+               z0 = svhsubr_z (p0, z0, 11))
+
+/*
+** hsubr_11_u64_z_untied:
+**     mov     (z[0-9]+\.d), #11
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uhsubr  z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     uhsub   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u64_z_untied, svuint64_t,
+               z0 = svhsubr_n_u64_z (p0, z1, 11),
+               z0 = svhsubr_z (p0, z1, 11))
+
+/*
+** hsubr_u64_x_tied1:
+**     uhsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u64_x_tied1, svuint64_t,
+               z0 = svhsubr_u64_x (p0, z0, z1),
+               z0 = svhsubr_x (p0, z0, z1))
+
+/*
+** hsubr_u64_x_tied2:
+**     uhsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u64_x_tied2, svuint64_t,
+               z0 = svhsubr_u64_x (p0, z1, z0),
+               z0 = svhsubr_x (p0, z1, z0))
+
+/*
+** hsubr_u64_x_untied:
+** (
+**     movprfx z0, z1
+**     uhsubr  z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0, z2
+**     uhsub   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u64_x_untied, svuint64_t,
+               z0 = svhsubr_u64_x (p0, z1, z2),
+               z0 = svhsubr_x (p0, z1, z2))
+
+/*
+** hsubr_x0_u64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     uhsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_x0_u64_x_tied1, svuint64_t, uint64_t,
+                z0 = svhsubr_n_u64_x (p0, z0, x0),
+                z0 = svhsubr_x (p0, z0, x0))
+
+/*
+** hsubr_x0_u64_x_untied:
+**     mov     z0\.d, x0
+**     uhsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_x0_u64_x_untied, svuint64_t, uint64_t,
+                z0 = svhsubr_n_u64_x (p0, z1, x0),
+                z0 = svhsubr_x (p0, z1, x0))
+
+/*
+** hsubr_11_u64_x_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     uhsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u64_x_tied1, svuint64_t,
+               z0 = svhsubr_n_u64_x (p0, z0, 11),
+               z0 = svhsubr_x (p0, z0, 11))
+
+/*
+** hsubr_11_u64_x_untied:
+**     mov     z0\.d, #11
+**     uhsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u64_x_untied, svuint64_t,
+               z0 = svhsubr_n_u64_x (p0, z1, 11),
+               z0 = svhsubr_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/hsubr_u8.c
new file mode 100644 (file)
index 0000000..8c4f0a7
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** hsubr_u8_m_tied1:
+**     uhsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u8_m_tied1, svuint8_t,
+               z0 = svhsubr_u8_m (p0, z0, z1),
+               z0 = svhsubr_m (p0, z0, z1))
+
+/*
+** hsubr_u8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uhsubr  z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u8_m_tied2, svuint8_t,
+               z0 = svhsubr_u8_m (p0, z1, z0),
+               z0 = svhsubr_m (p0, z1, z0))
+
+/*
+** hsubr_u8_m_untied:
+**     movprfx z0, z1
+**     uhsubr  z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u8_m_untied, svuint8_t,
+               z0 = svhsubr_u8_m (p0, z1, z2),
+               z0 = svhsubr_m (p0, z1, z2))
+
+/*
+** hsubr_w0_u8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uhsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_u8_m_tied1, svuint8_t, uint8_t,
+                z0 = svhsubr_n_u8_m (p0, z0, x0),
+                z0 = svhsubr_m (p0, z0, x0))
+
+/*
+** hsubr_w0_u8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     uhsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_u8_m_untied, svuint8_t, uint8_t,
+                z0 = svhsubr_n_u8_m (p0, z1, x0),
+                z0 = svhsubr_m (p0, z1, x0))
+
+/*
+** hsubr_11_u8_m_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     uhsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u8_m_tied1, svuint8_t,
+               z0 = svhsubr_n_u8_m (p0, z0, 11),
+               z0 = svhsubr_m (p0, z0, 11))
+
+/*
+** hsubr_11_u8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     uhsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u8_m_untied, svuint8_t,
+               z0 = svhsubr_n_u8_m (p0, z1, 11),
+               z0 = svhsubr_m (p0, z1, 11))
+
+/*
+** hsubr_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uhsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u8_z_tied1, svuint8_t,
+               z0 = svhsubr_u8_z (p0, z0, z1),
+               z0 = svhsubr_z (p0, z0, z1))
+
+/*
+** hsubr_u8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uhsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u8_z_tied2, svuint8_t,
+               z0 = svhsubr_u8_z (p0, z1, z0),
+               z0 = svhsubr_z (p0, z1, z0))
+
+/*
+** hsubr_u8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uhsubr  z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0\.b, p0/z, z2\.b
+**     uhsub   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u8_z_untied, svuint8_t,
+               z0 = svhsubr_u8_z (p0, z1, z2),
+               z0 = svhsubr_z (p0, z1, z2))
+
+/*
+** hsubr_w0_u8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     uhsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_u8_z_tied1, svuint8_t, uint8_t,
+                z0 = svhsubr_n_u8_z (p0, z0, x0),
+                z0 = svhsubr_z (p0, z0, x0))
+
+/*
+** hsubr_w0_u8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uhsubr  z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     uhsub   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_u8_z_untied, svuint8_t, uint8_t,
+                z0 = svhsubr_n_u8_z (p0, z1, x0),
+                z0 = svhsubr_z (p0, z1, x0))
+
+/*
+** hsubr_11_u8_z_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0\.b, p0/z, z0\.b
+**     uhsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u8_z_tied1, svuint8_t,
+               z0 = svhsubr_n_u8_z (p0, z0, 11),
+               z0 = svhsubr_z (p0, z0, 11))
+
+/*
+** hsubr_11_u8_z_untied:
+**     mov     (z[0-9]+\.b), #11
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uhsubr  z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     uhsub   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u8_z_untied, svuint8_t,
+               z0 = svhsubr_n_u8_z (p0, z1, 11),
+               z0 = svhsubr_z (p0, z1, 11))
+
+/*
+** hsubr_u8_x_tied1:
+**     uhsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u8_x_tied1, svuint8_t,
+               z0 = svhsubr_u8_x (p0, z0, z1),
+               z0 = svhsubr_x (p0, z0, z1))
+
+/*
+** hsubr_u8_x_tied2:
+**     uhsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u8_x_tied2, svuint8_t,
+               z0 = svhsubr_u8_x (p0, z1, z0),
+               z0 = svhsubr_x (p0, z1, z0))
+
+/*
+** hsubr_u8_x_untied:
+** (
+**     movprfx z0, z1
+**     uhsubr  z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0, z2
+**     uhsub   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_u8_x_untied, svuint8_t,
+               z0 = svhsubr_u8_x (p0, z1, z2),
+               z0 = svhsubr_x (p0, z1, z2))
+
+/*
+** hsubr_w0_u8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uhsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_u8_x_tied1, svuint8_t, uint8_t,
+                z0 = svhsubr_n_u8_x (p0, z0, x0),
+                z0 = svhsubr_x (p0, z0, x0))
+
+/*
+** hsubr_w0_u8_x_untied:
+**     mov     z0\.b, w0
+**     uhsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_ZX (hsubr_w0_u8_x_untied, svuint8_t, uint8_t,
+                z0 = svhsubr_n_u8_x (p0, z1, x0),
+                z0 = svhsubr_x (p0, z1, x0))
+
+/*
+** hsubr_11_u8_x_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     uhsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u8_x_tied1, svuint8_t,
+               z0 = svhsubr_n_u8_x (p0, z0, 11),
+               z0 = svhsubr_x (p0, z0, 11))
+
+/*
+** hsubr_11_u8_x_untied:
+**     mov     z0\.b, #11
+**     uhsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (hsubr_11_u8_x_untied, svuint8_t,
+               z0 = svhsubr_n_u8_x (p0, z1, 11),
+               z0 = svhsubr_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1_gather_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1_gather_f32.c
new file mode 100644 (file)
index 0000000..c6acdbf
--- /dev/null
@@ -0,0 +1,195 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1_gather_f32_tied1:
+**     ldnt1w  z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_f32_tied1, svfloat32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_f32 (p0, z0),
+                    z0_res = svldnt1_gather_f32 (p0, z0))
+
+/*
+** ldnt1_gather_f32_untied:
+**     ldnt1w  z0\.s, p0/z, \[z1\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_f32_untied, svfloat32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_f32 (p0, z1),
+                    z0_res = svldnt1_gather_f32 (p0, z1))
+
+/*
+** ldnt1_gather_x0_f32_offset:
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_x0_f32_offset, svfloat32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_f32 (p0, z0, x0),
+                    z0_res = svldnt1_gather_offset_f32 (p0, z0, x0))
+
+/*
+** ldnt1_gather_m4_f32_offset:
+**     mov     (x[0-9]+), #?-4
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_m4_f32_offset, svfloat32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_f32 (p0, z0, -4),
+                    z0_res = svldnt1_gather_offset_f32 (p0, z0, -4))
+
+/*
+** ldnt1_gather_0_f32_offset:
+**     ldnt1w  z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_0_f32_offset, svfloat32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_f32 (p0, z0, 0),
+                    z0_res = svldnt1_gather_offset_f32 (p0, z0, 0))
+
+/*
+** ldnt1_gather_5_f32_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_5_f32_offset, svfloat32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_f32 (p0, z0, 5),
+                    z0_res = svldnt1_gather_offset_f32 (p0, z0, 5))
+
+/*
+** ldnt1_gather_6_f32_offset:
+**     mov     (x[0-9]+), #?6
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_6_f32_offset, svfloat32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_f32 (p0, z0, 6),
+                    z0_res = svldnt1_gather_offset_f32 (p0, z0, 6))
+
+/*
+** ldnt1_gather_7_f32_offset:
+**     mov     (x[0-9]+), #?7
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_7_f32_offset, svfloat32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_f32 (p0, z0, 7),
+                    z0_res = svldnt1_gather_offset_f32 (p0, z0, 7))
+
+/*
+** ldnt1_gather_8_f32_offset:
+**     mov     (x[0-9]+), #?8
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_8_f32_offset, svfloat32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_f32 (p0, z0, 8),
+                    z0_res = svldnt1_gather_offset_f32 (p0, z0, 8))
+
+/*
+** ldnt1_gather_124_f32_offset:
+**     mov     (x[0-9]+), #?124
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_124_f32_offset, svfloat32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_f32 (p0, z0, 124),
+                    z0_res = svldnt1_gather_offset_f32 (p0, z0, 124))
+
+/*
+** ldnt1_gather_128_f32_offset:
+**     mov     (x[0-9]+), #?128
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_128_f32_offset, svfloat32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_f32 (p0, z0, 128),
+                    z0_res = svldnt1_gather_offset_f32 (p0, z0, 128))
+
+/*
+** ldnt1_gather_x0_f32_index:
+**     lsl     (x[0-9]+), x0, #?2
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_x0_f32_index, svfloat32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_index_f32 (p0, z0, x0),
+                    z0_res = svldnt1_gather_index_f32 (p0, z0, x0))
+
+/*
+** ldnt1_gather_m1_f32_index:
+**     mov     (x[0-9]+), #?-4
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_m1_f32_index, svfloat32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_index_f32 (p0, z0, -1),
+                    z0_res = svldnt1_gather_index_f32 (p0, z0, -1))
+
+/*
+** ldnt1_gather_0_f32_index:
+**     ldnt1w  z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_0_f32_index, svfloat32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_index_f32 (p0, z0, 0),
+                    z0_res = svldnt1_gather_index_f32 (p0, z0, 0))
+
+/*
+** ldnt1_gather_5_f32_index:
+**     mov     (x[0-9]+), #?20
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_5_f32_index, svfloat32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_index_f32 (p0, z0, 5),
+                    z0_res = svldnt1_gather_index_f32 (p0, z0, 5))
+
+/*
+** ldnt1_gather_31_f32_index:
+**     mov     (x[0-9]+), #?124
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_31_f32_index, svfloat32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_index_f32 (p0, z0, 31),
+                    z0_res = svldnt1_gather_index_f32 (p0, z0, 31))
+
+/*
+** ldnt1_gather_32_f32_index:
+**     mov     (x[0-9]+), #?128
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_32_f32_index, svfloat32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_index_f32 (p0, z0, 32),
+                    z0_res = svldnt1_gather_index_f32 (p0, z0, 32))
+
+/*
+** ldnt1_gather_x0_f32_u32offset:
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_x0_f32_u32offset, svfloat32_t, float32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32offset_f32 (p0, x0, z0),
+                    z0_res = svldnt1_gather_offset (p0, x0, z0))
+
+/*
+** ldnt1_gather_tied1_f32_u32offset:
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_tied1_f32_u32offset, svfloat32_t, float32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32offset_f32 (p0, x0, z0),
+                    z0_res = svldnt1_gather_offset (p0, x0, z0))
+
+/*
+** ldnt1_gather_untied_f32_u32offset:
+**     ldnt1w  z0\.s, p0/z, \[z1\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_untied_f32_u32offset, svfloat32_t, float32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32offset_f32 (p0, x0, z1),
+                    z0_res = svldnt1_gather_offset (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1_gather_f64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1_gather_f64.c
new file mode 100644 (file)
index 0000000..ff93c44
--- /dev/null
@@ -0,0 +1,322 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1_gather_f64_tied1:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_f64_tied1, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_f64 (p0, z0),
+                    z0_res = svldnt1_gather_f64 (p0, z0))
+
+/*
+** ldnt1_gather_f64_untied:
+**     ldnt1d  z0\.d, p0/z, \[z1\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_f64_untied, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_f64 (p0, z1),
+                    z0_res = svldnt1_gather_f64 (p0, z1))
+
+/*
+** ldnt1_gather_x0_f64_offset:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_x0_f64_offset, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_f64 (p0, z0, x0),
+                    z0_res = svldnt1_gather_offset_f64 (p0, z0, x0))
+
+/*
+** ldnt1_gather_m8_f64_offset:
+**     mov     (x[0-9]+), #?-8
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_m8_f64_offset, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_f64 (p0, z0, -8),
+                    z0_res = svldnt1_gather_offset_f64 (p0, z0, -8))
+
+/*
+** ldnt1_gather_0_f64_offset:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_0_f64_offset, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_f64 (p0, z0, 0),
+                    z0_res = svldnt1_gather_offset_f64 (p0, z0, 0))
+
+/*
+** ldnt1_gather_9_f64_offset:
+**     mov     (x[0-9]+), #?9
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_9_f64_offset, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_f64 (p0, z0, 9),
+                    z0_res = svldnt1_gather_offset_f64 (p0, z0, 9))
+
+/*
+** ldnt1_gather_10_f64_offset:
+**     mov     (x[0-9]+), #?10
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_10_f64_offset, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_f64 (p0, z0, 10),
+                    z0_res = svldnt1_gather_offset_f64 (p0, z0, 10))
+
+/*
+** ldnt1_gather_11_f64_offset:
+**     mov     (x[0-9]+), #?11
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_11_f64_offset, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_f64 (p0, z0, 11),
+                    z0_res = svldnt1_gather_offset_f64 (p0, z0, 11))
+
+/*
+** ldnt1_gather_12_f64_offset:
+**     mov     (x[0-9]+), #?12
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_12_f64_offset, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_f64 (p0, z0, 12),
+                    z0_res = svldnt1_gather_offset_f64 (p0, z0, 12))
+
+/*
+** ldnt1_gather_13_f64_offset:
+**     mov     (x[0-9]+), #?13
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_13_f64_offset, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_f64 (p0, z0, 13),
+                    z0_res = svldnt1_gather_offset_f64 (p0, z0, 13))
+
+/*
+** ldnt1_gather_14_f64_offset:
+**     mov     (x[0-9]+), #?14
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_14_f64_offset, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_f64 (p0, z0, 14),
+                    z0_res = svldnt1_gather_offset_f64 (p0, z0, 14))
+
+/*
+** ldnt1_gather_15_f64_offset:
+**     mov     (x[0-9]+), #?15
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_15_f64_offset, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_f64 (p0, z0, 15),
+                    z0_res = svldnt1_gather_offset_f64 (p0, z0, 15))
+
+/*
+** ldnt1_gather_16_f64_offset:
+**     mov     (x[0-9]+), #?16
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_16_f64_offset, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_f64 (p0, z0, 16),
+                    z0_res = svldnt1_gather_offset_f64 (p0, z0, 16))
+
+/*
+** ldnt1_gather_248_f64_offset:
+**     mov     (x[0-9]+), #?248
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_248_f64_offset, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_f64 (p0, z0, 248),
+                    z0_res = svldnt1_gather_offset_f64 (p0, z0, 248))
+
+/*
+** ldnt1_gather_256_f64_offset:
+**     mov     (x[0-9]+), #?256
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_256_f64_offset, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_f64 (p0, z0, 256),
+                    z0_res = svldnt1_gather_offset_f64 (p0, z0, 256))
+
+/*
+** ldnt1_gather_x0_f64_index:
+**     lsl     (x[0-9]+), x0, #?3
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_x0_f64_index, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_index_f64 (p0, z0, x0),
+                    z0_res = svldnt1_gather_index_f64 (p0, z0, x0))
+
+/*
+** ldnt1_gather_m1_f64_index:
+**     mov     (x[0-9]+), #?-8
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_m1_f64_index, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_index_f64 (p0, z0, -1),
+                    z0_res = svldnt1_gather_index_f64 (p0, z0, -1))
+
+/*
+** ldnt1_gather_0_f64_index:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_0_f64_index, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_index_f64 (p0, z0, 0),
+                    z0_res = svldnt1_gather_index_f64 (p0, z0, 0))
+
+/*
+** ldnt1_gather_5_f64_index:
+**     mov     (x[0-9]+), #?40
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_5_f64_index, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_index_f64 (p0, z0, 5),
+                    z0_res = svldnt1_gather_index_f64 (p0, z0, 5))
+
+/*
+** ldnt1_gather_31_f64_index:
+**     mov     (x[0-9]+), #?248
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_31_f64_index, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_index_f64 (p0, z0, 31),
+                    z0_res = svldnt1_gather_index_f64 (p0, z0, 31))
+
+/*
+** ldnt1_gather_32_f64_index:
+**     mov     (x[0-9]+), #?256
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_32_f64_index, svfloat64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_index_f64 (p0, z0, 32),
+                    z0_res = svldnt1_gather_index_f64 (p0, z0, 32))
+
+/*
+** ldnt1_gather_x0_f64_s64offset:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_x0_f64_s64offset, svfloat64_t, float64_t, svint64_t,
+                    z0_res = svldnt1_gather_s64offset_f64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_offset (p0, x0, z0))
+
+/*
+** ldnt1_gather_tied1_f64_s64offset:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_tied1_f64_s64offset, svfloat64_t, float64_t, svint64_t,
+                    z0_res = svldnt1_gather_s64offset_f64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_offset (p0, x0, z0))
+
+/*
+** ldnt1_gather_untied_f64_s64offset:
+**     ldnt1d  z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_untied_f64_s64offset, svfloat64_t, float64_t, svint64_t,
+                    z0_res = svldnt1_gather_s64offset_f64 (p0, x0, z1),
+                    z0_res = svldnt1_gather_offset (p0, x0, z1))
+
+/*
+** ldnt1_gather_x0_f64_u64offset:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_x0_f64_u64offset, svfloat64_t, float64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64offset_f64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_offset (p0, x0, z0))
+
+/*
+** ldnt1_gather_tied1_f64_u64offset:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_tied1_f64_u64offset, svfloat64_t, float64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64offset_f64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_offset (p0, x0, z0))
+
+/*
+** ldnt1_gather_untied_f64_u64offset:
+**     ldnt1d  z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_untied_f64_u64offset, svfloat64_t, float64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64offset_f64 (p0, x0, z1),
+                    z0_res = svldnt1_gather_offset (p0, x0, z1))
+
+/*
+** ldnt1_gather_x0_f64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #3
+**     ldnt1d  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_x0_f64_s64index, svfloat64_t, float64_t, svint64_t,
+                    z0_res = svldnt1_gather_s64index_f64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_index (p0, x0, z0))
+
+/*
+** ldnt1_gather_tied1_f64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #3
+**     ldnt1d  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_tied1_f64_s64index, svfloat64_t, float64_t, svint64_t,
+                    z0_res = svldnt1_gather_s64index_f64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_index (p0, x0, z0))
+
+/*
+** ldnt1_gather_untied_f64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #3
+**     ldnt1d  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_untied_f64_s64index, svfloat64_t, float64_t, svint64_t,
+                    z0_res = svldnt1_gather_s64index_f64 (p0, x0, z1),
+                    z0_res = svldnt1_gather_index (p0, x0, z1))
+
+/*
+** ldnt1_gather_x0_f64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #3
+**     ldnt1d  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_x0_f64_u64index, svfloat64_t, float64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64index_f64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_index (p0, x0, z0))
+
+/*
+** ldnt1_gather_tied1_f64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #3
+**     ldnt1d  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_tied1_f64_u64index, svfloat64_t, float64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64index_f64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_index (p0, x0, z0))
+
+/*
+** ldnt1_gather_untied_f64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #3
+**     ldnt1d  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_untied_f64_u64index, svfloat64_t, float64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64index_f64 (p0, x0, z1),
+                    z0_res = svldnt1_gather_index (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1_gather_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1_gather_s32.c
new file mode 100644 (file)
index 0000000..153f5c2
--- /dev/null
@@ -0,0 +1,195 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1_gather_s32_tied1:
+**     ldnt1w  z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_s32_tied1, svint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_s32 (p0, z0),
+                    z0_res = svldnt1_gather_s32 (p0, z0))
+
+/*
+** ldnt1_gather_s32_untied:
+**     ldnt1w  z0\.s, p0/z, \[z1\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_s32_untied, svint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_s32 (p0, z1),
+                    z0_res = svldnt1_gather_s32 (p0, z1))
+
+/*
+** ldnt1_gather_x0_s32_offset:
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_x0_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_s32 (p0, z0, x0),
+                    z0_res = svldnt1_gather_offset_s32 (p0, z0, x0))
+
+/*
+** ldnt1_gather_m4_s32_offset:
+**     mov     (x[0-9]+), #?-4
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_m4_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_s32 (p0, z0, -4),
+                    z0_res = svldnt1_gather_offset_s32 (p0, z0, -4))
+
+/*
+** ldnt1_gather_0_s32_offset:
+**     ldnt1w  z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_0_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_s32 (p0, z0, 0),
+                    z0_res = svldnt1_gather_offset_s32 (p0, z0, 0))
+
+/*
+** ldnt1_gather_5_s32_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_5_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_s32 (p0, z0, 5),
+                    z0_res = svldnt1_gather_offset_s32 (p0, z0, 5))
+
+/*
+** ldnt1_gather_6_s32_offset:
+**     mov     (x[0-9]+), #?6
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_6_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_s32 (p0, z0, 6),
+                    z0_res = svldnt1_gather_offset_s32 (p0, z0, 6))
+
+/*
+** ldnt1_gather_7_s32_offset:
+**     mov     (x[0-9]+), #?7
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_7_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_s32 (p0, z0, 7),
+                    z0_res = svldnt1_gather_offset_s32 (p0, z0, 7))
+
+/*
+** ldnt1_gather_8_s32_offset:
+**     mov     (x[0-9]+), #?8
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_8_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_s32 (p0, z0, 8),
+                    z0_res = svldnt1_gather_offset_s32 (p0, z0, 8))
+
+/*
+** ldnt1_gather_124_s32_offset:
+**     mov     (x[0-9]+), #?124
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_124_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_s32 (p0, z0, 124),
+                    z0_res = svldnt1_gather_offset_s32 (p0, z0, 124))
+
+/*
+** ldnt1_gather_128_s32_offset:
+**     mov     (x[0-9]+), #?128
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_128_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_s32 (p0, z0, 128),
+                    z0_res = svldnt1_gather_offset_s32 (p0, z0, 128))
+
+/*
+** ldnt1_gather_x0_s32_index:
+**     lsl     (x[0-9]+), x0, #?2
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_x0_s32_index, svint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_index_s32 (p0, z0, x0),
+                    z0_res = svldnt1_gather_index_s32 (p0, z0, x0))
+
+/*
+** ldnt1_gather_m1_s32_index:
+**     mov     (x[0-9]+), #?-4
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_m1_s32_index, svint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_index_s32 (p0, z0, -1),
+                    z0_res = svldnt1_gather_index_s32 (p0, z0, -1))
+
+/*
+** ldnt1_gather_0_s32_index:
+**     ldnt1w  z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_0_s32_index, svint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_index_s32 (p0, z0, 0),
+                    z0_res = svldnt1_gather_index_s32 (p0, z0, 0))
+
+/*
+** ldnt1_gather_5_s32_index:
+**     mov     (x[0-9]+), #?20
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_5_s32_index, svint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_index_s32 (p0, z0, 5),
+                    z0_res = svldnt1_gather_index_s32 (p0, z0, 5))
+
+/*
+** ldnt1_gather_31_s32_index:
+**     mov     (x[0-9]+), #?124
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_31_s32_index, svint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_index_s32 (p0, z0, 31),
+                    z0_res = svldnt1_gather_index_s32 (p0, z0, 31))
+
+/*
+** ldnt1_gather_32_s32_index:
+**     mov     (x[0-9]+), #?128
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_32_s32_index, svint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_index_s32 (p0, z0, 32),
+                    z0_res = svldnt1_gather_index_s32 (p0, z0, 32))
+
+/*
+** ldnt1_gather_x0_s32_u32offset:
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_x0_s32_u32offset, svint32_t, int32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32offset_s32 (p0, x0, z0),
+                    z0_res = svldnt1_gather_offset (p0, x0, z0))
+
+/*
+** ldnt1_gather_tied1_s32_u32offset:
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_tied1_s32_u32offset, svint32_t, int32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32offset_s32 (p0, x0, z0),
+                    z0_res = svldnt1_gather_offset (p0, x0, z0))
+
+/*
+** ldnt1_gather_untied_s32_u32offset:
+**     ldnt1w  z0\.s, p0/z, \[z1\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_untied_s32_u32offset, svint32_t, int32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32offset_s32 (p0, x0, z1),
+                    z0_res = svldnt1_gather_offset (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1_gather_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1_gather_s64.c
new file mode 100644 (file)
index 0000000..778cdbf
--- /dev/null
@@ -0,0 +1,322 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1_gather_s64_tied1:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_s64_tied1, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_s64 (p0, z0),
+                    z0_res = svldnt1_gather_s64 (p0, z0))
+
+/*
+** ldnt1_gather_s64_untied:
+**     ldnt1d  z0\.d, p0/z, \[z1\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_s64_untied, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_s64 (p0, z1),
+                    z0_res = svldnt1_gather_s64 (p0, z1))
+
+/*
+** ldnt1_gather_x0_s64_offset:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_x0_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_s64 (p0, z0, x0),
+                    z0_res = svldnt1_gather_offset_s64 (p0, z0, x0))
+
+/*
+** ldnt1_gather_m8_s64_offset:
+**     mov     (x[0-9]+), #?-8
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_m8_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_s64 (p0, z0, -8),
+                    z0_res = svldnt1_gather_offset_s64 (p0, z0, -8))
+
+/*
+** ldnt1_gather_0_s64_offset:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_0_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_s64 (p0, z0, 0),
+                    z0_res = svldnt1_gather_offset_s64 (p0, z0, 0))
+
+/*
+** ldnt1_gather_9_s64_offset:
+**     mov     (x[0-9]+), #?9
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_9_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_s64 (p0, z0, 9),
+                    z0_res = svldnt1_gather_offset_s64 (p0, z0, 9))
+
+/*
+** ldnt1_gather_10_s64_offset:
+**     mov     (x[0-9]+), #?10
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_10_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_s64 (p0, z0, 10),
+                    z0_res = svldnt1_gather_offset_s64 (p0, z0, 10))
+
+/*
+** ldnt1_gather_11_s64_offset:
+**     mov     (x[0-9]+), #?11
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_11_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_s64 (p0, z0, 11),
+                    z0_res = svldnt1_gather_offset_s64 (p0, z0, 11))
+
+/*
+** ldnt1_gather_12_s64_offset:
+**     mov     (x[0-9]+), #?12
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_12_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_s64 (p0, z0, 12),
+                    z0_res = svldnt1_gather_offset_s64 (p0, z0, 12))
+
+/*
+** ldnt1_gather_13_s64_offset:
+**     mov     (x[0-9]+), #?13
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_13_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_s64 (p0, z0, 13),
+                    z0_res = svldnt1_gather_offset_s64 (p0, z0, 13))
+
+/*
+** ldnt1_gather_14_s64_offset:
+**     mov     (x[0-9]+), #?14
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_14_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_s64 (p0, z0, 14),
+                    z0_res = svldnt1_gather_offset_s64 (p0, z0, 14))
+
+/*
+** ldnt1_gather_15_s64_offset:
+**     mov     (x[0-9]+), #?15
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_15_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_s64 (p0, z0, 15),
+                    z0_res = svldnt1_gather_offset_s64 (p0, z0, 15))
+
+/*
+** ldnt1_gather_16_s64_offset:
+**     mov     (x[0-9]+), #?16
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_16_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_s64 (p0, z0, 16),
+                    z0_res = svldnt1_gather_offset_s64 (p0, z0, 16))
+
+/*
+** ldnt1_gather_248_s64_offset:
+**     mov     (x[0-9]+), #?248
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_248_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_s64 (p0, z0, 248),
+                    z0_res = svldnt1_gather_offset_s64 (p0, z0, 248))
+
+/*
+** ldnt1_gather_256_s64_offset:
+**     mov     (x[0-9]+), #?256
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_256_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_s64 (p0, z0, 256),
+                    z0_res = svldnt1_gather_offset_s64 (p0, z0, 256))
+
+/*
+** ldnt1_gather_x0_s64_index:
+**     lsl     (x[0-9]+), x0, #?3
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_x0_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_index_s64 (p0, z0, x0),
+                    z0_res = svldnt1_gather_index_s64 (p0, z0, x0))
+
+/*
+** ldnt1_gather_m1_s64_index:
+**     mov     (x[0-9]+), #?-8
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_m1_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_index_s64 (p0, z0, -1),
+                    z0_res = svldnt1_gather_index_s64 (p0, z0, -1))
+
+/*
+** ldnt1_gather_0_s64_index:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_0_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_index_s64 (p0, z0, 0),
+                    z0_res = svldnt1_gather_index_s64 (p0, z0, 0))
+
+/*
+** ldnt1_gather_5_s64_index:
+**     mov     (x[0-9]+), #?40
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_5_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_index_s64 (p0, z0, 5),
+                    z0_res = svldnt1_gather_index_s64 (p0, z0, 5))
+
+/*
+** ldnt1_gather_31_s64_index:
+**     mov     (x[0-9]+), #?248
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_31_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_index_s64 (p0, z0, 31),
+                    z0_res = svldnt1_gather_index_s64 (p0, z0, 31))
+
+/*
+** ldnt1_gather_32_s64_index:
+**     mov     (x[0-9]+), #?256
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_32_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_index_s64 (p0, z0, 32),
+                    z0_res = svldnt1_gather_index_s64 (p0, z0, 32))
+
+/*
+** ldnt1_gather_x0_s64_s64offset:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_x0_s64_s64offset, svint64_t, int64_t, svint64_t,
+                    z0_res = svldnt1_gather_s64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_offset (p0, x0, z0))
+
+/*
+** ldnt1_gather_tied1_s64_s64offset:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_tied1_s64_s64offset, svint64_t, int64_t, svint64_t,
+                    z0_res = svldnt1_gather_s64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_offset (p0, x0, z0))
+
+/*
+** ldnt1_gather_untied_s64_s64offset:
+**     ldnt1d  z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_untied_s64_s64offset, svint64_t, int64_t, svint64_t,
+                    z0_res = svldnt1_gather_s64offset_s64 (p0, x0, z1),
+                    z0_res = svldnt1_gather_offset (p0, x0, z1))
+
+/*
+** ldnt1_gather_x0_s64_u64offset:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_x0_s64_u64offset, svint64_t, int64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_offset (p0, x0, z0))
+
+/*
+** ldnt1_gather_tied1_s64_u64offset:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_tied1_s64_u64offset, svint64_t, int64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_offset (p0, x0, z0))
+
+/*
+** ldnt1_gather_untied_s64_u64offset:
+**     ldnt1d  z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_untied_s64_u64offset, svint64_t, int64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64offset_s64 (p0, x0, z1),
+                    z0_res = svldnt1_gather_offset (p0, x0, z1))
+
+/*
+** ldnt1_gather_x0_s64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #3
+**     ldnt1d  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_x0_s64_s64index, svint64_t, int64_t, svint64_t,
+                    z0_res = svldnt1_gather_s64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_index (p0, x0, z0))
+
+/*
+** ldnt1_gather_tied1_s64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #3
+**     ldnt1d  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_tied1_s64_s64index, svint64_t, int64_t, svint64_t,
+                    z0_res = svldnt1_gather_s64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_index (p0, x0, z0))
+
+/*
+** ldnt1_gather_untied_s64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #3
+**     ldnt1d  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_untied_s64_s64index, svint64_t, int64_t, svint64_t,
+                    z0_res = svldnt1_gather_s64index_s64 (p0, x0, z1),
+                    z0_res = svldnt1_gather_index (p0, x0, z1))
+
+/*
+** ldnt1_gather_x0_s64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #3
+**     ldnt1d  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_x0_s64_u64index, svint64_t, int64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_index (p0, x0, z0))
+
+/*
+** ldnt1_gather_tied1_s64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #3
+**     ldnt1d  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_tied1_s64_u64index, svint64_t, int64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_index (p0, x0, z0))
+
+/*
+** ldnt1_gather_untied_s64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #3
+**     ldnt1d  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_untied_s64_u64index, svint64_t, int64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64index_s64 (p0, x0, z1),
+                    z0_res = svldnt1_gather_index (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1_gather_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1_gather_u32.c
new file mode 100644 (file)
index 0000000..48bc9b9
--- /dev/null
@@ -0,0 +1,195 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1_gather_u32_tied1:
+**     ldnt1w  z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_u32_tied1, svuint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_u32 (p0, z0),
+                    z0_res = svldnt1_gather_u32 (p0, z0))
+
+/*
+** ldnt1_gather_u32_untied:
+**     ldnt1w  z0\.s, p0/z, \[z1\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_u32_untied, svuint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_u32 (p0, z1),
+                    z0_res = svldnt1_gather_u32 (p0, z1))
+
+/*
+** ldnt1_gather_x0_u32_offset:
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_x0_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_u32 (p0, z0, x0),
+                    z0_res = svldnt1_gather_offset_u32 (p0, z0, x0))
+
+/*
+** ldnt1_gather_m4_u32_offset:
+**     mov     (x[0-9]+), #?-4
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_m4_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_u32 (p0, z0, -4),
+                    z0_res = svldnt1_gather_offset_u32 (p0, z0, -4))
+
+/*
+** ldnt1_gather_0_u32_offset:
+**     ldnt1w  z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_0_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_u32 (p0, z0, 0),
+                    z0_res = svldnt1_gather_offset_u32 (p0, z0, 0))
+
+/*
+** ldnt1_gather_5_u32_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_5_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_u32 (p0, z0, 5),
+                    z0_res = svldnt1_gather_offset_u32 (p0, z0, 5))
+
+/*
+** ldnt1_gather_6_u32_offset:
+**     mov     (x[0-9]+), #?6
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_6_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_u32 (p0, z0, 6),
+                    z0_res = svldnt1_gather_offset_u32 (p0, z0, 6))
+
+/*
+** ldnt1_gather_7_u32_offset:
+**     mov     (x[0-9]+), #?7
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_7_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_u32 (p0, z0, 7),
+                    z0_res = svldnt1_gather_offset_u32 (p0, z0, 7))
+
+/*
+** ldnt1_gather_8_u32_offset:
+**     mov     (x[0-9]+), #?8
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_8_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_u32 (p0, z0, 8),
+                    z0_res = svldnt1_gather_offset_u32 (p0, z0, 8))
+
+/*
+** ldnt1_gather_124_u32_offset:
+**     mov     (x[0-9]+), #?124
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_124_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_u32 (p0, z0, 124),
+                    z0_res = svldnt1_gather_offset_u32 (p0, z0, 124))
+
+/*
+** ldnt1_gather_128_u32_offset:
+**     mov     (x[0-9]+), #?128
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_128_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_offset_u32 (p0, z0, 128),
+                    z0_res = svldnt1_gather_offset_u32 (p0, z0, 128))
+
+/*
+** ldnt1_gather_x0_u32_index:
+**     lsl     (x[0-9]+), x0, #?2
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_x0_u32_index, svuint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_index_u32 (p0, z0, x0),
+                    z0_res = svldnt1_gather_index_u32 (p0, z0, x0))
+
+/*
+** ldnt1_gather_m1_u32_index:
+**     mov     (x[0-9]+), #?-4
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_m1_u32_index, svuint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_index_u32 (p0, z0, -1),
+                    z0_res = svldnt1_gather_index_u32 (p0, z0, -1))
+
+/*
+** ldnt1_gather_0_u32_index:
+**     ldnt1w  z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_0_u32_index, svuint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_index_u32 (p0, z0, 0),
+                    z0_res = svldnt1_gather_index_u32 (p0, z0, 0))
+
+/*
+** ldnt1_gather_5_u32_index:
+**     mov     (x[0-9]+), #?20
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_5_u32_index, svuint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_index_u32 (p0, z0, 5),
+                    z0_res = svldnt1_gather_index_u32 (p0, z0, 5))
+
+/*
+** ldnt1_gather_31_u32_index:
+**     mov     (x[0-9]+), #?124
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_31_u32_index, svuint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_index_u32 (p0, z0, 31),
+                    z0_res = svldnt1_gather_index_u32 (p0, z0, 31))
+
+/*
+** ldnt1_gather_32_u32_index:
+**     mov     (x[0-9]+), #?128
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_32_u32_index, svuint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32base_index_u32 (p0, z0, 32),
+                    z0_res = svldnt1_gather_index_u32 (p0, z0, 32))
+
+/*
+** ldnt1_gather_x0_u32_u32offset:
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_x0_u32_u32offset, svuint32_t, uint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32offset_u32 (p0, x0, z0),
+                    z0_res = svldnt1_gather_offset (p0, x0, z0))
+
+/*
+** ldnt1_gather_tied1_u32_u32offset:
+**     ldnt1w  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_tied1_u32_u32offset, svuint32_t, uint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32offset_u32 (p0, x0, z0),
+                    z0_res = svldnt1_gather_offset (p0, x0, z0))
+
+/*
+** ldnt1_gather_untied_u32_u32offset:
+**     ldnt1w  z0\.s, p0/z, \[z1\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_untied_u32_u32offset, svuint32_t, uint32_t, svuint32_t,
+                    z0_res = svldnt1_gather_u32offset_u32 (p0, x0, z1),
+                    z0_res = svldnt1_gather_offset (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1_gather_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1_gather_u64.c
new file mode 100644 (file)
index 0000000..52e944b
--- /dev/null
@@ -0,0 +1,322 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1_gather_u64_tied1:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_u64_tied1, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_u64 (p0, z0),
+                    z0_res = svldnt1_gather_u64 (p0, z0))
+
+/*
+** ldnt1_gather_u64_untied:
+**     ldnt1d  z0\.d, p0/z, \[z1\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_u64_untied, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_u64 (p0, z1),
+                    z0_res = svldnt1_gather_u64 (p0, z1))
+
+/*
+** ldnt1_gather_x0_u64_offset:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_x0_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_u64 (p0, z0, x0),
+                    z0_res = svldnt1_gather_offset_u64 (p0, z0, x0))
+
+/*
+** ldnt1_gather_m8_u64_offset:
+**     mov     (x[0-9]+), #?-8
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_m8_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_u64 (p0, z0, -8),
+                    z0_res = svldnt1_gather_offset_u64 (p0, z0, -8))
+
+/*
+** ldnt1_gather_0_u64_offset:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_0_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_u64 (p0, z0, 0),
+                    z0_res = svldnt1_gather_offset_u64 (p0, z0, 0))
+
+/*
+** ldnt1_gather_9_u64_offset:
+**     mov     (x[0-9]+), #?9
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_9_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_u64 (p0, z0, 9),
+                    z0_res = svldnt1_gather_offset_u64 (p0, z0, 9))
+
+/*
+** ldnt1_gather_10_u64_offset:
+**     mov     (x[0-9]+), #?10
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_10_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_u64 (p0, z0, 10),
+                    z0_res = svldnt1_gather_offset_u64 (p0, z0, 10))
+
+/*
+** ldnt1_gather_11_u64_offset:
+**     mov     (x[0-9]+), #?11
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_11_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_u64 (p0, z0, 11),
+                    z0_res = svldnt1_gather_offset_u64 (p0, z0, 11))
+
+/*
+** ldnt1_gather_12_u64_offset:
+**     mov     (x[0-9]+), #?12
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_12_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_u64 (p0, z0, 12),
+                    z0_res = svldnt1_gather_offset_u64 (p0, z0, 12))
+
+/*
+** ldnt1_gather_13_u64_offset:
+**     mov     (x[0-9]+), #?13
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_13_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_u64 (p0, z0, 13),
+                    z0_res = svldnt1_gather_offset_u64 (p0, z0, 13))
+
+/*
+** ldnt1_gather_14_u64_offset:
+**     mov     (x[0-9]+), #?14
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_14_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_u64 (p0, z0, 14),
+                    z0_res = svldnt1_gather_offset_u64 (p0, z0, 14))
+
+/*
+** ldnt1_gather_15_u64_offset:
+**     mov     (x[0-9]+), #?15
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_15_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_u64 (p0, z0, 15),
+                    z0_res = svldnt1_gather_offset_u64 (p0, z0, 15))
+
+/*
+** ldnt1_gather_16_u64_offset:
+**     mov     (x[0-9]+), #?16
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_16_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_u64 (p0, z0, 16),
+                    z0_res = svldnt1_gather_offset_u64 (p0, z0, 16))
+
+/*
+** ldnt1_gather_248_u64_offset:
+**     mov     (x[0-9]+), #?248
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_248_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_u64 (p0, z0, 248),
+                    z0_res = svldnt1_gather_offset_u64 (p0, z0, 248))
+
+/*
+** ldnt1_gather_256_u64_offset:
+**     mov     (x[0-9]+), #?256
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_256_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_offset_u64 (p0, z0, 256),
+                    z0_res = svldnt1_gather_offset_u64 (p0, z0, 256))
+
+/*
+** ldnt1_gather_x0_u64_index:
+**     lsl     (x[0-9]+), x0, #?3
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_x0_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_index_u64 (p0, z0, x0),
+                    z0_res = svldnt1_gather_index_u64 (p0, z0, x0))
+
+/*
+** ldnt1_gather_m1_u64_index:
+**     mov     (x[0-9]+), #?-8
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_m1_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_index_u64 (p0, z0, -1),
+                    z0_res = svldnt1_gather_index_u64 (p0, z0, -1))
+
+/*
+** ldnt1_gather_0_u64_index:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_0_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_index_u64 (p0, z0, 0),
+                    z0_res = svldnt1_gather_index_u64 (p0, z0, 0))
+
+/*
+** ldnt1_gather_5_u64_index:
+**     mov     (x[0-9]+), #?40
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_5_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_index_u64 (p0, z0, 5),
+                    z0_res = svldnt1_gather_index_u64 (p0, z0, 5))
+
+/*
+** ldnt1_gather_31_u64_index:
+**     mov     (x[0-9]+), #?248
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_31_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_index_u64 (p0, z0, 31),
+                    z0_res = svldnt1_gather_index_u64 (p0, z0, 31))
+
+/*
+** ldnt1_gather_32_u64_index:
+**     mov     (x[0-9]+), #?256
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1_gather_32_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64base_index_u64 (p0, z0, 32),
+                    z0_res = svldnt1_gather_index_u64 (p0, z0, 32))
+
+/*
+** ldnt1_gather_x0_u64_s64offset:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_x0_u64_s64offset, svuint64_t, uint64_t, svint64_t,
+                    z0_res = svldnt1_gather_s64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_offset (p0, x0, z0))
+
+/*
+** ldnt1_gather_tied1_u64_s64offset:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_tied1_u64_s64offset, svuint64_t, uint64_t, svint64_t,
+                    z0_res = svldnt1_gather_s64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_offset (p0, x0, z0))
+
+/*
+** ldnt1_gather_untied_u64_s64offset:
+**     ldnt1d  z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_untied_u64_s64offset, svuint64_t, uint64_t, svint64_t,
+                    z0_res = svldnt1_gather_s64offset_u64 (p0, x0, z1),
+                    z0_res = svldnt1_gather_offset (p0, x0, z1))
+
+/*
+** ldnt1_gather_x0_u64_u64offset:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_x0_u64_u64offset, svuint64_t, uint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_offset (p0, x0, z0))
+
+/*
+** ldnt1_gather_tied1_u64_u64offset:
+**     ldnt1d  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_tied1_u64_u64offset, svuint64_t, uint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_offset (p0, x0, z0))
+
+/*
+** ldnt1_gather_untied_u64_u64offset:
+**     ldnt1d  z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_untied_u64_u64offset, svuint64_t, uint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64offset_u64 (p0, x0, z1),
+                    z0_res = svldnt1_gather_offset (p0, x0, z1))
+
+/*
+** ldnt1_gather_x0_u64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #3
+**     ldnt1d  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_x0_u64_s64index, svuint64_t, uint64_t, svint64_t,
+                    z0_res = svldnt1_gather_s64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_index (p0, x0, z0))
+
+/*
+** ldnt1_gather_tied1_u64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #3
+**     ldnt1d  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_tied1_u64_s64index, svuint64_t, uint64_t, svint64_t,
+                    z0_res = svldnt1_gather_s64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_index (p0, x0, z0))
+
+/*
+** ldnt1_gather_untied_u64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #3
+**     ldnt1d  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_untied_u64_s64index, svuint64_t, uint64_t, svint64_t,
+                    z0_res = svldnt1_gather_s64index_u64 (p0, x0, z1),
+                    z0_res = svldnt1_gather_index (p0, x0, z1))
+
+/*
+** ldnt1_gather_x0_u64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #3
+**     ldnt1d  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_x0_u64_u64index, svuint64_t, uint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_index (p0, x0, z0))
+
+/*
+** ldnt1_gather_tied1_u64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #3
+**     ldnt1d  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_tied1_u64_u64index, svuint64_t, uint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1_gather_index (p0, x0, z0))
+
+/*
+** ldnt1_gather_untied_u64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #3
+**     ldnt1d  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1_gather_untied_u64_u64index, svuint64_t, uint64_t, svuint64_t,
+                    z0_res = svldnt1_gather_u64index_u64 (p0, x0, z1),
+                    z0_res = svldnt1_gather_index (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sb_gather_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sb_gather_s32.c
new file mode 100644 (file)
index 0000000..0d77cb9
--- /dev/null
@@ -0,0 +1,106 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1sb_gather_s32_tied1:
+**     ldnt1sb z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_s32_tied1, svint32_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32base_s32 (p0, z0),
+                    z0_res = svldnt1sb_gather_s32 (p0, z0))
+
+/*
+** ldnt1sb_gather_s32_untied:
+**     ldnt1sb z0\.s, p0/z, \[z1\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_s32_untied, svint32_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32base_s32 (p0, z1),
+                    z0_res = svldnt1sb_gather_s32 (p0, z1))
+
+/*
+** ldnt1sb_gather_x0_s32_offset:
+**     ldnt1sb z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_x0_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32base_offset_s32 (p0, z0, x0),
+                    z0_res = svldnt1sb_gather_offset_s32 (p0, z0, x0))
+
+/*
+** ldnt1sb_gather_m1_s32_offset:
+**     mov     (x[0-9]+), #?-1
+**     ldnt1sb z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_m1_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32base_offset_s32 (p0, z0, -1),
+                    z0_res = svldnt1sb_gather_offset_s32 (p0, z0, -1))
+
+/*
+** ldnt1sb_gather_0_s32_offset:
+**     ldnt1sb z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_0_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32base_offset_s32 (p0, z0, 0),
+                    z0_res = svldnt1sb_gather_offset_s32 (p0, z0, 0))
+
+/*
+** ldnt1sb_gather_5_s32_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1sb z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_5_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32base_offset_s32 (p0, z0, 5),
+                    z0_res = svldnt1sb_gather_offset_s32 (p0, z0, 5))
+
+/*
+** ldnt1sb_gather_31_s32_offset:
+**     mov     (x[0-9]+), #?31
+**     ldnt1sb z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_31_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32base_offset_s32 (p0, z0, 31),
+                    z0_res = svldnt1sb_gather_offset_s32 (p0, z0, 31))
+
+/*
+** ldnt1sb_gather_32_s32_offset:
+**     mov     (x[0-9]+), #?32
+**     ldnt1sb z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_32_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32base_offset_s32 (p0, z0, 32),
+                    z0_res = svldnt1sb_gather_offset_s32 (p0, z0, 32))
+
+/*
+** ldnt1sb_gather_x0_s32_u32offset:
+**     ldnt1sb z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sb_gather_x0_s32_u32offset, svint32_t, int8_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32offset_s32 (p0, x0, z0),
+                    z0_res = svldnt1sb_gather_offset_s32 (p0, x0, z0))
+
+/*
+** ldnt1sb_gather_tied1_s32_u32offset:
+**     ldnt1sb z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sb_gather_tied1_s32_u32offset, svint32_t, int8_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32offset_s32 (p0, x0, z0),
+                    z0_res = svldnt1sb_gather_offset_s32 (p0, x0, z0))
+
+/*
+** ldnt1sb_gather_untied_s32_u32offset:
+**     ldnt1sb z0\.s, p0/z, \[z1\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sb_gather_untied_s32_u32offset, svint32_t, int8_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32offset_s32 (p0, x0, z1),
+                    z0_res = svldnt1sb_gather_offset_s32 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sb_gather_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sb_gather_s64.c
new file mode 100644 (file)
index 0000000..2f86ebd
--- /dev/null
@@ -0,0 +1,133 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1sb_gather_s64_tied1:
+**     ldnt1sb z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_s64_tied1, svint64_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64base_s64 (p0, z0),
+                    z0_res = svldnt1sb_gather_s64 (p0, z0))
+
+/*
+** ldnt1sb_gather_s64_untied:
+**     ldnt1sb z0\.d, p0/z, \[z1\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_s64_untied, svint64_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64base_s64 (p0, z1),
+                    z0_res = svldnt1sb_gather_s64 (p0, z1))
+
+/*
+** ldnt1sb_gather_x0_s64_offset:
+**     ldnt1sb z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_x0_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64base_offset_s64 (p0, z0, x0),
+                    z0_res = svldnt1sb_gather_offset_s64 (p0, z0, x0))
+
+/*
+** ldnt1sb_gather_m1_s64_offset:
+**     mov     (x[0-9]+), #?-1
+**     ldnt1sb z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_m1_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64base_offset_s64 (p0, z0, -1),
+                    z0_res = svldnt1sb_gather_offset_s64 (p0, z0, -1))
+
+/*
+** ldnt1sb_gather_0_s64_offset:
+**     ldnt1sb z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_0_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64base_offset_s64 (p0, z0, 0),
+                    z0_res = svldnt1sb_gather_offset_s64 (p0, z0, 0))
+
+/*
+** ldnt1sb_gather_5_s64_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1sb z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_5_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64base_offset_s64 (p0, z0, 5),
+                    z0_res = svldnt1sb_gather_offset_s64 (p0, z0, 5))
+
+/*
+** ldnt1sb_gather_31_s64_offset:
+**     mov     (x[0-9]+), #?31
+**     ldnt1sb z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_31_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64base_offset_s64 (p0, z0, 31),
+                    z0_res = svldnt1sb_gather_offset_s64 (p0, z0, 31))
+
+/*
+** ldnt1sb_gather_32_s64_offset:
+**     mov     (x[0-9]+), #?32
+**     ldnt1sb z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_32_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64base_offset_s64 (p0, z0, 32),
+                    z0_res = svldnt1sb_gather_offset_s64 (p0, z0, 32))
+
+/*
+** ldnt1sb_gather_x0_s64_s64offset:
+**     ldnt1sb z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sb_gather_x0_s64_s64offset, svint64_t, int8_t, svint64_t,
+                    z0_res = svldnt1sb_gather_s64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1sb_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1sb_gather_tied1_s64_s64offset:
+**     ldnt1sb z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sb_gather_tied1_s64_s64offset, svint64_t, int8_t, svint64_t,
+                    z0_res = svldnt1sb_gather_s64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1sb_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1sb_gather_untied_s64_s64offset:
+**     ldnt1sb z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sb_gather_untied_s64_s64offset, svint64_t, int8_t, svint64_t,
+                    z0_res = svldnt1sb_gather_s64offset_s64 (p0, x0, z1),
+                    z0_res = svldnt1sb_gather_offset_s64 (p0, x0, z1))
+
+/*
+** ldnt1sb_gather_x0_s64_u64offset:
+**     ldnt1sb z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sb_gather_x0_s64_u64offset, svint64_t, int8_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1sb_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1sb_gather_tied1_s64_u64offset:
+**     ldnt1sb z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sb_gather_tied1_s64_u64offset, svint64_t, int8_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1sb_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1sb_gather_untied_s64_u64offset:
+**     ldnt1sb z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sb_gather_untied_s64_u64offset, svint64_t, int8_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64offset_s64 (p0, x0, z1),
+                    z0_res = svldnt1sb_gather_offset_s64 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sb_gather_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sb_gather_u32.c
new file mode 100644 (file)
index 0000000..2d144db
--- /dev/null
@@ -0,0 +1,106 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1sb_gather_u32_tied1:
+**     ldnt1sb z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_u32_tied1, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32base_u32 (p0, z0),
+                    z0_res = svldnt1sb_gather_u32 (p0, z0))
+
+/*
+** ldnt1sb_gather_u32_untied:
+**     ldnt1sb z0\.s, p0/z, \[z1\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_u32_untied, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32base_u32 (p0, z1),
+                    z0_res = svldnt1sb_gather_u32 (p0, z1))
+
+/*
+** ldnt1sb_gather_x0_u32_offset:
+**     ldnt1sb z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_x0_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32base_offset_u32 (p0, z0, x0),
+                    z0_res = svldnt1sb_gather_offset_u32 (p0, z0, x0))
+
+/*
+** ldnt1sb_gather_m1_u32_offset:
+**     mov     (x[0-9]+), #?-1
+**     ldnt1sb z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_m1_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32base_offset_u32 (p0, z0, -1),
+                    z0_res = svldnt1sb_gather_offset_u32 (p0, z0, -1))
+
+/*
+** ldnt1sb_gather_0_u32_offset:
+**     ldnt1sb z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_0_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32base_offset_u32 (p0, z0, 0),
+                    z0_res = svldnt1sb_gather_offset_u32 (p0, z0, 0))
+
+/*
+** ldnt1sb_gather_5_u32_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1sb z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_5_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32base_offset_u32 (p0, z0, 5),
+                    z0_res = svldnt1sb_gather_offset_u32 (p0, z0, 5))
+
+/*
+** ldnt1sb_gather_31_u32_offset:
+**     mov     (x[0-9]+), #?31
+**     ldnt1sb z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_31_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32base_offset_u32 (p0, z0, 31),
+                    z0_res = svldnt1sb_gather_offset_u32 (p0, z0, 31))
+
+/*
+** ldnt1sb_gather_32_u32_offset:
+**     mov     (x[0-9]+), #?32
+**     ldnt1sb z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_32_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32base_offset_u32 (p0, z0, 32),
+                    z0_res = svldnt1sb_gather_offset_u32 (p0, z0, 32))
+
+/*
+** ldnt1sb_gather_x0_u32_u32offset:
+**     ldnt1sb z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sb_gather_x0_u32_u32offset, svuint32_t, int8_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32offset_u32 (p0, x0, z0),
+                    z0_res = svldnt1sb_gather_offset_u32 (p0, x0, z0))
+
+/*
+** ldnt1sb_gather_tied1_u32_u32offset:
+**     ldnt1sb z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sb_gather_tied1_u32_u32offset, svuint32_t, int8_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32offset_u32 (p0, x0, z0),
+                    z0_res = svldnt1sb_gather_offset_u32 (p0, x0, z0))
+
+/*
+** ldnt1sb_gather_untied_u32_u32offset:
+**     ldnt1sb z0\.s, p0/z, \[z1\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sb_gather_untied_u32_u32offset, svuint32_t, int8_t, svuint32_t,
+                    z0_res = svldnt1sb_gather_u32offset_u32 (p0, x0, z1),
+                    z0_res = svldnt1sb_gather_offset_u32 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sb_gather_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sb_gather_u64.c
new file mode 100644 (file)
index 0000000..e647e68
--- /dev/null
@@ -0,0 +1,133 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1sb_gather_u64_tied1:
+**     ldnt1sb z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_u64_tied1, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64base_u64 (p0, z0),
+                    z0_res = svldnt1sb_gather_u64 (p0, z0))
+
+/*
+** ldnt1sb_gather_u64_untied:
+**     ldnt1sb z0\.d, p0/z, \[z1\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_u64_untied, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64base_u64 (p0, z1),
+                    z0_res = svldnt1sb_gather_u64 (p0, z1))
+
+/*
+** ldnt1sb_gather_x0_u64_offset:
+**     ldnt1sb z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_x0_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64base_offset_u64 (p0, z0, x0),
+                    z0_res = svldnt1sb_gather_offset_u64 (p0, z0, x0))
+
+/*
+** ldnt1sb_gather_m1_u64_offset:
+**     mov     (x[0-9]+), #?-1
+**     ldnt1sb z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_m1_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64base_offset_u64 (p0, z0, -1),
+                    z0_res = svldnt1sb_gather_offset_u64 (p0, z0, -1))
+
+/*
+** ldnt1sb_gather_0_u64_offset:
+**     ldnt1sb z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_0_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64base_offset_u64 (p0, z0, 0),
+                    z0_res = svldnt1sb_gather_offset_u64 (p0, z0, 0))
+
+/*
+** ldnt1sb_gather_5_u64_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1sb z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_5_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64base_offset_u64 (p0, z0, 5),
+                    z0_res = svldnt1sb_gather_offset_u64 (p0, z0, 5))
+
+/*
+** ldnt1sb_gather_31_u64_offset:
+**     mov     (x[0-9]+), #?31
+**     ldnt1sb z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_31_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64base_offset_u64 (p0, z0, 31),
+                    z0_res = svldnt1sb_gather_offset_u64 (p0, z0, 31))
+
+/*
+** ldnt1sb_gather_32_u64_offset:
+**     mov     (x[0-9]+), #?32
+**     ldnt1sb z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sb_gather_32_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64base_offset_u64 (p0, z0, 32),
+                    z0_res = svldnt1sb_gather_offset_u64 (p0, z0, 32))
+
+/*
+** ldnt1sb_gather_x0_u64_s64offset:
+**     ldnt1sb z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sb_gather_x0_u64_s64offset, svuint64_t, int8_t, svint64_t,
+                    z0_res = svldnt1sb_gather_s64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1sb_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1sb_gather_tied1_u64_s64offset:
+**     ldnt1sb z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sb_gather_tied1_u64_s64offset, svuint64_t, int8_t, svint64_t,
+                    z0_res = svldnt1sb_gather_s64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1sb_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1sb_gather_untied_u64_s64offset:
+**     ldnt1sb z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sb_gather_untied_u64_s64offset, svuint64_t, int8_t, svint64_t,
+                    z0_res = svldnt1sb_gather_s64offset_u64 (p0, x0, z1),
+                    z0_res = svldnt1sb_gather_offset_u64 (p0, x0, z1))
+
+/*
+** ldnt1sb_gather_x0_u64_u64offset:
+**     ldnt1sb z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sb_gather_x0_u64_u64offset, svuint64_t, int8_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1sb_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1sb_gather_tied1_u64_u64offset:
+**     ldnt1sb z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sb_gather_tied1_u64_u64offset, svuint64_t, int8_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1sb_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1sb_gather_untied_u64_u64offset:
+**     ldnt1sb z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sb_gather_untied_u64_u64offset, svuint64_t, int8_t, svuint64_t,
+                    z0_res = svldnt1sb_gather_u64offset_u64 (p0, x0, z1),
+                    z0_res = svldnt1sb_gather_offset_u64 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sh_gather_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sh_gather_s32.c
new file mode 100644 (file)
index 0000000..f7adbae
--- /dev/null
@@ -0,0 +1,175 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1sh_gather_s32_tied1:
+**     ldnt1sh z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_s32_tied1, svint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_s32 (p0, z0),
+                    z0_res = svldnt1sh_gather_s32 (p0, z0))
+
+/*
+** ldnt1sh_gather_s32_untied:
+**     ldnt1sh z0\.s, p0/z, \[z1\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_s32_untied, svint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_s32 (p0, z1),
+                    z0_res = svldnt1sh_gather_s32 (p0, z1))
+
+/*
+** ldnt1sh_gather_x0_s32_offset:
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_x0_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_offset_s32 (p0, z0, x0),
+                    z0_res = svldnt1sh_gather_offset_s32 (p0, z0, x0))
+
+/*
+** ldnt1sh_gather_m2_s32_offset:
+**     mov     (x[0-9]+), #?-2
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_m2_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_offset_s32 (p0, z0, -2),
+                    z0_res = svldnt1sh_gather_offset_s32 (p0, z0, -2))
+
+/*
+** ldnt1sh_gather_0_s32_offset:
+**     ldnt1sh z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_0_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_offset_s32 (p0, z0, 0),
+                    z0_res = svldnt1sh_gather_offset_s32 (p0, z0, 0))
+
+/*
+** ldnt1sh_gather_5_s32_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_5_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_offset_s32 (p0, z0, 5),
+                    z0_res = svldnt1sh_gather_offset_s32 (p0, z0, 5))
+
+/*
+** ldnt1sh_gather_6_s32_offset:
+**     mov     (x[0-9]+), #?6
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_6_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_offset_s32 (p0, z0, 6),
+                    z0_res = svldnt1sh_gather_offset_s32 (p0, z0, 6))
+
+/*
+** ldnt1sh_gather_62_s32_offset:
+**     mov     (x[0-9]+), #?62
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_62_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_offset_s32 (p0, z0, 62),
+                    z0_res = svldnt1sh_gather_offset_s32 (p0, z0, 62))
+
+/*
+** ldnt1sh_gather_64_s32_offset:
+**     mov     (x[0-9]+), #?64
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_64_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_offset_s32 (p0, z0, 64),
+                    z0_res = svldnt1sh_gather_offset_s32 (p0, z0, 64))
+
+/*
+** ldnt1sh_gather_x0_s32_index:
+**     lsl     (x[0-9]+), x0, #?1
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_x0_s32_index, svint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_index_s32 (p0, z0, x0),
+                    z0_res = svldnt1sh_gather_index_s32 (p0, z0, x0))
+
+/*
+** ldnt1sh_gather_m1_s32_index:
+**     mov     (x[0-9]+), #?-2
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_m1_s32_index, svint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_index_s32 (p0, z0, -1),
+                    z0_res = svldnt1sh_gather_index_s32 (p0, z0, -1))
+
+/*
+** ldnt1sh_gather_0_s32_index:
+**     ldnt1sh z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_0_s32_index, svint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_index_s32 (p0, z0, 0),
+                    z0_res = svldnt1sh_gather_index_s32 (p0, z0, 0))
+
+/*
+** ldnt1sh_gather_5_s32_index:
+**     mov     (x[0-9]+), #?10
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_5_s32_index, svint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_index_s32 (p0, z0, 5),
+                    z0_res = svldnt1sh_gather_index_s32 (p0, z0, 5))
+
+/*
+** ldnt1sh_gather_31_s32_index:
+**     mov     (x[0-9]+), #?62
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_31_s32_index, svint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_index_s32 (p0, z0, 31),
+                    z0_res = svldnt1sh_gather_index_s32 (p0, z0, 31))
+
+/*
+** ldnt1sh_gather_32_s32_index:
+**     mov     (x[0-9]+), #?64
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_32_s32_index, svint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_index_s32 (p0, z0, 32),
+                    z0_res = svldnt1sh_gather_index_s32 (p0, z0, 32))
+
+/*
+** ldnt1sh_gather_x0_s32_u32offset:
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_x0_s32_u32offset, svint32_t, int16_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32offset_s32 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_offset_s32 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_tied1_s32_u32offset:
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_tied1_s32_u32offset, svint32_t, int16_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32offset_s32 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_offset_s32 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_untied_s32_u32offset:
+**     ldnt1sh z0\.s, p0/z, \[z1\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_untied_s32_u32offset, svint32_t, int16_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32offset_s32 (p0, x0, z1),
+                    z0_res = svldnt1sh_gather_offset_s32 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sh_gather_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sh_gather_s64.c
new file mode 100644 (file)
index 0000000..9f3e084
--- /dev/null
@@ -0,0 +1,262 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1sh_gather_s64_tied1:
+**     ldnt1sh z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_s64_tied1, svint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_s64 (p0, z0),
+                    z0_res = svldnt1sh_gather_s64 (p0, z0))
+
+/*
+** ldnt1sh_gather_s64_untied:
+**     ldnt1sh z0\.d, p0/z, \[z1\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_s64_untied, svint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_s64 (p0, z1),
+                    z0_res = svldnt1sh_gather_s64 (p0, z1))
+
+/*
+** ldnt1sh_gather_x0_s64_offset:
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_x0_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_offset_s64 (p0, z0, x0),
+                    z0_res = svldnt1sh_gather_offset_s64 (p0, z0, x0))
+
+/*
+** ldnt1sh_gather_m2_s64_offset:
+**     mov     (x[0-9]+), #?-2
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_m2_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_offset_s64 (p0, z0, -2),
+                    z0_res = svldnt1sh_gather_offset_s64 (p0, z0, -2))
+
+/*
+** ldnt1sh_gather_0_s64_offset:
+**     ldnt1sh z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_0_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_offset_s64 (p0, z0, 0),
+                    z0_res = svldnt1sh_gather_offset_s64 (p0, z0, 0))
+
+/*
+** ldnt1sh_gather_5_s64_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_5_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_offset_s64 (p0, z0, 5),
+                    z0_res = svldnt1sh_gather_offset_s64 (p0, z0, 5))
+
+/*
+** ldnt1sh_gather_6_s64_offset:
+**     mov     (x[0-9]+), #?6
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_6_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_offset_s64 (p0, z0, 6),
+                    z0_res = svldnt1sh_gather_offset_s64 (p0, z0, 6))
+
+/*
+** ldnt1sh_gather_62_s64_offset:
+**     mov     (x[0-9]+), #?62
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_62_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_offset_s64 (p0, z0, 62),
+                    z0_res = svldnt1sh_gather_offset_s64 (p0, z0, 62))
+
+/*
+** ldnt1sh_gather_64_s64_offset:
+**     mov     (x[0-9]+), #?64
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_64_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_offset_s64 (p0, z0, 64),
+                    z0_res = svldnt1sh_gather_offset_s64 (p0, z0, 64))
+
+/*
+** ldnt1sh_gather_x0_s64_index:
+**     lsl     (x[0-9]+), x0, #?1
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_x0_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_index_s64 (p0, z0, x0),
+                    z0_res = svldnt1sh_gather_index_s64 (p0, z0, x0))
+
+/*
+** ldnt1sh_gather_m1_s64_index:
+**     mov     (x[0-9]+), #?-2
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_m1_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_index_s64 (p0, z0, -1),
+                    z0_res = svldnt1sh_gather_index_s64 (p0, z0, -1))
+
+/*
+** ldnt1sh_gather_0_s64_index:
+**     ldnt1sh z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_0_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_index_s64 (p0, z0, 0),
+                    z0_res = svldnt1sh_gather_index_s64 (p0, z0, 0))
+
+/*
+** ldnt1sh_gather_5_s64_index:
+**     mov     (x[0-9]+), #?10
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_5_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_index_s64 (p0, z0, 5),
+                    z0_res = svldnt1sh_gather_index_s64 (p0, z0, 5))
+
+/*
+** ldnt1sh_gather_31_s64_index:
+**     mov     (x[0-9]+), #?62
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_31_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_index_s64 (p0, z0, 31),
+                    z0_res = svldnt1sh_gather_index_s64 (p0, z0, 31))
+
+/*
+** ldnt1sh_gather_32_s64_index:
+**     mov     (x[0-9]+), #?64
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_32_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_index_s64 (p0, z0, 32),
+                    z0_res = svldnt1sh_gather_index_s64 (p0, z0, 32))
+
+/*
+** ldnt1sh_gather_x0_s64_s64offset:
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_x0_s64_s64offset, svint64_t, int16_t, svint64_t,
+                    z0_res = svldnt1sh_gather_s64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_tied1_s64_s64offset:
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_tied1_s64_s64offset, svint64_t, int16_t, svint64_t,
+                    z0_res = svldnt1sh_gather_s64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_untied_s64_s64offset:
+**     ldnt1sh z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_untied_s64_s64offset, svint64_t, int16_t, svint64_t,
+                    z0_res = svldnt1sh_gather_s64offset_s64 (p0, x0, z1),
+                    z0_res = svldnt1sh_gather_offset_s64 (p0, x0, z1))
+
+/*
+** ldnt1sh_gather_x0_s64_u64offset:
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_x0_s64_u64offset, svint64_t, int16_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_tied1_s64_u64offset:
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_tied1_s64_u64offset, svint64_t, int16_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_untied_s64_u64offset:
+**     ldnt1sh z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_untied_s64_u64offset, svint64_t, int16_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64offset_s64 (p0, x0, z1),
+                    z0_res = svldnt1sh_gather_offset_s64 (p0, x0, z1))
+
+/*
+** ldnt1sh_gather_x0_s64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #1
+**     ldnt1sh z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_x0_s64_s64index, svint64_t, int16_t, svint64_t,
+                    z0_res = svldnt1sh_gather_s64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_index_s64 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_tied1_s64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #1
+**     ldnt1sh z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_tied1_s64_s64index, svint64_t, int16_t, svint64_t,
+                    z0_res = svldnt1sh_gather_s64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_index_s64 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_untied_s64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #1
+**     ldnt1sh z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_untied_s64_s64index, svint64_t, int16_t, svint64_t,
+                    z0_res = svldnt1sh_gather_s64index_s64 (p0, x0, z1),
+                    z0_res = svldnt1sh_gather_index_s64 (p0, x0, z1))
+
+/*
+** ldnt1sh_gather_x0_s64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #1
+**     ldnt1sh z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_x0_s64_u64index, svint64_t, int16_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_index_s64 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_tied1_s64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #1
+**     ldnt1sh z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_tied1_s64_u64index, svint64_t, int16_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_index_s64 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_untied_s64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #1
+**     ldnt1sh z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_untied_s64_u64index, svint64_t, int16_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64index_s64 (p0, x0, z1),
+                    z0_res = svldnt1sh_gather_index_s64 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sh_gather_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sh_gather_u32.c
new file mode 100644 (file)
index 0000000..12a17d3
--- /dev/null
@@ -0,0 +1,175 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1sh_gather_u32_tied1:
+**     ldnt1sh z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_u32_tied1, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_u32 (p0, z0),
+                    z0_res = svldnt1sh_gather_u32 (p0, z0))
+
+/*
+** ldnt1sh_gather_u32_untied:
+**     ldnt1sh z0\.s, p0/z, \[z1\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_u32_untied, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_u32 (p0, z1),
+                    z0_res = svldnt1sh_gather_u32 (p0, z1))
+
+/*
+** ldnt1sh_gather_x0_u32_offset:
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_x0_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_offset_u32 (p0, z0, x0),
+                    z0_res = svldnt1sh_gather_offset_u32 (p0, z0, x0))
+
+/*
+** ldnt1sh_gather_m2_u32_offset:
+**     mov     (x[0-9]+), #?-2
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_m2_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_offset_u32 (p0, z0, -2),
+                    z0_res = svldnt1sh_gather_offset_u32 (p0, z0, -2))
+
+/*
+** ldnt1sh_gather_0_u32_offset:
+**     ldnt1sh z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_0_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_offset_u32 (p0, z0, 0),
+                    z0_res = svldnt1sh_gather_offset_u32 (p0, z0, 0))
+
+/*
+** ldnt1sh_gather_5_u32_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_5_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_offset_u32 (p0, z0, 5),
+                    z0_res = svldnt1sh_gather_offset_u32 (p0, z0, 5))
+
+/*
+** ldnt1sh_gather_6_u32_offset:
+**     mov     (x[0-9]+), #?6
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_6_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_offset_u32 (p0, z0, 6),
+                    z0_res = svldnt1sh_gather_offset_u32 (p0, z0, 6))
+
+/*
+** ldnt1sh_gather_62_u32_offset:
+**     mov     (x[0-9]+), #?62
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_62_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_offset_u32 (p0, z0, 62),
+                    z0_res = svldnt1sh_gather_offset_u32 (p0, z0, 62))
+
+/*
+** ldnt1sh_gather_64_u32_offset:
+**     mov     (x[0-9]+), #?64
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_64_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_offset_u32 (p0, z0, 64),
+                    z0_res = svldnt1sh_gather_offset_u32 (p0, z0, 64))
+
+/*
+** ldnt1sh_gather_x0_u32_index:
+**     lsl     (x[0-9]+), x0, #?1
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_x0_u32_index, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_index_u32 (p0, z0, x0),
+                    z0_res = svldnt1sh_gather_index_u32 (p0, z0, x0))
+
+/*
+** ldnt1sh_gather_m1_u32_index:
+**     mov     (x[0-9]+), #?-2
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_m1_u32_index, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_index_u32 (p0, z0, -1),
+                    z0_res = svldnt1sh_gather_index_u32 (p0, z0, -1))
+
+/*
+** ldnt1sh_gather_0_u32_index:
+**     ldnt1sh z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_0_u32_index, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_index_u32 (p0, z0, 0),
+                    z0_res = svldnt1sh_gather_index_u32 (p0, z0, 0))
+
+/*
+** ldnt1sh_gather_5_u32_index:
+**     mov     (x[0-9]+), #?10
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_5_u32_index, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_index_u32 (p0, z0, 5),
+                    z0_res = svldnt1sh_gather_index_u32 (p0, z0, 5))
+
+/*
+** ldnt1sh_gather_31_u32_index:
+**     mov     (x[0-9]+), #?62
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_31_u32_index, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_index_u32 (p0, z0, 31),
+                    z0_res = svldnt1sh_gather_index_u32 (p0, z0, 31))
+
+/*
+** ldnt1sh_gather_32_u32_index:
+**     mov     (x[0-9]+), #?64
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_32_u32_index, svuint32_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32base_index_u32 (p0, z0, 32),
+                    z0_res = svldnt1sh_gather_index_u32 (p0, z0, 32))
+
+/*
+** ldnt1sh_gather_x0_u32_u32offset:
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_x0_u32_u32offset, svuint32_t, int16_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32offset_u32 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_offset_u32 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_tied1_u32_u32offset:
+**     ldnt1sh z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_tied1_u32_u32offset, svuint32_t, int16_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32offset_u32 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_offset_u32 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_untied_u32_u32offset:
+**     ldnt1sh z0\.s, p0/z, \[z1\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_untied_u32_u32offset, svuint32_t, int16_t, svuint32_t,
+                    z0_res = svldnt1sh_gather_u32offset_u32 (p0, x0, z1),
+                    z0_res = svldnt1sh_gather_offset_u32 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sh_gather_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sh_gather_u64.c
new file mode 100644 (file)
index 0000000..619482f
--- /dev/null
@@ -0,0 +1,262 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1sh_gather_u64_tied1:
+**     ldnt1sh z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_u64_tied1, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_u64 (p0, z0),
+                    z0_res = svldnt1sh_gather_u64 (p0, z0))
+
+/*
+** ldnt1sh_gather_u64_untied:
+**     ldnt1sh z0\.d, p0/z, \[z1\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_u64_untied, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_u64 (p0, z1),
+                    z0_res = svldnt1sh_gather_u64 (p0, z1))
+
+/*
+** ldnt1sh_gather_x0_u64_offset:
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_x0_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_offset_u64 (p0, z0, x0),
+                    z0_res = svldnt1sh_gather_offset_u64 (p0, z0, x0))
+
+/*
+** ldnt1sh_gather_m2_u64_offset:
+**     mov     (x[0-9]+), #?-2
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_m2_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_offset_u64 (p0, z0, -2),
+                    z0_res = svldnt1sh_gather_offset_u64 (p0, z0, -2))
+
+/*
+** ldnt1sh_gather_0_u64_offset:
+**     ldnt1sh z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_0_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_offset_u64 (p0, z0, 0),
+                    z0_res = svldnt1sh_gather_offset_u64 (p0, z0, 0))
+
+/*
+** ldnt1sh_gather_5_u64_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_5_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_offset_u64 (p0, z0, 5),
+                    z0_res = svldnt1sh_gather_offset_u64 (p0, z0, 5))
+
+/*
+** ldnt1sh_gather_6_u64_offset:
+**     mov     (x[0-9]+), #?6
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_6_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_offset_u64 (p0, z0, 6),
+                    z0_res = svldnt1sh_gather_offset_u64 (p0, z0, 6))
+
+/*
+** ldnt1sh_gather_62_u64_offset:
+**     mov     (x[0-9]+), #?62
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_62_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_offset_u64 (p0, z0, 62),
+                    z0_res = svldnt1sh_gather_offset_u64 (p0, z0, 62))
+
+/*
+** ldnt1sh_gather_64_u64_offset:
+**     mov     (x[0-9]+), #?64
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_64_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_offset_u64 (p0, z0, 64),
+                    z0_res = svldnt1sh_gather_offset_u64 (p0, z0, 64))
+
+/*
+** ldnt1sh_gather_x0_u64_index:
+**     lsl     (x[0-9]+), x0, #?1
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_x0_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_index_u64 (p0, z0, x0),
+                    z0_res = svldnt1sh_gather_index_u64 (p0, z0, x0))
+
+/*
+** ldnt1sh_gather_m1_u64_index:
+**     mov     (x[0-9]+), #?-2
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_m1_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_index_u64 (p0, z0, -1),
+                    z0_res = svldnt1sh_gather_index_u64 (p0, z0, -1))
+
+/*
+** ldnt1sh_gather_0_u64_index:
+**     ldnt1sh z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_0_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_index_u64 (p0, z0, 0),
+                    z0_res = svldnt1sh_gather_index_u64 (p0, z0, 0))
+
+/*
+** ldnt1sh_gather_5_u64_index:
+**     mov     (x[0-9]+), #?10
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_5_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_index_u64 (p0, z0, 5),
+                    z0_res = svldnt1sh_gather_index_u64 (p0, z0, 5))
+
+/*
+** ldnt1sh_gather_31_u64_index:
+**     mov     (x[0-9]+), #?62
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_31_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_index_u64 (p0, z0, 31),
+                    z0_res = svldnt1sh_gather_index_u64 (p0, z0, 31))
+
+/*
+** ldnt1sh_gather_32_u64_index:
+**     mov     (x[0-9]+), #?64
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sh_gather_32_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64base_index_u64 (p0, z0, 32),
+                    z0_res = svldnt1sh_gather_index_u64 (p0, z0, 32))
+
+/*
+** ldnt1sh_gather_x0_u64_s64offset:
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_x0_u64_s64offset, svuint64_t, int16_t, svint64_t,
+                    z0_res = svldnt1sh_gather_s64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_tied1_u64_s64offset:
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_tied1_u64_s64offset, svuint64_t, int16_t, svint64_t,
+                    z0_res = svldnt1sh_gather_s64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_untied_u64_s64offset:
+**     ldnt1sh z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_untied_u64_s64offset, svuint64_t, int16_t, svint64_t,
+                    z0_res = svldnt1sh_gather_s64offset_u64 (p0, x0, z1),
+                    z0_res = svldnt1sh_gather_offset_u64 (p0, x0, z1))
+
+/*
+** ldnt1sh_gather_x0_u64_u64offset:
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_x0_u64_u64offset, svuint64_t, int16_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_tied1_u64_u64offset:
+**     ldnt1sh z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_tied1_u64_u64offset, svuint64_t, int16_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_untied_u64_u64offset:
+**     ldnt1sh z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_untied_u64_u64offset, svuint64_t, int16_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64offset_u64 (p0, x0, z1),
+                    z0_res = svldnt1sh_gather_offset_u64 (p0, x0, z1))
+
+/*
+** ldnt1sh_gather_x0_u64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #1
+**     ldnt1sh z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_x0_u64_s64index, svuint64_t, int16_t, svint64_t,
+                    z0_res = svldnt1sh_gather_s64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_index_u64 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_tied1_u64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #1
+**     ldnt1sh z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_tied1_u64_s64index, svuint64_t, int16_t, svint64_t,
+                    z0_res = svldnt1sh_gather_s64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_index_u64 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_untied_u64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #1
+**     ldnt1sh z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_untied_u64_s64index, svuint64_t, int16_t, svint64_t,
+                    z0_res = svldnt1sh_gather_s64index_u64 (p0, x0, z1),
+                    z0_res = svldnt1sh_gather_index_u64 (p0, x0, z1))
+
+/*
+** ldnt1sh_gather_x0_u64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #1
+**     ldnt1sh z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_x0_u64_u64index, svuint64_t, int16_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_index_u64 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_tied1_u64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #1
+**     ldnt1sh z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_tied1_u64_u64index, svuint64_t, int16_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1sh_gather_index_u64 (p0, x0, z0))
+
+/*
+** ldnt1sh_gather_untied_u64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #1
+**     ldnt1sh z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sh_gather_untied_u64_u64index, svuint64_t, int16_t, svuint64_t,
+                    z0_res = svldnt1sh_gather_u64index_u64 (p0, x0, z1),
+                    z0_res = svldnt1sh_gather_index_u64 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sw_gather_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sw_gather_s64.c
new file mode 100644 (file)
index 0000000..c150a62
--- /dev/null
@@ -0,0 +1,282 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1sw_gather_s64_tied1:
+**     ldnt1sw z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_s64_tied1, svint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_s64 (p0, z0),
+                    z0_res = svldnt1sw_gather_s64 (p0, z0))
+
+/*
+** ldnt1sw_gather_s64_untied:
+**     ldnt1sw z0\.d, p0/z, \[z1\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_s64_untied, svint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_s64 (p0, z1),
+                    z0_res = svldnt1sw_gather_s64 (p0, z1))
+
+/*
+** ldnt1sw_gather_x0_s64_offset:
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_x0_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_offset_s64 (p0, z0, x0),
+                    z0_res = svldnt1sw_gather_offset_s64 (p0, z0, x0))
+
+/*
+** ldnt1sw_gather_m4_s64_offset:
+**     mov     (x[0-9]+), #?-4
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_m4_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_offset_s64 (p0, z0, -4),
+                    z0_res = svldnt1sw_gather_offset_s64 (p0, z0, -4))
+
+/*
+** ldnt1sw_gather_0_s64_offset:
+**     ldnt1sw z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_0_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_offset_s64 (p0, z0, 0),
+                    z0_res = svldnt1sw_gather_offset_s64 (p0, z0, 0))
+
+/*
+** ldnt1sw_gather_5_s64_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_5_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_offset_s64 (p0, z0, 5),
+                    z0_res = svldnt1sw_gather_offset_s64 (p0, z0, 5))
+
+/*
+** ldnt1sw_gather_6_s64_offset:
+**     mov     (x[0-9]+), #?6
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_6_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_offset_s64 (p0, z0, 6),
+                    z0_res = svldnt1sw_gather_offset_s64 (p0, z0, 6))
+
+/*
+** ldnt1sw_gather_7_s64_offset:
+**     mov     (x[0-9]+), #?7
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_7_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_offset_s64 (p0, z0, 7),
+                    z0_res = svldnt1sw_gather_offset_s64 (p0, z0, 7))
+
+/*
+** ldnt1sw_gather_8_s64_offset:
+**     mov     (x[0-9]+), #?8
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_8_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_offset_s64 (p0, z0, 8),
+                    z0_res = svldnt1sw_gather_offset_s64 (p0, z0, 8))
+
+/*
+** ldnt1sw_gather_124_s64_offset:
+**     mov     (x[0-9]+), #?124
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_124_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_offset_s64 (p0, z0, 124),
+                    z0_res = svldnt1sw_gather_offset_s64 (p0, z0, 124))
+
+/*
+** ldnt1sw_gather_128_s64_offset:
+**     mov     (x[0-9]+), #?128
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_128_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_offset_s64 (p0, z0, 128),
+                    z0_res = svldnt1sw_gather_offset_s64 (p0, z0, 128))
+
+/*
+** ldnt1sw_gather_x0_s64_index:
+**     lsl     (x[0-9]+), x0, #?2
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_x0_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_index_s64 (p0, z0, x0),
+                    z0_res = svldnt1sw_gather_index_s64 (p0, z0, x0))
+
+/*
+** ldnt1sw_gather_m1_s64_index:
+**     mov     (x[0-9]+), #?-4
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_m1_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_index_s64 (p0, z0, -1),
+                    z0_res = svldnt1sw_gather_index_s64 (p0, z0, -1))
+
+/*
+** ldnt1sw_gather_0_s64_index:
+**     ldnt1sw z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_0_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_index_s64 (p0, z0, 0),
+                    z0_res = svldnt1sw_gather_index_s64 (p0, z0, 0))
+
+/*
+** ldnt1sw_gather_5_s64_index:
+**     mov     (x[0-9]+), #?20
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_5_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_index_s64 (p0, z0, 5),
+                    z0_res = svldnt1sw_gather_index_s64 (p0, z0, 5))
+
+/*
+** ldnt1sw_gather_31_s64_index:
+**     mov     (x[0-9]+), #?124
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_31_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_index_s64 (p0, z0, 31),
+                    z0_res = svldnt1sw_gather_index_s64 (p0, z0, 31))
+
+/*
+** ldnt1sw_gather_32_s64_index:
+**     mov     (x[0-9]+), #?128
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_32_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_index_s64 (p0, z0, 32),
+                    z0_res = svldnt1sw_gather_index_s64 (p0, z0, 32))
+
+/*
+** ldnt1sw_gather_x0_s64_s64offset:
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_x0_s64_s64offset, svint64_t, int32_t, svint64_t,
+                    z0_res = svldnt1sw_gather_s64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1sw_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1sw_gather_tied1_s64_s64offset:
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_tied1_s64_s64offset, svint64_t, int32_t, svint64_t,
+                    z0_res = svldnt1sw_gather_s64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1sw_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1sw_gather_untied_s64_s64offset:
+**     ldnt1sw z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_untied_s64_s64offset, svint64_t, int32_t, svint64_t,
+                    z0_res = svldnt1sw_gather_s64offset_s64 (p0, x0, z1),
+                    z0_res = svldnt1sw_gather_offset_s64 (p0, x0, z1))
+
+/*
+** ldnt1sw_gather_x0_s64_u64offset:
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_x0_s64_u64offset, svint64_t, int32_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1sw_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1sw_gather_tied1_s64_u64offset:
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_tied1_s64_u64offset, svint64_t, int32_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1sw_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1sw_gather_untied_s64_u64offset:
+**     ldnt1sw z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_untied_s64_u64offset, svint64_t, int32_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64offset_s64 (p0, x0, z1),
+                    z0_res = svldnt1sw_gather_offset_s64 (p0, x0, z1))
+
+/*
+** ldnt1sw_gather_x0_s64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #2
+**     ldnt1sw z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_x0_s64_s64index, svint64_t, int32_t, svint64_t,
+                    z0_res = svldnt1sw_gather_s64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1sw_gather_index_s64 (p0, x0, z0))
+
+/*
+** ldnt1sw_gather_tied1_s64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #2
+**     ldnt1sw z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_tied1_s64_s64index, svint64_t, int32_t, svint64_t,
+                    z0_res = svldnt1sw_gather_s64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1sw_gather_index_s64 (p0, x0, z0))
+
+/*
+** ldnt1sw_gather_untied_s64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #2
+**     ldnt1sw z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_untied_s64_s64index, svint64_t, int32_t, svint64_t,
+                    z0_res = svldnt1sw_gather_s64index_s64 (p0, x0, z1),
+                    z0_res = svldnt1sw_gather_index_s64 (p0, x0, z1))
+
+/*
+** ldnt1sw_gather_x0_s64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #2
+**     ldnt1sw z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_x0_s64_u64index, svint64_t, int32_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1sw_gather_index_s64 (p0, x0, z0))
+
+/*
+** ldnt1sw_gather_tied1_s64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #2
+**     ldnt1sw z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_tied1_s64_u64index, svint64_t, int32_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1sw_gather_index_s64 (p0, x0, z0))
+
+/*
+** ldnt1sw_gather_untied_s64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #2
+**     ldnt1sw z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_untied_s64_u64index, svint64_t, int32_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64index_s64 (p0, x0, z1),
+                    z0_res = svldnt1sw_gather_index_s64 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sw_gather_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1sw_gather_u64.c
new file mode 100644 (file)
index 0000000..cdcce1a
--- /dev/null
@@ -0,0 +1,282 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1sw_gather_u64_tied1:
+**     ldnt1sw z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_u64_tied1, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_u64 (p0, z0),
+                    z0_res = svldnt1sw_gather_u64 (p0, z0))
+
+/*
+** ldnt1sw_gather_u64_untied:
+**     ldnt1sw z0\.d, p0/z, \[z1\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_u64_untied, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_u64 (p0, z1),
+                    z0_res = svldnt1sw_gather_u64 (p0, z1))
+
+/*
+** ldnt1sw_gather_x0_u64_offset:
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_x0_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_offset_u64 (p0, z0, x0),
+                    z0_res = svldnt1sw_gather_offset_u64 (p0, z0, x0))
+
+/*
+** ldnt1sw_gather_m4_u64_offset:
+**     mov     (x[0-9]+), #?-4
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_m4_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_offset_u64 (p0, z0, -4),
+                    z0_res = svldnt1sw_gather_offset_u64 (p0, z0, -4))
+
+/*
+** ldnt1sw_gather_0_u64_offset:
+**     ldnt1sw z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_0_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_offset_u64 (p0, z0, 0),
+                    z0_res = svldnt1sw_gather_offset_u64 (p0, z0, 0))
+
+/*
+** ldnt1sw_gather_5_u64_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_5_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_offset_u64 (p0, z0, 5),
+                    z0_res = svldnt1sw_gather_offset_u64 (p0, z0, 5))
+
+/*
+** ldnt1sw_gather_6_u64_offset:
+**     mov     (x[0-9]+), #?6
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_6_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_offset_u64 (p0, z0, 6),
+                    z0_res = svldnt1sw_gather_offset_u64 (p0, z0, 6))
+
+/*
+** ldnt1sw_gather_7_u64_offset:
+**     mov     (x[0-9]+), #?7
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_7_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_offset_u64 (p0, z0, 7),
+                    z0_res = svldnt1sw_gather_offset_u64 (p0, z0, 7))
+
+/*
+** ldnt1sw_gather_8_u64_offset:
+**     mov     (x[0-9]+), #?8
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_8_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_offset_u64 (p0, z0, 8),
+                    z0_res = svldnt1sw_gather_offset_u64 (p0, z0, 8))
+
+/*
+** ldnt1sw_gather_124_u64_offset:
+**     mov     (x[0-9]+), #?124
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_124_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_offset_u64 (p0, z0, 124),
+                    z0_res = svldnt1sw_gather_offset_u64 (p0, z0, 124))
+
+/*
+** ldnt1sw_gather_128_u64_offset:
+**     mov     (x[0-9]+), #?128
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_128_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_offset_u64 (p0, z0, 128),
+                    z0_res = svldnt1sw_gather_offset_u64 (p0, z0, 128))
+
+/*
+** ldnt1sw_gather_x0_u64_index:
+**     lsl     (x[0-9]+), x0, #?2
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_x0_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_index_u64 (p0, z0, x0),
+                    z0_res = svldnt1sw_gather_index_u64 (p0, z0, x0))
+
+/*
+** ldnt1sw_gather_m1_u64_index:
+**     mov     (x[0-9]+), #?-4
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_m1_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_index_u64 (p0, z0, -1),
+                    z0_res = svldnt1sw_gather_index_u64 (p0, z0, -1))
+
+/*
+** ldnt1sw_gather_0_u64_index:
+**     ldnt1sw z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_0_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_index_u64 (p0, z0, 0),
+                    z0_res = svldnt1sw_gather_index_u64 (p0, z0, 0))
+
+/*
+** ldnt1sw_gather_5_u64_index:
+**     mov     (x[0-9]+), #?20
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_5_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_index_u64 (p0, z0, 5),
+                    z0_res = svldnt1sw_gather_index_u64 (p0, z0, 5))
+
+/*
+** ldnt1sw_gather_31_u64_index:
+**     mov     (x[0-9]+), #?124
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_31_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_index_u64 (p0, z0, 31),
+                    z0_res = svldnt1sw_gather_index_u64 (p0, z0, 31))
+
+/*
+** ldnt1sw_gather_32_u64_index:
+**     mov     (x[0-9]+), #?128
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1sw_gather_32_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64base_index_u64 (p0, z0, 32),
+                    z0_res = svldnt1sw_gather_index_u64 (p0, z0, 32))
+
+/*
+** ldnt1sw_gather_x0_u64_s64offset:
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_x0_u64_s64offset, svuint64_t, int32_t, svint64_t,
+                    z0_res = svldnt1sw_gather_s64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1sw_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1sw_gather_tied1_u64_s64offset:
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_tied1_u64_s64offset, svuint64_t, int32_t, svint64_t,
+                    z0_res = svldnt1sw_gather_s64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1sw_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1sw_gather_untied_u64_s64offset:
+**     ldnt1sw z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_untied_u64_s64offset, svuint64_t, int32_t, svint64_t,
+                    z0_res = svldnt1sw_gather_s64offset_u64 (p0, x0, z1),
+                    z0_res = svldnt1sw_gather_offset_u64 (p0, x0, z1))
+
+/*
+** ldnt1sw_gather_x0_u64_u64offset:
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_x0_u64_u64offset, svuint64_t, int32_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1sw_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1sw_gather_tied1_u64_u64offset:
+**     ldnt1sw z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_tied1_u64_u64offset, svuint64_t, int32_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1sw_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1sw_gather_untied_u64_u64offset:
+**     ldnt1sw z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_untied_u64_u64offset, svuint64_t, int32_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64offset_u64 (p0, x0, z1),
+                    z0_res = svldnt1sw_gather_offset_u64 (p0, x0, z1))
+
+/*
+** ldnt1sw_gather_x0_u64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #2
+**     ldnt1sw z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_x0_u64_s64index, svuint64_t, int32_t, svint64_t,
+                    z0_res = svldnt1sw_gather_s64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1sw_gather_index_u64 (p0, x0, z0))
+
+/*
+** ldnt1sw_gather_tied1_u64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #2
+**     ldnt1sw z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_tied1_u64_s64index, svuint64_t, int32_t, svint64_t,
+                    z0_res = svldnt1sw_gather_s64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1sw_gather_index_u64 (p0, x0, z0))
+
+/*
+** ldnt1sw_gather_untied_u64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #2
+**     ldnt1sw z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_untied_u64_s64index, svuint64_t, int32_t, svint64_t,
+                    z0_res = svldnt1sw_gather_s64index_u64 (p0, x0, z1),
+                    z0_res = svldnt1sw_gather_index_u64 (p0, x0, z1))
+
+/*
+** ldnt1sw_gather_x0_u64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #2
+**     ldnt1sw z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_x0_u64_u64index, svuint64_t, int32_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1sw_gather_index_u64 (p0, x0, z0))
+
+/*
+** ldnt1sw_gather_tied1_u64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #2
+**     ldnt1sw z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_tied1_u64_u64index, svuint64_t, int32_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1sw_gather_index_u64 (p0, x0, z0))
+
+/*
+** ldnt1sw_gather_untied_u64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #2
+**     ldnt1sw z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1sw_gather_untied_u64_u64index, svuint64_t, int32_t, svuint64_t,
+                    z0_res = svldnt1sw_gather_u64index_u64 (p0, x0, z1),
+                    z0_res = svldnt1sw_gather_index_u64 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1ub_gather_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1ub_gather_s32.c
new file mode 100644 (file)
index 0000000..fa7487c
--- /dev/null
@@ -0,0 +1,106 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1ub_gather_s32_tied1:
+**     ldnt1b  z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_s32_tied1, svint32_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32base_s32 (p0, z0),
+                    z0_res = svldnt1ub_gather_s32 (p0, z0))
+
+/*
+** ldnt1ub_gather_s32_untied:
+**     ldnt1b  z0\.s, p0/z, \[z1\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_s32_untied, svint32_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32base_s32 (p0, z1),
+                    z0_res = svldnt1ub_gather_s32 (p0, z1))
+
+/*
+** ldnt1ub_gather_x0_s32_offset:
+**     ldnt1b  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_x0_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32base_offset_s32 (p0, z0, x0),
+                    z0_res = svldnt1ub_gather_offset_s32 (p0, z0, x0))
+
+/*
+** ldnt1ub_gather_m1_s32_offset:
+**     mov     (x[0-9]+), #?-1
+**     ldnt1b  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_m1_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32base_offset_s32 (p0, z0, -1),
+                    z0_res = svldnt1ub_gather_offset_s32 (p0, z0, -1))
+
+/*
+** ldnt1ub_gather_0_s32_offset:
+**     ldnt1b  z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_0_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32base_offset_s32 (p0, z0, 0),
+                    z0_res = svldnt1ub_gather_offset_s32 (p0, z0, 0))
+
+/*
+** ldnt1ub_gather_5_s32_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1b  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_5_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32base_offset_s32 (p0, z0, 5),
+                    z0_res = svldnt1ub_gather_offset_s32 (p0, z0, 5))
+
+/*
+** ldnt1ub_gather_31_s32_offset:
+**     mov     (x[0-9]+), #?31
+**     ldnt1b  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_31_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32base_offset_s32 (p0, z0, 31),
+                    z0_res = svldnt1ub_gather_offset_s32 (p0, z0, 31))
+
+/*
+** ldnt1ub_gather_32_s32_offset:
+**     mov     (x[0-9]+), #?32
+**     ldnt1b  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_32_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32base_offset_s32 (p0, z0, 32),
+                    z0_res = svldnt1ub_gather_offset_s32 (p0, z0, 32))
+
+/*
+** ldnt1ub_gather_x0_s32_u32offset:
+**     ldnt1b  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1ub_gather_x0_s32_u32offset, svint32_t, uint8_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32offset_s32 (p0, x0, z0),
+                    z0_res = svldnt1ub_gather_offset_s32 (p0, x0, z0))
+
+/*
+** ldnt1ub_gather_tied1_s32_u32offset:
+**     ldnt1b  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1ub_gather_tied1_s32_u32offset, svint32_t, uint8_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32offset_s32 (p0, x0, z0),
+                    z0_res = svldnt1ub_gather_offset_s32 (p0, x0, z0))
+
+/*
+** ldnt1ub_gather_untied_s32_u32offset:
+**     ldnt1b  z0\.s, p0/z, \[z1\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1ub_gather_untied_s32_u32offset, svint32_t, uint8_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32offset_s32 (p0, x0, z1),
+                    z0_res = svldnt1ub_gather_offset_s32 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1ub_gather_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1ub_gather_s64.c
new file mode 100644 (file)
index 0000000..2669a0c
--- /dev/null
@@ -0,0 +1,133 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1ub_gather_s64_tied1:
+**     ldnt1b  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_s64_tied1, svint64_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64base_s64 (p0, z0),
+                    z0_res = svldnt1ub_gather_s64 (p0, z0))
+
+/*
+** ldnt1ub_gather_s64_untied:
+**     ldnt1b  z0\.d, p0/z, \[z1\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_s64_untied, svint64_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64base_s64 (p0, z1),
+                    z0_res = svldnt1ub_gather_s64 (p0, z1))
+
+/*
+** ldnt1ub_gather_x0_s64_offset:
+**     ldnt1b  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_x0_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64base_offset_s64 (p0, z0, x0),
+                    z0_res = svldnt1ub_gather_offset_s64 (p0, z0, x0))
+
+/*
+** ldnt1ub_gather_m1_s64_offset:
+**     mov     (x[0-9]+), #?-1
+**     ldnt1b  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_m1_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64base_offset_s64 (p0, z0, -1),
+                    z0_res = svldnt1ub_gather_offset_s64 (p0, z0, -1))
+
+/*
+** ldnt1ub_gather_0_s64_offset:
+**     ldnt1b  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_0_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64base_offset_s64 (p0, z0, 0),
+                    z0_res = svldnt1ub_gather_offset_s64 (p0, z0, 0))
+
+/*
+** ldnt1ub_gather_5_s64_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1b  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_5_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64base_offset_s64 (p0, z0, 5),
+                    z0_res = svldnt1ub_gather_offset_s64 (p0, z0, 5))
+
+/*
+** ldnt1ub_gather_31_s64_offset:
+**     mov     (x[0-9]+), #?31
+**     ldnt1b  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_31_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64base_offset_s64 (p0, z0, 31),
+                    z0_res = svldnt1ub_gather_offset_s64 (p0, z0, 31))
+
+/*
+** ldnt1ub_gather_32_s64_offset:
+**     mov     (x[0-9]+), #?32
+**     ldnt1b  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_32_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64base_offset_s64 (p0, z0, 32),
+                    z0_res = svldnt1ub_gather_offset_s64 (p0, z0, 32))
+
+/*
+** ldnt1ub_gather_x0_s64_s64offset:
+**     ldnt1b  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1ub_gather_x0_s64_s64offset, svint64_t, uint8_t, svint64_t,
+                    z0_res = svldnt1ub_gather_s64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1ub_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1ub_gather_tied1_s64_s64offset:
+**     ldnt1b  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1ub_gather_tied1_s64_s64offset, svint64_t, uint8_t, svint64_t,
+                    z0_res = svldnt1ub_gather_s64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1ub_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1ub_gather_untied_s64_s64offset:
+**     ldnt1b  z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1ub_gather_untied_s64_s64offset, svint64_t, uint8_t, svint64_t,
+                    z0_res = svldnt1ub_gather_s64offset_s64 (p0, x0, z1),
+                    z0_res = svldnt1ub_gather_offset_s64 (p0, x0, z1))
+
+/*
+** ldnt1ub_gather_x0_s64_u64offset:
+**     ldnt1b  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1ub_gather_x0_s64_u64offset, svint64_t, uint8_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1ub_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1ub_gather_tied1_s64_u64offset:
+**     ldnt1b  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1ub_gather_tied1_s64_u64offset, svint64_t, uint8_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1ub_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1ub_gather_untied_s64_u64offset:
+**     ldnt1b  z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1ub_gather_untied_s64_u64offset, svint64_t, uint8_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64offset_s64 (p0, x0, z1),
+                    z0_res = svldnt1ub_gather_offset_s64 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1ub_gather_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1ub_gather_u32.c
new file mode 100644 (file)
index 0000000..db281d2
--- /dev/null
@@ -0,0 +1,106 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1ub_gather_u32_tied1:
+**     ldnt1b  z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_u32_tied1, svuint32_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32base_u32 (p0, z0),
+                    z0_res = svldnt1ub_gather_u32 (p0, z0))
+
+/*
+** ldnt1ub_gather_u32_untied:
+**     ldnt1b  z0\.s, p0/z, \[z1\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_u32_untied, svuint32_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32base_u32 (p0, z1),
+                    z0_res = svldnt1ub_gather_u32 (p0, z1))
+
+/*
+** ldnt1ub_gather_x0_u32_offset:
+**     ldnt1b  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_x0_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32base_offset_u32 (p0, z0, x0),
+                    z0_res = svldnt1ub_gather_offset_u32 (p0, z0, x0))
+
+/*
+** ldnt1ub_gather_m1_u32_offset:
+**     mov     (x[0-9]+), #?-1
+**     ldnt1b  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_m1_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32base_offset_u32 (p0, z0, -1),
+                    z0_res = svldnt1ub_gather_offset_u32 (p0, z0, -1))
+
+/*
+** ldnt1ub_gather_0_u32_offset:
+**     ldnt1b  z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_0_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32base_offset_u32 (p0, z0, 0),
+                    z0_res = svldnt1ub_gather_offset_u32 (p0, z0, 0))
+
+/*
+** ldnt1ub_gather_5_u32_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1b  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_5_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32base_offset_u32 (p0, z0, 5),
+                    z0_res = svldnt1ub_gather_offset_u32 (p0, z0, 5))
+
+/*
+** ldnt1ub_gather_31_u32_offset:
+**     mov     (x[0-9]+), #?31
+**     ldnt1b  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_31_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32base_offset_u32 (p0, z0, 31),
+                    z0_res = svldnt1ub_gather_offset_u32 (p0, z0, 31))
+
+/*
+** ldnt1ub_gather_32_u32_offset:
+**     mov     (x[0-9]+), #?32
+**     ldnt1b  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_32_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32base_offset_u32 (p0, z0, 32),
+                    z0_res = svldnt1ub_gather_offset_u32 (p0, z0, 32))
+
+/*
+** ldnt1ub_gather_x0_u32_u32offset:
+**     ldnt1b  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1ub_gather_x0_u32_u32offset, svuint32_t, uint8_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32offset_u32 (p0, x0, z0),
+                    z0_res = svldnt1ub_gather_offset_u32 (p0, x0, z0))
+
+/*
+** ldnt1ub_gather_tied1_u32_u32offset:
+**     ldnt1b  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1ub_gather_tied1_u32_u32offset, svuint32_t, uint8_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32offset_u32 (p0, x0, z0),
+                    z0_res = svldnt1ub_gather_offset_u32 (p0, x0, z0))
+
+/*
+** ldnt1ub_gather_untied_u32_u32offset:
+**     ldnt1b  z0\.s, p0/z, \[z1\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1ub_gather_untied_u32_u32offset, svuint32_t, uint8_t, svuint32_t,
+                    z0_res = svldnt1ub_gather_u32offset_u32 (p0, x0, z1),
+                    z0_res = svldnt1ub_gather_offset_u32 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1ub_gather_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1ub_gather_u64.c
new file mode 100644 (file)
index 0000000..c96e9f1
--- /dev/null
@@ -0,0 +1,133 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1ub_gather_u64_tied1:
+**     ldnt1b  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_u64_tied1, svuint64_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64base_u64 (p0, z0),
+                    z0_res = svldnt1ub_gather_u64 (p0, z0))
+
+/*
+** ldnt1ub_gather_u64_untied:
+**     ldnt1b  z0\.d, p0/z, \[z1\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_u64_untied, svuint64_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64base_u64 (p0, z1),
+                    z0_res = svldnt1ub_gather_u64 (p0, z1))
+
+/*
+** ldnt1ub_gather_x0_u64_offset:
+**     ldnt1b  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_x0_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64base_offset_u64 (p0, z0, x0),
+                    z0_res = svldnt1ub_gather_offset_u64 (p0, z0, x0))
+
+/*
+** ldnt1ub_gather_m1_u64_offset:
+**     mov     (x[0-9]+), #?-1
+**     ldnt1b  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_m1_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64base_offset_u64 (p0, z0, -1),
+                    z0_res = svldnt1ub_gather_offset_u64 (p0, z0, -1))
+
+/*
+** ldnt1ub_gather_0_u64_offset:
+**     ldnt1b  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_0_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64base_offset_u64 (p0, z0, 0),
+                    z0_res = svldnt1ub_gather_offset_u64 (p0, z0, 0))
+
+/*
+** ldnt1ub_gather_5_u64_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1b  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_5_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64base_offset_u64 (p0, z0, 5),
+                    z0_res = svldnt1ub_gather_offset_u64 (p0, z0, 5))
+
+/*
+** ldnt1ub_gather_31_u64_offset:
+**     mov     (x[0-9]+), #?31
+**     ldnt1b  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_31_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64base_offset_u64 (p0, z0, 31),
+                    z0_res = svldnt1ub_gather_offset_u64 (p0, z0, 31))
+
+/*
+** ldnt1ub_gather_32_u64_offset:
+**     mov     (x[0-9]+), #?32
+**     ldnt1b  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1ub_gather_32_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64base_offset_u64 (p0, z0, 32),
+                    z0_res = svldnt1ub_gather_offset_u64 (p0, z0, 32))
+
+/*
+** ldnt1ub_gather_x0_u64_s64offset:
+**     ldnt1b  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1ub_gather_x0_u64_s64offset, svuint64_t, uint8_t, svint64_t,
+                    z0_res = svldnt1ub_gather_s64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1ub_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1ub_gather_tied1_u64_s64offset:
+**     ldnt1b  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1ub_gather_tied1_u64_s64offset, svuint64_t, uint8_t, svint64_t,
+                    z0_res = svldnt1ub_gather_s64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1ub_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1ub_gather_untied_u64_s64offset:
+**     ldnt1b  z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1ub_gather_untied_u64_s64offset, svuint64_t, uint8_t, svint64_t,
+                    z0_res = svldnt1ub_gather_s64offset_u64 (p0, x0, z1),
+                    z0_res = svldnt1ub_gather_offset_u64 (p0, x0, z1))
+
+/*
+** ldnt1ub_gather_x0_u64_u64offset:
+**     ldnt1b  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1ub_gather_x0_u64_u64offset, svuint64_t, uint8_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1ub_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1ub_gather_tied1_u64_u64offset:
+**     ldnt1b  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1ub_gather_tied1_u64_u64offset, svuint64_t, uint8_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1ub_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1ub_gather_untied_u64_u64offset:
+**     ldnt1b  z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1ub_gather_untied_u64_u64offset, svuint64_t, uint8_t, svuint64_t,
+                    z0_res = svldnt1ub_gather_u64offset_u64 (p0, x0, z1),
+                    z0_res = svldnt1ub_gather_offset_u64 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1uh_gather_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1uh_gather_s32.c
new file mode 100644 (file)
index 0000000..dbc8e6e
--- /dev/null
@@ -0,0 +1,175 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1uh_gather_s32_tied1:
+**     ldnt1h  z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_s32_tied1, svint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_s32 (p0, z0),
+                    z0_res = svldnt1uh_gather_s32 (p0, z0))
+
+/*
+** ldnt1uh_gather_s32_untied:
+**     ldnt1h  z0\.s, p0/z, \[z1\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_s32_untied, svint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_s32 (p0, z1),
+                    z0_res = svldnt1uh_gather_s32 (p0, z1))
+
+/*
+** ldnt1uh_gather_x0_s32_offset:
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_x0_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_offset_s32 (p0, z0, x0),
+                    z0_res = svldnt1uh_gather_offset_s32 (p0, z0, x0))
+
+/*
+** ldnt1uh_gather_m2_s32_offset:
+**     mov     (x[0-9]+), #?-2
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_m2_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_offset_s32 (p0, z0, -2),
+                    z0_res = svldnt1uh_gather_offset_s32 (p0, z0, -2))
+
+/*
+** ldnt1uh_gather_0_s32_offset:
+**     ldnt1h  z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_0_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_offset_s32 (p0, z0, 0),
+                    z0_res = svldnt1uh_gather_offset_s32 (p0, z0, 0))
+
+/*
+** ldnt1uh_gather_5_s32_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_5_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_offset_s32 (p0, z0, 5),
+                    z0_res = svldnt1uh_gather_offset_s32 (p0, z0, 5))
+
+/*
+** ldnt1uh_gather_6_s32_offset:
+**     mov     (x[0-9]+), #?6
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_6_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_offset_s32 (p0, z0, 6),
+                    z0_res = svldnt1uh_gather_offset_s32 (p0, z0, 6))
+
+/*
+** ldnt1uh_gather_62_s32_offset:
+**     mov     (x[0-9]+), #?62
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_62_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_offset_s32 (p0, z0, 62),
+                    z0_res = svldnt1uh_gather_offset_s32 (p0, z0, 62))
+
+/*
+** ldnt1uh_gather_64_s32_offset:
+**     mov     (x[0-9]+), #?64
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_64_s32_offset, svint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_offset_s32 (p0, z0, 64),
+                    z0_res = svldnt1uh_gather_offset_s32 (p0, z0, 64))
+
+/*
+** ldnt1uh_gather_x0_s32_index:
+**     lsl     (x[0-9]+), x0, #?1
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_x0_s32_index, svint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_index_s32 (p0, z0, x0),
+                    z0_res = svldnt1uh_gather_index_s32 (p0, z0, x0))
+
+/*
+** ldnt1uh_gather_m1_s32_index:
+**     mov     (x[0-9]+), #?-2
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_m1_s32_index, svint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_index_s32 (p0, z0, -1),
+                    z0_res = svldnt1uh_gather_index_s32 (p0, z0, -1))
+
+/*
+** ldnt1uh_gather_0_s32_index:
+**     ldnt1h  z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_0_s32_index, svint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_index_s32 (p0, z0, 0),
+                    z0_res = svldnt1uh_gather_index_s32 (p0, z0, 0))
+
+/*
+** ldnt1uh_gather_5_s32_index:
+**     mov     (x[0-9]+), #?10
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_5_s32_index, svint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_index_s32 (p0, z0, 5),
+                    z0_res = svldnt1uh_gather_index_s32 (p0, z0, 5))
+
+/*
+** ldnt1uh_gather_31_s32_index:
+**     mov     (x[0-9]+), #?62
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_31_s32_index, svint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_index_s32 (p0, z0, 31),
+                    z0_res = svldnt1uh_gather_index_s32 (p0, z0, 31))
+
+/*
+** ldnt1uh_gather_32_s32_index:
+**     mov     (x[0-9]+), #?64
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_32_s32_index, svint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_index_s32 (p0, z0, 32),
+                    z0_res = svldnt1uh_gather_index_s32 (p0, z0, 32))
+
+/*
+** ldnt1uh_gather_x0_s32_u32offset:
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_x0_s32_u32offset, svint32_t, uint16_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32offset_s32 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_offset_s32 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_tied1_s32_u32offset:
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_tied1_s32_u32offset, svint32_t, uint16_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32offset_s32 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_offset_s32 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_untied_s32_u32offset:
+**     ldnt1h  z0\.s, p0/z, \[z1\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_untied_s32_u32offset, svint32_t, uint16_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32offset_s32 (p0, x0, z1),
+                    z0_res = svldnt1uh_gather_offset_s32 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1uh_gather_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1uh_gather_s64.c
new file mode 100644 (file)
index 0000000..4d0a5fe
--- /dev/null
@@ -0,0 +1,262 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1uh_gather_s64_tied1:
+**     ldnt1h  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_s64_tied1, svint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_s64 (p0, z0),
+                    z0_res = svldnt1uh_gather_s64 (p0, z0))
+
+/*
+** ldnt1uh_gather_s64_untied:
+**     ldnt1h  z0\.d, p0/z, \[z1\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_s64_untied, svint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_s64 (p0, z1),
+                    z0_res = svldnt1uh_gather_s64 (p0, z1))
+
+/*
+** ldnt1uh_gather_x0_s64_offset:
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_x0_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_offset_s64 (p0, z0, x0),
+                    z0_res = svldnt1uh_gather_offset_s64 (p0, z0, x0))
+
+/*
+** ldnt1uh_gather_m2_s64_offset:
+**     mov     (x[0-9]+), #?-2
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_m2_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_offset_s64 (p0, z0, -2),
+                    z0_res = svldnt1uh_gather_offset_s64 (p0, z0, -2))
+
+/*
+** ldnt1uh_gather_0_s64_offset:
+**     ldnt1h  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_0_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_offset_s64 (p0, z0, 0),
+                    z0_res = svldnt1uh_gather_offset_s64 (p0, z0, 0))
+
+/*
+** ldnt1uh_gather_5_s64_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_5_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_offset_s64 (p0, z0, 5),
+                    z0_res = svldnt1uh_gather_offset_s64 (p0, z0, 5))
+
+/*
+** ldnt1uh_gather_6_s64_offset:
+**     mov     (x[0-9]+), #?6
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_6_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_offset_s64 (p0, z0, 6),
+                    z0_res = svldnt1uh_gather_offset_s64 (p0, z0, 6))
+
+/*
+** ldnt1uh_gather_62_s64_offset:
+**     mov     (x[0-9]+), #?62
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_62_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_offset_s64 (p0, z0, 62),
+                    z0_res = svldnt1uh_gather_offset_s64 (p0, z0, 62))
+
+/*
+** ldnt1uh_gather_64_s64_offset:
+**     mov     (x[0-9]+), #?64
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_64_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_offset_s64 (p0, z0, 64),
+                    z0_res = svldnt1uh_gather_offset_s64 (p0, z0, 64))
+
+/*
+** ldnt1uh_gather_x0_s64_index:
+**     lsl     (x[0-9]+), x0, #?1
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_x0_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_index_s64 (p0, z0, x0),
+                    z0_res = svldnt1uh_gather_index_s64 (p0, z0, x0))
+
+/*
+** ldnt1uh_gather_m1_s64_index:
+**     mov     (x[0-9]+), #?-2
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_m1_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_index_s64 (p0, z0, -1),
+                    z0_res = svldnt1uh_gather_index_s64 (p0, z0, -1))
+
+/*
+** ldnt1uh_gather_0_s64_index:
+**     ldnt1h  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_0_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_index_s64 (p0, z0, 0),
+                    z0_res = svldnt1uh_gather_index_s64 (p0, z0, 0))
+
+/*
+** ldnt1uh_gather_5_s64_index:
+**     mov     (x[0-9]+), #?10
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_5_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_index_s64 (p0, z0, 5),
+                    z0_res = svldnt1uh_gather_index_s64 (p0, z0, 5))
+
+/*
+** ldnt1uh_gather_31_s64_index:
+**     mov     (x[0-9]+), #?62
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_31_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_index_s64 (p0, z0, 31),
+                    z0_res = svldnt1uh_gather_index_s64 (p0, z0, 31))
+
+/*
+** ldnt1uh_gather_32_s64_index:
+**     mov     (x[0-9]+), #?64
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_32_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_index_s64 (p0, z0, 32),
+                    z0_res = svldnt1uh_gather_index_s64 (p0, z0, 32))
+
+/*
+** ldnt1uh_gather_x0_s64_s64offset:
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_x0_s64_s64offset, svint64_t, uint16_t, svint64_t,
+                    z0_res = svldnt1uh_gather_s64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_tied1_s64_s64offset:
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_tied1_s64_s64offset, svint64_t, uint16_t, svint64_t,
+                    z0_res = svldnt1uh_gather_s64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_untied_s64_s64offset:
+**     ldnt1h  z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_untied_s64_s64offset, svint64_t, uint16_t, svint64_t,
+                    z0_res = svldnt1uh_gather_s64offset_s64 (p0, x0, z1),
+                    z0_res = svldnt1uh_gather_offset_s64 (p0, x0, z1))
+
+/*
+** ldnt1uh_gather_x0_s64_u64offset:
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_x0_s64_u64offset, svint64_t, uint16_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_tied1_s64_u64offset:
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_tied1_s64_u64offset, svint64_t, uint16_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_untied_s64_u64offset:
+**     ldnt1h  z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_untied_s64_u64offset, svint64_t, uint16_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64offset_s64 (p0, x0, z1),
+                    z0_res = svldnt1uh_gather_offset_s64 (p0, x0, z1))
+
+/*
+** ldnt1uh_gather_x0_s64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #1
+**     ldnt1h  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_x0_s64_s64index, svint64_t, uint16_t, svint64_t,
+                    z0_res = svldnt1uh_gather_s64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_index_s64 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_tied1_s64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #1
+**     ldnt1h  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_tied1_s64_s64index, svint64_t, uint16_t, svint64_t,
+                    z0_res = svldnt1uh_gather_s64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_index_s64 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_untied_s64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #1
+**     ldnt1h  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_untied_s64_s64index, svint64_t, uint16_t, svint64_t,
+                    z0_res = svldnt1uh_gather_s64index_s64 (p0, x0, z1),
+                    z0_res = svldnt1uh_gather_index_s64 (p0, x0, z1))
+
+/*
+** ldnt1uh_gather_x0_s64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #1
+**     ldnt1h  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_x0_s64_u64index, svint64_t, uint16_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_index_s64 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_tied1_s64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #1
+**     ldnt1h  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_tied1_s64_u64index, svint64_t, uint16_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_index_s64 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_untied_s64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #1
+**     ldnt1h  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_untied_s64_u64index, svint64_t, uint16_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64index_s64 (p0, x0, z1),
+                    z0_res = svldnt1uh_gather_index_s64 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1uh_gather_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1uh_gather_u32.c
new file mode 100644 (file)
index 0000000..a5b70db
--- /dev/null
@@ -0,0 +1,175 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1uh_gather_u32_tied1:
+**     ldnt1h  z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_u32_tied1, svuint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_u32 (p0, z0),
+                    z0_res = svldnt1uh_gather_u32 (p0, z0))
+
+/*
+** ldnt1uh_gather_u32_untied:
+**     ldnt1h  z0\.s, p0/z, \[z1\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_u32_untied, svuint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_u32 (p0, z1),
+                    z0_res = svldnt1uh_gather_u32 (p0, z1))
+
+/*
+** ldnt1uh_gather_x0_u32_offset:
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_x0_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_offset_u32 (p0, z0, x0),
+                    z0_res = svldnt1uh_gather_offset_u32 (p0, z0, x0))
+
+/*
+** ldnt1uh_gather_m2_u32_offset:
+**     mov     (x[0-9]+), #?-2
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_m2_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_offset_u32 (p0, z0, -2),
+                    z0_res = svldnt1uh_gather_offset_u32 (p0, z0, -2))
+
+/*
+** ldnt1uh_gather_0_u32_offset:
+**     ldnt1h  z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_0_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_offset_u32 (p0, z0, 0),
+                    z0_res = svldnt1uh_gather_offset_u32 (p0, z0, 0))
+
+/*
+** ldnt1uh_gather_5_u32_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_5_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_offset_u32 (p0, z0, 5),
+                    z0_res = svldnt1uh_gather_offset_u32 (p0, z0, 5))
+
+/*
+** ldnt1uh_gather_6_u32_offset:
+**     mov     (x[0-9]+), #?6
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_6_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_offset_u32 (p0, z0, 6),
+                    z0_res = svldnt1uh_gather_offset_u32 (p0, z0, 6))
+
+/*
+** ldnt1uh_gather_62_u32_offset:
+**     mov     (x[0-9]+), #?62
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_62_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_offset_u32 (p0, z0, 62),
+                    z0_res = svldnt1uh_gather_offset_u32 (p0, z0, 62))
+
+/*
+** ldnt1uh_gather_64_u32_offset:
+**     mov     (x[0-9]+), #?64
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_64_u32_offset, svuint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_offset_u32 (p0, z0, 64),
+                    z0_res = svldnt1uh_gather_offset_u32 (p0, z0, 64))
+
+/*
+** ldnt1uh_gather_x0_u32_index:
+**     lsl     (x[0-9]+), x0, #?1
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_x0_u32_index, svuint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_index_u32 (p0, z0, x0),
+                    z0_res = svldnt1uh_gather_index_u32 (p0, z0, x0))
+
+/*
+** ldnt1uh_gather_m1_u32_index:
+**     mov     (x[0-9]+), #?-2
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_m1_u32_index, svuint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_index_u32 (p0, z0, -1),
+                    z0_res = svldnt1uh_gather_index_u32 (p0, z0, -1))
+
+/*
+** ldnt1uh_gather_0_u32_index:
+**     ldnt1h  z0\.s, p0/z, \[z0\.s\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_0_u32_index, svuint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_index_u32 (p0, z0, 0),
+                    z0_res = svldnt1uh_gather_index_u32 (p0, z0, 0))
+
+/*
+** ldnt1uh_gather_5_u32_index:
+**     mov     (x[0-9]+), #?10
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_5_u32_index, svuint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_index_u32 (p0, z0, 5),
+                    z0_res = svldnt1uh_gather_index_u32 (p0, z0, 5))
+
+/*
+** ldnt1uh_gather_31_u32_index:
+**     mov     (x[0-9]+), #?62
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_31_u32_index, svuint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_index_u32 (p0, z0, 31),
+                    z0_res = svldnt1uh_gather_index_u32 (p0, z0, 31))
+
+/*
+** ldnt1uh_gather_32_u32_index:
+**     mov     (x[0-9]+), #?64
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_32_u32_index, svuint32_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32base_index_u32 (p0, z0, 32),
+                    z0_res = svldnt1uh_gather_index_u32 (p0, z0, 32))
+
+/*
+** ldnt1uh_gather_x0_u32_u32offset:
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_x0_u32_u32offset, svuint32_t, uint16_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32offset_u32 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_offset_u32 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_tied1_u32_u32offset:
+**     ldnt1h  z0\.s, p0/z, \[z0\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_tied1_u32_u32offset, svuint32_t, uint16_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32offset_u32 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_offset_u32 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_untied_u32_u32offset:
+**     ldnt1h  z0\.s, p0/z, \[z1\.s, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_untied_u32_u32offset, svuint32_t, uint16_t, svuint32_t,
+                    z0_res = svldnt1uh_gather_u32offset_u32 (p0, x0, z1),
+                    z0_res = svldnt1uh_gather_offset_u32 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1uh_gather_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1uh_gather_u64.c
new file mode 100644 (file)
index 0000000..8ab0ca2
--- /dev/null
@@ -0,0 +1,262 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1uh_gather_u64_tied1:
+**     ldnt1h  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_u64_tied1, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_u64 (p0, z0),
+                    z0_res = svldnt1uh_gather_u64 (p0, z0))
+
+/*
+** ldnt1uh_gather_u64_untied:
+**     ldnt1h  z0\.d, p0/z, \[z1\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_u64_untied, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_u64 (p0, z1),
+                    z0_res = svldnt1uh_gather_u64 (p0, z1))
+
+/*
+** ldnt1uh_gather_x0_u64_offset:
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_x0_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_offset_u64 (p0, z0, x0),
+                    z0_res = svldnt1uh_gather_offset_u64 (p0, z0, x0))
+
+/*
+** ldnt1uh_gather_m2_u64_offset:
+**     mov     (x[0-9]+), #?-2
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_m2_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_offset_u64 (p0, z0, -2),
+                    z0_res = svldnt1uh_gather_offset_u64 (p0, z0, -2))
+
+/*
+** ldnt1uh_gather_0_u64_offset:
+**     ldnt1h  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_0_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_offset_u64 (p0, z0, 0),
+                    z0_res = svldnt1uh_gather_offset_u64 (p0, z0, 0))
+
+/*
+** ldnt1uh_gather_5_u64_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_5_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_offset_u64 (p0, z0, 5),
+                    z0_res = svldnt1uh_gather_offset_u64 (p0, z0, 5))
+
+/*
+** ldnt1uh_gather_6_u64_offset:
+**     mov     (x[0-9]+), #?6
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_6_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_offset_u64 (p0, z0, 6),
+                    z0_res = svldnt1uh_gather_offset_u64 (p0, z0, 6))
+
+/*
+** ldnt1uh_gather_62_u64_offset:
+**     mov     (x[0-9]+), #?62
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_62_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_offset_u64 (p0, z0, 62),
+                    z0_res = svldnt1uh_gather_offset_u64 (p0, z0, 62))
+
+/*
+** ldnt1uh_gather_64_u64_offset:
+**     mov     (x[0-9]+), #?64
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_64_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_offset_u64 (p0, z0, 64),
+                    z0_res = svldnt1uh_gather_offset_u64 (p0, z0, 64))
+
+/*
+** ldnt1uh_gather_x0_u64_index:
+**     lsl     (x[0-9]+), x0, #?1
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_x0_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_index_u64 (p0, z0, x0),
+                    z0_res = svldnt1uh_gather_index_u64 (p0, z0, x0))
+
+/*
+** ldnt1uh_gather_m1_u64_index:
+**     mov     (x[0-9]+), #?-2
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_m1_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_index_u64 (p0, z0, -1),
+                    z0_res = svldnt1uh_gather_index_u64 (p0, z0, -1))
+
+/*
+** ldnt1uh_gather_0_u64_index:
+**     ldnt1h  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_0_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_index_u64 (p0, z0, 0),
+                    z0_res = svldnt1uh_gather_index_u64 (p0, z0, 0))
+
+/*
+** ldnt1uh_gather_5_u64_index:
+**     mov     (x[0-9]+), #?10
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_5_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_index_u64 (p0, z0, 5),
+                    z0_res = svldnt1uh_gather_index_u64 (p0, z0, 5))
+
+/*
+** ldnt1uh_gather_31_u64_index:
+**     mov     (x[0-9]+), #?62
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_31_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_index_u64 (p0, z0, 31),
+                    z0_res = svldnt1uh_gather_index_u64 (p0, z0, 31))
+
+/*
+** ldnt1uh_gather_32_u64_index:
+**     mov     (x[0-9]+), #?64
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uh_gather_32_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64base_index_u64 (p0, z0, 32),
+                    z0_res = svldnt1uh_gather_index_u64 (p0, z0, 32))
+
+/*
+** ldnt1uh_gather_x0_u64_s64offset:
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_x0_u64_s64offset, svuint64_t, uint16_t, svint64_t,
+                    z0_res = svldnt1uh_gather_s64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_tied1_u64_s64offset:
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_tied1_u64_s64offset, svuint64_t, uint16_t, svint64_t,
+                    z0_res = svldnt1uh_gather_s64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_untied_u64_s64offset:
+**     ldnt1h  z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_untied_u64_s64offset, svuint64_t, uint16_t, svint64_t,
+                    z0_res = svldnt1uh_gather_s64offset_u64 (p0, x0, z1),
+                    z0_res = svldnt1uh_gather_offset_u64 (p0, x0, z1))
+
+/*
+** ldnt1uh_gather_x0_u64_u64offset:
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_x0_u64_u64offset, svuint64_t, uint16_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_tied1_u64_u64offset:
+**     ldnt1h  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_tied1_u64_u64offset, svuint64_t, uint16_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_untied_u64_u64offset:
+**     ldnt1h  z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_untied_u64_u64offset, svuint64_t, uint16_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64offset_u64 (p0, x0, z1),
+                    z0_res = svldnt1uh_gather_offset_u64 (p0, x0, z1))
+
+/*
+** ldnt1uh_gather_x0_u64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #1
+**     ldnt1h  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_x0_u64_s64index, svuint64_t, uint16_t, svint64_t,
+                    z0_res = svldnt1uh_gather_s64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_index_u64 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_tied1_u64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #1
+**     ldnt1h  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_tied1_u64_s64index, svuint64_t, uint16_t, svint64_t,
+                    z0_res = svldnt1uh_gather_s64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_index_u64 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_untied_u64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #1
+**     ldnt1h  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_untied_u64_s64index, svuint64_t, uint16_t, svint64_t,
+                    z0_res = svldnt1uh_gather_s64index_u64 (p0, x0, z1),
+                    z0_res = svldnt1uh_gather_index_u64 (p0, x0, z1))
+
+/*
+** ldnt1uh_gather_x0_u64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #1
+**     ldnt1h  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_x0_u64_u64index, svuint64_t, uint16_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_index_u64 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_tied1_u64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #1
+**     ldnt1h  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_tied1_u64_u64index, svuint64_t, uint16_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1uh_gather_index_u64 (p0, x0, z0))
+
+/*
+** ldnt1uh_gather_untied_u64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #1
+**     ldnt1h  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uh_gather_untied_u64_u64index, svuint64_t, uint16_t, svuint64_t,
+                    z0_res = svldnt1uh_gather_u64index_u64 (p0, x0, z1),
+                    z0_res = svldnt1uh_gather_index_u64 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1uw_gather_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1uw_gather_s64.c
new file mode 100644 (file)
index 0000000..236e7ab
--- /dev/null
@@ -0,0 +1,282 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1uw_gather_s64_tied1:
+**     ldnt1w  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_s64_tied1, svint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_s64 (p0, z0),
+                    z0_res = svldnt1uw_gather_s64 (p0, z0))
+
+/*
+** ldnt1uw_gather_s64_untied:
+**     ldnt1w  z0\.d, p0/z, \[z1\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_s64_untied, svint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_s64 (p0, z1),
+                    z0_res = svldnt1uw_gather_s64 (p0, z1))
+
+/*
+** ldnt1uw_gather_x0_s64_offset:
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_x0_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_offset_s64 (p0, z0, x0),
+                    z0_res = svldnt1uw_gather_offset_s64 (p0, z0, x0))
+
+/*
+** ldnt1uw_gather_m4_s64_offset:
+**     mov     (x[0-9]+), #?-4
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_m4_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_offset_s64 (p0, z0, -4),
+                    z0_res = svldnt1uw_gather_offset_s64 (p0, z0, -4))
+
+/*
+** ldnt1uw_gather_0_s64_offset:
+**     ldnt1w  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_0_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_offset_s64 (p0, z0, 0),
+                    z0_res = svldnt1uw_gather_offset_s64 (p0, z0, 0))
+
+/*
+** ldnt1uw_gather_5_s64_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_5_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_offset_s64 (p0, z0, 5),
+                    z0_res = svldnt1uw_gather_offset_s64 (p0, z0, 5))
+
+/*
+** ldnt1uw_gather_6_s64_offset:
+**     mov     (x[0-9]+), #?6
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_6_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_offset_s64 (p0, z0, 6),
+                    z0_res = svldnt1uw_gather_offset_s64 (p0, z0, 6))
+
+/*
+** ldnt1uw_gather_7_s64_offset:
+**     mov     (x[0-9]+), #?7
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_7_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_offset_s64 (p0, z0, 7),
+                    z0_res = svldnt1uw_gather_offset_s64 (p0, z0, 7))
+
+/*
+** ldnt1uw_gather_8_s64_offset:
+**     mov     (x[0-9]+), #?8
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_8_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_offset_s64 (p0, z0, 8),
+                    z0_res = svldnt1uw_gather_offset_s64 (p0, z0, 8))
+
+/*
+** ldnt1uw_gather_124_s64_offset:
+**     mov     (x[0-9]+), #?124
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_124_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_offset_s64 (p0, z0, 124),
+                    z0_res = svldnt1uw_gather_offset_s64 (p0, z0, 124))
+
+/*
+** ldnt1uw_gather_128_s64_offset:
+**     mov     (x[0-9]+), #?128
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_128_s64_offset, svint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_offset_s64 (p0, z0, 128),
+                    z0_res = svldnt1uw_gather_offset_s64 (p0, z0, 128))
+
+/*
+** ldnt1uw_gather_x0_s64_index:
+**     lsl     (x[0-9]+), x0, #?2
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_x0_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_index_s64 (p0, z0, x0),
+                    z0_res = svldnt1uw_gather_index_s64 (p0, z0, x0))
+
+/*
+** ldnt1uw_gather_m1_s64_index:
+**     mov     (x[0-9]+), #?-4
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_m1_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_index_s64 (p0, z0, -1),
+                    z0_res = svldnt1uw_gather_index_s64 (p0, z0, -1))
+
+/*
+** ldnt1uw_gather_0_s64_index:
+**     ldnt1w  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_0_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_index_s64 (p0, z0, 0),
+                    z0_res = svldnt1uw_gather_index_s64 (p0, z0, 0))
+
+/*
+** ldnt1uw_gather_5_s64_index:
+**     mov     (x[0-9]+), #?20
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_5_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_index_s64 (p0, z0, 5),
+                    z0_res = svldnt1uw_gather_index_s64 (p0, z0, 5))
+
+/*
+** ldnt1uw_gather_31_s64_index:
+**     mov     (x[0-9]+), #?124
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_31_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_index_s64 (p0, z0, 31),
+                    z0_res = svldnt1uw_gather_index_s64 (p0, z0, 31))
+
+/*
+** ldnt1uw_gather_32_s64_index:
+**     mov     (x[0-9]+), #?128
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_32_s64_index, svint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_index_s64 (p0, z0, 32),
+                    z0_res = svldnt1uw_gather_index_s64 (p0, z0, 32))
+
+/*
+** ldnt1uw_gather_x0_s64_s64offset:
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_x0_s64_s64offset, svint64_t, uint32_t, svint64_t,
+                    z0_res = svldnt1uw_gather_s64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1uw_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1uw_gather_tied1_s64_s64offset:
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_tied1_s64_s64offset, svint64_t, uint32_t, svint64_t,
+                    z0_res = svldnt1uw_gather_s64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1uw_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1uw_gather_untied_s64_s64offset:
+**     ldnt1w  z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_untied_s64_s64offset, svint64_t, uint32_t, svint64_t,
+                    z0_res = svldnt1uw_gather_s64offset_s64 (p0, x0, z1),
+                    z0_res = svldnt1uw_gather_offset_s64 (p0, x0, z1))
+
+/*
+** ldnt1uw_gather_x0_s64_u64offset:
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_x0_s64_u64offset, svint64_t, uint32_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1uw_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1uw_gather_tied1_s64_u64offset:
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_tied1_s64_u64offset, svint64_t, uint32_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64offset_s64 (p0, x0, z0),
+                    z0_res = svldnt1uw_gather_offset_s64 (p0, x0, z0))
+
+/*
+** ldnt1uw_gather_untied_s64_u64offset:
+**     ldnt1w  z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_untied_s64_u64offset, svint64_t, uint32_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64offset_s64 (p0, x0, z1),
+                    z0_res = svldnt1uw_gather_offset_s64 (p0, x0, z1))
+
+/*
+** ldnt1uw_gather_x0_s64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #2
+**     ldnt1w  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_x0_s64_s64index, svint64_t, uint32_t, svint64_t,
+                    z0_res = svldnt1uw_gather_s64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1uw_gather_index_s64 (p0, x0, z0))
+
+/*
+** ldnt1uw_gather_tied1_s64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #2
+**     ldnt1w  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_tied1_s64_s64index, svint64_t, uint32_t, svint64_t,
+                    z0_res = svldnt1uw_gather_s64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1uw_gather_index_s64 (p0, x0, z0))
+
+/*
+** ldnt1uw_gather_untied_s64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #2
+**     ldnt1w  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_untied_s64_s64index, svint64_t, uint32_t, svint64_t,
+                    z0_res = svldnt1uw_gather_s64index_s64 (p0, x0, z1),
+                    z0_res = svldnt1uw_gather_index_s64 (p0, x0, z1))
+
+/*
+** ldnt1uw_gather_x0_s64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #2
+**     ldnt1w  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_x0_s64_u64index, svint64_t, uint32_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1uw_gather_index_s64 (p0, x0, z0))
+
+/*
+** ldnt1uw_gather_tied1_s64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #2
+**     ldnt1w  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_tied1_s64_u64index, svint64_t, uint32_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64index_s64 (p0, x0, z0),
+                    z0_res = svldnt1uw_gather_index_s64 (p0, x0, z0))
+
+/*
+** ldnt1uw_gather_untied_s64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #2
+**     ldnt1w  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_untied_s64_u64index, svint64_t, uint32_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64index_s64 (p0, x0, z1),
+                    z0_res = svldnt1uw_gather_index_s64 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1uw_gather_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/ldnt1uw_gather_u64.c
new file mode 100644 (file)
index 0000000..cd9a0f6
--- /dev/null
@@ -0,0 +1,282 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** ldnt1uw_gather_u64_tied1:
+**     ldnt1w  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_u64_tied1, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_u64 (p0, z0),
+                    z0_res = svldnt1uw_gather_u64 (p0, z0))
+
+/*
+** ldnt1uw_gather_u64_untied:
+**     ldnt1w  z0\.d, p0/z, \[z1\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_u64_untied, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_u64 (p0, z1),
+                    z0_res = svldnt1uw_gather_u64 (p0, z1))
+
+/*
+** ldnt1uw_gather_x0_u64_offset:
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_x0_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_offset_u64 (p0, z0, x0),
+                    z0_res = svldnt1uw_gather_offset_u64 (p0, z0, x0))
+
+/*
+** ldnt1uw_gather_m4_u64_offset:
+**     mov     (x[0-9]+), #?-4
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_m4_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_offset_u64 (p0, z0, -4),
+                    z0_res = svldnt1uw_gather_offset_u64 (p0, z0, -4))
+
+/*
+** ldnt1uw_gather_0_u64_offset:
+**     ldnt1w  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_0_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_offset_u64 (p0, z0, 0),
+                    z0_res = svldnt1uw_gather_offset_u64 (p0, z0, 0))
+
+/*
+** ldnt1uw_gather_5_u64_offset:
+**     mov     (x[0-9]+), #?5
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_5_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_offset_u64 (p0, z0, 5),
+                    z0_res = svldnt1uw_gather_offset_u64 (p0, z0, 5))
+
+/*
+** ldnt1uw_gather_6_u64_offset:
+**     mov     (x[0-9]+), #?6
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_6_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_offset_u64 (p0, z0, 6),
+                    z0_res = svldnt1uw_gather_offset_u64 (p0, z0, 6))
+
+/*
+** ldnt1uw_gather_7_u64_offset:
+**     mov     (x[0-9]+), #?7
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_7_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_offset_u64 (p0, z0, 7),
+                    z0_res = svldnt1uw_gather_offset_u64 (p0, z0, 7))
+
+/*
+** ldnt1uw_gather_8_u64_offset:
+**     mov     (x[0-9]+), #?8
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_8_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_offset_u64 (p0, z0, 8),
+                    z0_res = svldnt1uw_gather_offset_u64 (p0, z0, 8))
+
+/*
+** ldnt1uw_gather_124_u64_offset:
+**     mov     (x[0-9]+), #?124
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_124_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_offset_u64 (p0, z0, 124),
+                    z0_res = svldnt1uw_gather_offset_u64 (p0, z0, 124))
+
+/*
+** ldnt1uw_gather_128_u64_offset:
+**     mov     (x[0-9]+), #?128
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_128_u64_offset, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_offset_u64 (p0, z0, 128),
+                    z0_res = svldnt1uw_gather_offset_u64 (p0, z0, 128))
+
+/*
+** ldnt1uw_gather_x0_u64_index:
+**     lsl     (x[0-9]+), x0, #?2
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_x0_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_index_u64 (p0, z0, x0),
+                    z0_res = svldnt1uw_gather_index_u64 (p0, z0, x0))
+
+/*
+** ldnt1uw_gather_m1_u64_index:
+**     mov     (x[0-9]+), #?-4
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_m1_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_index_u64 (p0, z0, -1),
+                    z0_res = svldnt1uw_gather_index_u64 (p0, z0, -1))
+
+/*
+** ldnt1uw_gather_0_u64_index:
+**     ldnt1w  z0\.d, p0/z, \[z0\.d\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_0_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_index_u64 (p0, z0, 0),
+                    z0_res = svldnt1uw_gather_index_u64 (p0, z0, 0))
+
+/*
+** ldnt1uw_gather_5_u64_index:
+**     mov     (x[0-9]+), #?20
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_5_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_index_u64 (p0, z0, 5),
+                    z0_res = svldnt1uw_gather_index_u64 (p0, z0, 5))
+
+/*
+** ldnt1uw_gather_31_u64_index:
+**     mov     (x[0-9]+), #?124
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_31_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_index_u64 (p0, z0, 31),
+                    z0_res = svldnt1uw_gather_index_u64 (p0, z0, 31))
+
+/*
+** ldnt1uw_gather_32_u64_index:
+**     mov     (x[0-9]+), #?128
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, \1\]
+**     ret
+*/
+TEST_LOAD_GATHER_ZS (ldnt1uw_gather_32_u64_index, svuint64_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64base_index_u64 (p0, z0, 32),
+                    z0_res = svldnt1uw_gather_index_u64 (p0, z0, 32))
+
+/*
+** ldnt1uw_gather_x0_u64_s64offset:
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_x0_u64_s64offset, svuint64_t, uint32_t, svint64_t,
+                    z0_res = svldnt1uw_gather_s64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1uw_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1uw_gather_tied1_u64_s64offset:
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_tied1_u64_s64offset, svuint64_t, uint32_t, svint64_t,
+                    z0_res = svldnt1uw_gather_s64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1uw_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1uw_gather_untied_u64_s64offset:
+**     ldnt1w  z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_untied_u64_s64offset, svuint64_t, uint32_t, svint64_t,
+                    z0_res = svldnt1uw_gather_s64offset_u64 (p0, x0, z1),
+                    z0_res = svldnt1uw_gather_offset_u64 (p0, x0, z1))
+
+/*
+** ldnt1uw_gather_x0_u64_u64offset:
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_x0_u64_u64offset, svuint64_t, uint32_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1uw_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1uw_gather_tied1_u64_u64offset:
+**     ldnt1w  z0\.d, p0/z, \[z0\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_tied1_u64_u64offset, svuint64_t, uint32_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64offset_u64 (p0, x0, z0),
+                    z0_res = svldnt1uw_gather_offset_u64 (p0, x0, z0))
+
+/*
+** ldnt1uw_gather_untied_u64_u64offset:
+**     ldnt1w  z0\.d, p0/z, \[z1\.d, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_untied_u64_u64offset, svuint64_t, uint32_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64offset_u64 (p0, x0, z1),
+                    z0_res = svldnt1uw_gather_offset_u64 (p0, x0, z1))
+
+/*
+** ldnt1uw_gather_x0_u64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #2
+**     ldnt1w  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_x0_u64_s64index, svuint64_t, uint32_t, svint64_t,
+                    z0_res = svldnt1uw_gather_s64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1uw_gather_index_u64 (p0, x0, z0))
+
+/*
+** ldnt1uw_gather_tied1_u64_s64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #2
+**     ldnt1w  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_tied1_u64_s64index, svuint64_t, uint32_t, svint64_t,
+                    z0_res = svldnt1uw_gather_s64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1uw_gather_index_u64 (p0, x0, z0))
+
+/*
+** ldnt1uw_gather_untied_u64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #2
+**     ldnt1w  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_untied_u64_s64index, svuint64_t, uint32_t, svint64_t,
+                    z0_res = svldnt1uw_gather_s64index_u64 (p0, x0, z1),
+                    z0_res = svldnt1uw_gather_index_u64 (p0, x0, z1))
+
+/*
+** ldnt1uw_gather_x0_u64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #2
+**     ldnt1w  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_x0_u64_u64index, svuint64_t, uint32_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1uw_gather_index_u64 (p0, x0, z0))
+
+/*
+** ldnt1uw_gather_tied1_u64_u64index:
+**     lsl     (z[0-9]+\.d), z0\.d, #2
+**     ldnt1w  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_tied1_u64_u64index, svuint64_t, uint32_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64index_u64 (p0, x0, z0),
+                    z0_res = svldnt1uw_gather_index_u64 (p0, x0, z0))
+
+/*
+** ldnt1uw_gather_untied_u64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #2
+**     ldnt1w  z0\.d, p0/z, \[\1, x0\]
+**     ret
+*/
+TEST_LOAD_GATHER_SZ (ldnt1uw_gather_untied_u64_u64index, svuint64_t, uint32_t, svuint64_t,
+                    z0_res = svldnt1uw_gather_u64index_u64 (p0, x0, z1),
+                    z0_res = svldnt1uw_gather_index_u64 (p0, x0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/logb_f16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/logb_f16.c
new file mode 100644 (file)
index 0000000..bc68156
--- /dev/null
@@ -0,0 +1,52 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** logb_f16_m_tied1:
+**     flogb   z0\.h, p0/m, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (logb_f16_m_tied1, svint16_t, svfloat16_t,
+            z0 = svlogb_f16_m (z0, p0, z4),
+            z0 = svlogb_m (z0, p0, z4))
+
+/*
+** logb_f16_m_untied:
+**     movprfx z0, z1
+**     flogb   z0\.h, p0/m, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (logb_f16_m_untied, svint16_t, svfloat16_t,
+            z0 = svlogb_f16_m (z1, p0, z4),
+            z0 = svlogb_m (z1, p0, z4))
+
+/*
+** logb_f16_z:
+**     movprfx z0\.h, p0/z, z4\.h
+**     flogb   z0\.h, p0/m, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (logb_f16_z, svint16_t, svfloat16_t,
+            z0 = svlogb_f16_z (p0, z4),
+            z0 = svlogb_z (p0, z4))
+
+/*
+** logb_f16_x:
+**     flogb   z0\.h, p0/m, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (logb_f16_x, svint16_t, svfloat16_t,
+            z0 = svlogb_f16_x (p0, z4),
+            z0 = svlogb_x (p0, z4))
+
+/*
+** ptrue_logb_f16_x:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_DUAL_Z (ptrue_logb_f16_x, svint16_t, svfloat16_t,
+            z0 = svlogb_f16_x (svptrue_b16 (), z4),
+            z0 = svlogb_x (svptrue_b16 (), z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/logb_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/logb_f32.c
new file mode 100644 (file)
index 0000000..35bdcd1
--- /dev/null
@@ -0,0 +1,52 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** logb_f32_m_tied1:
+**     flogb   z0\.s, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (logb_f32_m_tied1, svint32_t, svfloat32_t,
+            z0 = svlogb_f32_m (z0, p0, z4),
+            z0 = svlogb_m (z0, p0, z4))
+
+/*
+** logb_f32_m_untied:
+**     movprfx z0, z1
+**     flogb   z0\.s, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (logb_f32_m_untied, svint32_t, svfloat32_t,
+            z0 = svlogb_f32_m (z1, p0, z4),
+            z0 = svlogb_m (z1, p0, z4))
+
+/*
+** logb_f32_z:
+**     movprfx z0\.s, p0/z, z4\.s
+**     flogb   z0\.s, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (logb_f32_z, svint32_t, svfloat32_t,
+            z0 = svlogb_f32_z (p0, z4),
+            z0 = svlogb_z (p0, z4))
+
+/*
+** logb_f32_x:
+**     flogb   z0\.s, p0/m, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (logb_f32_x, svint32_t, svfloat32_t,
+            z0 = svlogb_f32_x (p0, z4),
+            z0 = svlogb_x (p0, z4))
+
+/*
+** ptrue_logb_f32_x:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_DUAL_Z (ptrue_logb_f32_x, svint32_t, svfloat32_t,
+            z0 = svlogb_f32_x (svptrue_b32 (), z4),
+            z0 = svlogb_x (svptrue_b32 (), z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/logb_f64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/logb_f64.c
new file mode 100644 (file)
index 0000000..c7c2cb2
--- /dev/null
@@ -0,0 +1,52 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** logb_f64_m_tied1:
+**     flogb   z0\.d, p0/m, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (logb_f64_m_tied1, svint64_t, svfloat64_t,
+            z0 = svlogb_f64_m (z0, p0, z4),
+            z0 = svlogb_m (z0, p0, z4))
+
+/*
+** logb_f64_m_untied:
+**     movprfx z0, z1
+**     flogb   z0\.d, p0/m, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (logb_f64_m_untied, svint64_t, svfloat64_t,
+            z0 = svlogb_f64_m (z1, p0, z4),
+            z0 = svlogb_m (z1, p0, z4))
+
+/*
+** logb_f64_z:
+**     movprfx z0\.d, p0/z, z4\.d
+**     flogb   z0\.d, p0/m, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (logb_f64_z, svint64_t, svfloat64_t,
+            z0 = svlogb_f64_z (p0, z4),
+            z0 = svlogb_z (p0, z4))
+
+/*
+** logb_f64_x:
+**     flogb   z0\.d, p0/m, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (logb_f64_x, svint64_t, svfloat64_t,
+            z0 = svlogb_f64_x (p0, z4),
+            z0 = svlogb_x (p0, z4))
+
+/*
+** ptrue_logb_f64_x:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_DUAL_Z (ptrue_logb_f64_x, svint64_t, svfloat64_t,
+            z0 = svlogb_f64_x (svptrue_b64 (), z4),
+            z0 = svlogb_x (svptrue_b64 (), z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/match_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/match_s16.c
new file mode 100644 (file)
index 0000000..baebc76
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** match_s16_tied:
+**     match   p0\.h, p0/z, z0\.h, z1\.h
+**     ret
+*/
+TEST_COMPARE_Z (match_s16_tied, svint16_t,
+               p0 = svmatch_s16 (p0, z0, z1),
+               p0 = svmatch (p0, z0, z1))
+
+/*
+** match_s16_untied:
+**     match   p0\.h, p1/z, z0\.h, z1\.h
+**     ret
+*/
+TEST_COMPARE_Z (match_s16_untied, svint16_t,
+               p0 = svmatch_s16 (p1, z0, z1),
+               p0 = svmatch (p1, z0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/match_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/match_s8.c
new file mode 100644 (file)
index 0000000..f35a753
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** match_s8_tied:
+**     match   p0\.b, p0/z, z0\.b, z1\.b
+**     ret
+*/
+TEST_COMPARE_Z (match_s8_tied, svint8_t,
+               p0 = svmatch_s8 (p0, z0, z1),
+               p0 = svmatch (p0, z0, z1))
+
+/*
+** match_s8_untied:
+**     match   p0\.b, p1/z, z0\.b, z1\.b
+**     ret
+*/
+TEST_COMPARE_Z (match_s8_untied, svint8_t,
+               p0 = svmatch_s8 (p1, z0, z1),
+               p0 = svmatch (p1, z0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/match_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/match_u16.c
new file mode 100644 (file)
index 0000000..0bdf446
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** match_u16_tied:
+**     match   p0\.h, p0/z, z0\.h, z1\.h
+**     ret
+*/
+TEST_COMPARE_Z (match_u16_tied, svuint16_t,
+               p0 = svmatch_u16 (p0, z0, z1),
+               p0 = svmatch (p0, z0, z1))
+
+/*
+** match_u16_untied:
+**     match   p0\.h, p1/z, z0\.h, z1\.h
+**     ret
+*/
+TEST_COMPARE_Z (match_u16_untied, svuint16_t,
+               p0 = svmatch_u16 (p1, z0, z1),
+               p0 = svmatch (p1, z0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/match_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/match_u8.c
new file mode 100644 (file)
index 0000000..6d78692
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** match_u8_tied:
+**     match   p0\.b, p0/z, z0\.b, z1\.b
+**     ret
+*/
+TEST_COMPARE_Z (match_u8_tied, svuint8_t,
+               p0 = svmatch_u8 (p0, z0, z1),
+               p0 = svmatch (p0, z0, z1))
+
+/*
+** match_u8_untied:
+**     match   p0\.b, p1/z, z0\.b, z1\.b
+**     ret
+*/
+TEST_COMPARE_Z (match_u8_untied, svuint8_t,
+               p0 = svmatch_u8 (p1, z0, z1),
+               p0 = svmatch (p1, z0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxnmp_f16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxnmp_f16.c
new file mode 100644 (file)
index 0000000..02865ea
--- /dev/null
@@ -0,0 +1,96 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** maxnmp_f16_m_tied1:
+**     fmaxnmp z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxnmp_f16_m_tied1, svfloat16_t,
+               z0 = svmaxnmp_f16_m (p0, z0, z1),
+               z0 = svmaxnmp_m (p0, z0, z1))
+
+/*
+** maxnmp_f16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     fmaxnmp z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxnmp_f16_m_tied2, svfloat16_t,
+               z0 = svmaxnmp_f16_m (p0, z1, z0),
+               z0 = svmaxnmp_m (p0, z1, z0))
+
+/*
+** maxnmp_f16_m_untied:
+**     movprfx z0, z1
+**     fmaxnmp z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxnmp_f16_m_untied, svfloat16_t,
+               z0 = svmaxnmp_f16_m (p0, z1, z2),
+               z0 = svmaxnmp_m (p0, z1, z2))
+
+/*
+** maxnmp_f16_x_tied1:
+**     fmaxnmp z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxnmp_f16_x_tied1, svfloat16_t,
+               z0 = svmaxnmp_f16_x (p0, z0, z1),
+               z0 = svmaxnmp_x (p0, z0, z1))
+
+/*
+** maxnmp_f16_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     fmaxnmp z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxnmp_f16_x_tied2, svfloat16_t,
+               z0 = svmaxnmp_f16_x (p0, z1, z0),
+               z0 = svmaxnmp_x (p0, z1, z0))
+
+/*
+** maxnmp_f16_x_untied:
+**     movprfx z0, z1
+**     fmaxnmp z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxnmp_f16_x_untied, svfloat16_t,
+               z0 = svmaxnmp_f16_x (p0, z1, z2),
+               z0 = svmaxnmp_x (p0, z1, z2))
+
+/*
+** ptrue_maxnmp_f16_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_maxnmp_f16_x_tied1, svfloat16_t,
+               z0 = svmaxnmp_f16_x (svptrue_b16 (), z0, z1),
+               z0 = svmaxnmp_x (svptrue_b16 (), z0, z1))
+
+/*
+** ptrue_maxnmp_f16_x_tied2:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_maxnmp_f16_x_tied2, svfloat16_t,
+               z0 = svmaxnmp_f16_x (svptrue_b16 (), z1, z0),
+               z0 = svmaxnmp_x (svptrue_b16 (), z1, z0))
+
+/*
+** ptrue_maxnmp_f16_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_maxnmp_f16_x_untied, svfloat16_t,
+               z0 = svmaxnmp_f16_x (svptrue_b16 (), z1, z2),
+               z0 = svmaxnmp_x (svptrue_b16 (), z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxnmp_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxnmp_f32.c
new file mode 100644 (file)
index 0000000..ac13df5
--- /dev/null
@@ -0,0 +1,96 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** maxnmp_f32_m_tied1:
+**     fmaxnmp z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxnmp_f32_m_tied1, svfloat32_t,
+               z0 = svmaxnmp_f32_m (p0, z0, z1),
+               z0 = svmaxnmp_m (p0, z0, z1))
+
+/*
+** maxnmp_f32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     fmaxnmp z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxnmp_f32_m_tied2, svfloat32_t,
+               z0 = svmaxnmp_f32_m (p0, z1, z0),
+               z0 = svmaxnmp_m (p0, z1, z0))
+
+/*
+** maxnmp_f32_m_untied:
+**     movprfx z0, z1
+**     fmaxnmp z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxnmp_f32_m_untied, svfloat32_t,
+               z0 = svmaxnmp_f32_m (p0, z1, z2),
+               z0 = svmaxnmp_m (p0, z1, z2))
+
+/*
+** maxnmp_f32_x_tied1:
+**     fmaxnmp z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxnmp_f32_x_tied1, svfloat32_t,
+               z0 = svmaxnmp_f32_x (p0, z0, z1),
+               z0 = svmaxnmp_x (p0, z0, z1))
+
+/*
+** maxnmp_f32_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     fmaxnmp z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxnmp_f32_x_tied2, svfloat32_t,
+               z0 = svmaxnmp_f32_x (p0, z1, z0),
+               z0 = svmaxnmp_x (p0, z1, z0))
+
+/*
+** maxnmp_f32_x_untied:
+**     movprfx z0, z1
+**     fmaxnmp z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxnmp_f32_x_untied, svfloat32_t,
+               z0 = svmaxnmp_f32_x (p0, z1, z2),
+               z0 = svmaxnmp_x (p0, z1, z2))
+
+/*
+** ptrue_maxnmp_f32_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_maxnmp_f32_x_tied1, svfloat32_t,
+               z0 = svmaxnmp_f32_x (svptrue_b32 (), z0, z1),
+               z0 = svmaxnmp_x (svptrue_b32 (), z0, z1))
+
+/*
+** ptrue_maxnmp_f32_x_tied2:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_maxnmp_f32_x_tied2, svfloat32_t,
+               z0 = svmaxnmp_f32_x (svptrue_b32 (), z1, z0),
+               z0 = svmaxnmp_x (svptrue_b32 (), z1, z0))
+
+/*
+** ptrue_maxnmp_f32_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_maxnmp_f32_x_untied, svfloat32_t,
+               z0 = svmaxnmp_f32_x (svptrue_b32 (), z1, z2),
+               z0 = svmaxnmp_x (svptrue_b32 (), z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxnmp_f64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxnmp_f64.c
new file mode 100644 (file)
index 0000000..a7547b6
--- /dev/null
@@ -0,0 +1,96 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** maxnmp_f64_m_tied1:
+**     fmaxnmp z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (maxnmp_f64_m_tied1, svfloat64_t,
+               z0 = svmaxnmp_f64_m (p0, z0, z1),
+               z0 = svmaxnmp_m (p0, z0, z1))
+
+/*
+** maxnmp_f64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     fmaxnmp z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (maxnmp_f64_m_tied2, svfloat64_t,
+               z0 = svmaxnmp_f64_m (p0, z1, z0),
+               z0 = svmaxnmp_m (p0, z1, z0))
+
+/*
+** maxnmp_f64_m_untied:
+**     movprfx z0, z1
+**     fmaxnmp z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (maxnmp_f64_m_untied, svfloat64_t,
+               z0 = svmaxnmp_f64_m (p0, z1, z2),
+               z0 = svmaxnmp_m (p0, z1, z2))
+
+/*
+** maxnmp_f64_x_tied1:
+**     fmaxnmp z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (maxnmp_f64_x_tied1, svfloat64_t,
+               z0 = svmaxnmp_f64_x (p0, z0, z1),
+               z0 = svmaxnmp_x (p0, z0, z1))
+
+/*
+** maxnmp_f64_x_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     fmaxnmp z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (maxnmp_f64_x_tied2, svfloat64_t,
+               z0 = svmaxnmp_f64_x (p0, z1, z0),
+               z0 = svmaxnmp_x (p0, z1, z0))
+
+/*
+** maxnmp_f64_x_untied:
+**     movprfx z0, z1
+**     fmaxnmp z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (maxnmp_f64_x_untied, svfloat64_t,
+               z0 = svmaxnmp_f64_x (p0, z1, z2),
+               z0 = svmaxnmp_x (p0, z1, z2))
+
+/*
+** ptrue_maxnmp_f64_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_maxnmp_f64_x_tied1, svfloat64_t,
+               z0 = svmaxnmp_f64_x (svptrue_b64 (), z0, z1),
+               z0 = svmaxnmp_x (svptrue_b64 (), z0, z1))
+
+/*
+** ptrue_maxnmp_f64_x_tied2:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_maxnmp_f64_x_tied2, svfloat64_t,
+               z0 = svmaxnmp_f64_x (svptrue_b64 (), z1, z0),
+               z0 = svmaxnmp_x (svptrue_b64 (), z1, z0))
+
+/*
+** ptrue_maxnmp_f64_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_maxnmp_f64_x_untied, svfloat64_t,
+               z0 = svmaxnmp_f64_x (svptrue_b64 (), z1, z2),
+               z0 = svmaxnmp_x (svptrue_b64 (), z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_f16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_f16.c
new file mode 100644 (file)
index 0000000..8be5c40
--- /dev/null
@@ -0,0 +1,96 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** maxp_f16_m_tied1:
+**     fmaxp   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_f16_m_tied1, svfloat16_t,
+               z0 = svmaxp_f16_m (p0, z0, z1),
+               z0 = svmaxp_m (p0, z0, z1))
+
+/*
+** maxp_f16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     fmaxp   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_f16_m_tied2, svfloat16_t,
+               z0 = svmaxp_f16_m (p0, z1, z0),
+               z0 = svmaxp_m (p0, z1, z0))
+
+/*
+** maxp_f16_m_untied:
+**     movprfx z0, z1
+**     fmaxp   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_f16_m_untied, svfloat16_t,
+               z0 = svmaxp_f16_m (p0, z1, z2),
+               z0 = svmaxp_m (p0, z1, z2))
+
+/*
+** maxp_f16_x_tied1:
+**     fmaxp   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_f16_x_tied1, svfloat16_t,
+               z0 = svmaxp_f16_x (p0, z0, z1),
+               z0 = svmaxp_x (p0, z0, z1))
+
+/*
+** maxp_f16_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     fmaxp   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_f16_x_tied2, svfloat16_t,
+               z0 = svmaxp_f16_x (p0, z1, z0),
+               z0 = svmaxp_x (p0, z1, z0))
+
+/*
+** maxp_f16_x_untied:
+**     movprfx z0, z1
+**     fmaxp   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_f16_x_untied, svfloat16_t,
+               z0 = svmaxp_f16_x (p0, z1, z2),
+               z0 = svmaxp_x (p0, z1, z2))
+
+/*
+** ptrue_maxp_f16_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_maxp_f16_x_tied1, svfloat16_t,
+               z0 = svmaxp_f16_x (svptrue_b16 (), z0, z1),
+               z0 = svmaxp_x (svptrue_b16 (), z0, z1))
+
+/*
+** ptrue_maxp_f16_x_tied2:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_maxp_f16_x_tied2, svfloat16_t,
+               z0 = svmaxp_f16_x (svptrue_b16 (), z1, z0),
+               z0 = svmaxp_x (svptrue_b16 (), z1, z0))
+
+/*
+** ptrue_maxp_f16_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_maxp_f16_x_untied, svfloat16_t,
+               z0 = svmaxp_f16_x (svptrue_b16 (), z1, z2),
+               z0 = svmaxp_x (svptrue_b16 (), z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_f32.c
new file mode 100644 (file)
index 0000000..5cab4dc
--- /dev/null
@@ -0,0 +1,96 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** maxp_f32_m_tied1:
+**     fmaxp   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_f32_m_tied1, svfloat32_t,
+               z0 = svmaxp_f32_m (p0, z0, z1),
+               z0 = svmaxp_m (p0, z0, z1))
+
+/*
+** maxp_f32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     fmaxp   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_f32_m_tied2, svfloat32_t,
+               z0 = svmaxp_f32_m (p0, z1, z0),
+               z0 = svmaxp_m (p0, z1, z0))
+
+/*
+** maxp_f32_m_untied:
+**     movprfx z0, z1
+**     fmaxp   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_f32_m_untied, svfloat32_t,
+               z0 = svmaxp_f32_m (p0, z1, z2),
+               z0 = svmaxp_m (p0, z1, z2))
+
+/*
+** maxp_f32_x_tied1:
+**     fmaxp   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_f32_x_tied1, svfloat32_t,
+               z0 = svmaxp_f32_x (p0, z0, z1),
+               z0 = svmaxp_x (p0, z0, z1))
+
+/*
+** maxp_f32_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     fmaxp   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_f32_x_tied2, svfloat32_t,
+               z0 = svmaxp_f32_x (p0, z1, z0),
+               z0 = svmaxp_x (p0, z1, z0))
+
+/*
+** maxp_f32_x_untied:
+**     movprfx z0, z1
+**     fmaxp   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_f32_x_untied, svfloat32_t,
+               z0 = svmaxp_f32_x (p0, z1, z2),
+               z0 = svmaxp_x (p0, z1, z2))
+
+/*
+** ptrue_maxp_f32_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_maxp_f32_x_tied1, svfloat32_t,
+               z0 = svmaxp_f32_x (svptrue_b32 (), z0, z1),
+               z0 = svmaxp_x (svptrue_b32 (), z0, z1))
+
+/*
+** ptrue_maxp_f32_x_tied2:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_maxp_f32_x_tied2, svfloat32_t,
+               z0 = svmaxp_f32_x (svptrue_b32 (), z1, z0),
+               z0 = svmaxp_x (svptrue_b32 (), z1, z0))
+
+/*
+** ptrue_maxp_f32_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_maxp_f32_x_untied, svfloat32_t,
+               z0 = svmaxp_f32_x (svptrue_b32 (), z1, z2),
+               z0 = svmaxp_x (svptrue_b32 (), z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_f64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_f64.c
new file mode 100644 (file)
index 0000000..cbb7e65
--- /dev/null
@@ -0,0 +1,96 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** maxp_f64_m_tied1:
+**     fmaxp   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_f64_m_tied1, svfloat64_t,
+               z0 = svmaxp_f64_m (p0, z0, z1),
+               z0 = svmaxp_m (p0, z0, z1))
+
+/*
+** maxp_f64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     fmaxp   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_f64_m_tied2, svfloat64_t,
+               z0 = svmaxp_f64_m (p0, z1, z0),
+               z0 = svmaxp_m (p0, z1, z0))
+
+/*
+** maxp_f64_m_untied:
+**     movprfx z0, z1
+**     fmaxp   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_f64_m_untied, svfloat64_t,
+               z0 = svmaxp_f64_m (p0, z1, z2),
+               z0 = svmaxp_m (p0, z1, z2))
+
+/*
+** maxp_f64_x_tied1:
+**     fmaxp   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_f64_x_tied1, svfloat64_t,
+               z0 = svmaxp_f64_x (p0, z0, z1),
+               z0 = svmaxp_x (p0, z0, z1))
+
+/*
+** maxp_f64_x_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     fmaxp   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_f64_x_tied2, svfloat64_t,
+               z0 = svmaxp_f64_x (p0, z1, z0),
+               z0 = svmaxp_x (p0, z1, z0))
+
+/*
+** maxp_f64_x_untied:
+**     movprfx z0, z1
+**     fmaxp   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_f64_x_untied, svfloat64_t,
+               z0 = svmaxp_f64_x (p0, z1, z2),
+               z0 = svmaxp_x (p0, z1, z2))
+
+/*
+** ptrue_maxp_f64_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_maxp_f64_x_tied1, svfloat64_t,
+               z0 = svmaxp_f64_x (svptrue_b64 (), z0, z1),
+               z0 = svmaxp_x (svptrue_b64 (), z0, z1))
+
+/*
+** ptrue_maxp_f64_x_tied2:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_maxp_f64_x_tied2, svfloat64_t,
+               z0 = svmaxp_f64_x (svptrue_b64 (), z1, z0),
+               z0 = svmaxp_x (svptrue_b64 (), z1, z0))
+
+/*
+** ptrue_maxp_f64_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_maxp_f64_x_untied, svfloat64_t,
+               z0 = svmaxp_f64_x (svptrue_b64 (), z1, z2),
+               z0 = svmaxp_x (svptrue_b64 (), z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_s16.c
new file mode 100644 (file)
index 0000000..b8fd094
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** maxp_s16_m_tied1:
+**     smaxp   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s16_m_tied1, svint16_t,
+               z0 = svmaxp_s16_m (p0, z0, z1),
+               z0 = svmaxp_m (p0, z0, z1))
+
+/*
+** maxp_s16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     smaxp   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s16_m_tied2, svint16_t,
+               z0 = svmaxp_s16_m (p0, z1, z0),
+               z0 = svmaxp_m (p0, z1, z0))
+
+/*
+** maxp_s16_m_untied:
+**     movprfx z0, z1
+**     smaxp   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s16_m_untied, svint16_t,
+               z0 = svmaxp_s16_m (p0, z1, z2),
+               z0 = svmaxp_m (p0, z1, z2))
+
+/*
+** maxp_s16_x_tied1:
+**     smaxp   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s16_x_tied1, svint16_t,
+               z0 = svmaxp_s16_x (p0, z0, z1),
+               z0 = svmaxp_x (p0, z0, z1))
+
+/*
+** maxp_s16_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     smaxp   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s16_x_tied2, svint16_t,
+               z0 = svmaxp_s16_x (p0, z1, z0),
+               z0 = svmaxp_x (p0, z1, z0))
+
+/*
+** maxp_s16_x_untied:
+**     movprfx z0, z1
+**     smaxp   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s16_x_untied, svint16_t,
+               z0 = svmaxp_s16_x (p0, z1, z2),
+               z0 = svmaxp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_s32.c
new file mode 100644 (file)
index 0000000..778aab6
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** maxp_s32_m_tied1:
+**     smaxp   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s32_m_tied1, svint32_t,
+               z0 = svmaxp_s32_m (p0, z0, z1),
+               z0 = svmaxp_m (p0, z0, z1))
+
+/*
+** maxp_s32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     smaxp   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s32_m_tied2, svint32_t,
+               z0 = svmaxp_s32_m (p0, z1, z0),
+               z0 = svmaxp_m (p0, z1, z0))
+
+/*
+** maxp_s32_m_untied:
+**     movprfx z0, z1
+**     smaxp   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s32_m_untied, svint32_t,
+               z0 = svmaxp_s32_m (p0, z1, z2),
+               z0 = svmaxp_m (p0, z1, z2))
+
+/*
+** maxp_s32_x_tied1:
+**     smaxp   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s32_x_tied1, svint32_t,
+               z0 = svmaxp_s32_x (p0, z0, z1),
+               z0 = svmaxp_x (p0, z0, z1))
+
+/*
+** maxp_s32_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     smaxp   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s32_x_tied2, svint32_t,
+               z0 = svmaxp_s32_x (p0, z1, z0),
+               z0 = svmaxp_x (p0, z1, z0))
+
+/*
+** maxp_s32_x_untied:
+**     movprfx z0, z1
+**     smaxp   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s32_x_untied, svint32_t,
+               z0 = svmaxp_s32_x (p0, z1, z2),
+               z0 = svmaxp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_s64.c
new file mode 100644 (file)
index 0000000..5cb85e7
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** maxp_s64_m_tied1:
+**     smaxp   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s64_m_tied1, svint64_t,
+               z0 = svmaxp_s64_m (p0, z0, z1),
+               z0 = svmaxp_m (p0, z0, z1))
+
+/*
+** maxp_s64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     smaxp   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s64_m_tied2, svint64_t,
+               z0 = svmaxp_s64_m (p0, z1, z0),
+               z0 = svmaxp_m (p0, z1, z0))
+
+/*
+** maxp_s64_m_untied:
+**     movprfx z0, z1
+**     smaxp   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s64_m_untied, svint64_t,
+               z0 = svmaxp_s64_m (p0, z1, z2),
+               z0 = svmaxp_m (p0, z1, z2))
+
+/*
+** maxp_s64_x_tied1:
+**     smaxp   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s64_x_tied1, svint64_t,
+               z0 = svmaxp_s64_x (p0, z0, z1),
+               z0 = svmaxp_x (p0, z0, z1))
+
+/*
+** maxp_s64_x_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     smaxp   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s64_x_tied2, svint64_t,
+               z0 = svmaxp_s64_x (p0, z1, z0),
+               z0 = svmaxp_x (p0, z1, z0))
+
+/*
+** maxp_s64_x_untied:
+**     movprfx z0, z1
+**     smaxp   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s64_x_untied, svint64_t,
+               z0 = svmaxp_s64_x (p0, z1, z2),
+               z0 = svmaxp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_s8.c
new file mode 100644 (file)
index 0000000..fbe8c40
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** maxp_s8_m_tied1:
+**     smaxp   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s8_m_tied1, svint8_t,
+               z0 = svmaxp_s8_m (p0, z0, z1),
+               z0 = svmaxp_m (p0, z0, z1))
+
+/*
+** maxp_s8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     smaxp   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s8_m_tied2, svint8_t,
+               z0 = svmaxp_s8_m (p0, z1, z0),
+               z0 = svmaxp_m (p0, z1, z0))
+
+/*
+** maxp_s8_m_untied:
+**     movprfx z0, z1
+**     smaxp   z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s8_m_untied, svint8_t,
+               z0 = svmaxp_s8_m (p0, z1, z2),
+               z0 = svmaxp_m (p0, z1, z2))
+
+/*
+** maxp_s8_x_tied1:
+**     smaxp   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s8_x_tied1, svint8_t,
+               z0 = svmaxp_s8_x (p0, z0, z1),
+               z0 = svmaxp_x (p0, z0, z1))
+
+/*
+** maxp_s8_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     smaxp   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s8_x_tied2, svint8_t,
+               z0 = svmaxp_s8_x (p0, z1, z0),
+               z0 = svmaxp_x (p0, z1, z0))
+
+/*
+** maxp_s8_x_untied:
+**     movprfx z0, z1
+**     smaxp   z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_s8_x_untied, svint8_t,
+               z0 = svmaxp_s8_x (p0, z1, z2),
+               z0 = svmaxp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_u16.c
new file mode 100644 (file)
index 0000000..9936c70
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** maxp_u16_m_tied1:
+**     umaxp   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u16_m_tied1, svuint16_t,
+               z0 = svmaxp_u16_m (p0, z0, z1),
+               z0 = svmaxp_m (p0, z0, z1))
+
+/*
+** maxp_u16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     umaxp   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u16_m_tied2, svuint16_t,
+               z0 = svmaxp_u16_m (p0, z1, z0),
+               z0 = svmaxp_m (p0, z1, z0))
+
+/*
+** maxp_u16_m_untied:
+**     movprfx z0, z1
+**     umaxp   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u16_m_untied, svuint16_t,
+               z0 = svmaxp_u16_m (p0, z1, z2),
+               z0 = svmaxp_m (p0, z1, z2))
+
+/*
+** maxp_u16_x_tied1:
+**     umaxp   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u16_x_tied1, svuint16_t,
+               z0 = svmaxp_u16_x (p0, z0, z1),
+               z0 = svmaxp_x (p0, z0, z1))
+
+/*
+** maxp_u16_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     umaxp   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u16_x_tied2, svuint16_t,
+               z0 = svmaxp_u16_x (p0, z1, z0),
+               z0 = svmaxp_x (p0, z1, z0))
+
+/*
+** maxp_u16_x_untied:
+**     movprfx z0, z1
+**     umaxp   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u16_x_untied, svuint16_t,
+               z0 = svmaxp_u16_x (p0, z1, z2),
+               z0 = svmaxp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_u32.c
new file mode 100644 (file)
index 0000000..b1b241f
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** maxp_u32_m_tied1:
+**     umaxp   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u32_m_tied1, svuint32_t,
+               z0 = svmaxp_u32_m (p0, z0, z1),
+               z0 = svmaxp_m (p0, z0, z1))
+
+/*
+** maxp_u32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     umaxp   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u32_m_tied2, svuint32_t,
+               z0 = svmaxp_u32_m (p0, z1, z0),
+               z0 = svmaxp_m (p0, z1, z0))
+
+/*
+** maxp_u32_m_untied:
+**     movprfx z0, z1
+**     umaxp   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u32_m_untied, svuint32_t,
+               z0 = svmaxp_u32_m (p0, z1, z2),
+               z0 = svmaxp_m (p0, z1, z2))
+
+/*
+** maxp_u32_x_tied1:
+**     umaxp   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u32_x_tied1, svuint32_t,
+               z0 = svmaxp_u32_x (p0, z0, z1),
+               z0 = svmaxp_x (p0, z0, z1))
+
+/*
+** maxp_u32_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     umaxp   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u32_x_tied2, svuint32_t,
+               z0 = svmaxp_u32_x (p0, z1, z0),
+               z0 = svmaxp_x (p0, z1, z0))
+
+/*
+** maxp_u32_x_untied:
+**     movprfx z0, z1
+**     umaxp   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u32_x_untied, svuint32_t,
+               z0 = svmaxp_u32_x (p0, z1, z2),
+               z0 = svmaxp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_u64.c
new file mode 100644 (file)
index 0000000..19d7202
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** maxp_u64_m_tied1:
+**     umaxp   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u64_m_tied1, svuint64_t,
+               z0 = svmaxp_u64_m (p0, z0, z1),
+               z0 = svmaxp_m (p0, z0, z1))
+
+/*
+** maxp_u64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     umaxp   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u64_m_tied2, svuint64_t,
+               z0 = svmaxp_u64_m (p0, z1, z0),
+               z0 = svmaxp_m (p0, z1, z0))
+
+/*
+** maxp_u64_m_untied:
+**     movprfx z0, z1
+**     umaxp   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u64_m_untied, svuint64_t,
+               z0 = svmaxp_u64_m (p0, z1, z2),
+               z0 = svmaxp_m (p0, z1, z2))
+
+/*
+** maxp_u64_x_tied1:
+**     umaxp   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u64_x_tied1, svuint64_t,
+               z0 = svmaxp_u64_x (p0, z0, z1),
+               z0 = svmaxp_x (p0, z0, z1))
+
+/*
+** maxp_u64_x_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     umaxp   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u64_x_tied2, svuint64_t,
+               z0 = svmaxp_u64_x (p0, z1, z0),
+               z0 = svmaxp_x (p0, z1, z0))
+
+/*
+** maxp_u64_x_untied:
+**     movprfx z0, z1
+**     umaxp   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u64_x_untied, svuint64_t,
+               z0 = svmaxp_u64_x (p0, z1, z2),
+               z0 = svmaxp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/maxp_u8.c
new file mode 100644 (file)
index 0000000..0d2ff00
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** maxp_u8_m_tied1:
+**     umaxp   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u8_m_tied1, svuint8_t,
+               z0 = svmaxp_u8_m (p0, z0, z1),
+               z0 = svmaxp_m (p0, z0, z1))
+
+/*
+** maxp_u8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     umaxp   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u8_m_tied2, svuint8_t,
+               z0 = svmaxp_u8_m (p0, z1, z0),
+               z0 = svmaxp_m (p0, z1, z0))
+
+/*
+** maxp_u8_m_untied:
+**     movprfx z0, z1
+**     umaxp   z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u8_m_untied, svuint8_t,
+               z0 = svmaxp_u8_m (p0, z1, z2),
+               z0 = svmaxp_m (p0, z1, z2))
+
+/*
+** maxp_u8_x_tied1:
+**     umaxp   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u8_x_tied1, svuint8_t,
+               z0 = svmaxp_u8_x (p0, z0, z1),
+               z0 = svmaxp_x (p0, z0, z1))
+
+/*
+** maxp_u8_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     umaxp   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u8_x_tied2, svuint8_t,
+               z0 = svmaxp_u8_x (p0, z1, z0),
+               z0 = svmaxp_x (p0, z1, z0))
+
+/*
+** maxp_u8_x_untied:
+**     movprfx z0, z1
+**     umaxp   z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (maxp_u8_x_untied, svuint8_t,
+               z0 = svmaxp_u8_x (p0, z1, z2),
+               z0 = svmaxp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minnmp_f16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minnmp_f16.c
new file mode 100644 (file)
index 0000000..29e9fe2
--- /dev/null
@@ -0,0 +1,96 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** minnmp_f16_m_tied1:
+**     fminnmp z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minnmp_f16_m_tied1, svfloat16_t,
+               z0 = svminnmp_f16_m (p0, z0, z1),
+               z0 = svminnmp_m (p0, z0, z1))
+
+/*
+** minnmp_f16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     fminnmp z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minnmp_f16_m_tied2, svfloat16_t,
+               z0 = svminnmp_f16_m (p0, z1, z0),
+               z0 = svminnmp_m (p0, z1, z0))
+
+/*
+** minnmp_f16_m_untied:
+**     movprfx z0, z1
+**     fminnmp z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minnmp_f16_m_untied, svfloat16_t,
+               z0 = svminnmp_f16_m (p0, z1, z2),
+               z0 = svminnmp_m (p0, z1, z2))
+
+/*
+** minnmp_f16_x_tied1:
+**     fminnmp z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minnmp_f16_x_tied1, svfloat16_t,
+               z0 = svminnmp_f16_x (p0, z0, z1),
+               z0 = svminnmp_x (p0, z0, z1))
+
+/*
+** minnmp_f16_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     fminnmp z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minnmp_f16_x_tied2, svfloat16_t,
+               z0 = svminnmp_f16_x (p0, z1, z0),
+               z0 = svminnmp_x (p0, z1, z0))
+
+/*
+** minnmp_f16_x_untied:
+**     movprfx z0, z1
+**     fminnmp z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minnmp_f16_x_untied, svfloat16_t,
+               z0 = svminnmp_f16_x (p0, z1, z2),
+               z0 = svminnmp_x (p0, z1, z2))
+
+/*
+** ptrue_minnmp_f16_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_minnmp_f16_x_tied1, svfloat16_t,
+               z0 = svminnmp_f16_x (svptrue_b16 (), z0, z1),
+               z0 = svminnmp_x (svptrue_b16 (), z0, z1))
+
+/*
+** ptrue_minnmp_f16_x_tied2:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_minnmp_f16_x_tied2, svfloat16_t,
+               z0 = svminnmp_f16_x (svptrue_b16 (), z1, z0),
+               z0 = svminnmp_x (svptrue_b16 (), z1, z0))
+
+/*
+** ptrue_minnmp_f16_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_minnmp_f16_x_untied, svfloat16_t,
+               z0 = svminnmp_f16_x (svptrue_b16 (), z1, z2),
+               z0 = svminnmp_x (svptrue_b16 (), z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minnmp_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minnmp_f32.c
new file mode 100644 (file)
index 0000000..c63cc72
--- /dev/null
@@ -0,0 +1,96 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** minnmp_f32_m_tied1:
+**     fminnmp z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minnmp_f32_m_tied1, svfloat32_t,
+               z0 = svminnmp_f32_m (p0, z0, z1),
+               z0 = svminnmp_m (p0, z0, z1))
+
+/*
+** minnmp_f32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     fminnmp z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minnmp_f32_m_tied2, svfloat32_t,
+               z0 = svminnmp_f32_m (p0, z1, z0),
+               z0 = svminnmp_m (p0, z1, z0))
+
+/*
+** minnmp_f32_m_untied:
+**     movprfx z0, z1
+**     fminnmp z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minnmp_f32_m_untied, svfloat32_t,
+               z0 = svminnmp_f32_m (p0, z1, z2),
+               z0 = svminnmp_m (p0, z1, z2))
+
+/*
+** minnmp_f32_x_tied1:
+**     fminnmp z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minnmp_f32_x_tied1, svfloat32_t,
+               z0 = svminnmp_f32_x (p0, z0, z1),
+               z0 = svminnmp_x (p0, z0, z1))
+
+/*
+** minnmp_f32_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     fminnmp z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minnmp_f32_x_tied2, svfloat32_t,
+               z0 = svminnmp_f32_x (p0, z1, z0),
+               z0 = svminnmp_x (p0, z1, z0))
+
+/*
+** minnmp_f32_x_untied:
+**     movprfx z0, z1
+**     fminnmp z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minnmp_f32_x_untied, svfloat32_t,
+               z0 = svminnmp_f32_x (p0, z1, z2),
+               z0 = svminnmp_x (p0, z1, z2))
+
+/*
+** ptrue_minnmp_f32_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_minnmp_f32_x_tied1, svfloat32_t,
+               z0 = svminnmp_f32_x (svptrue_b32 (), z0, z1),
+               z0 = svminnmp_x (svptrue_b32 (), z0, z1))
+
+/*
+** ptrue_minnmp_f32_x_tied2:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_minnmp_f32_x_tied2, svfloat32_t,
+               z0 = svminnmp_f32_x (svptrue_b32 (), z1, z0),
+               z0 = svminnmp_x (svptrue_b32 (), z1, z0))
+
+/*
+** ptrue_minnmp_f32_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_minnmp_f32_x_untied, svfloat32_t,
+               z0 = svminnmp_f32_x (svptrue_b32 (), z1, z2),
+               z0 = svminnmp_x (svptrue_b32 (), z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minnmp_f64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minnmp_f64.c
new file mode 100644 (file)
index 0000000..f9be2b2
--- /dev/null
@@ -0,0 +1,96 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** minnmp_f64_m_tied1:
+**     fminnmp z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (minnmp_f64_m_tied1, svfloat64_t,
+               z0 = svminnmp_f64_m (p0, z0, z1),
+               z0 = svminnmp_m (p0, z0, z1))
+
+/*
+** minnmp_f64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     fminnmp z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (minnmp_f64_m_tied2, svfloat64_t,
+               z0 = svminnmp_f64_m (p0, z1, z0),
+               z0 = svminnmp_m (p0, z1, z0))
+
+/*
+** minnmp_f64_m_untied:
+**     movprfx z0, z1
+**     fminnmp z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (minnmp_f64_m_untied, svfloat64_t,
+               z0 = svminnmp_f64_m (p0, z1, z2),
+               z0 = svminnmp_m (p0, z1, z2))
+
+/*
+** minnmp_f64_x_tied1:
+**     fminnmp z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (minnmp_f64_x_tied1, svfloat64_t,
+               z0 = svminnmp_f64_x (p0, z0, z1),
+               z0 = svminnmp_x (p0, z0, z1))
+
+/*
+** minnmp_f64_x_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     fminnmp z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (minnmp_f64_x_tied2, svfloat64_t,
+               z0 = svminnmp_f64_x (p0, z1, z0),
+               z0 = svminnmp_x (p0, z1, z0))
+
+/*
+** minnmp_f64_x_untied:
+**     movprfx z0, z1
+**     fminnmp z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (minnmp_f64_x_untied, svfloat64_t,
+               z0 = svminnmp_f64_x (p0, z1, z2),
+               z0 = svminnmp_x (p0, z1, z2))
+
+/*
+** ptrue_minnmp_f64_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_minnmp_f64_x_tied1, svfloat64_t,
+               z0 = svminnmp_f64_x (svptrue_b64 (), z0, z1),
+               z0 = svminnmp_x (svptrue_b64 (), z0, z1))
+
+/*
+** ptrue_minnmp_f64_x_tied2:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_minnmp_f64_x_tied2, svfloat64_t,
+               z0 = svminnmp_f64_x (svptrue_b64 (), z1, z0),
+               z0 = svminnmp_x (svptrue_b64 (), z1, z0))
+
+/*
+** ptrue_minnmp_f64_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_minnmp_f64_x_untied, svfloat64_t,
+               z0 = svminnmp_f64_x (svptrue_b64 (), z1, z2),
+               z0 = svminnmp_x (svptrue_b64 (), z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_f16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_f16.c
new file mode 100644 (file)
index 0000000..50191c4
--- /dev/null
@@ -0,0 +1,96 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** minp_f16_m_tied1:
+**     fminp   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minp_f16_m_tied1, svfloat16_t,
+               z0 = svminp_f16_m (p0, z0, z1),
+               z0 = svminp_m (p0, z0, z1))
+
+/*
+** minp_f16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     fminp   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minp_f16_m_tied2, svfloat16_t,
+               z0 = svminp_f16_m (p0, z1, z0),
+               z0 = svminp_m (p0, z1, z0))
+
+/*
+** minp_f16_m_untied:
+**     movprfx z0, z1
+**     fminp   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minp_f16_m_untied, svfloat16_t,
+               z0 = svminp_f16_m (p0, z1, z2),
+               z0 = svminp_m (p0, z1, z2))
+
+/*
+** minp_f16_x_tied1:
+**     fminp   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minp_f16_x_tied1, svfloat16_t,
+               z0 = svminp_f16_x (p0, z0, z1),
+               z0 = svminp_x (p0, z0, z1))
+
+/*
+** minp_f16_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     fminp   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minp_f16_x_tied2, svfloat16_t,
+               z0 = svminp_f16_x (p0, z1, z0),
+               z0 = svminp_x (p0, z1, z0))
+
+/*
+** minp_f16_x_untied:
+**     movprfx z0, z1
+**     fminp   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minp_f16_x_untied, svfloat16_t,
+               z0 = svminp_f16_x (p0, z1, z2),
+               z0 = svminp_x (p0, z1, z2))
+
+/*
+** ptrue_minp_f16_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_minp_f16_x_tied1, svfloat16_t,
+               z0 = svminp_f16_x (svptrue_b16 (), z0, z1),
+               z0 = svminp_x (svptrue_b16 (), z0, z1))
+
+/*
+** ptrue_minp_f16_x_tied2:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_minp_f16_x_tied2, svfloat16_t,
+               z0 = svminp_f16_x (svptrue_b16 (), z1, z0),
+               z0 = svminp_x (svptrue_b16 (), z1, z0))
+
+/*
+** ptrue_minp_f16_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_minp_f16_x_untied, svfloat16_t,
+               z0 = svminp_f16_x (svptrue_b16 (), z1, z2),
+               z0 = svminp_x (svptrue_b16 (), z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_f32.c
new file mode 100644 (file)
index 0000000..df35e61
--- /dev/null
@@ -0,0 +1,96 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** minp_f32_m_tied1:
+**     fminp   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minp_f32_m_tied1, svfloat32_t,
+               z0 = svminp_f32_m (p0, z0, z1),
+               z0 = svminp_m (p0, z0, z1))
+
+/*
+** minp_f32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     fminp   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minp_f32_m_tied2, svfloat32_t,
+               z0 = svminp_f32_m (p0, z1, z0),
+               z0 = svminp_m (p0, z1, z0))
+
+/*
+** minp_f32_m_untied:
+**     movprfx z0, z1
+**     fminp   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minp_f32_m_untied, svfloat32_t,
+               z0 = svminp_f32_m (p0, z1, z2),
+               z0 = svminp_m (p0, z1, z2))
+
+/*
+** minp_f32_x_tied1:
+**     fminp   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minp_f32_x_tied1, svfloat32_t,
+               z0 = svminp_f32_x (p0, z0, z1),
+               z0 = svminp_x (p0, z0, z1))
+
+/*
+** minp_f32_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     fminp   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minp_f32_x_tied2, svfloat32_t,
+               z0 = svminp_f32_x (p0, z1, z0),
+               z0 = svminp_x (p0, z1, z0))
+
+/*
+** minp_f32_x_untied:
+**     movprfx z0, z1
+**     fminp   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minp_f32_x_untied, svfloat32_t,
+               z0 = svminp_f32_x (p0, z1, z2),
+               z0 = svminp_x (p0, z1, z2))
+
+/*
+** ptrue_minp_f32_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_minp_f32_x_tied1, svfloat32_t,
+               z0 = svminp_f32_x (svptrue_b32 (), z0, z1),
+               z0 = svminp_x (svptrue_b32 (), z0, z1))
+
+/*
+** ptrue_minp_f32_x_tied2:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_minp_f32_x_tied2, svfloat32_t,
+               z0 = svminp_f32_x (svptrue_b32 (), z1, z0),
+               z0 = svminp_x (svptrue_b32 (), z1, z0))
+
+/*
+** ptrue_minp_f32_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_minp_f32_x_untied, svfloat32_t,
+               z0 = svminp_f32_x (svptrue_b32 (), z1, z2),
+               z0 = svminp_x (svptrue_b32 (), z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_f64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_f64.c
new file mode 100644 (file)
index 0000000..a9af1b9
--- /dev/null
@@ -0,0 +1,96 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** minp_f64_m_tied1:
+**     fminp   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (minp_f64_m_tied1, svfloat64_t,
+               z0 = svminp_f64_m (p0, z0, z1),
+               z0 = svminp_m (p0, z0, z1))
+
+/*
+** minp_f64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     fminp   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (minp_f64_m_tied2, svfloat64_t,
+               z0 = svminp_f64_m (p0, z1, z0),
+               z0 = svminp_m (p0, z1, z0))
+
+/*
+** minp_f64_m_untied:
+**     movprfx z0, z1
+**     fminp   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (minp_f64_m_untied, svfloat64_t,
+               z0 = svminp_f64_m (p0, z1, z2),
+               z0 = svminp_m (p0, z1, z2))
+
+/*
+** minp_f64_x_tied1:
+**     fminp   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (minp_f64_x_tied1, svfloat64_t,
+               z0 = svminp_f64_x (p0, z0, z1),
+               z0 = svminp_x (p0, z0, z1))
+
+/*
+** minp_f64_x_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     fminp   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (minp_f64_x_tied2, svfloat64_t,
+               z0 = svminp_f64_x (p0, z1, z0),
+               z0 = svminp_x (p0, z1, z0))
+
+/*
+** minp_f64_x_untied:
+**     movprfx z0, z1
+**     fminp   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (minp_f64_x_untied, svfloat64_t,
+               z0 = svminp_f64_x (p0, z1, z2),
+               z0 = svminp_x (p0, z1, z2))
+
+/*
+** ptrue_minp_f64_x_tied1:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_minp_f64_x_tied1, svfloat64_t,
+               z0 = svminp_f64_x (svptrue_b64 (), z0, z1),
+               z0 = svminp_x (svptrue_b64 (), z0, z1))
+
+/*
+** ptrue_minp_f64_x_tied2:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_minp_f64_x_tied2, svfloat64_t,
+               z0 = svminp_f64_x (svptrue_b64 (), z1, z0),
+               z0 = svminp_x (svptrue_b64 (), z1, z0))
+
+/*
+** ptrue_minp_f64_x_untied:
+**     ...
+**     ptrue   p[0-9]+\.b[^\n]*
+**     ...
+**     ret
+*/
+TEST_UNIFORM_Z (ptrue_minp_f64_x_untied, svfloat64_t,
+               z0 = svminp_f64_x (svptrue_b64 (), z1, z2),
+               z0 = svminp_x (svptrue_b64 (), z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_s16.c
new file mode 100644 (file)
index 0000000..1ae2197
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** minp_s16_m_tied1:
+**     sminp   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s16_m_tied1, svint16_t,
+               z0 = svminp_s16_m (p0, z0, z1),
+               z0 = svminp_m (p0, z0, z1))
+
+/*
+** minp_s16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sminp   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s16_m_tied2, svint16_t,
+               z0 = svminp_s16_m (p0, z1, z0),
+               z0 = svminp_m (p0, z1, z0))
+
+/*
+** minp_s16_m_untied:
+**     movprfx z0, z1
+**     sminp   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s16_m_untied, svint16_t,
+               z0 = svminp_s16_m (p0, z1, z2),
+               z0 = svminp_m (p0, z1, z2))
+
+/*
+** minp_s16_x_tied1:
+**     sminp   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s16_x_tied1, svint16_t,
+               z0 = svminp_s16_x (p0, z0, z1),
+               z0 = svminp_x (p0, z0, z1))
+
+/*
+** minp_s16_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sminp   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s16_x_tied2, svint16_t,
+               z0 = svminp_s16_x (p0, z1, z0),
+               z0 = svminp_x (p0, z1, z0))
+
+/*
+** minp_s16_x_untied:
+**     movprfx z0, z1
+**     sminp   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s16_x_untied, svint16_t,
+               z0 = svminp_s16_x (p0, z1, z2),
+               z0 = svminp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_s32.c
new file mode 100644 (file)
index 0000000..01ba579
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** minp_s32_m_tied1:
+**     sminp   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s32_m_tied1, svint32_t,
+               z0 = svminp_s32_m (p0, z0, z1),
+               z0 = svminp_m (p0, z0, z1))
+
+/*
+** minp_s32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sminp   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s32_m_tied2, svint32_t,
+               z0 = svminp_s32_m (p0, z1, z0),
+               z0 = svminp_m (p0, z1, z0))
+
+/*
+** minp_s32_m_untied:
+**     movprfx z0, z1
+**     sminp   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s32_m_untied, svint32_t,
+               z0 = svminp_s32_m (p0, z1, z2),
+               z0 = svminp_m (p0, z1, z2))
+
+/*
+** minp_s32_x_tied1:
+**     sminp   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s32_x_tied1, svint32_t,
+               z0 = svminp_s32_x (p0, z0, z1),
+               z0 = svminp_x (p0, z0, z1))
+
+/*
+** minp_s32_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sminp   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s32_x_tied2, svint32_t,
+               z0 = svminp_s32_x (p0, z1, z0),
+               z0 = svminp_x (p0, z1, z0))
+
+/*
+** minp_s32_x_untied:
+**     movprfx z0, z1
+**     sminp   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s32_x_untied, svint32_t,
+               z0 = svminp_s32_x (p0, z1, z2),
+               z0 = svminp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_s64.c
new file mode 100644 (file)
index 0000000..dbea82d
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** minp_s64_m_tied1:
+**     sminp   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s64_m_tied1, svint64_t,
+               z0 = svminp_s64_m (p0, z0, z1),
+               z0 = svminp_m (p0, z0, z1))
+
+/*
+** minp_s64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sminp   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s64_m_tied2, svint64_t,
+               z0 = svminp_s64_m (p0, z1, z0),
+               z0 = svminp_m (p0, z1, z0))
+
+/*
+** minp_s64_m_untied:
+**     movprfx z0, z1
+**     sminp   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s64_m_untied, svint64_t,
+               z0 = svminp_s64_m (p0, z1, z2),
+               z0 = svminp_m (p0, z1, z2))
+
+/*
+** minp_s64_x_tied1:
+**     sminp   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s64_x_tied1, svint64_t,
+               z0 = svminp_s64_x (p0, z0, z1),
+               z0 = svminp_x (p0, z0, z1))
+
+/*
+** minp_s64_x_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sminp   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s64_x_tied2, svint64_t,
+               z0 = svminp_s64_x (p0, z1, z0),
+               z0 = svminp_x (p0, z1, z0))
+
+/*
+** minp_s64_x_untied:
+**     movprfx z0, z1
+**     sminp   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s64_x_untied, svint64_t,
+               z0 = svminp_s64_x (p0, z1, z2),
+               z0 = svminp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_s8.c
new file mode 100644 (file)
index 0000000..f0beb34
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** minp_s8_m_tied1:
+**     sminp   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s8_m_tied1, svint8_t,
+               z0 = svminp_s8_m (p0, z0, z1),
+               z0 = svminp_m (p0, z0, z1))
+
+/*
+** minp_s8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sminp   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s8_m_tied2, svint8_t,
+               z0 = svminp_s8_m (p0, z1, z0),
+               z0 = svminp_m (p0, z1, z0))
+
+/*
+** minp_s8_m_untied:
+**     movprfx z0, z1
+**     sminp   z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s8_m_untied, svint8_t,
+               z0 = svminp_s8_m (p0, z1, z2),
+               z0 = svminp_m (p0, z1, z2))
+
+/*
+** minp_s8_x_tied1:
+**     sminp   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s8_x_tied1, svint8_t,
+               z0 = svminp_s8_x (p0, z0, z1),
+               z0 = svminp_x (p0, z0, z1))
+
+/*
+** minp_s8_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sminp   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s8_x_tied2, svint8_t,
+               z0 = svminp_s8_x (p0, z1, z0),
+               z0 = svminp_x (p0, z1, z0))
+
+/*
+** minp_s8_x_untied:
+**     movprfx z0, z1
+**     sminp   z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (minp_s8_x_untied, svint8_t,
+               z0 = svminp_s8_x (p0, z1, z2),
+               z0 = svminp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_u16.c
new file mode 100644 (file)
index 0000000..f51f23d
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** minp_u16_m_tied1:
+**     uminp   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u16_m_tied1, svuint16_t,
+               z0 = svminp_u16_m (p0, z0, z1),
+               z0 = svminp_m (p0, z0, z1))
+
+/*
+** minp_u16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uminp   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u16_m_tied2, svuint16_t,
+               z0 = svminp_u16_m (p0, z1, z0),
+               z0 = svminp_m (p0, z1, z0))
+
+/*
+** minp_u16_m_untied:
+**     movprfx z0, z1
+**     uminp   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u16_m_untied, svuint16_t,
+               z0 = svminp_u16_m (p0, z1, z2),
+               z0 = svminp_m (p0, z1, z2))
+
+/*
+** minp_u16_x_tied1:
+**     uminp   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u16_x_tied1, svuint16_t,
+               z0 = svminp_u16_x (p0, z0, z1),
+               z0 = svminp_x (p0, z0, z1))
+
+/*
+** minp_u16_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uminp   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u16_x_tied2, svuint16_t,
+               z0 = svminp_u16_x (p0, z1, z0),
+               z0 = svminp_x (p0, z1, z0))
+
+/*
+** minp_u16_x_untied:
+**     movprfx z0, z1
+**     uminp   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u16_x_untied, svuint16_t,
+               z0 = svminp_u16_x (p0, z1, z2),
+               z0 = svminp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_u32.c
new file mode 100644 (file)
index 0000000..bfdbe28
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** minp_u32_m_tied1:
+**     uminp   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u32_m_tied1, svuint32_t,
+               z0 = svminp_u32_m (p0, z0, z1),
+               z0 = svminp_m (p0, z0, z1))
+
+/*
+** minp_u32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uminp   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u32_m_tied2, svuint32_t,
+               z0 = svminp_u32_m (p0, z1, z0),
+               z0 = svminp_m (p0, z1, z0))
+
+/*
+** minp_u32_m_untied:
+**     movprfx z0, z1
+**     uminp   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u32_m_untied, svuint32_t,
+               z0 = svminp_u32_m (p0, z1, z2),
+               z0 = svminp_m (p0, z1, z2))
+
+/*
+** minp_u32_x_tied1:
+**     uminp   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u32_x_tied1, svuint32_t,
+               z0 = svminp_u32_x (p0, z0, z1),
+               z0 = svminp_x (p0, z0, z1))
+
+/*
+** minp_u32_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uminp   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u32_x_tied2, svuint32_t,
+               z0 = svminp_u32_x (p0, z1, z0),
+               z0 = svminp_x (p0, z1, z0))
+
+/*
+** minp_u32_x_untied:
+**     movprfx z0, z1
+**     uminp   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u32_x_untied, svuint32_t,
+               z0 = svminp_u32_x (p0, z1, z2),
+               z0 = svminp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_u64.c
new file mode 100644 (file)
index 0000000..1c8688c
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** minp_u64_m_tied1:
+**     uminp   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u64_m_tied1, svuint64_t,
+               z0 = svminp_u64_m (p0, z0, z1),
+               z0 = svminp_m (p0, z0, z1))
+
+/*
+** minp_u64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     uminp   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u64_m_tied2, svuint64_t,
+               z0 = svminp_u64_m (p0, z1, z0),
+               z0 = svminp_m (p0, z1, z0))
+
+/*
+** minp_u64_m_untied:
+**     movprfx z0, z1
+**     uminp   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u64_m_untied, svuint64_t,
+               z0 = svminp_u64_m (p0, z1, z2),
+               z0 = svminp_m (p0, z1, z2))
+
+/*
+** minp_u64_x_tied1:
+**     uminp   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u64_x_tied1, svuint64_t,
+               z0 = svminp_u64_x (p0, z0, z1),
+               z0 = svminp_x (p0, z0, z1))
+
+/*
+** minp_u64_x_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     uminp   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u64_x_tied2, svuint64_t,
+               z0 = svminp_u64_x (p0, z1, z0),
+               z0 = svminp_x (p0, z1, z0))
+
+/*
+** minp_u64_x_untied:
+**     movprfx z0, z1
+**     uminp   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u64_x_untied, svuint64_t,
+               z0 = svminp_u64_x (p0, z1, z2),
+               z0 = svminp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/minp_u8.c
new file mode 100644 (file)
index 0000000..8fa3e28
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** minp_u8_m_tied1:
+**     uminp   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u8_m_tied1, svuint8_t,
+               z0 = svminp_u8_m (p0, z0, z1),
+               z0 = svminp_m (p0, z0, z1))
+
+/*
+** minp_u8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uminp   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u8_m_tied2, svuint8_t,
+               z0 = svminp_u8_m (p0, z1, z0),
+               z0 = svminp_m (p0, z1, z0))
+
+/*
+** minp_u8_m_untied:
+**     movprfx z0, z1
+**     uminp   z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u8_m_untied, svuint8_t,
+               z0 = svminp_u8_m (p0, z1, z2),
+               z0 = svminp_m (p0, z1, z2))
+
+/*
+** minp_u8_x_tied1:
+**     uminp   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u8_x_tied1, svuint8_t,
+               z0 = svminp_u8_x (p0, z0, z1),
+               z0 = svminp_x (p0, z0, z1))
+
+/*
+** minp_u8_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uminp   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u8_x_tied2, svuint8_t,
+               z0 = svminp_u8_x (p0, z1, z0),
+               z0 = svminp_x (p0, z1, z0))
+
+/*
+** minp_u8_x_untied:
+**     movprfx z0, z1
+**     uminp   z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (minp_u8_x_untied, svuint8_t,
+               z0 = svminp_u8_x (p0, z1, z2),
+               z0 = svminp_x (p0, z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mla_lane_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mla_lane_s16.c
new file mode 100644 (file)
index 0000000..087466a
--- /dev/null
@@ -0,0 +1,129 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mla_lane_0_s16_tied1:
+**     mla     z0\.h, z1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_s16_tied1, svint16_t,
+               z0 = svmla_lane_s16 (z0, z1, z2, 0),
+               z0 = svmla_lane (z0, z1, z2, 0))
+
+/*
+** mla_lane_0_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     mla     z0\.h, \1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_s16_tied2, svint16_t,
+               z0 = svmla_lane_s16 (z1, z0, z2, 0),
+               z0 = svmla_lane (z1, z0, z2, 0))
+
+/*
+** mla_lane_0_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     mla     z0\.h, z2\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_s16_tied3, svint16_t,
+               z0 = svmla_lane_s16 (z1, z2, z0, 0),
+               z0 = svmla_lane (z1, z2, z0, 0))
+
+/*
+** mla_lane_0_s16_untied:
+**     movprfx z0, z1
+**     mla     z0\.h, z2\.h, z3\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_s16_untied, svint16_t,
+               z0 = svmla_lane_s16 (z1, z2, z3, 0),
+               z0 = svmla_lane (z1, z2, z3, 0))
+
+/*
+** mla_lane_1_s16:
+**     mla     z0\.h, z1\.h, z2\.h\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_1_s16, svint16_t,
+               z0 = svmla_lane_s16 (z0, z1, z2, 1),
+               z0 = svmla_lane (z0, z1, z2, 1))
+
+/*
+** mla_lane_2_s16:
+**     mla     z0\.h, z1\.h, z2\.h\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_2_s16, svint16_t,
+               z0 = svmla_lane_s16 (z0, z1, z2, 2),
+               z0 = svmla_lane (z0, z1, z2, 2))
+
+/*
+** mla_lane_3_s16:
+**     mla     z0\.h, z1\.h, z2\.h\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_3_s16, svint16_t,
+               z0 = svmla_lane_s16 (z0, z1, z2, 3),
+               z0 = svmla_lane (z0, z1, z2, 3))
+
+/*
+** mla_lane_4_s16:
+**     mla     z0\.h, z1\.h, z2\.h\[4\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_4_s16, svint16_t,
+               z0 = svmla_lane_s16 (z0, z1, z2, 4),
+               z0 = svmla_lane (z0, z1, z2, 4))
+
+/*
+** mla_lane_5_s16:
+**     mla     z0\.h, z1\.h, z2\.h\[5\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_5_s16, svint16_t,
+               z0 = svmla_lane_s16 (z0, z1, z2, 5),
+               z0 = svmla_lane (z0, z1, z2, 5))
+
+/*
+** mla_lane_6_s16:
+**     mla     z0\.h, z1\.h, z2\.h\[6\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_6_s16, svint16_t,
+               z0 = svmla_lane_s16 (z0, z1, z2, 6),
+               z0 = svmla_lane (z0, z1, z2, 6))
+
+/*
+** mla_lane_7_s16:
+**     mla     z0\.h, z1\.h, z2\.h\[7\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_7_s16, svint16_t,
+               z0 = svmla_lane_s16 (z0, z1, z2, 7),
+               z0 = svmla_lane (z0, z1, z2, 7))
+
+/*
+** mla_lane_z8_s16:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     mla     z0\.h, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mla_lane_z8_s16, svint16_t, svint16_t, z8,
+                   z0 = svmla_lane_s16 (z0, z1, z8, 1),
+                   z0 = svmla_lane (z0, z1, z8, 1))
+
+/*
+** mla_lane_z16_s16:
+**     mov     (z[0-7])\.d, z16\.d
+**     mla     z0\.h, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mla_lane_z16_s16, svint16_t, svint16_t, z16,
+                   z0 = svmla_lane_s16 (z0, z1, z16, 1),
+                   z0 = svmla_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mla_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mla_lane_s32.c
new file mode 100644 (file)
index 0000000..7da8183
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mla_lane_0_s32_tied1:
+**     mla     z0\.s, z1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_s32_tied1, svint32_t,
+               z0 = svmla_lane_s32 (z0, z1, z2, 0),
+               z0 = svmla_lane (z0, z1, z2, 0))
+
+/*
+** mla_lane_0_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     mla     z0\.s, \1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_s32_tied2, svint32_t,
+               z0 = svmla_lane_s32 (z1, z0, z2, 0),
+               z0 = svmla_lane (z1, z0, z2, 0))
+
+/*
+** mla_lane_0_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     mla     z0\.s, z2\.s, \1\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_s32_tied3, svint32_t,
+               z0 = svmla_lane_s32 (z1, z2, z0, 0),
+               z0 = svmla_lane (z1, z2, z0, 0))
+
+/*
+** mla_lane_0_s32_untied:
+**     movprfx z0, z1
+**     mla     z0\.s, z2\.s, z3\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_s32_untied, svint32_t,
+               z0 = svmla_lane_s32 (z1, z2, z3, 0),
+               z0 = svmla_lane (z1, z2, z3, 0))
+
+/*
+** mla_lane_1_s32:
+**     mla     z0\.s, z1\.s, z2\.s\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_1_s32, svint32_t,
+               z0 = svmla_lane_s32 (z0, z1, z2, 1),
+               z0 = svmla_lane (z0, z1, z2, 1))
+
+/*
+** mla_lane_2_s32:
+**     mla     z0\.s, z1\.s, z2\.s\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_2_s32, svint32_t,
+               z0 = svmla_lane_s32 (z0, z1, z2, 2),
+               z0 = svmla_lane (z0, z1, z2, 2))
+
+/*
+** mla_lane_3_s32:
+**     mla     z0\.s, z1\.s, z2\.s\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_3_s32, svint32_t,
+               z0 = svmla_lane_s32 (z0, z1, z2, 3),
+               z0 = svmla_lane (z0, z1, z2, 3))
+
+/*
+** mla_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     mla     z0\.s, z1\.s, \1\.s\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mla_lane_z8_s32, svint32_t, svint32_t, z8,
+                   z0 = svmla_lane_s32 (z0, z1, z8, 1),
+                   z0 = svmla_lane (z0, z1, z8, 1))
+
+/*
+** mla_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     mla     z0\.s, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mla_lane_z16_s32, svint32_t, svint32_t, z16,
+                   z0 = svmla_lane_s32 (z0, z1, z16, 1),
+                   z0 = svmla_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mla_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mla_lane_s64.c
new file mode 100644 (file)
index 0000000..c8fe3fd
--- /dev/null
@@ -0,0 +1,74 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mla_lane_0_s64_tied1:
+**     mla     z0\.d, z1\.d, z2\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_s64_tied1, svint64_t,
+               z0 = svmla_lane_s64 (z0, z1, z2, 0),
+               z0 = svmla_lane (z0, z1, z2, 0))
+
+/*
+** mla_lane_0_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     mla     z0\.d, \1, z2\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_s64_tied2, svint64_t,
+               z0 = svmla_lane_s64 (z1, z0, z2, 0),
+               z0 = svmla_lane (z1, z0, z2, 0))
+
+/*
+** mla_lane_0_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     mla     z0\.d, z2\.d, \1\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_s64_tied3, svint64_t,
+               z0 = svmla_lane_s64 (z1, z2, z0, 0),
+               z0 = svmla_lane (z1, z2, z0, 0))
+
+/*
+** mla_lane_0_s64_untied:
+**     movprfx z0, z1
+**     mla     z0\.d, z2\.d, z3\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_s64_untied, svint64_t,
+               z0 = svmla_lane_s64 (z1, z2, z3, 0),
+               z0 = svmla_lane (z1, z2, z3, 0))
+
+/*
+** mla_lane_1_s64:
+**     mla     z0\.d, z1\.d, z2\.d\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_1_s64, svint64_t,
+               z0 = svmla_lane_s64 (z0, z1, z2, 1),
+               z0 = svmla_lane (z0, z1, z2, 1))
+
+/*
+** mla_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     mla     z0\.d, z1\.d, z15\.d\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mla_lane_z15_s64, svint64_t, svint64_t, z15,
+                   z0 = svmla_lane_s64 (z0, z1, z15, 1),
+                   z0 = svmla_lane (z0, z1, z15, 1))
+
+/*
+** mla_lane_z16_s64:
+**     mov     (z[0-7])\.d, z16\.d
+**     mla     z0\.d, z1\.d, \1\.d\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mla_lane_z16_s64, svint64_t, svint64_t, z16,
+                   z0 = svmla_lane_s64 (z0, z1, z16, 1),
+                   z0 = svmla_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mla_lane_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mla_lane_u16.c
new file mode 100644 (file)
index 0000000..43a4c6e
--- /dev/null
@@ -0,0 +1,129 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mla_lane_0_u16_tied1:
+**     mla     z0\.h, z1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_u16_tied1, svuint16_t,
+               z0 = svmla_lane_u16 (z0, z1, z2, 0),
+               z0 = svmla_lane (z0, z1, z2, 0))
+
+/*
+** mla_lane_0_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     mla     z0\.h, \1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_u16_tied2, svuint16_t,
+               z0 = svmla_lane_u16 (z1, z0, z2, 0),
+               z0 = svmla_lane (z1, z0, z2, 0))
+
+/*
+** mla_lane_0_u16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     mla     z0\.h, z2\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_u16_tied3, svuint16_t,
+               z0 = svmla_lane_u16 (z1, z2, z0, 0),
+               z0 = svmla_lane (z1, z2, z0, 0))
+
+/*
+** mla_lane_0_u16_untied:
+**     movprfx z0, z1
+**     mla     z0\.h, z2\.h, z3\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_u16_untied, svuint16_t,
+               z0 = svmla_lane_u16 (z1, z2, z3, 0),
+               z0 = svmla_lane (z1, z2, z3, 0))
+
+/*
+** mla_lane_1_u16:
+**     mla     z0\.h, z1\.h, z2\.h\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_1_u16, svuint16_t,
+               z0 = svmla_lane_u16 (z0, z1, z2, 1),
+               z0 = svmla_lane (z0, z1, z2, 1))
+
+/*
+** mla_lane_2_u16:
+**     mla     z0\.h, z1\.h, z2\.h\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_2_u16, svuint16_t,
+               z0 = svmla_lane_u16 (z0, z1, z2, 2),
+               z0 = svmla_lane (z0, z1, z2, 2))
+
+/*
+** mla_lane_3_u16:
+**     mla     z0\.h, z1\.h, z2\.h\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_3_u16, svuint16_t,
+               z0 = svmla_lane_u16 (z0, z1, z2, 3),
+               z0 = svmla_lane (z0, z1, z2, 3))
+
+/*
+** mla_lane_4_u16:
+**     mla     z0\.h, z1\.h, z2\.h\[4\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_4_u16, svuint16_t,
+               z0 = svmla_lane_u16 (z0, z1, z2, 4),
+               z0 = svmla_lane (z0, z1, z2, 4))
+
+/*
+** mla_lane_5_u16:
+**     mla     z0\.h, z1\.h, z2\.h\[5\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_5_u16, svuint16_t,
+               z0 = svmla_lane_u16 (z0, z1, z2, 5),
+               z0 = svmla_lane (z0, z1, z2, 5))
+
+/*
+** mla_lane_6_u16:
+**     mla     z0\.h, z1\.h, z2\.h\[6\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_6_u16, svuint16_t,
+               z0 = svmla_lane_u16 (z0, z1, z2, 6),
+               z0 = svmla_lane (z0, z1, z2, 6))
+
+/*
+** mla_lane_7_u16:
+**     mla     z0\.h, z1\.h, z2\.h\[7\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_7_u16, svuint16_t,
+               z0 = svmla_lane_u16 (z0, z1, z2, 7),
+               z0 = svmla_lane (z0, z1, z2, 7))
+
+/*
+** mla_lane_z8_u16:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     mla     z0\.h, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mla_lane_z8_u16, svuint16_t, svuint16_t, z8,
+                   z0 = svmla_lane_u16 (z0, z1, z8, 1),
+                   z0 = svmla_lane (z0, z1, z8, 1))
+
+/*
+** mla_lane_z16_u16:
+**     mov     (z[0-7])\.d, z16\.d
+**     mla     z0\.h, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mla_lane_z16_u16, svuint16_t, svuint16_t, z16,
+                   z0 = svmla_lane_u16 (z0, z1, z16, 1),
+                   z0 = svmla_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mla_lane_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mla_lane_u32.c
new file mode 100644 (file)
index 0000000..46d47d0
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mla_lane_0_u32_tied1:
+**     mla     z0\.s, z1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_u32_tied1, svuint32_t,
+               z0 = svmla_lane_u32 (z0, z1, z2, 0),
+               z0 = svmla_lane (z0, z1, z2, 0))
+
+/*
+** mla_lane_0_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     mla     z0\.s, \1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_u32_tied2, svuint32_t,
+               z0 = svmla_lane_u32 (z1, z0, z2, 0),
+               z0 = svmla_lane (z1, z0, z2, 0))
+
+/*
+** mla_lane_0_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     mla     z0\.s, z2\.s, \1\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_u32_tied3, svuint32_t,
+               z0 = svmla_lane_u32 (z1, z2, z0, 0),
+               z0 = svmla_lane (z1, z2, z0, 0))
+
+/*
+** mla_lane_0_u32_untied:
+**     movprfx z0, z1
+**     mla     z0\.s, z2\.s, z3\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_u32_untied, svuint32_t,
+               z0 = svmla_lane_u32 (z1, z2, z3, 0),
+               z0 = svmla_lane (z1, z2, z3, 0))
+
+/*
+** mla_lane_1_u32:
+**     mla     z0\.s, z1\.s, z2\.s\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_1_u32, svuint32_t,
+               z0 = svmla_lane_u32 (z0, z1, z2, 1),
+               z0 = svmla_lane (z0, z1, z2, 1))
+
+/*
+** mla_lane_2_u32:
+**     mla     z0\.s, z1\.s, z2\.s\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_2_u32, svuint32_t,
+               z0 = svmla_lane_u32 (z0, z1, z2, 2),
+               z0 = svmla_lane (z0, z1, z2, 2))
+
+/*
+** mla_lane_3_u32:
+**     mla     z0\.s, z1\.s, z2\.s\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_3_u32, svuint32_t,
+               z0 = svmla_lane_u32 (z0, z1, z2, 3),
+               z0 = svmla_lane (z0, z1, z2, 3))
+
+/*
+** mla_lane_z8_u32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     mla     z0\.s, z1\.s, \1\.s\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mla_lane_z8_u32, svuint32_t, svuint32_t, z8,
+                   z0 = svmla_lane_u32 (z0, z1, z8, 1),
+                   z0 = svmla_lane (z0, z1, z8, 1))
+
+/*
+** mla_lane_z16_u32:
+**     mov     (z[0-7])\.d, z16\.d
+**     mla     z0\.s, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mla_lane_z16_u32, svuint32_t, svuint32_t, z16,
+                   z0 = svmla_lane_u32 (z0, z1, z16, 1),
+                   z0 = svmla_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mla_lane_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mla_lane_u64.c
new file mode 100644 (file)
index 0000000..cfe82af
--- /dev/null
@@ -0,0 +1,74 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mla_lane_0_u64_tied1:
+**     mla     z0\.d, z1\.d, z2\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_u64_tied1, svuint64_t,
+               z0 = svmla_lane_u64 (z0, z1, z2, 0),
+               z0 = svmla_lane (z0, z1, z2, 0))
+
+/*
+** mla_lane_0_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     mla     z0\.d, \1, z2\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_u64_tied2, svuint64_t,
+               z0 = svmla_lane_u64 (z1, z0, z2, 0),
+               z0 = svmla_lane (z1, z0, z2, 0))
+
+/*
+** mla_lane_0_u64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     mla     z0\.d, z2\.d, \1\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_u64_tied3, svuint64_t,
+               z0 = svmla_lane_u64 (z1, z2, z0, 0),
+               z0 = svmla_lane (z1, z2, z0, 0))
+
+/*
+** mla_lane_0_u64_untied:
+**     movprfx z0, z1
+**     mla     z0\.d, z2\.d, z3\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_0_u64_untied, svuint64_t,
+               z0 = svmla_lane_u64 (z1, z2, z3, 0),
+               z0 = svmla_lane (z1, z2, z3, 0))
+
+/*
+** mla_lane_1_u64:
+**     mla     z0\.d, z1\.d, z2\.d\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (mla_lane_1_u64, svuint64_t,
+               z0 = svmla_lane_u64 (z0, z1, z2, 1),
+               z0 = svmla_lane (z0, z1, z2, 1))
+
+/*
+** mla_lane_z15_u64:
+**     str     d15, \[sp, -16\]!
+**     mla     z0\.d, z1\.d, z15\.d\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mla_lane_z15_u64, svuint64_t, svuint64_t, z15,
+                   z0 = svmla_lane_u64 (z0, z1, z15, 1),
+                   z0 = svmla_lane (z0, z1, z15, 1))
+
+/*
+** mla_lane_z16_u64:
+**     mov     (z[0-7])\.d, z16\.d
+**     mla     z0\.d, z1\.d, \1\.d\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mla_lane_z16_u64, svuint64_t, svuint64_t, z16,
+                   z0 = svmla_lane_u64 (z0, z1, z16, 1),
+                   z0 = svmla_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_f32.c
new file mode 100644 (file)
index 0000000..63cb9dd
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalb_f32_tied1:
+**     fmlalb  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlalb_f32_tied1, svfloat32_t, svfloat16_t,
+            z0 = svmlalb_f32 (z0, z4, z5),
+            z0 = svmlalb (z0, z4, z5))
+
+/*
+** mlalb_f32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     fmlalb  z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_f32_tied2, svfloat32_t, svfloat16_t,
+                z0_res = svmlalb_f32 (z4, z0, z1),
+                z0_res = svmlalb (z4, z0, z1))
+
+/*
+** mlalb_f32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     fmlalb  z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_f32_tied3, svfloat32_t, svfloat16_t,
+                z0_res = svmlalb_f32 (z4, z1, z0),
+                z0_res = svmlalb (z4, z1, z0))
+
+/*
+** mlalb_f32_untied:
+**     movprfx z0, z1
+**     fmlalb  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlalb_f32_untied, svfloat32_t, svfloat16_t,
+            z0 = svmlalb_f32 (z1, z4, z5),
+            z0 = svmlalb (z1, z4, z5))
+
+/*
+** mlalb_h7_f32_tied1:
+**     mov     (z[0-9]+\.h), h7
+**     fmlalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZD (mlalb_h7_f32_tied1, svfloat32_t, svfloat16_t, float16_t,
+             z0 = svmlalb_n_f32 (z0, z4, d7),
+             z0 = svmlalb (z0, z4, d7))
+
+/*
+** mlalb_h7_f32_untied:
+**     mov     (z[0-9]+\.h), h7
+**     movprfx z0, z1
+**     fmlalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZD (mlalb_h7_f32_untied, svfloat32_t, svfloat16_t, float16_t,
+             z0 = svmlalb_n_f32 (z1, z4, d7),
+             z0 = svmlalb (z1, z4, d7))
+
+/*
+** mlalb_2_f32_tied1:
+**     fmov    (z[0-9]+\.h), #2\.0(?:e\+0)?
+**     fmlalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalb_2_f32_tied1, svfloat32_t, svfloat16_t,
+            z0 = svmlalb_n_f32 (z0, z4, 2),
+            z0 = svmlalb (z0, z4, 2))
+
+/*
+** mlalb_2_f32_untied:
+**     fmov    (z[0-9]+\.h), #2\.0(?:e\+0)?
+**     movprfx z0, z1
+**     fmlalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalb_2_f32_untied, svfloat32_t, svfloat16_t,
+            z0 = svmlalb_n_f32 (z1, z4, 2),
+            z0 = svmlalb (z1, z4, 2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_lane_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_lane_f32.c
new file mode 100644 (file)
index 0000000..f38cdac
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalb_lane_0_f32_tied1:
+**     fmlalb  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalb_lane_0_f32_tied1, svfloat32_t, svfloat16_t,
+            z0 = svmlalb_lane_f32 (z0, z4, z5, 0),
+            z0 = svmlalb_lane (z0, z4, z5, 0))
+
+/*
+** mlalb_lane_0_f32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     fmlalb  z0\.s, \1\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_lane_0_f32_tied2, svfloat32_t, svfloat16_t,
+                z0_res = svmlalb_lane_f32 (z4, z0, z1, 0),
+                z0_res = svmlalb_lane (z4, z0, z1, 0))
+
+/*
+** mlalb_lane_0_f32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     fmlalb  z0\.s, z1\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_lane_0_f32_tied3, svfloat32_t, svfloat16_t,
+                z0_res = svmlalb_lane_f32 (z4, z1, z0, 0),
+                z0_res = svmlalb_lane (z4, z1, z0, 0))
+
+/*
+** mlalb_lane_0_f32_untied:
+**     movprfx z0, z1
+**     fmlalb  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalb_lane_0_f32_untied, svfloat32_t, svfloat16_t,
+            z0 = svmlalb_lane_f32 (z1, z4, z5, 0),
+            z0 = svmlalb_lane (z1, z4, z5, 0))
+
+/*
+** mlalb_lane_1_f32:
+**     fmlalb  z0\.s, z4\.h, z5\.h\[1\]
+**     ret
+*/
+TEST_DUAL_Z (mlalb_lane_1_f32, svfloat32_t, svfloat16_t,
+            z0 = svmlalb_lane_f32 (z0, z4, z5, 1),
+            z0 = svmlalb_lane (z0, z4, z5, 1))
+
+/*
+** mlalb_lane_z8_f32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     fmlalb  z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalb_lane_z8_f32, svfloat32_t, svfloat16_t, z8,
+                   z0 = svmlalb_lane_f32 (z0, z1, z8, 1),
+                   z0 = svmlalb_lane (z0, z1, z8, 1))
+
+/*
+** mlalb_lane_z16_f32:
+**     mov     (z[0-7])\.d, z16\.d
+**     fmlalb  z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalb_lane_z16_f32, svfloat32_t, svfloat16_t, z16,
+                   z0 = svmlalb_lane_f32 (z0, z1, z16, 1),
+                   z0 = svmlalb_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_lane_s32.c
new file mode 100644 (file)
index 0000000..2de2b11
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalb_lane_0_s32_tied1:
+**     smlalb  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalb_lane_0_s32_tied1, svint32_t, svint16_t,
+            z0 = svmlalb_lane_s32 (z0, z4, z5, 0),
+            z0 = svmlalb_lane (z0, z4, z5, 0))
+
+/*
+** mlalb_lane_0_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalb  z0\.s, \1\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_lane_0_s32_tied2, svint32_t, svint16_t,
+                z0_res = svmlalb_lane_s32 (z4, z0, z1, 0),
+                z0_res = svmlalb_lane (z4, z0, z1, 0))
+
+/*
+** mlalb_lane_0_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalb  z0\.s, z1\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_lane_0_s32_tied3, svint32_t, svint16_t,
+                z0_res = svmlalb_lane_s32 (z4, z1, z0, 0),
+                z0_res = svmlalb_lane (z4, z1, z0, 0))
+
+/*
+** mlalb_lane_0_s32_untied:
+**     movprfx z0, z1
+**     smlalb  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalb_lane_0_s32_untied, svint32_t, svint16_t,
+            z0 = svmlalb_lane_s32 (z1, z4, z5, 0),
+            z0 = svmlalb_lane (z1, z4, z5, 0))
+
+/*
+** mlalb_lane_1_s32:
+**     smlalb  z0\.s, z4\.h, z5\.h\[1\]
+**     ret
+*/
+TEST_DUAL_Z (mlalb_lane_1_s32, svint32_t, svint16_t,
+            z0 = svmlalb_lane_s32 (z0, z4, z5, 1),
+            z0 = svmlalb_lane (z0, z4, z5, 1))
+
+/*
+** mlalb_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     smlalb  z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalb_lane_z8_s32, svint32_t, svint16_t, z8,
+                   z0 = svmlalb_lane_s32 (z0, z1, z8, 1),
+                   z0 = svmlalb_lane (z0, z1, z8, 1))
+
+/*
+** mlalb_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     smlalb  z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalb_lane_z16_s32, svint32_t, svint16_t, z16,
+                   z0 = svmlalb_lane_s32 (z0, z1, z16, 1),
+                   z0 = svmlalb_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_lane_s64.c
new file mode 100644 (file)
index 0000000..835c9d0
--- /dev/null
@@ -0,0 +1,65 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalb_lane_0_s64_tied1:
+**     smlalb  z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalb_lane_0_s64_tied1, svint64_t, svint32_t,
+            z0 = svmlalb_lane_s64 (z0, z4, z5, 0),
+            z0 = svmlalb_lane (z0, z4, z5, 0))
+
+/*
+** mlalb_lane_0_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalb  z0\.d, \1\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_lane_0_s64_tied2, svint64_t, svint32_t,
+                z0_res = svmlalb_lane_s64 (z4, z0, z1, 0),
+                z0_res = svmlalb_lane (z4, z0, z1, 0))
+
+/*
+** mlalb_lane_0_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalb  z0\.d, z1\.s, \1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_lane_0_s64_tied3, svint64_t, svint32_t,
+                z0_res = svmlalb_lane_s64 (z4, z1, z0, 0),
+                z0_res = svmlalb_lane (z4, z1, z0, 0))
+
+/*
+** mlalb_lane_0_s64_untied:
+**     movprfx z0, z1
+**     smlalb  z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalb_lane_0_s64_untied, svint64_t, svint32_t,
+            z0 = svmlalb_lane_s64 (z1, z4, z5, 0),
+            z0 = svmlalb_lane (z1, z4, z5, 0))
+
+/*
+** mlalb_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     smlalb  z0\.d, z1\.s, z15\.s\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalb_lane_z15_s64, svint64_t, svint32_t, z15,
+                   z0 = svmlalb_lane_s64 (z0, z1, z15, 1),
+                   z0 = svmlalb_lane (z0, z1, z15, 1))
+
+/*
+** mlalb_lane_z16_s64:
+**     mov     (z[0-9]|z1[0-5])\.d, z16\.d
+**     smlalb  z0\.d, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalb_lane_z16_s64, svint64_t, svint32_t, z16,
+                   z0 = svmlalb_lane_s64 (z0, z1, z16, 1),
+                   z0 = svmlalb_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_lane_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_lane_u32.c
new file mode 100644 (file)
index 0000000..5eb9a38
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalb_lane_0_u32_tied1:
+**     umlalb  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalb_lane_0_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svmlalb_lane_u32 (z0, z4, z5, 0),
+            z0 = svmlalb_lane (z0, z4, z5, 0))
+
+/*
+** mlalb_lane_0_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalb  z0\.s, \1\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_lane_0_u32_tied2, svuint32_t, svuint16_t,
+                z0_res = svmlalb_lane_u32 (z4, z0, z1, 0),
+                z0_res = svmlalb_lane (z4, z0, z1, 0))
+
+/*
+** mlalb_lane_0_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalb  z0\.s, z1\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_lane_0_u32_tied3, svuint32_t, svuint16_t,
+                z0_res = svmlalb_lane_u32 (z4, z1, z0, 0),
+                z0_res = svmlalb_lane (z4, z1, z0, 0))
+
+/*
+** mlalb_lane_0_u32_untied:
+**     movprfx z0, z1
+**     umlalb  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalb_lane_0_u32_untied, svuint32_t, svuint16_t,
+            z0 = svmlalb_lane_u32 (z1, z4, z5, 0),
+            z0 = svmlalb_lane (z1, z4, z5, 0))
+
+/*
+** mlalb_lane_1_u32:
+**     umlalb  z0\.s, z4\.h, z5\.h\[1\]
+**     ret
+*/
+TEST_DUAL_Z (mlalb_lane_1_u32, svuint32_t, svuint16_t,
+            z0 = svmlalb_lane_u32 (z0, z4, z5, 1),
+            z0 = svmlalb_lane (z0, z4, z5, 1))
+
+/*
+** mlalb_lane_z8_u32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     umlalb  z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalb_lane_z8_u32, svuint32_t, svuint16_t, z8,
+                   z0 = svmlalb_lane_u32 (z0, z1, z8, 1),
+                   z0 = svmlalb_lane (z0, z1, z8, 1))
+
+/*
+** mlalb_lane_z16_u32:
+**     mov     (z[0-7])\.d, z16\.d
+**     umlalb  z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalb_lane_z16_u32, svuint32_t, svuint16_t, z16,
+                   z0 = svmlalb_lane_u32 (z0, z1, z16, 1),
+                   z0 = svmlalb_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_lane_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_lane_u64.c
new file mode 100644 (file)
index 0000000..fa0e568
--- /dev/null
@@ -0,0 +1,65 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalb_lane_0_u64_tied1:
+**     umlalb  z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalb_lane_0_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svmlalb_lane_u64 (z0, z4, z5, 0),
+            z0 = svmlalb_lane (z0, z4, z5, 0))
+
+/*
+** mlalb_lane_0_u64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalb  z0\.d, \1\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_lane_0_u64_tied2, svuint64_t, svuint32_t,
+                z0_res = svmlalb_lane_u64 (z4, z0, z1, 0),
+                z0_res = svmlalb_lane (z4, z0, z1, 0))
+
+/*
+** mlalb_lane_0_u64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalb  z0\.d, z1\.s, \1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_lane_0_u64_tied3, svuint64_t, svuint32_t,
+                z0_res = svmlalb_lane_u64 (z4, z1, z0, 0),
+                z0_res = svmlalb_lane (z4, z1, z0, 0))
+
+/*
+** mlalb_lane_0_u64_untied:
+**     movprfx z0, z1
+**     umlalb  z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalb_lane_0_u64_untied, svuint64_t, svuint32_t,
+            z0 = svmlalb_lane_u64 (z1, z4, z5, 0),
+            z0 = svmlalb_lane (z1, z4, z5, 0))
+
+/*
+** mlalb_lane_z15_u64:
+**     str     d15, \[sp, -16\]!
+**     umlalb  z0\.d, z1\.s, z15\.s\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalb_lane_z15_u64, svuint64_t, svuint32_t, z15,
+                   z0 = svmlalb_lane_u64 (z0, z1, z15, 1),
+                   z0 = svmlalb_lane (z0, z1, z15, 1))
+
+/*
+** mlalb_lane_z16_u64:
+**     mov     (z[0-9]|z1[0-5])\.d, z16\.d
+**     umlalb  z0\.d, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalb_lane_z16_u64, svuint64_t, svuint32_t, z16,
+                   z0 = svmlalb_lane_u64 (z0, z1, z16, 1),
+                   z0 = svmlalb_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_s16.c
new file mode 100644 (file)
index 0000000..4092a9c
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalb_s16_tied1:
+**     smlalb  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (mlalb_s16_tied1, svint16_t, svint8_t,
+            z0 = svmlalb_s16 (z0, z4, z5),
+            z0 = svmlalb (z0, z4, z5))
+
+/*
+** mlalb_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalb  z0\.h, \1\.b, z1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_s16_tied2, svint16_t, svint8_t,
+                z0_res = svmlalb_s16 (z4, z0, z1),
+                z0_res = svmlalb (z4, z0, z1))
+
+/*
+** mlalb_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalb  z0\.h, z1\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_s16_tied3, svint16_t, svint8_t,
+                z0_res = svmlalb_s16 (z4, z1, z0),
+                z0_res = svmlalb (z4, z1, z0))
+
+/*
+** mlalb_s16_untied:
+**     movprfx z0, z1
+**     smlalb  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (mlalb_s16_untied, svint16_t, svint8_t,
+            z0 = svmlalb_s16 (z1, z4, z5),
+            z0 = svmlalb (z1, z4, z5))
+
+/*
+** mlalb_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     smlalb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalb_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+             z0 = svmlalb_n_s16 (z0, z4, x0),
+             z0 = svmlalb (z0, z4, x0))
+
+/*
+** mlalb_w0_s16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     smlalb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalb_w0_s16_untied, svint16_t, svint8_t, int8_t,
+             z0 = svmlalb_n_s16 (z1, z4, x0),
+             z0 = svmlalb (z1, z4, x0))
+
+/*
+** mlalb_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     smlalb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalb_11_s16_tied1, svint16_t, svint8_t,
+            z0 = svmlalb_n_s16 (z0, z4, 11),
+            z0 = svmlalb (z0, z4, 11))
+
+/*
+** mlalb_11_s16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     smlalb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalb_11_s16_untied, svint16_t, svint8_t,
+            z0 = svmlalb_n_s16 (z1, z4, 11),
+            z0 = svmlalb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_s32.c
new file mode 100644 (file)
index 0000000..8f72b26
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalb_s32_tied1:
+**     smlalb  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlalb_s32_tied1, svint32_t, svint16_t,
+            z0 = svmlalb_s32 (z0, z4, z5),
+            z0 = svmlalb (z0, z4, z5))
+
+/*
+** mlalb_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalb  z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_s32_tied2, svint32_t, svint16_t,
+                z0_res = svmlalb_s32 (z4, z0, z1),
+                z0_res = svmlalb (z4, z0, z1))
+
+/*
+** mlalb_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalb  z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_s32_tied3, svint32_t, svint16_t,
+                z0_res = svmlalb_s32 (z4, z1, z0),
+                z0_res = svmlalb (z4, z1, z0))
+
+/*
+** mlalb_s32_untied:
+**     movprfx z0, z1
+**     smlalb  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlalb_s32_untied, svint32_t, svint16_t,
+            z0 = svmlalb_s32 (z1, z4, z5),
+            z0 = svmlalb (z1, z4, z5))
+
+/*
+** mlalb_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     smlalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalb_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+             z0 = svmlalb_n_s32 (z0, z4, x0),
+             z0 = svmlalb (z0, z4, x0))
+
+/*
+** mlalb_w0_s32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     smlalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalb_w0_s32_untied, svint32_t, svint16_t, int16_t,
+             z0 = svmlalb_n_s32 (z1, z4, x0),
+             z0 = svmlalb (z1, z4, x0))
+
+/*
+** mlalb_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     smlalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalb_11_s32_tied1, svint32_t, svint16_t,
+            z0 = svmlalb_n_s32 (z0, z4, 11),
+            z0 = svmlalb (z0, z4, 11))
+
+/*
+** mlalb_11_s32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     smlalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalb_11_s32_untied, svint32_t, svint16_t,
+            z0 = svmlalb_n_s32 (z1, z4, 11),
+            z0 = svmlalb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_s64.c
new file mode 100644 (file)
index 0000000..8982255
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalb_s64_tied1:
+**     smlalb  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (mlalb_s64_tied1, svint64_t, svint32_t,
+            z0 = svmlalb_s64 (z0, z4, z5),
+            z0 = svmlalb (z0, z4, z5))
+
+/*
+** mlalb_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalb  z0\.d, \1\.s, z1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_s64_tied2, svint64_t, svint32_t,
+                z0_res = svmlalb_s64 (z4, z0, z1),
+                z0_res = svmlalb (z4, z0, z1))
+
+/*
+** mlalb_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalb  z0\.d, z1\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_s64_tied3, svint64_t, svint32_t,
+                z0_res = svmlalb_s64 (z4, z1, z0),
+                z0_res = svmlalb (z4, z1, z0))
+
+/*
+** mlalb_s64_untied:
+**     movprfx z0, z1
+**     smlalb  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (mlalb_s64_untied, svint64_t, svint32_t,
+            z0 = svmlalb_s64 (z1, z4, z5),
+            z0 = svmlalb (z1, z4, z5))
+
+/*
+** mlalb_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     smlalb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalb_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+             z0 = svmlalb_n_s64 (z0, z4, x0),
+             z0 = svmlalb (z0, z4, x0))
+
+/*
+** mlalb_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     smlalb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalb_w0_s64_untied, svint64_t, svint32_t, int32_t,
+             z0 = svmlalb_n_s64 (z1, z4, x0),
+             z0 = svmlalb (z1, z4, x0))
+
+/*
+** mlalb_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     smlalb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalb_11_s64_tied1, svint64_t, svint32_t,
+            z0 = svmlalb_n_s64 (z0, z4, 11),
+            z0 = svmlalb (z0, z4, 11))
+
+/*
+** mlalb_11_s64_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     smlalb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalb_11_s64_untied, svint64_t, svint32_t,
+            z0 = svmlalb_n_s64 (z1, z4, 11),
+            z0 = svmlalb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_u16.c
new file mode 100644 (file)
index 0000000..2a1ea26
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalb_u16_tied1:
+**     umlalb  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (mlalb_u16_tied1, svuint16_t, svuint8_t,
+            z0 = svmlalb_u16 (z0, z4, z5),
+            z0 = svmlalb (z0, z4, z5))
+
+/*
+** mlalb_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalb  z0\.h, \1\.b, z1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_u16_tied2, svuint16_t, svuint8_t,
+                z0_res = svmlalb_u16 (z4, z0, z1),
+                z0_res = svmlalb (z4, z0, z1))
+
+/*
+** mlalb_u16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalb  z0\.h, z1\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_u16_tied3, svuint16_t, svuint8_t,
+                z0_res = svmlalb_u16 (z4, z1, z0),
+                z0_res = svmlalb (z4, z1, z0))
+
+/*
+** mlalb_u16_untied:
+**     movprfx z0, z1
+**     umlalb  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (mlalb_u16_untied, svuint16_t, svuint8_t,
+            z0 = svmlalb_u16 (z1, z4, z5),
+            z0 = svmlalb (z1, z4, z5))
+
+/*
+** mlalb_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     umlalb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalb_w0_u16_tied1, svuint16_t, svuint8_t, uint8_t,
+             z0 = svmlalb_n_u16 (z0, z4, x0),
+             z0 = svmlalb (z0, z4, x0))
+
+/*
+** mlalb_w0_u16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     umlalb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalb_w0_u16_untied, svuint16_t, svuint8_t, uint8_t,
+             z0 = svmlalb_n_u16 (z1, z4, x0),
+             z0 = svmlalb (z1, z4, x0))
+
+/*
+** mlalb_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     umlalb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalb_11_u16_tied1, svuint16_t, svuint8_t,
+            z0 = svmlalb_n_u16 (z0, z4, 11),
+            z0 = svmlalb (z0, z4, 11))
+
+/*
+** mlalb_11_u16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     umlalb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalb_11_u16_untied, svuint16_t, svuint8_t,
+            z0 = svmlalb_n_u16 (z1, z4, 11),
+            z0 = svmlalb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_u32.c
new file mode 100644 (file)
index 0000000..f27cd47
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalb_u32_tied1:
+**     umlalb  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlalb_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svmlalb_u32 (z0, z4, z5),
+            z0 = svmlalb (z0, z4, z5))
+
+/*
+** mlalb_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalb  z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_u32_tied2, svuint32_t, svuint16_t,
+                z0_res = svmlalb_u32 (z4, z0, z1),
+                z0_res = svmlalb (z4, z0, z1))
+
+/*
+** mlalb_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalb  z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_u32_tied3, svuint32_t, svuint16_t,
+                z0_res = svmlalb_u32 (z4, z1, z0),
+                z0_res = svmlalb (z4, z1, z0))
+
+/*
+** mlalb_u32_untied:
+**     movprfx z0, z1
+**     umlalb  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlalb_u32_untied, svuint32_t, svuint16_t,
+            z0 = svmlalb_u32 (z1, z4, z5),
+            z0 = svmlalb (z1, z4, z5))
+
+/*
+** mlalb_w0_u32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     umlalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalb_w0_u32_tied1, svuint32_t, svuint16_t, uint16_t,
+             z0 = svmlalb_n_u32 (z0, z4, x0),
+             z0 = svmlalb (z0, z4, x0))
+
+/*
+** mlalb_w0_u32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     umlalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalb_w0_u32_untied, svuint32_t, svuint16_t, uint16_t,
+             z0 = svmlalb_n_u32 (z1, z4, x0),
+             z0 = svmlalb (z1, z4, x0))
+
+/*
+** mlalb_11_u32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     umlalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalb_11_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svmlalb_n_u32 (z0, z4, 11),
+            z0 = svmlalb (z0, z4, 11))
+
+/*
+** mlalb_11_u32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     umlalb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalb_11_u32_untied, svuint32_t, svuint16_t,
+            z0 = svmlalb_n_u32 (z1, z4, 11),
+            z0 = svmlalb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalb_u64.c
new file mode 100644 (file)
index 0000000..982e4a3
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalb_u64_tied1:
+**     umlalb  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (mlalb_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svmlalb_u64 (z0, z4, z5),
+            z0 = svmlalb (z0, z4, z5))
+
+/*
+** mlalb_u64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalb  z0\.d, \1\.s, z1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_u64_tied2, svuint64_t, svuint32_t,
+                z0_res = svmlalb_u64 (z4, z0, z1),
+                z0_res = svmlalb (z4, z0, z1))
+
+/*
+** mlalb_u64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalb  z0\.d, z1\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalb_u64_tied3, svuint64_t, svuint32_t,
+                z0_res = svmlalb_u64 (z4, z1, z0),
+                z0_res = svmlalb (z4, z1, z0))
+
+/*
+** mlalb_u64_untied:
+**     movprfx z0, z1
+**     umlalb  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (mlalb_u64_untied, svuint64_t, svuint32_t,
+            z0 = svmlalb_u64 (z1, z4, z5),
+            z0 = svmlalb (z1, z4, z5))
+
+/*
+** mlalb_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     umlalb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalb_w0_u64_tied1, svuint64_t, svuint32_t, uint32_t,
+             z0 = svmlalb_n_u64 (z0, z4, x0),
+             z0 = svmlalb (z0, z4, x0))
+
+/*
+** mlalb_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     umlalb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalb_w0_u64_untied, svuint64_t, svuint32_t, uint32_t,
+             z0 = svmlalb_n_u64 (z1, z4, x0),
+             z0 = svmlalb (z1, z4, x0))
+
+/*
+** mlalb_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     umlalb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalb_11_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svmlalb_n_u64 (z0, z4, 11),
+            z0 = svmlalb (z0, z4, 11))
+
+/*
+** mlalb_11_u64_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     umlalb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalb_11_u64_untied, svuint64_t, svuint32_t,
+            z0 = svmlalb_n_u64 (z1, z4, 11),
+            z0 = svmlalb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_f32.c
new file mode 100644 (file)
index 0000000..ef33193
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalt_f32_tied1:
+**     fmlalt  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlalt_f32_tied1, svfloat32_t, svfloat16_t,
+            z0 = svmlalt_f32 (z0, z4, z5),
+            z0 = svmlalt (z0, z4, z5))
+
+/*
+** mlalt_f32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     fmlalt  z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_f32_tied2, svfloat32_t, svfloat16_t,
+                z0_res = svmlalt_f32 (z4, z0, z1),
+                z0_res = svmlalt (z4, z0, z1))
+
+/*
+** mlalt_f32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     fmlalt  z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_f32_tied3, svfloat32_t, svfloat16_t,
+                z0_res = svmlalt_f32 (z4, z1, z0),
+                z0_res = svmlalt (z4, z1, z0))
+
+/*
+** mlalt_f32_untied:
+**     movprfx z0, z1
+**     fmlalt  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlalt_f32_untied, svfloat32_t, svfloat16_t,
+            z0 = svmlalt_f32 (z1, z4, z5),
+            z0 = svmlalt (z1, z4, z5))
+
+/*
+** mlalt_h7_f32_tied1:
+**     mov     (z[0-9]+\.h), h7
+**     fmlalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZD (mlalt_h7_f32_tied1, svfloat32_t, svfloat16_t, float16_t,
+             z0 = svmlalt_n_f32 (z0, z4, d7),
+             z0 = svmlalt (z0, z4, d7))
+
+/*
+** mlalt_h7_f32_untied:
+**     mov     (z[0-9]+\.h), h7
+**     movprfx z0, z1
+**     fmlalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZD (mlalt_h7_f32_untied, svfloat32_t, svfloat16_t, float16_t,
+             z0 = svmlalt_n_f32 (z1, z4, d7),
+             z0 = svmlalt (z1, z4, d7))
+
+/*
+** mlalt_2_f32_tied1:
+**     fmov    (z[0-9]+\.h), #2\.0(?:e\+0)?
+**     fmlalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalt_2_f32_tied1, svfloat32_t, svfloat16_t,
+            z0 = svmlalt_n_f32 (z0, z4, 2),
+            z0 = svmlalt (z0, z4, 2))
+
+/*
+** mlalt_2_f32_untied:
+**     fmov    (z[0-9]+\.h), #2\.0(?:e\+0)?
+**     movprfx z0, z1
+**     fmlalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalt_2_f32_untied, svfloat32_t, svfloat16_t,
+            z0 = svmlalt_n_f32 (z1, z4, 2),
+            z0 = svmlalt (z1, z4, 2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_lane_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_lane_f32.c
new file mode 100644 (file)
index 0000000..05105df
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalt_lane_0_f32_tied1:
+**     fmlalt  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalt_lane_0_f32_tied1, svfloat32_t, svfloat16_t,
+            z0 = svmlalt_lane_f32 (z0, z4, z5, 0),
+            z0 = svmlalt_lane (z0, z4, z5, 0))
+
+/*
+** mlalt_lane_0_f32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     fmlalt  z0\.s, \1\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_lane_0_f32_tied2, svfloat32_t, svfloat16_t,
+                z0_res = svmlalt_lane_f32 (z4, z0, z1, 0),
+                z0_res = svmlalt_lane (z4, z0, z1, 0))
+
+/*
+** mlalt_lane_0_f32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     fmlalt  z0\.s, z1\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_lane_0_f32_tied3, svfloat32_t, svfloat16_t,
+                z0_res = svmlalt_lane_f32 (z4, z1, z0, 0),
+                z0_res = svmlalt_lane (z4, z1, z0, 0))
+
+/*
+** mlalt_lane_0_f32_untied:
+**     movprfx z0, z1
+**     fmlalt  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalt_lane_0_f32_untied, svfloat32_t, svfloat16_t,
+            z0 = svmlalt_lane_f32 (z1, z4, z5, 0),
+            z0 = svmlalt_lane (z1, z4, z5, 0))
+
+/*
+** mlalt_lane_1_f32:
+**     fmlalt  z0\.s, z4\.h, z5\.h\[1\]
+**     ret
+*/
+TEST_DUAL_Z (mlalt_lane_1_f32, svfloat32_t, svfloat16_t,
+            z0 = svmlalt_lane_f32 (z0, z4, z5, 1),
+            z0 = svmlalt_lane (z0, z4, z5, 1))
+
+/*
+** mlalt_lane_z8_f32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     fmlalt  z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalt_lane_z8_f32, svfloat32_t, svfloat16_t, z8,
+                   z0 = svmlalt_lane_f32 (z0, z1, z8, 1),
+                   z0 = svmlalt_lane (z0, z1, z8, 1))
+
+/*
+** mlalt_lane_z16_f32:
+**     mov     (z[0-7])\.d, z16\.d
+**     fmlalt  z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalt_lane_z16_f32, svfloat32_t, svfloat16_t, z16,
+                   z0 = svmlalt_lane_f32 (z0, z1, z16, 1),
+                   z0 = svmlalt_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_lane_s32.c
new file mode 100644 (file)
index 0000000..1d2397e
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalt_lane_0_s32_tied1:
+**     smlalt  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalt_lane_0_s32_tied1, svint32_t, svint16_t,
+            z0 = svmlalt_lane_s32 (z0, z4, z5, 0),
+            z0 = svmlalt_lane (z0, z4, z5, 0))
+
+/*
+** mlalt_lane_0_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalt  z0\.s, \1\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_lane_0_s32_tied2, svint32_t, svint16_t,
+                z0_res = svmlalt_lane_s32 (z4, z0, z1, 0),
+                z0_res = svmlalt_lane (z4, z0, z1, 0))
+
+/*
+** mlalt_lane_0_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalt  z0\.s, z1\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_lane_0_s32_tied3, svint32_t, svint16_t,
+                z0_res = svmlalt_lane_s32 (z4, z1, z0, 0),
+                z0_res = svmlalt_lane (z4, z1, z0, 0))
+
+/*
+** mlalt_lane_0_s32_untied:
+**     movprfx z0, z1
+**     smlalt  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalt_lane_0_s32_untied, svint32_t, svint16_t,
+            z0 = svmlalt_lane_s32 (z1, z4, z5, 0),
+            z0 = svmlalt_lane (z1, z4, z5, 0))
+
+/*
+** mlalt_lane_1_s32:
+**     smlalt  z0\.s, z4\.h, z5\.h\[1\]
+**     ret
+*/
+TEST_DUAL_Z (mlalt_lane_1_s32, svint32_t, svint16_t,
+            z0 = svmlalt_lane_s32 (z0, z4, z5, 1),
+            z0 = svmlalt_lane (z0, z4, z5, 1))
+
+/*
+** mlalt_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     smlalt  z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalt_lane_z8_s32, svint32_t, svint16_t, z8,
+                   z0 = svmlalt_lane_s32 (z0, z1, z8, 1),
+                   z0 = svmlalt_lane (z0, z1, z8, 1))
+
+/*
+** mlalt_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     smlalt  z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalt_lane_z16_s32, svint32_t, svint16_t, z16,
+                   z0 = svmlalt_lane_s32 (z0, z1, z16, 1),
+                   z0 = svmlalt_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_lane_s64.c
new file mode 100644 (file)
index 0000000..4f4ef3d
--- /dev/null
@@ -0,0 +1,65 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalt_lane_0_s64_tied1:
+**     smlalt  z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalt_lane_0_s64_tied1, svint64_t, svint32_t,
+            z0 = svmlalt_lane_s64 (z0, z4, z5, 0),
+            z0 = svmlalt_lane (z0, z4, z5, 0))
+
+/*
+** mlalt_lane_0_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalt  z0\.d, \1\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_lane_0_s64_tied2, svint64_t, svint32_t,
+                z0_res = svmlalt_lane_s64 (z4, z0, z1, 0),
+                z0_res = svmlalt_lane (z4, z0, z1, 0))
+
+/*
+** mlalt_lane_0_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalt  z0\.d, z1\.s, \1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_lane_0_s64_tied3, svint64_t, svint32_t,
+                z0_res = svmlalt_lane_s64 (z4, z1, z0, 0),
+                z0_res = svmlalt_lane (z4, z1, z0, 0))
+
+/*
+** mlalt_lane_0_s64_untied:
+**     movprfx z0, z1
+**     smlalt  z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalt_lane_0_s64_untied, svint64_t, svint32_t,
+            z0 = svmlalt_lane_s64 (z1, z4, z5, 0),
+            z0 = svmlalt_lane (z1, z4, z5, 0))
+
+/*
+** mlalt_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     smlalt  z0\.d, z1\.s, z15\.s\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalt_lane_z15_s64, svint64_t, svint32_t, z15,
+                   z0 = svmlalt_lane_s64 (z0, z1, z15, 1),
+                   z0 = svmlalt_lane (z0, z1, z15, 1))
+
+/*
+** mlalt_lane_z16_s64:
+**     mov     (z[0-9]|z1[0-5])\.d, z16\.d
+**     smlalt  z0\.d, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalt_lane_z16_s64, svint64_t, svint32_t, z16,
+                   z0 = svmlalt_lane_s64 (z0, z1, z16, 1),
+                   z0 = svmlalt_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_lane_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_lane_u32.c
new file mode 100644 (file)
index 0000000..6542106
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalt_lane_0_u32_tied1:
+**     umlalt  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalt_lane_0_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svmlalt_lane_u32 (z0, z4, z5, 0),
+            z0 = svmlalt_lane (z0, z4, z5, 0))
+
+/*
+** mlalt_lane_0_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalt  z0\.s, \1\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_lane_0_u32_tied2, svuint32_t, svuint16_t,
+                z0_res = svmlalt_lane_u32 (z4, z0, z1, 0),
+                z0_res = svmlalt_lane (z4, z0, z1, 0))
+
+/*
+** mlalt_lane_0_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalt  z0\.s, z1\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_lane_0_u32_tied3, svuint32_t, svuint16_t,
+                z0_res = svmlalt_lane_u32 (z4, z1, z0, 0),
+                z0_res = svmlalt_lane (z4, z1, z0, 0))
+
+/*
+** mlalt_lane_0_u32_untied:
+**     movprfx z0, z1
+**     umlalt  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalt_lane_0_u32_untied, svuint32_t, svuint16_t,
+            z0 = svmlalt_lane_u32 (z1, z4, z5, 0),
+            z0 = svmlalt_lane (z1, z4, z5, 0))
+
+/*
+** mlalt_lane_1_u32:
+**     umlalt  z0\.s, z4\.h, z5\.h\[1\]
+**     ret
+*/
+TEST_DUAL_Z (mlalt_lane_1_u32, svuint32_t, svuint16_t,
+            z0 = svmlalt_lane_u32 (z0, z4, z5, 1),
+            z0 = svmlalt_lane (z0, z4, z5, 1))
+
+/*
+** mlalt_lane_z8_u32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     umlalt  z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalt_lane_z8_u32, svuint32_t, svuint16_t, z8,
+                   z0 = svmlalt_lane_u32 (z0, z1, z8, 1),
+                   z0 = svmlalt_lane (z0, z1, z8, 1))
+
+/*
+** mlalt_lane_z16_u32:
+**     mov     (z[0-7])\.d, z16\.d
+**     umlalt  z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalt_lane_z16_u32, svuint32_t, svuint16_t, z16,
+                   z0 = svmlalt_lane_u32 (z0, z1, z16, 1),
+                   z0 = svmlalt_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_lane_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_lane_u64.c
new file mode 100644 (file)
index 0000000..9464312
--- /dev/null
@@ -0,0 +1,65 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalt_lane_0_u64_tied1:
+**     umlalt  z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalt_lane_0_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svmlalt_lane_u64 (z0, z4, z5, 0),
+            z0 = svmlalt_lane (z0, z4, z5, 0))
+
+/*
+** mlalt_lane_0_u64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalt  z0\.d, \1\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_lane_0_u64_tied2, svuint64_t, svuint32_t,
+                z0_res = svmlalt_lane_u64 (z4, z0, z1, 0),
+                z0_res = svmlalt_lane (z4, z0, z1, 0))
+
+/*
+** mlalt_lane_0_u64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalt  z0\.d, z1\.s, \1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_lane_0_u64_tied3, svuint64_t, svuint32_t,
+                z0_res = svmlalt_lane_u64 (z4, z1, z0, 0),
+                z0_res = svmlalt_lane (z4, z1, z0, 0))
+
+/*
+** mlalt_lane_0_u64_untied:
+**     movprfx z0, z1
+**     umlalt  z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlalt_lane_0_u64_untied, svuint64_t, svuint32_t,
+            z0 = svmlalt_lane_u64 (z1, z4, z5, 0),
+            z0 = svmlalt_lane (z1, z4, z5, 0))
+
+/*
+** mlalt_lane_z15_u64:
+**     str     d15, \[sp, -16\]!
+**     umlalt  z0\.d, z1\.s, z15\.s\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalt_lane_z15_u64, svuint64_t, svuint32_t, z15,
+                   z0 = svmlalt_lane_u64 (z0, z1, z15, 1),
+                   z0 = svmlalt_lane (z0, z1, z15, 1))
+
+/*
+** mlalt_lane_z16_u64:
+**     mov     (z[0-9]|z1[0-5])\.d, z16\.d
+**     umlalt  z0\.d, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlalt_lane_z16_u64, svuint64_t, svuint32_t, z16,
+                   z0 = svmlalt_lane_u64 (z0, z1, z16, 1),
+                   z0 = svmlalt_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_s16.c
new file mode 100644 (file)
index 0000000..7078c38
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalt_s16_tied1:
+**     smlalt  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (mlalt_s16_tied1, svint16_t, svint8_t,
+            z0 = svmlalt_s16 (z0, z4, z5),
+            z0 = svmlalt (z0, z4, z5))
+
+/*
+** mlalt_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalt  z0\.h, \1\.b, z1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_s16_tied2, svint16_t, svint8_t,
+                z0_res = svmlalt_s16 (z4, z0, z1),
+                z0_res = svmlalt (z4, z0, z1))
+
+/*
+** mlalt_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalt  z0\.h, z1\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_s16_tied3, svint16_t, svint8_t,
+                z0_res = svmlalt_s16 (z4, z1, z0),
+                z0_res = svmlalt (z4, z1, z0))
+
+/*
+** mlalt_s16_untied:
+**     movprfx z0, z1
+**     smlalt  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (mlalt_s16_untied, svint16_t, svint8_t,
+            z0 = svmlalt_s16 (z1, z4, z5),
+            z0 = svmlalt (z1, z4, z5))
+
+/*
+** mlalt_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     smlalt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalt_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+             z0 = svmlalt_n_s16 (z0, z4, x0),
+             z0 = svmlalt (z0, z4, x0))
+
+/*
+** mlalt_w0_s16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     smlalt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalt_w0_s16_untied, svint16_t, svint8_t, int8_t,
+             z0 = svmlalt_n_s16 (z1, z4, x0),
+             z0 = svmlalt (z1, z4, x0))
+
+/*
+** mlalt_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     smlalt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalt_11_s16_tied1, svint16_t, svint8_t,
+            z0 = svmlalt_n_s16 (z0, z4, 11),
+            z0 = svmlalt (z0, z4, 11))
+
+/*
+** mlalt_11_s16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     smlalt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalt_11_s16_untied, svint16_t, svint8_t,
+            z0 = svmlalt_n_s16 (z1, z4, 11),
+            z0 = svmlalt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_s32.c
new file mode 100644 (file)
index 0000000..982a5a9
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalt_s32_tied1:
+**     smlalt  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlalt_s32_tied1, svint32_t, svint16_t,
+            z0 = svmlalt_s32 (z0, z4, z5),
+            z0 = svmlalt (z0, z4, z5))
+
+/*
+** mlalt_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalt  z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_s32_tied2, svint32_t, svint16_t,
+                z0_res = svmlalt_s32 (z4, z0, z1),
+                z0_res = svmlalt (z4, z0, z1))
+
+/*
+** mlalt_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalt  z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_s32_tied3, svint32_t, svint16_t,
+                z0_res = svmlalt_s32 (z4, z1, z0),
+                z0_res = svmlalt (z4, z1, z0))
+
+/*
+** mlalt_s32_untied:
+**     movprfx z0, z1
+**     smlalt  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlalt_s32_untied, svint32_t, svint16_t,
+            z0 = svmlalt_s32 (z1, z4, z5),
+            z0 = svmlalt (z1, z4, z5))
+
+/*
+** mlalt_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     smlalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalt_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+             z0 = svmlalt_n_s32 (z0, z4, x0),
+             z0 = svmlalt (z0, z4, x0))
+
+/*
+** mlalt_w0_s32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     smlalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalt_w0_s32_untied, svint32_t, svint16_t, int16_t,
+             z0 = svmlalt_n_s32 (z1, z4, x0),
+             z0 = svmlalt (z1, z4, x0))
+
+/*
+** mlalt_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     smlalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalt_11_s32_tied1, svint32_t, svint16_t,
+            z0 = svmlalt_n_s32 (z0, z4, 11),
+            z0 = svmlalt (z0, z4, 11))
+
+/*
+** mlalt_11_s32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     smlalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalt_11_s32_untied, svint32_t, svint16_t,
+            z0 = svmlalt_n_s32 (z1, z4, 11),
+            z0 = svmlalt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_s64.c
new file mode 100644 (file)
index 0000000..2cc2670
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalt_s64_tied1:
+**     smlalt  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (mlalt_s64_tied1, svint64_t, svint32_t,
+            z0 = svmlalt_s64 (z0, z4, z5),
+            z0 = svmlalt (z0, z4, z5))
+
+/*
+** mlalt_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalt  z0\.d, \1\.s, z1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_s64_tied2, svint64_t, svint32_t,
+                z0_res = svmlalt_s64 (z4, z0, z1),
+                z0_res = svmlalt (z4, z0, z1))
+
+/*
+** mlalt_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlalt  z0\.d, z1\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_s64_tied3, svint64_t, svint32_t,
+                z0_res = svmlalt_s64 (z4, z1, z0),
+                z0_res = svmlalt (z4, z1, z0))
+
+/*
+** mlalt_s64_untied:
+**     movprfx z0, z1
+**     smlalt  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (mlalt_s64_untied, svint64_t, svint32_t,
+            z0 = svmlalt_s64 (z1, z4, z5),
+            z0 = svmlalt (z1, z4, z5))
+
+/*
+** mlalt_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     smlalt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalt_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+             z0 = svmlalt_n_s64 (z0, z4, x0),
+             z0 = svmlalt (z0, z4, x0))
+
+/*
+** mlalt_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     smlalt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalt_w0_s64_untied, svint64_t, svint32_t, int32_t,
+             z0 = svmlalt_n_s64 (z1, z4, x0),
+             z0 = svmlalt (z1, z4, x0))
+
+/*
+** mlalt_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     smlalt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalt_11_s64_tied1, svint64_t, svint32_t,
+            z0 = svmlalt_n_s64 (z0, z4, 11),
+            z0 = svmlalt (z0, z4, 11))
+
+/*
+** mlalt_11_s64_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     smlalt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalt_11_s64_untied, svint64_t, svint32_t,
+            z0 = svmlalt_n_s64 (z1, z4, 11),
+            z0 = svmlalt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_u16.c
new file mode 100644 (file)
index 0000000..ac6142b
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalt_u16_tied1:
+**     umlalt  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (mlalt_u16_tied1, svuint16_t, svuint8_t,
+            z0 = svmlalt_u16 (z0, z4, z5),
+            z0 = svmlalt (z0, z4, z5))
+
+/*
+** mlalt_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalt  z0\.h, \1\.b, z1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_u16_tied2, svuint16_t, svuint8_t,
+                z0_res = svmlalt_u16 (z4, z0, z1),
+                z0_res = svmlalt (z4, z0, z1))
+
+/*
+** mlalt_u16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalt  z0\.h, z1\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_u16_tied3, svuint16_t, svuint8_t,
+                z0_res = svmlalt_u16 (z4, z1, z0),
+                z0_res = svmlalt (z4, z1, z0))
+
+/*
+** mlalt_u16_untied:
+**     movprfx z0, z1
+**     umlalt  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (mlalt_u16_untied, svuint16_t, svuint8_t,
+            z0 = svmlalt_u16 (z1, z4, z5),
+            z0 = svmlalt (z1, z4, z5))
+
+/*
+** mlalt_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     umlalt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalt_w0_u16_tied1, svuint16_t, svuint8_t, uint8_t,
+             z0 = svmlalt_n_u16 (z0, z4, x0),
+             z0 = svmlalt (z0, z4, x0))
+
+/*
+** mlalt_w0_u16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     umlalt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalt_w0_u16_untied, svuint16_t, svuint8_t, uint8_t,
+             z0 = svmlalt_n_u16 (z1, z4, x0),
+             z0 = svmlalt (z1, z4, x0))
+
+/*
+** mlalt_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     umlalt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalt_11_u16_tied1, svuint16_t, svuint8_t,
+            z0 = svmlalt_n_u16 (z0, z4, 11),
+            z0 = svmlalt (z0, z4, 11))
+
+/*
+** mlalt_11_u16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     umlalt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalt_11_u16_untied, svuint16_t, svuint8_t,
+            z0 = svmlalt_n_u16 (z1, z4, 11),
+            z0 = svmlalt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_u32.c
new file mode 100644 (file)
index 0000000..c41cf01
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalt_u32_tied1:
+**     umlalt  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlalt_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svmlalt_u32 (z0, z4, z5),
+            z0 = svmlalt (z0, z4, z5))
+
+/*
+** mlalt_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalt  z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_u32_tied2, svuint32_t, svuint16_t,
+                z0_res = svmlalt_u32 (z4, z0, z1),
+                z0_res = svmlalt (z4, z0, z1))
+
+/*
+** mlalt_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalt  z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_u32_tied3, svuint32_t, svuint16_t,
+                z0_res = svmlalt_u32 (z4, z1, z0),
+                z0_res = svmlalt (z4, z1, z0))
+
+/*
+** mlalt_u32_untied:
+**     movprfx z0, z1
+**     umlalt  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlalt_u32_untied, svuint32_t, svuint16_t,
+            z0 = svmlalt_u32 (z1, z4, z5),
+            z0 = svmlalt (z1, z4, z5))
+
+/*
+** mlalt_w0_u32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     umlalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalt_w0_u32_tied1, svuint32_t, svuint16_t, uint16_t,
+             z0 = svmlalt_n_u32 (z0, z4, x0),
+             z0 = svmlalt (z0, z4, x0))
+
+/*
+** mlalt_w0_u32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     umlalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalt_w0_u32_untied, svuint32_t, svuint16_t, uint16_t,
+             z0 = svmlalt_n_u32 (z1, z4, x0),
+             z0 = svmlalt (z1, z4, x0))
+
+/*
+** mlalt_11_u32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     umlalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalt_11_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svmlalt_n_u32 (z0, z4, 11),
+            z0 = svmlalt (z0, z4, 11))
+
+/*
+** mlalt_11_u32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     umlalt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalt_11_u32_untied, svuint32_t, svuint16_t,
+            z0 = svmlalt_n_u32 (z1, z4, 11),
+            z0 = svmlalt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlalt_u64.c
new file mode 100644 (file)
index 0000000..9971602
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlalt_u64_tied1:
+**     umlalt  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (mlalt_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svmlalt_u64 (z0, z4, z5),
+            z0 = svmlalt (z0, z4, z5))
+
+/*
+** mlalt_u64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalt  z0\.d, \1\.s, z1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_u64_tied2, svuint64_t, svuint32_t,
+                z0_res = svmlalt_u64 (z4, z0, z1),
+                z0_res = svmlalt (z4, z0, z1))
+
+/*
+** mlalt_u64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlalt  z0\.d, z1\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (mlalt_u64_tied3, svuint64_t, svuint32_t,
+                z0_res = svmlalt_u64 (z4, z1, z0),
+                z0_res = svmlalt (z4, z1, z0))
+
+/*
+** mlalt_u64_untied:
+**     movprfx z0, z1
+**     umlalt  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (mlalt_u64_untied, svuint64_t, svuint32_t,
+            z0 = svmlalt_u64 (z1, z4, z5),
+            z0 = svmlalt (z1, z4, z5))
+
+/*
+** mlalt_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     umlalt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalt_w0_u64_tied1, svuint64_t, svuint32_t, uint32_t,
+             z0 = svmlalt_n_u64 (z0, z4, x0),
+             z0 = svmlalt (z0, z4, x0))
+
+/*
+** mlalt_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     umlalt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlalt_w0_u64_untied, svuint64_t, svuint32_t, uint32_t,
+             z0 = svmlalt_n_u64 (z1, z4, x0),
+             z0 = svmlalt (z1, z4, x0))
+
+/*
+** mlalt_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     umlalt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalt_11_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svmlalt_n_u64 (z0, z4, 11),
+            z0 = svmlalt (z0, z4, 11))
+
+/*
+** mlalt_11_u64_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     umlalt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (mlalt_11_u64_untied, svuint64_t, svuint32_t,
+            z0 = svmlalt_n_u64 (z1, z4, 11),
+            z0 = svmlalt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mls_lane_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mls_lane_s16.c
new file mode 100644 (file)
index 0000000..3e996a8
--- /dev/null
@@ -0,0 +1,129 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mls_lane_0_s16_tied1:
+**     mls     z0\.h, z1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_s16_tied1, svint16_t,
+               z0 = svmls_lane_s16 (z0, z1, z2, 0),
+               z0 = svmls_lane (z0, z1, z2, 0))
+
+/*
+** mls_lane_0_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     mls     z0\.h, \1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_s16_tied2, svint16_t,
+               z0 = svmls_lane_s16 (z1, z0, z2, 0),
+               z0 = svmls_lane (z1, z0, z2, 0))
+
+/*
+** mls_lane_0_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     mls     z0\.h, z2\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_s16_tied3, svint16_t,
+               z0 = svmls_lane_s16 (z1, z2, z0, 0),
+               z0 = svmls_lane (z1, z2, z0, 0))
+
+/*
+** mls_lane_0_s16_untied:
+**     movprfx z0, z1
+**     mls     z0\.h, z2\.h, z3\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_s16_untied, svint16_t,
+               z0 = svmls_lane_s16 (z1, z2, z3, 0),
+               z0 = svmls_lane (z1, z2, z3, 0))
+
+/*
+** mls_lane_1_s16:
+**     mls     z0\.h, z1\.h, z2\.h\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_1_s16, svint16_t,
+               z0 = svmls_lane_s16 (z0, z1, z2, 1),
+               z0 = svmls_lane (z0, z1, z2, 1))
+
+/*
+** mls_lane_2_s16:
+**     mls     z0\.h, z1\.h, z2\.h\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_2_s16, svint16_t,
+               z0 = svmls_lane_s16 (z0, z1, z2, 2),
+               z0 = svmls_lane (z0, z1, z2, 2))
+
+/*
+** mls_lane_3_s16:
+**     mls     z0\.h, z1\.h, z2\.h\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_3_s16, svint16_t,
+               z0 = svmls_lane_s16 (z0, z1, z2, 3),
+               z0 = svmls_lane (z0, z1, z2, 3))
+
+/*
+** mls_lane_4_s16:
+**     mls     z0\.h, z1\.h, z2\.h\[4\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_4_s16, svint16_t,
+               z0 = svmls_lane_s16 (z0, z1, z2, 4),
+               z0 = svmls_lane (z0, z1, z2, 4))
+
+/*
+** mls_lane_5_s16:
+**     mls     z0\.h, z1\.h, z2\.h\[5\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_5_s16, svint16_t,
+               z0 = svmls_lane_s16 (z0, z1, z2, 5),
+               z0 = svmls_lane (z0, z1, z2, 5))
+
+/*
+** mls_lane_6_s16:
+**     mls     z0\.h, z1\.h, z2\.h\[6\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_6_s16, svint16_t,
+               z0 = svmls_lane_s16 (z0, z1, z2, 6),
+               z0 = svmls_lane (z0, z1, z2, 6))
+
+/*
+** mls_lane_7_s16:
+**     mls     z0\.h, z1\.h, z2\.h\[7\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_7_s16, svint16_t,
+               z0 = svmls_lane_s16 (z0, z1, z2, 7),
+               z0 = svmls_lane (z0, z1, z2, 7))
+
+/*
+** mls_lane_z8_s16:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     mls     z0\.h, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mls_lane_z8_s16, svint16_t, svint16_t, z8,
+                   z0 = svmls_lane_s16 (z0, z1, z8, 1),
+                   z0 = svmls_lane (z0, z1, z8, 1))
+
+/*
+** mls_lane_z16_s16:
+**     mov     (z[0-7])\.d, z16\.d
+**     mls     z0\.h, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mls_lane_z16_s16, svint16_t, svint16_t, z16,
+                   z0 = svmls_lane_s16 (z0, z1, z16, 1),
+                   z0 = svmls_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mls_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mls_lane_s32.c
new file mode 100644 (file)
index 0000000..e6b9439
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mls_lane_0_s32_tied1:
+**     mls     z0\.s, z1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_s32_tied1, svint32_t,
+               z0 = svmls_lane_s32 (z0, z1, z2, 0),
+               z0 = svmls_lane (z0, z1, z2, 0))
+
+/*
+** mls_lane_0_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     mls     z0\.s, \1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_s32_tied2, svint32_t,
+               z0 = svmls_lane_s32 (z1, z0, z2, 0),
+               z0 = svmls_lane (z1, z0, z2, 0))
+
+/*
+** mls_lane_0_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     mls     z0\.s, z2\.s, \1\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_s32_tied3, svint32_t,
+               z0 = svmls_lane_s32 (z1, z2, z0, 0),
+               z0 = svmls_lane (z1, z2, z0, 0))
+
+/*
+** mls_lane_0_s32_untied:
+**     movprfx z0, z1
+**     mls     z0\.s, z2\.s, z3\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_s32_untied, svint32_t,
+               z0 = svmls_lane_s32 (z1, z2, z3, 0),
+               z0 = svmls_lane (z1, z2, z3, 0))
+
+/*
+** mls_lane_1_s32:
+**     mls     z0\.s, z1\.s, z2\.s\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_1_s32, svint32_t,
+               z0 = svmls_lane_s32 (z0, z1, z2, 1),
+               z0 = svmls_lane (z0, z1, z2, 1))
+
+/*
+** mls_lane_2_s32:
+**     mls     z0\.s, z1\.s, z2\.s\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_2_s32, svint32_t,
+               z0 = svmls_lane_s32 (z0, z1, z2, 2),
+               z0 = svmls_lane (z0, z1, z2, 2))
+
+/*
+** mls_lane_3_s32:
+**     mls     z0\.s, z1\.s, z2\.s\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_3_s32, svint32_t,
+               z0 = svmls_lane_s32 (z0, z1, z2, 3),
+               z0 = svmls_lane (z0, z1, z2, 3))
+
+/*
+** mls_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     mls     z0\.s, z1\.s, \1\.s\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mls_lane_z8_s32, svint32_t, svint32_t, z8,
+                   z0 = svmls_lane_s32 (z0, z1, z8, 1),
+                   z0 = svmls_lane (z0, z1, z8, 1))
+
+/*
+** mls_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     mls     z0\.s, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mls_lane_z16_s32, svint32_t, svint32_t, z16,
+                   z0 = svmls_lane_s32 (z0, z1, z16, 1),
+                   z0 = svmls_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mls_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mls_lane_s64.c
new file mode 100644 (file)
index 0000000..de859dd
--- /dev/null
@@ -0,0 +1,74 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mls_lane_0_s64_tied1:
+**     mls     z0\.d, z1\.d, z2\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_s64_tied1, svint64_t,
+               z0 = svmls_lane_s64 (z0, z1, z2, 0),
+               z0 = svmls_lane (z0, z1, z2, 0))
+
+/*
+** mls_lane_0_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     mls     z0\.d, \1, z2\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_s64_tied2, svint64_t,
+               z0 = svmls_lane_s64 (z1, z0, z2, 0),
+               z0 = svmls_lane (z1, z0, z2, 0))
+
+/*
+** mls_lane_0_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     mls     z0\.d, z2\.d, \1\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_s64_tied3, svint64_t,
+               z0 = svmls_lane_s64 (z1, z2, z0, 0),
+               z0 = svmls_lane (z1, z2, z0, 0))
+
+/*
+** mls_lane_0_s64_untied:
+**     movprfx z0, z1
+**     mls     z0\.d, z2\.d, z3\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_s64_untied, svint64_t,
+               z0 = svmls_lane_s64 (z1, z2, z3, 0),
+               z0 = svmls_lane (z1, z2, z3, 0))
+
+/*
+** mls_lane_1_s64:
+**     mls     z0\.d, z1\.d, z2\.d\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_1_s64, svint64_t,
+               z0 = svmls_lane_s64 (z0, z1, z2, 1),
+               z0 = svmls_lane (z0, z1, z2, 1))
+
+/*
+** mls_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     mls     z0\.d, z1\.d, z15\.d\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mls_lane_z15_s64, svint64_t, svint64_t, z15,
+                   z0 = svmls_lane_s64 (z0, z1, z15, 1),
+                   z0 = svmls_lane (z0, z1, z15, 1))
+
+/*
+** mls_lane_z16_s64:
+**     mov     (z[0-7])\.d, z16\.d
+**     mls     z0\.d, z1\.d, \1\.d\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mls_lane_z16_s64, svint64_t, svint64_t, z16,
+                   z0 = svmls_lane_s64 (z0, z1, z16, 1),
+                   z0 = svmls_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mls_lane_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mls_lane_u16.c
new file mode 100644 (file)
index 0000000..e88c3da
--- /dev/null
@@ -0,0 +1,129 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mls_lane_0_u16_tied1:
+**     mls     z0\.h, z1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_u16_tied1, svuint16_t,
+               z0 = svmls_lane_u16 (z0, z1, z2, 0),
+               z0 = svmls_lane (z0, z1, z2, 0))
+
+/*
+** mls_lane_0_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     mls     z0\.h, \1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_u16_tied2, svuint16_t,
+               z0 = svmls_lane_u16 (z1, z0, z2, 0),
+               z0 = svmls_lane (z1, z0, z2, 0))
+
+/*
+** mls_lane_0_u16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     mls     z0\.h, z2\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_u16_tied3, svuint16_t,
+               z0 = svmls_lane_u16 (z1, z2, z0, 0),
+               z0 = svmls_lane (z1, z2, z0, 0))
+
+/*
+** mls_lane_0_u16_untied:
+**     movprfx z0, z1
+**     mls     z0\.h, z2\.h, z3\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_u16_untied, svuint16_t,
+               z0 = svmls_lane_u16 (z1, z2, z3, 0),
+               z0 = svmls_lane (z1, z2, z3, 0))
+
+/*
+** mls_lane_1_u16:
+**     mls     z0\.h, z1\.h, z2\.h\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_1_u16, svuint16_t,
+               z0 = svmls_lane_u16 (z0, z1, z2, 1),
+               z0 = svmls_lane (z0, z1, z2, 1))
+
+/*
+** mls_lane_2_u16:
+**     mls     z0\.h, z1\.h, z2\.h\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_2_u16, svuint16_t,
+               z0 = svmls_lane_u16 (z0, z1, z2, 2),
+               z0 = svmls_lane (z0, z1, z2, 2))
+
+/*
+** mls_lane_3_u16:
+**     mls     z0\.h, z1\.h, z2\.h\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_3_u16, svuint16_t,
+               z0 = svmls_lane_u16 (z0, z1, z2, 3),
+               z0 = svmls_lane (z0, z1, z2, 3))
+
+/*
+** mls_lane_4_u16:
+**     mls     z0\.h, z1\.h, z2\.h\[4\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_4_u16, svuint16_t,
+               z0 = svmls_lane_u16 (z0, z1, z2, 4),
+               z0 = svmls_lane (z0, z1, z2, 4))
+
+/*
+** mls_lane_5_u16:
+**     mls     z0\.h, z1\.h, z2\.h\[5\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_5_u16, svuint16_t,
+               z0 = svmls_lane_u16 (z0, z1, z2, 5),
+               z0 = svmls_lane (z0, z1, z2, 5))
+
+/*
+** mls_lane_6_u16:
+**     mls     z0\.h, z1\.h, z2\.h\[6\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_6_u16, svuint16_t,
+               z0 = svmls_lane_u16 (z0, z1, z2, 6),
+               z0 = svmls_lane (z0, z1, z2, 6))
+
+/*
+** mls_lane_7_u16:
+**     mls     z0\.h, z1\.h, z2\.h\[7\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_7_u16, svuint16_t,
+               z0 = svmls_lane_u16 (z0, z1, z2, 7),
+               z0 = svmls_lane (z0, z1, z2, 7))
+
+/*
+** mls_lane_z8_u16:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     mls     z0\.h, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mls_lane_z8_u16, svuint16_t, svuint16_t, z8,
+                   z0 = svmls_lane_u16 (z0, z1, z8, 1),
+                   z0 = svmls_lane (z0, z1, z8, 1))
+
+/*
+** mls_lane_z16_u16:
+**     mov     (z[0-7])\.d, z16\.d
+**     mls     z0\.h, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mls_lane_z16_u16, svuint16_t, svuint16_t, z16,
+                   z0 = svmls_lane_u16 (z0, z1, z16, 1),
+                   z0 = svmls_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mls_lane_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mls_lane_u32.c
new file mode 100644 (file)
index 0000000..88c586d
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mls_lane_0_u32_tied1:
+**     mls     z0\.s, z1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_u32_tied1, svuint32_t,
+               z0 = svmls_lane_u32 (z0, z1, z2, 0),
+               z0 = svmls_lane (z0, z1, z2, 0))
+
+/*
+** mls_lane_0_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     mls     z0\.s, \1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_u32_tied2, svuint32_t,
+               z0 = svmls_lane_u32 (z1, z0, z2, 0),
+               z0 = svmls_lane (z1, z0, z2, 0))
+
+/*
+** mls_lane_0_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     mls     z0\.s, z2\.s, \1\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_u32_tied3, svuint32_t,
+               z0 = svmls_lane_u32 (z1, z2, z0, 0),
+               z0 = svmls_lane (z1, z2, z0, 0))
+
+/*
+** mls_lane_0_u32_untied:
+**     movprfx z0, z1
+**     mls     z0\.s, z2\.s, z3\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_u32_untied, svuint32_t,
+               z0 = svmls_lane_u32 (z1, z2, z3, 0),
+               z0 = svmls_lane (z1, z2, z3, 0))
+
+/*
+** mls_lane_1_u32:
+**     mls     z0\.s, z1\.s, z2\.s\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_1_u32, svuint32_t,
+               z0 = svmls_lane_u32 (z0, z1, z2, 1),
+               z0 = svmls_lane (z0, z1, z2, 1))
+
+/*
+** mls_lane_2_u32:
+**     mls     z0\.s, z1\.s, z2\.s\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_2_u32, svuint32_t,
+               z0 = svmls_lane_u32 (z0, z1, z2, 2),
+               z0 = svmls_lane (z0, z1, z2, 2))
+
+/*
+** mls_lane_3_u32:
+**     mls     z0\.s, z1\.s, z2\.s\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_3_u32, svuint32_t,
+               z0 = svmls_lane_u32 (z0, z1, z2, 3),
+               z0 = svmls_lane (z0, z1, z2, 3))
+
+/*
+** mls_lane_z8_u32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     mls     z0\.s, z1\.s, \1\.s\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mls_lane_z8_u32, svuint32_t, svuint32_t, z8,
+                   z0 = svmls_lane_u32 (z0, z1, z8, 1),
+                   z0 = svmls_lane (z0, z1, z8, 1))
+
+/*
+** mls_lane_z16_u32:
+**     mov     (z[0-7])\.d, z16\.d
+**     mls     z0\.s, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mls_lane_z16_u32, svuint32_t, svuint32_t, z16,
+                   z0 = svmls_lane_u32 (z0, z1, z16, 1),
+                   z0 = svmls_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mls_lane_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mls_lane_u64.c
new file mode 100644 (file)
index 0000000..1bc5a34
--- /dev/null
@@ -0,0 +1,74 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mls_lane_0_u64_tied1:
+**     mls     z0\.d, z1\.d, z2\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_u64_tied1, svuint64_t,
+               z0 = svmls_lane_u64 (z0, z1, z2, 0),
+               z0 = svmls_lane (z0, z1, z2, 0))
+
+/*
+** mls_lane_0_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     mls     z0\.d, \1, z2\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_u64_tied2, svuint64_t,
+               z0 = svmls_lane_u64 (z1, z0, z2, 0),
+               z0 = svmls_lane (z1, z0, z2, 0))
+
+/*
+** mls_lane_0_u64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     mls     z0\.d, z2\.d, \1\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_u64_tied3, svuint64_t,
+               z0 = svmls_lane_u64 (z1, z2, z0, 0),
+               z0 = svmls_lane (z1, z2, z0, 0))
+
+/*
+** mls_lane_0_u64_untied:
+**     movprfx z0, z1
+**     mls     z0\.d, z2\.d, z3\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_0_u64_untied, svuint64_t,
+               z0 = svmls_lane_u64 (z1, z2, z3, 0),
+               z0 = svmls_lane (z1, z2, z3, 0))
+
+/*
+** mls_lane_1_u64:
+**     mls     z0\.d, z1\.d, z2\.d\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (mls_lane_1_u64, svuint64_t,
+               z0 = svmls_lane_u64 (z0, z1, z2, 1),
+               z0 = svmls_lane (z0, z1, z2, 1))
+
+/*
+** mls_lane_z15_u64:
+**     str     d15, \[sp, -16\]!
+**     mls     z0\.d, z1\.d, z15\.d\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mls_lane_z15_u64, svuint64_t, svuint64_t, z15,
+                   z0 = svmls_lane_u64 (z0, z1, z15, 1),
+                   z0 = svmls_lane (z0, z1, z15, 1))
+
+/*
+** mls_lane_z16_u64:
+**     mov     (z[0-7])\.d, z16\.d
+**     mls     z0\.d, z1\.d, \1\.d\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mls_lane_z16_u64, svuint64_t, svuint64_t, z16,
+                   z0 = svmls_lane_u64 (z0, z1, z16, 1),
+                   z0 = svmls_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_f32.c
new file mode 100644 (file)
index 0000000..3ee5074
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslb_f32_tied1:
+**     fmlslb  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlslb_f32_tied1, svfloat32_t, svfloat16_t,
+            z0 = svmlslb_f32 (z0, z4, z5),
+            z0 = svmlslb (z0, z4, z5))
+
+/*
+** mlslb_f32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     fmlslb  z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_f32_tied2, svfloat32_t, svfloat16_t,
+                z0_res = svmlslb_f32 (z4, z0, z1),
+                z0_res = svmlslb (z4, z0, z1))
+
+/*
+** mlslb_f32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     fmlslb  z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_f32_tied3, svfloat32_t, svfloat16_t,
+                z0_res = svmlslb_f32 (z4, z1, z0),
+                z0_res = svmlslb (z4, z1, z0))
+
+/*
+** mlslb_f32_untied:
+**     movprfx z0, z1
+**     fmlslb  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlslb_f32_untied, svfloat32_t, svfloat16_t,
+            z0 = svmlslb_f32 (z1, z4, z5),
+            z0 = svmlslb (z1, z4, z5))
+
+/*
+** mlslb_h7_f32_tied1:
+**     mov     (z[0-9]+\.h), h7
+**     fmlslb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZD (mlslb_h7_f32_tied1, svfloat32_t, svfloat16_t, float16_t,
+             z0 = svmlslb_n_f32 (z0, z4, d7),
+             z0 = svmlslb (z0, z4, d7))
+
+/*
+** mlslb_h7_f32_untied:
+**     mov     (z[0-9]+\.h), h7
+**     movprfx z0, z1
+**     fmlslb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZD (mlslb_h7_f32_untied, svfloat32_t, svfloat16_t, float16_t,
+             z0 = svmlslb_n_f32 (z1, z4, d7),
+             z0 = svmlslb (z1, z4, d7))
+
+/*
+** mlslb_2_f32_tied1:
+**     fmov    (z[0-9]+\.h), #2\.0(?:e\+0)?
+**     fmlslb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslb_2_f32_tied1, svfloat32_t, svfloat16_t,
+            z0 = svmlslb_n_f32 (z0, z4, 2),
+            z0 = svmlslb (z0, z4, 2))
+
+/*
+** mlslb_2_f32_untied:
+**     fmov    (z[0-9]+\.h), #2\.0(?:e\+0)?
+**     movprfx z0, z1
+**     fmlslb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslb_2_f32_untied, svfloat32_t, svfloat16_t,
+            z0 = svmlslb_n_f32 (z1, z4, 2),
+            z0 = svmlslb (z1, z4, 2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_lane_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_lane_f32.c
new file mode 100644 (file)
index 0000000..1fe0fac
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslb_lane_0_f32_tied1:
+**     fmlslb  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslb_lane_0_f32_tied1, svfloat32_t, svfloat16_t,
+            z0 = svmlslb_lane_f32 (z0, z4, z5, 0),
+            z0 = svmlslb_lane (z0, z4, z5, 0))
+
+/*
+** mlslb_lane_0_f32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     fmlslb  z0\.s, \1\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_lane_0_f32_tied2, svfloat32_t, svfloat16_t,
+                z0_res = svmlslb_lane_f32 (z4, z0, z1, 0),
+                z0_res = svmlslb_lane (z4, z0, z1, 0))
+
+/*
+** mlslb_lane_0_f32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     fmlslb  z0\.s, z1\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_lane_0_f32_tied3, svfloat32_t, svfloat16_t,
+                z0_res = svmlslb_lane_f32 (z4, z1, z0, 0),
+                z0_res = svmlslb_lane (z4, z1, z0, 0))
+
+/*
+** mlslb_lane_0_f32_untied:
+**     movprfx z0, z1
+**     fmlslb  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslb_lane_0_f32_untied, svfloat32_t, svfloat16_t,
+            z0 = svmlslb_lane_f32 (z1, z4, z5, 0),
+            z0 = svmlslb_lane (z1, z4, z5, 0))
+
+/*
+** mlslb_lane_1_f32:
+**     fmlslb  z0\.s, z4\.h, z5\.h\[1\]
+**     ret
+*/
+TEST_DUAL_Z (mlslb_lane_1_f32, svfloat32_t, svfloat16_t,
+            z0 = svmlslb_lane_f32 (z0, z4, z5, 1),
+            z0 = svmlslb_lane (z0, z4, z5, 1))
+
+/*
+** mlslb_lane_z8_f32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     fmlslb  z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslb_lane_z8_f32, svfloat32_t, svfloat16_t, z8,
+                   z0 = svmlslb_lane_f32 (z0, z1, z8, 1),
+                   z0 = svmlslb_lane (z0, z1, z8, 1))
+
+/*
+** mlslb_lane_z16_f32:
+**     mov     (z[0-7])\.d, z16\.d
+**     fmlslb  z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslb_lane_z16_f32, svfloat32_t, svfloat16_t, z16,
+                   z0 = svmlslb_lane_f32 (z0, z1, z16, 1),
+                   z0 = svmlslb_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_lane_s32.c
new file mode 100644 (file)
index 0000000..48af223
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslb_lane_0_s32_tied1:
+**     smlslb  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslb_lane_0_s32_tied1, svint32_t, svint16_t,
+            z0 = svmlslb_lane_s32 (z0, z4, z5, 0),
+            z0 = svmlslb_lane (z0, z4, z5, 0))
+
+/*
+** mlslb_lane_0_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslb  z0\.s, \1\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_lane_0_s32_tied2, svint32_t, svint16_t,
+                z0_res = svmlslb_lane_s32 (z4, z0, z1, 0),
+                z0_res = svmlslb_lane (z4, z0, z1, 0))
+
+/*
+** mlslb_lane_0_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslb  z0\.s, z1\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_lane_0_s32_tied3, svint32_t, svint16_t,
+                z0_res = svmlslb_lane_s32 (z4, z1, z0, 0),
+                z0_res = svmlslb_lane (z4, z1, z0, 0))
+
+/*
+** mlslb_lane_0_s32_untied:
+**     movprfx z0, z1
+**     smlslb  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslb_lane_0_s32_untied, svint32_t, svint16_t,
+            z0 = svmlslb_lane_s32 (z1, z4, z5, 0),
+            z0 = svmlslb_lane (z1, z4, z5, 0))
+
+/*
+** mlslb_lane_1_s32:
+**     smlslb  z0\.s, z4\.h, z5\.h\[1\]
+**     ret
+*/
+TEST_DUAL_Z (mlslb_lane_1_s32, svint32_t, svint16_t,
+            z0 = svmlslb_lane_s32 (z0, z4, z5, 1),
+            z0 = svmlslb_lane (z0, z4, z5, 1))
+
+/*
+** mlslb_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     smlslb  z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslb_lane_z8_s32, svint32_t, svint16_t, z8,
+                   z0 = svmlslb_lane_s32 (z0, z1, z8, 1),
+                   z0 = svmlslb_lane (z0, z1, z8, 1))
+
+/*
+** mlslb_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     smlslb  z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslb_lane_z16_s32, svint32_t, svint16_t, z16,
+                   z0 = svmlslb_lane_s32 (z0, z1, z16, 1),
+                   z0 = svmlslb_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_lane_s64.c
new file mode 100644 (file)
index 0000000..afed994
--- /dev/null
@@ -0,0 +1,65 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslb_lane_0_s64_tied1:
+**     smlslb  z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslb_lane_0_s64_tied1, svint64_t, svint32_t,
+            z0 = svmlslb_lane_s64 (z0, z4, z5, 0),
+            z0 = svmlslb_lane (z0, z4, z5, 0))
+
+/*
+** mlslb_lane_0_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslb  z0\.d, \1\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_lane_0_s64_tied2, svint64_t, svint32_t,
+                z0_res = svmlslb_lane_s64 (z4, z0, z1, 0),
+                z0_res = svmlslb_lane (z4, z0, z1, 0))
+
+/*
+** mlslb_lane_0_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslb  z0\.d, z1\.s, \1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_lane_0_s64_tied3, svint64_t, svint32_t,
+                z0_res = svmlslb_lane_s64 (z4, z1, z0, 0),
+                z0_res = svmlslb_lane (z4, z1, z0, 0))
+
+/*
+** mlslb_lane_0_s64_untied:
+**     movprfx z0, z1
+**     smlslb  z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslb_lane_0_s64_untied, svint64_t, svint32_t,
+            z0 = svmlslb_lane_s64 (z1, z4, z5, 0),
+            z0 = svmlslb_lane (z1, z4, z5, 0))
+
+/*
+** mlslb_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     smlslb  z0\.d, z1\.s, z15\.s\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslb_lane_z15_s64, svint64_t, svint32_t, z15,
+                   z0 = svmlslb_lane_s64 (z0, z1, z15, 1),
+                   z0 = svmlslb_lane (z0, z1, z15, 1))
+
+/*
+** mlslb_lane_z16_s64:
+**     mov     (z[0-9]|z1[0-5])\.d, z16\.d
+**     smlslb  z0\.d, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslb_lane_z16_s64, svint64_t, svint32_t, z16,
+                   z0 = svmlslb_lane_s64 (z0, z1, z16, 1),
+                   z0 = svmlslb_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_lane_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_lane_u32.c
new file mode 100644 (file)
index 0000000..66236fd
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslb_lane_0_u32_tied1:
+**     umlslb  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslb_lane_0_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svmlslb_lane_u32 (z0, z4, z5, 0),
+            z0 = svmlslb_lane (z0, z4, z5, 0))
+
+/*
+** mlslb_lane_0_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslb  z0\.s, \1\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_lane_0_u32_tied2, svuint32_t, svuint16_t,
+                z0_res = svmlslb_lane_u32 (z4, z0, z1, 0),
+                z0_res = svmlslb_lane (z4, z0, z1, 0))
+
+/*
+** mlslb_lane_0_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslb  z0\.s, z1\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_lane_0_u32_tied3, svuint32_t, svuint16_t,
+                z0_res = svmlslb_lane_u32 (z4, z1, z0, 0),
+                z0_res = svmlslb_lane (z4, z1, z0, 0))
+
+/*
+** mlslb_lane_0_u32_untied:
+**     movprfx z0, z1
+**     umlslb  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslb_lane_0_u32_untied, svuint32_t, svuint16_t,
+            z0 = svmlslb_lane_u32 (z1, z4, z5, 0),
+            z0 = svmlslb_lane (z1, z4, z5, 0))
+
+/*
+** mlslb_lane_1_u32:
+**     umlslb  z0\.s, z4\.h, z5\.h\[1\]
+**     ret
+*/
+TEST_DUAL_Z (mlslb_lane_1_u32, svuint32_t, svuint16_t,
+            z0 = svmlslb_lane_u32 (z0, z4, z5, 1),
+            z0 = svmlslb_lane (z0, z4, z5, 1))
+
+/*
+** mlslb_lane_z8_u32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     umlslb  z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslb_lane_z8_u32, svuint32_t, svuint16_t, z8,
+                   z0 = svmlslb_lane_u32 (z0, z1, z8, 1),
+                   z0 = svmlslb_lane (z0, z1, z8, 1))
+
+/*
+** mlslb_lane_z16_u32:
+**     mov     (z[0-7])\.d, z16\.d
+**     umlslb  z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslb_lane_z16_u32, svuint32_t, svuint16_t, z16,
+                   z0 = svmlslb_lane_u32 (z0, z1, z16, 1),
+                   z0 = svmlslb_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_lane_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_lane_u64.c
new file mode 100644 (file)
index 0000000..6a33b73
--- /dev/null
@@ -0,0 +1,65 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslb_lane_0_u64_tied1:
+**     umlslb  z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslb_lane_0_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svmlslb_lane_u64 (z0, z4, z5, 0),
+            z0 = svmlslb_lane (z0, z4, z5, 0))
+
+/*
+** mlslb_lane_0_u64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslb  z0\.d, \1\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_lane_0_u64_tied2, svuint64_t, svuint32_t,
+                z0_res = svmlslb_lane_u64 (z4, z0, z1, 0),
+                z0_res = svmlslb_lane (z4, z0, z1, 0))
+
+/*
+** mlslb_lane_0_u64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslb  z0\.d, z1\.s, \1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_lane_0_u64_tied3, svuint64_t, svuint32_t,
+                z0_res = svmlslb_lane_u64 (z4, z1, z0, 0),
+                z0_res = svmlslb_lane (z4, z1, z0, 0))
+
+/*
+** mlslb_lane_0_u64_untied:
+**     movprfx z0, z1
+**     umlslb  z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslb_lane_0_u64_untied, svuint64_t, svuint32_t,
+            z0 = svmlslb_lane_u64 (z1, z4, z5, 0),
+            z0 = svmlslb_lane (z1, z4, z5, 0))
+
+/*
+** mlslb_lane_z15_u64:
+**     str     d15, \[sp, -16\]!
+**     umlslb  z0\.d, z1\.s, z15\.s\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslb_lane_z15_u64, svuint64_t, svuint32_t, z15,
+                   z0 = svmlslb_lane_u64 (z0, z1, z15, 1),
+                   z0 = svmlslb_lane (z0, z1, z15, 1))
+
+/*
+** mlslb_lane_z16_u64:
+**     mov     (z[0-9]|z1[0-5])\.d, z16\.d
+**     umlslb  z0\.d, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslb_lane_z16_u64, svuint64_t, svuint32_t, z16,
+                   z0 = svmlslb_lane_u64 (z0, z1, z16, 1),
+                   z0 = svmlslb_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_s16.c
new file mode 100644 (file)
index 0000000..7bb4031
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslb_s16_tied1:
+**     smlslb  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (mlslb_s16_tied1, svint16_t, svint8_t,
+            z0 = svmlslb_s16 (z0, z4, z5),
+            z0 = svmlslb (z0, z4, z5))
+
+/*
+** mlslb_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslb  z0\.h, \1\.b, z1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_s16_tied2, svint16_t, svint8_t,
+                z0_res = svmlslb_s16 (z4, z0, z1),
+                z0_res = svmlslb (z4, z0, z1))
+
+/*
+** mlslb_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslb  z0\.h, z1\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_s16_tied3, svint16_t, svint8_t,
+                z0_res = svmlslb_s16 (z4, z1, z0),
+                z0_res = svmlslb (z4, z1, z0))
+
+/*
+** mlslb_s16_untied:
+**     movprfx z0, z1
+**     smlslb  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (mlslb_s16_untied, svint16_t, svint8_t,
+            z0 = svmlslb_s16 (z1, z4, z5),
+            z0 = svmlslb (z1, z4, z5))
+
+/*
+** mlslb_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     smlslb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslb_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+             z0 = svmlslb_n_s16 (z0, z4, x0),
+             z0 = svmlslb (z0, z4, x0))
+
+/*
+** mlslb_w0_s16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     smlslb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslb_w0_s16_untied, svint16_t, svint8_t, int8_t,
+             z0 = svmlslb_n_s16 (z1, z4, x0),
+             z0 = svmlslb (z1, z4, x0))
+
+/*
+** mlslb_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     smlslb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslb_11_s16_tied1, svint16_t, svint8_t,
+            z0 = svmlslb_n_s16 (z0, z4, 11),
+            z0 = svmlslb (z0, z4, 11))
+
+/*
+** mlslb_11_s16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     smlslb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslb_11_s16_untied, svint16_t, svint8_t,
+            z0 = svmlslb_n_s16 (z1, z4, 11),
+            z0 = svmlslb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_s32.c
new file mode 100644 (file)
index 0000000..eabe869
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslb_s32_tied1:
+**     smlslb  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlslb_s32_tied1, svint32_t, svint16_t,
+            z0 = svmlslb_s32 (z0, z4, z5),
+            z0 = svmlslb (z0, z4, z5))
+
+/*
+** mlslb_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslb  z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_s32_tied2, svint32_t, svint16_t,
+                z0_res = svmlslb_s32 (z4, z0, z1),
+                z0_res = svmlslb (z4, z0, z1))
+
+/*
+** mlslb_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslb  z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_s32_tied3, svint32_t, svint16_t,
+                z0_res = svmlslb_s32 (z4, z1, z0),
+                z0_res = svmlslb (z4, z1, z0))
+
+/*
+** mlslb_s32_untied:
+**     movprfx z0, z1
+**     smlslb  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlslb_s32_untied, svint32_t, svint16_t,
+            z0 = svmlslb_s32 (z1, z4, z5),
+            z0 = svmlslb (z1, z4, z5))
+
+/*
+** mlslb_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     smlslb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslb_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+             z0 = svmlslb_n_s32 (z0, z4, x0),
+             z0 = svmlslb (z0, z4, x0))
+
+/*
+** mlslb_w0_s32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     smlslb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslb_w0_s32_untied, svint32_t, svint16_t, int16_t,
+             z0 = svmlslb_n_s32 (z1, z4, x0),
+             z0 = svmlslb (z1, z4, x0))
+
+/*
+** mlslb_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     smlslb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslb_11_s32_tied1, svint32_t, svint16_t,
+            z0 = svmlslb_n_s32 (z0, z4, 11),
+            z0 = svmlslb (z0, z4, 11))
+
+/*
+** mlslb_11_s32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     smlslb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslb_11_s32_untied, svint32_t, svint16_t,
+            z0 = svmlslb_n_s32 (z1, z4, 11),
+            z0 = svmlslb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_s64.c
new file mode 100644 (file)
index 0000000..ac768ed
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslb_s64_tied1:
+**     smlslb  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (mlslb_s64_tied1, svint64_t, svint32_t,
+            z0 = svmlslb_s64 (z0, z4, z5),
+            z0 = svmlslb (z0, z4, z5))
+
+/*
+** mlslb_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslb  z0\.d, \1\.s, z1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_s64_tied2, svint64_t, svint32_t,
+                z0_res = svmlslb_s64 (z4, z0, z1),
+                z0_res = svmlslb (z4, z0, z1))
+
+/*
+** mlslb_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslb  z0\.d, z1\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_s64_tied3, svint64_t, svint32_t,
+                z0_res = svmlslb_s64 (z4, z1, z0),
+                z0_res = svmlslb (z4, z1, z0))
+
+/*
+** mlslb_s64_untied:
+**     movprfx z0, z1
+**     smlslb  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (mlslb_s64_untied, svint64_t, svint32_t,
+            z0 = svmlslb_s64 (z1, z4, z5),
+            z0 = svmlslb (z1, z4, z5))
+
+/*
+** mlslb_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     smlslb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslb_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+             z0 = svmlslb_n_s64 (z0, z4, x0),
+             z0 = svmlslb (z0, z4, x0))
+
+/*
+** mlslb_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     smlslb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslb_w0_s64_untied, svint64_t, svint32_t, int32_t,
+             z0 = svmlslb_n_s64 (z1, z4, x0),
+             z0 = svmlslb (z1, z4, x0))
+
+/*
+** mlslb_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     smlslb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslb_11_s64_tied1, svint64_t, svint32_t,
+            z0 = svmlslb_n_s64 (z0, z4, 11),
+            z0 = svmlslb (z0, z4, 11))
+
+/*
+** mlslb_11_s64_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     smlslb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslb_11_s64_untied, svint64_t, svint32_t,
+            z0 = svmlslb_n_s64 (z1, z4, 11),
+            z0 = svmlslb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_u16.c
new file mode 100644 (file)
index 0000000..ff50ef7
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslb_u16_tied1:
+**     umlslb  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (mlslb_u16_tied1, svuint16_t, svuint8_t,
+            z0 = svmlslb_u16 (z0, z4, z5),
+            z0 = svmlslb (z0, z4, z5))
+
+/*
+** mlslb_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslb  z0\.h, \1\.b, z1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_u16_tied2, svuint16_t, svuint8_t,
+                z0_res = svmlslb_u16 (z4, z0, z1),
+                z0_res = svmlslb (z4, z0, z1))
+
+/*
+** mlslb_u16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslb  z0\.h, z1\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_u16_tied3, svuint16_t, svuint8_t,
+                z0_res = svmlslb_u16 (z4, z1, z0),
+                z0_res = svmlslb (z4, z1, z0))
+
+/*
+** mlslb_u16_untied:
+**     movprfx z0, z1
+**     umlslb  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (mlslb_u16_untied, svuint16_t, svuint8_t,
+            z0 = svmlslb_u16 (z1, z4, z5),
+            z0 = svmlslb (z1, z4, z5))
+
+/*
+** mlslb_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     umlslb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslb_w0_u16_tied1, svuint16_t, svuint8_t, uint8_t,
+             z0 = svmlslb_n_u16 (z0, z4, x0),
+             z0 = svmlslb (z0, z4, x0))
+
+/*
+** mlslb_w0_u16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     umlslb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslb_w0_u16_untied, svuint16_t, svuint8_t, uint8_t,
+             z0 = svmlslb_n_u16 (z1, z4, x0),
+             z0 = svmlslb (z1, z4, x0))
+
+/*
+** mlslb_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     umlslb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslb_11_u16_tied1, svuint16_t, svuint8_t,
+            z0 = svmlslb_n_u16 (z0, z4, 11),
+            z0 = svmlslb (z0, z4, 11))
+
+/*
+** mlslb_11_u16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     umlslb  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslb_11_u16_untied, svuint16_t, svuint8_t,
+            z0 = svmlslb_n_u16 (z1, z4, 11),
+            z0 = svmlslb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_u32.c
new file mode 100644 (file)
index 0000000..cd94368
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslb_u32_tied1:
+**     umlslb  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlslb_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svmlslb_u32 (z0, z4, z5),
+            z0 = svmlslb (z0, z4, z5))
+
+/*
+** mlslb_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslb  z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_u32_tied2, svuint32_t, svuint16_t,
+                z0_res = svmlslb_u32 (z4, z0, z1),
+                z0_res = svmlslb (z4, z0, z1))
+
+/*
+** mlslb_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslb  z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_u32_tied3, svuint32_t, svuint16_t,
+                z0_res = svmlslb_u32 (z4, z1, z0),
+                z0_res = svmlslb (z4, z1, z0))
+
+/*
+** mlslb_u32_untied:
+**     movprfx z0, z1
+**     umlslb  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlslb_u32_untied, svuint32_t, svuint16_t,
+            z0 = svmlslb_u32 (z1, z4, z5),
+            z0 = svmlslb (z1, z4, z5))
+
+/*
+** mlslb_w0_u32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     umlslb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslb_w0_u32_tied1, svuint32_t, svuint16_t, uint16_t,
+             z0 = svmlslb_n_u32 (z0, z4, x0),
+             z0 = svmlslb (z0, z4, x0))
+
+/*
+** mlslb_w0_u32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     umlslb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslb_w0_u32_untied, svuint32_t, svuint16_t, uint16_t,
+             z0 = svmlslb_n_u32 (z1, z4, x0),
+             z0 = svmlslb (z1, z4, x0))
+
+/*
+** mlslb_11_u32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     umlslb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslb_11_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svmlslb_n_u32 (z0, z4, 11),
+            z0 = svmlslb (z0, z4, 11))
+
+/*
+** mlslb_11_u32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     umlslb  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslb_11_u32_untied, svuint32_t, svuint16_t,
+            z0 = svmlslb_n_u32 (z1, z4, 11),
+            z0 = svmlslb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslb_u64.c
new file mode 100644 (file)
index 0000000..a895e7e
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslb_u64_tied1:
+**     umlslb  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (mlslb_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svmlslb_u64 (z0, z4, z5),
+            z0 = svmlslb (z0, z4, z5))
+
+/*
+** mlslb_u64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslb  z0\.d, \1\.s, z1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_u64_tied2, svuint64_t, svuint32_t,
+                z0_res = svmlslb_u64 (z4, z0, z1),
+                z0_res = svmlslb (z4, z0, z1))
+
+/*
+** mlslb_u64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslb  z0\.d, z1\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslb_u64_tied3, svuint64_t, svuint32_t,
+                z0_res = svmlslb_u64 (z4, z1, z0),
+                z0_res = svmlslb (z4, z1, z0))
+
+/*
+** mlslb_u64_untied:
+**     movprfx z0, z1
+**     umlslb  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (mlslb_u64_untied, svuint64_t, svuint32_t,
+            z0 = svmlslb_u64 (z1, z4, z5),
+            z0 = svmlslb (z1, z4, z5))
+
+/*
+** mlslb_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     umlslb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslb_w0_u64_tied1, svuint64_t, svuint32_t, uint32_t,
+             z0 = svmlslb_n_u64 (z0, z4, x0),
+             z0 = svmlslb (z0, z4, x0))
+
+/*
+** mlslb_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     umlslb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslb_w0_u64_untied, svuint64_t, svuint32_t, uint32_t,
+             z0 = svmlslb_n_u64 (z1, z4, x0),
+             z0 = svmlslb (z1, z4, x0))
+
+/*
+** mlslb_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     umlslb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslb_11_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svmlslb_n_u64 (z0, z4, 11),
+            z0 = svmlslb (z0, z4, 11))
+
+/*
+** mlslb_11_u64_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     umlslb  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslb_11_u64_untied, svuint64_t, svuint32_t,
+            z0 = svmlslb_n_u64 (z1, z4, 11),
+            z0 = svmlslb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_f32.c
new file mode 100644 (file)
index 0000000..d07f0c9
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslt_f32_tied1:
+**     fmlslt  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlslt_f32_tied1, svfloat32_t, svfloat16_t,
+            z0 = svmlslt_f32 (z0, z4, z5),
+            z0 = svmlslt (z0, z4, z5))
+
+/*
+** mlslt_f32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     fmlslt  z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_f32_tied2, svfloat32_t, svfloat16_t,
+                z0_res = svmlslt_f32 (z4, z0, z1),
+                z0_res = svmlslt (z4, z0, z1))
+
+/*
+** mlslt_f32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     fmlslt  z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_f32_tied3, svfloat32_t, svfloat16_t,
+                z0_res = svmlslt_f32 (z4, z1, z0),
+                z0_res = svmlslt (z4, z1, z0))
+
+/*
+** mlslt_f32_untied:
+**     movprfx z0, z1
+**     fmlslt  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlslt_f32_untied, svfloat32_t, svfloat16_t,
+            z0 = svmlslt_f32 (z1, z4, z5),
+            z0 = svmlslt (z1, z4, z5))
+
+/*
+** mlslt_h7_f32_tied1:
+**     mov     (z[0-9]+\.h), h7
+**     fmlslt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZD (mlslt_h7_f32_tied1, svfloat32_t, svfloat16_t, float16_t,
+             z0 = svmlslt_n_f32 (z0, z4, d7),
+             z0 = svmlslt (z0, z4, d7))
+
+/*
+** mlslt_h7_f32_untied:
+**     mov     (z[0-9]+\.h), h7
+**     movprfx z0, z1
+**     fmlslt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZD (mlslt_h7_f32_untied, svfloat32_t, svfloat16_t, float16_t,
+             z0 = svmlslt_n_f32 (z1, z4, d7),
+             z0 = svmlslt (z1, z4, d7))
+
+/*
+** mlslt_2_f32_tied1:
+**     fmov    (z[0-9]+\.h), #2\.0(?:e\+0)?
+**     fmlslt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslt_2_f32_tied1, svfloat32_t, svfloat16_t,
+            z0 = svmlslt_n_f32 (z0, z4, 2),
+            z0 = svmlslt (z0, z4, 2))
+
+/*
+** mlslt_2_f32_untied:
+**     fmov    (z[0-9]+\.h), #2\.0(?:e\+0)?
+**     movprfx z0, z1
+**     fmlslt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslt_2_f32_untied, svfloat32_t, svfloat16_t,
+            z0 = svmlslt_n_f32 (z1, z4, 2),
+            z0 = svmlslt (z1, z4, 2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_lane_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_lane_f32.c
new file mode 100644 (file)
index 0000000..83111f4
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslt_lane_0_f32_tied1:
+**     fmlslt  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslt_lane_0_f32_tied1, svfloat32_t, svfloat16_t,
+            z0 = svmlslt_lane_f32 (z0, z4, z5, 0),
+            z0 = svmlslt_lane (z0, z4, z5, 0))
+
+/*
+** mlslt_lane_0_f32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     fmlslt  z0\.s, \1\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_lane_0_f32_tied2, svfloat32_t, svfloat16_t,
+                z0_res = svmlslt_lane_f32 (z4, z0, z1, 0),
+                z0_res = svmlslt_lane (z4, z0, z1, 0))
+
+/*
+** mlslt_lane_0_f32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     fmlslt  z0\.s, z1\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_lane_0_f32_tied3, svfloat32_t, svfloat16_t,
+                z0_res = svmlslt_lane_f32 (z4, z1, z0, 0),
+                z0_res = svmlslt_lane (z4, z1, z0, 0))
+
+/*
+** mlslt_lane_0_f32_untied:
+**     movprfx z0, z1
+**     fmlslt  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslt_lane_0_f32_untied, svfloat32_t, svfloat16_t,
+            z0 = svmlslt_lane_f32 (z1, z4, z5, 0),
+            z0 = svmlslt_lane (z1, z4, z5, 0))
+
+/*
+** mlslt_lane_1_f32:
+**     fmlslt  z0\.s, z4\.h, z5\.h\[1\]
+**     ret
+*/
+TEST_DUAL_Z (mlslt_lane_1_f32, svfloat32_t, svfloat16_t,
+            z0 = svmlslt_lane_f32 (z0, z4, z5, 1),
+            z0 = svmlslt_lane (z0, z4, z5, 1))
+
+/*
+** mlslt_lane_z8_f32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     fmlslt  z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslt_lane_z8_f32, svfloat32_t, svfloat16_t, z8,
+                   z0 = svmlslt_lane_f32 (z0, z1, z8, 1),
+                   z0 = svmlslt_lane (z0, z1, z8, 1))
+
+/*
+** mlslt_lane_z16_f32:
+**     mov     (z[0-7])\.d, z16\.d
+**     fmlslt  z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslt_lane_z16_f32, svfloat32_t, svfloat16_t, z16,
+                   z0 = svmlslt_lane_f32 (z0, z1, z16, 1),
+                   z0 = svmlslt_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_lane_s32.c
new file mode 100644 (file)
index 0000000..9475df4
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslt_lane_0_s32_tied1:
+**     smlslt  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslt_lane_0_s32_tied1, svint32_t, svint16_t,
+            z0 = svmlslt_lane_s32 (z0, z4, z5, 0),
+            z0 = svmlslt_lane (z0, z4, z5, 0))
+
+/*
+** mlslt_lane_0_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslt  z0\.s, \1\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_lane_0_s32_tied2, svint32_t, svint16_t,
+                z0_res = svmlslt_lane_s32 (z4, z0, z1, 0),
+                z0_res = svmlslt_lane (z4, z0, z1, 0))
+
+/*
+** mlslt_lane_0_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslt  z0\.s, z1\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_lane_0_s32_tied3, svint32_t, svint16_t,
+                z0_res = svmlslt_lane_s32 (z4, z1, z0, 0),
+                z0_res = svmlslt_lane (z4, z1, z0, 0))
+
+/*
+** mlslt_lane_0_s32_untied:
+**     movprfx z0, z1
+**     smlslt  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslt_lane_0_s32_untied, svint32_t, svint16_t,
+            z0 = svmlslt_lane_s32 (z1, z4, z5, 0),
+            z0 = svmlslt_lane (z1, z4, z5, 0))
+
+/*
+** mlslt_lane_1_s32:
+**     smlslt  z0\.s, z4\.h, z5\.h\[1\]
+**     ret
+*/
+TEST_DUAL_Z (mlslt_lane_1_s32, svint32_t, svint16_t,
+            z0 = svmlslt_lane_s32 (z0, z4, z5, 1),
+            z0 = svmlslt_lane (z0, z4, z5, 1))
+
+/*
+** mlslt_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     smlslt  z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslt_lane_z8_s32, svint32_t, svint16_t, z8,
+                   z0 = svmlslt_lane_s32 (z0, z1, z8, 1),
+                   z0 = svmlslt_lane (z0, z1, z8, 1))
+
+/*
+** mlslt_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     smlslt  z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslt_lane_z16_s32, svint32_t, svint16_t, z16,
+                   z0 = svmlslt_lane_s32 (z0, z1, z16, 1),
+                   z0 = svmlslt_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_lane_s64.c
new file mode 100644 (file)
index 0000000..5cac418
--- /dev/null
@@ -0,0 +1,65 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslt_lane_0_s64_tied1:
+**     smlslt  z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslt_lane_0_s64_tied1, svint64_t, svint32_t,
+            z0 = svmlslt_lane_s64 (z0, z4, z5, 0),
+            z0 = svmlslt_lane (z0, z4, z5, 0))
+
+/*
+** mlslt_lane_0_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslt  z0\.d, \1\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_lane_0_s64_tied2, svint64_t, svint32_t,
+                z0_res = svmlslt_lane_s64 (z4, z0, z1, 0),
+                z0_res = svmlslt_lane (z4, z0, z1, 0))
+
+/*
+** mlslt_lane_0_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslt  z0\.d, z1\.s, \1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_lane_0_s64_tied3, svint64_t, svint32_t,
+                z0_res = svmlslt_lane_s64 (z4, z1, z0, 0),
+                z0_res = svmlslt_lane (z4, z1, z0, 0))
+
+/*
+** mlslt_lane_0_s64_untied:
+**     movprfx z0, z1
+**     smlslt  z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslt_lane_0_s64_untied, svint64_t, svint32_t,
+            z0 = svmlslt_lane_s64 (z1, z4, z5, 0),
+            z0 = svmlslt_lane (z1, z4, z5, 0))
+
+/*
+** mlslt_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     smlslt  z0\.d, z1\.s, z15\.s\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslt_lane_z15_s64, svint64_t, svint32_t, z15,
+                   z0 = svmlslt_lane_s64 (z0, z1, z15, 1),
+                   z0 = svmlslt_lane (z0, z1, z15, 1))
+
+/*
+** mlslt_lane_z16_s64:
+**     mov     (z[0-9]|z1[0-5])\.d, z16\.d
+**     smlslt  z0\.d, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslt_lane_z16_s64, svint64_t, svint32_t, z16,
+                   z0 = svmlslt_lane_s64 (z0, z1, z16, 1),
+                   z0 = svmlslt_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_lane_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_lane_u32.c
new file mode 100644 (file)
index 0000000..e7d96f0
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslt_lane_0_u32_tied1:
+**     umlslt  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslt_lane_0_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svmlslt_lane_u32 (z0, z4, z5, 0),
+            z0 = svmlslt_lane (z0, z4, z5, 0))
+
+/*
+** mlslt_lane_0_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslt  z0\.s, \1\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_lane_0_u32_tied2, svuint32_t, svuint16_t,
+                z0_res = svmlslt_lane_u32 (z4, z0, z1, 0),
+                z0_res = svmlslt_lane (z4, z0, z1, 0))
+
+/*
+** mlslt_lane_0_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslt  z0\.s, z1\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_lane_0_u32_tied3, svuint32_t, svuint16_t,
+                z0_res = svmlslt_lane_u32 (z4, z1, z0, 0),
+                z0_res = svmlslt_lane (z4, z1, z0, 0))
+
+/*
+** mlslt_lane_0_u32_untied:
+**     movprfx z0, z1
+**     umlslt  z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslt_lane_0_u32_untied, svuint32_t, svuint16_t,
+            z0 = svmlslt_lane_u32 (z1, z4, z5, 0),
+            z0 = svmlslt_lane (z1, z4, z5, 0))
+
+/*
+** mlslt_lane_1_u32:
+**     umlslt  z0\.s, z4\.h, z5\.h\[1\]
+**     ret
+*/
+TEST_DUAL_Z (mlslt_lane_1_u32, svuint32_t, svuint16_t,
+            z0 = svmlslt_lane_u32 (z0, z4, z5, 1),
+            z0 = svmlslt_lane (z0, z4, z5, 1))
+
+/*
+** mlslt_lane_z8_u32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     umlslt  z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslt_lane_z8_u32, svuint32_t, svuint16_t, z8,
+                   z0 = svmlslt_lane_u32 (z0, z1, z8, 1),
+                   z0 = svmlslt_lane (z0, z1, z8, 1))
+
+/*
+** mlslt_lane_z16_u32:
+**     mov     (z[0-7])\.d, z16\.d
+**     umlslt  z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslt_lane_z16_u32, svuint32_t, svuint16_t, z16,
+                   z0 = svmlslt_lane_u32 (z0, z1, z16, 1),
+                   z0 = svmlslt_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_lane_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_lane_u64.c
new file mode 100644 (file)
index 0000000..b28c5ec
--- /dev/null
@@ -0,0 +1,65 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslt_lane_0_u64_tied1:
+**     umlslt  z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslt_lane_0_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svmlslt_lane_u64 (z0, z4, z5, 0),
+            z0 = svmlslt_lane (z0, z4, z5, 0))
+
+/*
+** mlslt_lane_0_u64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslt  z0\.d, \1\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_lane_0_u64_tied2, svuint64_t, svuint32_t,
+                z0_res = svmlslt_lane_u64 (z4, z0, z1, 0),
+                z0_res = svmlslt_lane (z4, z0, z1, 0))
+
+/*
+** mlslt_lane_0_u64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslt  z0\.d, z1\.s, \1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_lane_0_u64_tied3, svuint64_t, svuint32_t,
+                z0_res = svmlslt_lane_u64 (z4, z1, z0, 0),
+                z0_res = svmlslt_lane (z4, z1, z0, 0))
+
+/*
+** mlslt_lane_0_u64_untied:
+**     movprfx z0, z1
+**     umlslt  z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (mlslt_lane_0_u64_untied, svuint64_t, svuint32_t,
+            z0 = svmlslt_lane_u64 (z1, z4, z5, 0),
+            z0 = svmlslt_lane (z1, z4, z5, 0))
+
+/*
+** mlslt_lane_z15_u64:
+**     str     d15, \[sp, -16\]!
+**     umlslt  z0\.d, z1\.s, z15\.s\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslt_lane_z15_u64, svuint64_t, svuint32_t, z15,
+                   z0 = svmlslt_lane_u64 (z0, z1, z15, 1),
+                   z0 = svmlslt_lane (z0, z1, z15, 1))
+
+/*
+** mlslt_lane_z16_u64:
+**     mov     (z[0-9]|z1[0-5])\.d, z16\.d
+**     umlslt  z0\.d, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mlslt_lane_z16_u64, svuint64_t, svuint32_t, z16,
+                   z0 = svmlslt_lane_u64 (z0, z1, z16, 1),
+                   z0 = svmlslt_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_s16.c
new file mode 100644 (file)
index 0000000..3ac402c
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslt_s16_tied1:
+**     smlslt  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (mlslt_s16_tied1, svint16_t, svint8_t,
+            z0 = svmlslt_s16 (z0, z4, z5),
+            z0 = svmlslt (z0, z4, z5))
+
+/*
+** mlslt_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslt  z0\.h, \1\.b, z1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_s16_tied2, svint16_t, svint8_t,
+                z0_res = svmlslt_s16 (z4, z0, z1),
+                z0_res = svmlslt (z4, z0, z1))
+
+/*
+** mlslt_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslt  z0\.h, z1\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_s16_tied3, svint16_t, svint8_t,
+                z0_res = svmlslt_s16 (z4, z1, z0),
+                z0_res = svmlslt (z4, z1, z0))
+
+/*
+** mlslt_s16_untied:
+**     movprfx z0, z1
+**     smlslt  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (mlslt_s16_untied, svint16_t, svint8_t,
+            z0 = svmlslt_s16 (z1, z4, z5),
+            z0 = svmlslt (z1, z4, z5))
+
+/*
+** mlslt_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     smlslt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslt_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+             z0 = svmlslt_n_s16 (z0, z4, x0),
+             z0 = svmlslt (z0, z4, x0))
+
+/*
+** mlslt_w0_s16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     smlslt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslt_w0_s16_untied, svint16_t, svint8_t, int8_t,
+             z0 = svmlslt_n_s16 (z1, z4, x0),
+             z0 = svmlslt (z1, z4, x0))
+
+/*
+** mlslt_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     smlslt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslt_11_s16_tied1, svint16_t, svint8_t,
+            z0 = svmlslt_n_s16 (z0, z4, 11),
+            z0 = svmlslt (z0, z4, 11))
+
+/*
+** mlslt_11_s16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     smlslt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslt_11_s16_untied, svint16_t, svint8_t,
+            z0 = svmlslt_n_s16 (z1, z4, 11),
+            z0 = svmlslt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_s32.c
new file mode 100644 (file)
index 0000000..cd4062a
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslt_s32_tied1:
+**     smlslt  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlslt_s32_tied1, svint32_t, svint16_t,
+            z0 = svmlslt_s32 (z0, z4, z5),
+            z0 = svmlslt (z0, z4, z5))
+
+/*
+** mlslt_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslt  z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_s32_tied2, svint32_t, svint16_t,
+                z0_res = svmlslt_s32 (z4, z0, z1),
+                z0_res = svmlslt (z4, z0, z1))
+
+/*
+** mlslt_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslt  z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_s32_tied3, svint32_t, svint16_t,
+                z0_res = svmlslt_s32 (z4, z1, z0),
+                z0_res = svmlslt (z4, z1, z0))
+
+/*
+** mlslt_s32_untied:
+**     movprfx z0, z1
+**     smlslt  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlslt_s32_untied, svint32_t, svint16_t,
+            z0 = svmlslt_s32 (z1, z4, z5),
+            z0 = svmlslt (z1, z4, z5))
+
+/*
+** mlslt_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     smlslt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslt_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+             z0 = svmlslt_n_s32 (z0, z4, x0),
+             z0 = svmlslt (z0, z4, x0))
+
+/*
+** mlslt_w0_s32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     smlslt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslt_w0_s32_untied, svint32_t, svint16_t, int16_t,
+             z0 = svmlslt_n_s32 (z1, z4, x0),
+             z0 = svmlslt (z1, z4, x0))
+
+/*
+** mlslt_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     smlslt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslt_11_s32_tied1, svint32_t, svint16_t,
+            z0 = svmlslt_n_s32 (z0, z4, 11),
+            z0 = svmlslt (z0, z4, 11))
+
+/*
+** mlslt_11_s32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     smlslt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslt_11_s32_untied, svint32_t, svint16_t,
+            z0 = svmlslt_n_s32 (z1, z4, 11),
+            z0 = svmlslt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_s64.c
new file mode 100644 (file)
index 0000000..5de31b2
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslt_s64_tied1:
+**     smlslt  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (mlslt_s64_tied1, svint64_t, svint32_t,
+            z0 = svmlslt_s64 (z0, z4, z5),
+            z0 = svmlslt (z0, z4, z5))
+
+/*
+** mlslt_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslt  z0\.d, \1\.s, z1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_s64_tied2, svint64_t, svint32_t,
+                z0_res = svmlslt_s64 (z4, z0, z1),
+                z0_res = svmlslt (z4, z0, z1))
+
+/*
+** mlslt_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     smlslt  z0\.d, z1\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_s64_tied3, svint64_t, svint32_t,
+                z0_res = svmlslt_s64 (z4, z1, z0),
+                z0_res = svmlslt (z4, z1, z0))
+
+/*
+** mlslt_s64_untied:
+**     movprfx z0, z1
+**     smlslt  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (mlslt_s64_untied, svint64_t, svint32_t,
+            z0 = svmlslt_s64 (z1, z4, z5),
+            z0 = svmlslt (z1, z4, z5))
+
+/*
+** mlslt_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     smlslt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslt_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+             z0 = svmlslt_n_s64 (z0, z4, x0),
+             z0 = svmlslt (z0, z4, x0))
+
+/*
+** mlslt_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     smlslt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslt_w0_s64_untied, svint64_t, svint32_t, int32_t,
+             z0 = svmlslt_n_s64 (z1, z4, x0),
+             z0 = svmlslt (z1, z4, x0))
+
+/*
+** mlslt_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     smlslt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslt_11_s64_tied1, svint64_t, svint32_t,
+            z0 = svmlslt_n_s64 (z0, z4, 11),
+            z0 = svmlslt (z0, z4, 11))
+
+/*
+** mlslt_11_s64_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     smlslt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslt_11_s64_untied, svint64_t, svint32_t,
+            z0 = svmlslt_n_s64 (z1, z4, 11),
+            z0 = svmlslt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_u16.c
new file mode 100644 (file)
index 0000000..12711f1
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslt_u16_tied1:
+**     umlslt  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (mlslt_u16_tied1, svuint16_t, svuint8_t,
+            z0 = svmlslt_u16 (z0, z4, z5),
+            z0 = svmlslt (z0, z4, z5))
+
+/*
+** mlslt_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslt  z0\.h, \1\.b, z1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_u16_tied2, svuint16_t, svuint8_t,
+                z0_res = svmlslt_u16 (z4, z0, z1),
+                z0_res = svmlslt (z4, z0, z1))
+
+/*
+** mlslt_u16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslt  z0\.h, z1\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_u16_tied3, svuint16_t, svuint8_t,
+                z0_res = svmlslt_u16 (z4, z1, z0),
+                z0_res = svmlslt (z4, z1, z0))
+
+/*
+** mlslt_u16_untied:
+**     movprfx z0, z1
+**     umlslt  z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (mlslt_u16_untied, svuint16_t, svuint8_t,
+            z0 = svmlslt_u16 (z1, z4, z5),
+            z0 = svmlslt (z1, z4, z5))
+
+/*
+** mlslt_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     umlslt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslt_w0_u16_tied1, svuint16_t, svuint8_t, uint8_t,
+             z0 = svmlslt_n_u16 (z0, z4, x0),
+             z0 = svmlslt (z0, z4, x0))
+
+/*
+** mlslt_w0_u16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     umlslt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslt_w0_u16_untied, svuint16_t, svuint8_t, uint8_t,
+             z0 = svmlslt_n_u16 (z1, z4, x0),
+             z0 = svmlslt (z1, z4, x0))
+
+/*
+** mlslt_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     umlslt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslt_11_u16_tied1, svuint16_t, svuint8_t,
+            z0 = svmlslt_n_u16 (z0, z4, 11),
+            z0 = svmlslt (z0, z4, 11))
+
+/*
+** mlslt_11_u16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     umlslt  z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslt_11_u16_untied, svuint16_t, svuint8_t,
+            z0 = svmlslt_n_u16 (z1, z4, 11),
+            z0 = svmlslt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_u32.c
new file mode 100644 (file)
index 0000000..1e71b93
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslt_u32_tied1:
+**     umlslt  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlslt_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svmlslt_u32 (z0, z4, z5),
+            z0 = svmlslt (z0, z4, z5))
+
+/*
+** mlslt_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslt  z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_u32_tied2, svuint32_t, svuint16_t,
+                z0_res = svmlslt_u32 (z4, z0, z1),
+                z0_res = svmlslt (z4, z0, z1))
+
+/*
+** mlslt_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslt  z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_u32_tied3, svuint32_t, svuint16_t,
+                z0_res = svmlslt_u32 (z4, z1, z0),
+                z0_res = svmlslt (z4, z1, z0))
+
+/*
+** mlslt_u32_untied:
+**     movprfx z0, z1
+**     umlslt  z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (mlslt_u32_untied, svuint32_t, svuint16_t,
+            z0 = svmlslt_u32 (z1, z4, z5),
+            z0 = svmlslt (z1, z4, z5))
+
+/*
+** mlslt_w0_u32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     umlslt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslt_w0_u32_tied1, svuint32_t, svuint16_t, uint16_t,
+             z0 = svmlslt_n_u32 (z0, z4, x0),
+             z0 = svmlslt (z0, z4, x0))
+
+/*
+** mlslt_w0_u32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     umlslt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslt_w0_u32_untied, svuint32_t, svuint16_t, uint16_t,
+             z0 = svmlslt_n_u32 (z1, z4, x0),
+             z0 = svmlslt (z1, z4, x0))
+
+/*
+** mlslt_11_u32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     umlslt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslt_11_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svmlslt_n_u32 (z0, z4, 11),
+            z0 = svmlslt (z0, z4, 11))
+
+/*
+** mlslt_11_u32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     umlslt  z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslt_11_u32_untied, svuint32_t, svuint16_t,
+            z0 = svmlslt_n_u32 (z1, z4, 11),
+            z0 = svmlslt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mlslt_u64.c
new file mode 100644 (file)
index 0000000..62b4071
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mlslt_u64_tied1:
+**     umlslt  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (mlslt_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svmlslt_u64 (z0, z4, z5),
+            z0 = svmlslt (z0, z4, z5))
+
+/*
+** mlslt_u64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslt  z0\.d, \1\.s, z1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_u64_tied2, svuint64_t, svuint32_t,
+                z0_res = svmlslt_u64 (z4, z0, z1),
+                z0_res = svmlslt (z4, z0, z1))
+
+/*
+** mlslt_u64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     umlslt  z0\.d, z1\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (mlslt_u64_tied3, svuint64_t, svuint32_t,
+                z0_res = svmlslt_u64 (z4, z1, z0),
+                z0_res = svmlslt (z4, z1, z0))
+
+/*
+** mlslt_u64_untied:
+**     movprfx z0, z1
+**     umlslt  z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (mlslt_u64_untied, svuint64_t, svuint32_t,
+            z0 = svmlslt_u64 (z1, z4, z5),
+            z0 = svmlslt (z1, z4, z5))
+
+/*
+** mlslt_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     umlslt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslt_w0_u64_tied1, svuint64_t, svuint32_t, uint32_t,
+             z0 = svmlslt_n_u64 (z0, z4, x0),
+             z0 = svmlslt (z0, z4, x0))
+
+/*
+** mlslt_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     umlslt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (mlslt_w0_u64_untied, svuint64_t, svuint32_t, uint32_t,
+             z0 = svmlslt_n_u64 (z1, z4, x0),
+             z0 = svmlslt (z1, z4, x0))
+
+/*
+** mlslt_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     umlslt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslt_11_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svmlslt_n_u64 (z0, z4, 11),
+            z0 = svmlslt (z0, z4, 11))
+
+/*
+** mlslt_11_u64_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     umlslt  z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (mlslt_11_u64_untied, svuint64_t, svuint32_t,
+            z0 = svmlslt_n_u64 (z1, z4, 11),
+            z0 = svmlslt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlb_s16.c
new file mode 100644 (file)
index 0000000..4be4aff
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** movlb_s16_tied1:
+**     sshllb  z0\.h, z0\.b, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlb_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svmovlb_s16 (z0),
+                   z0_res = svmovlb (z0))
+
+/*
+** movlb_s16_untied:
+**     sshllb  z0\.h, z1\.b, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlb_s16_untied, svint16_t, svint8_t,
+                   z0_res = svmovlb_s16 (z1),
+                   z0_res = svmovlb (z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlb_s32.c
new file mode 100644 (file)
index 0000000..e03ebc3
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** movlb_s32_tied1:
+**     sshllb  z0\.s, z0\.h, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlb_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svmovlb_s32 (z0),
+                   z0_res = svmovlb (z0))
+
+/*
+** movlb_s32_untied:
+**     sshllb  z0\.s, z1\.h, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlb_s32_untied, svint32_t, svint16_t,
+                   z0_res = svmovlb_s32 (z1),
+                   z0_res = svmovlb (z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlb_s64.c
new file mode 100644 (file)
index 0000000..a31dd6e
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** movlb_s64_tied1:
+**     sshllb  z0\.d, z0\.s, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlb_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svmovlb_s64 (z0),
+                   z0_res = svmovlb (z0))
+
+/*
+** movlb_s64_untied:
+**     sshllb  z0\.d, z1\.s, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlb_s64_untied, svint64_t, svint32_t,
+                   z0_res = svmovlb_s64 (z1),
+                   z0_res = svmovlb (z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlb_u16.c
new file mode 100644 (file)
index 0000000..1fb8570
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** movlb_u16_tied1:
+**     ushllb  z0\.h, z0\.b, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlb_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svmovlb_u16 (z0),
+                   z0_res = svmovlb (z0))
+
+/*
+** movlb_u16_untied:
+**     ushllb  z0\.h, z1\.b, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlb_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svmovlb_u16 (z1),
+                   z0_res = svmovlb (z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlb_u32.c
new file mode 100644 (file)
index 0000000..099c343
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** movlb_u32_tied1:
+**     ushllb  z0\.s, z0\.h, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlb_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svmovlb_u32 (z0),
+                   z0_res = svmovlb (z0))
+
+/*
+** movlb_u32_untied:
+**     ushllb  z0\.s, z1\.h, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlb_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svmovlb_u32 (z1),
+                   z0_res = svmovlb (z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlb_u64.c
new file mode 100644 (file)
index 0000000..0f00184
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** movlb_u64_tied1:
+**     ushllb  z0\.d, z0\.s, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlb_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svmovlb_u64 (z0),
+                   z0_res = svmovlb (z0))
+
+/*
+** movlb_u64_untied:
+**     ushllb  z0\.d, z1\.s, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlb_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svmovlb_u64 (z1),
+                   z0_res = svmovlb (z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlt_s16.c
new file mode 100644 (file)
index 0000000..6d48c86
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** movlt_s16_tied1:
+**     sshllt  z0\.h, z0\.b, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlt_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svmovlt_s16 (z0),
+                   z0_res = svmovlt (z0))
+
+/*
+** movlt_s16_untied:
+**     sshllt  z0\.h, z1\.b, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlt_s16_untied, svint16_t, svint8_t,
+                   z0_res = svmovlt_s16 (z1),
+                   z0_res = svmovlt (z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlt_s32.c
new file mode 100644 (file)
index 0000000..e9c09f1
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** movlt_s32_tied1:
+**     sshllt  z0\.s, z0\.h, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlt_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svmovlt_s32 (z0),
+                   z0_res = svmovlt (z0))
+
+/*
+** movlt_s32_untied:
+**     sshllt  z0\.s, z1\.h, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlt_s32_untied, svint32_t, svint16_t,
+                   z0_res = svmovlt_s32 (z1),
+                   z0_res = svmovlt (z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlt_s64.c
new file mode 100644 (file)
index 0000000..0a41a3b
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** movlt_s64_tied1:
+**     sshllt  z0\.d, z0\.s, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlt_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svmovlt_s64 (z0),
+                   z0_res = svmovlt (z0))
+
+/*
+** movlt_s64_untied:
+**     sshllt  z0\.d, z1\.s, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlt_s64_untied, svint64_t, svint32_t,
+                   z0_res = svmovlt_s64 (z1),
+                   z0_res = svmovlt (z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlt_u16.c
new file mode 100644 (file)
index 0000000..2415bac
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** movlt_u16_tied1:
+**     ushllt  z0\.h, z0\.b, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlt_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svmovlt_u16 (z0),
+                   z0_res = svmovlt (z0))
+
+/*
+** movlt_u16_untied:
+**     ushllt  z0\.h, z1\.b, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlt_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svmovlt_u16 (z1),
+                   z0_res = svmovlt (z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlt_u32.c
new file mode 100644 (file)
index 0000000..6b5cddb
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** movlt_u32_tied1:
+**     ushllt  z0\.s, z0\.h, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlt_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svmovlt_u32 (z0),
+                   z0_res = svmovlt (z0))
+
+/*
+** movlt_u32_untied:
+**     ushllt  z0\.s, z1\.h, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlt_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svmovlt_u32 (z1),
+                   z0_res = svmovlt (z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/movlt_u64.c
new file mode 100644 (file)
index 0000000..8cc62f0
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** movlt_u64_tied1:
+**     ushllt  z0\.d, z0\.s, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlt_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svmovlt_u64 (z0),
+                   z0_res = svmovlt (z0))
+
+/*
+** movlt_u64_untied:
+**     ushllt  z0\.d, z1\.s, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (movlt_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svmovlt_u64 (z1),
+                   z0_res = svmovlt (z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mul_lane_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mul_lane_s16.c
new file mode 100644 (file)
index 0000000..255bc52
--- /dev/null
@@ -0,0 +1,115 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mul_lane_0_s16_tied1:
+**     mul     z0\.h, z0\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_0_s16_tied1, svint16_t,
+               z0 = svmul_lane_s16 (z0, z1, 0),
+               z0 = svmul_lane (z0, z1, 0))
+
+/*
+** mul_lane_0_s16_tied2:
+**     mul     z0\.h, z1\.h, z0\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_0_s16_tied2, svint16_t,
+               z0 = svmul_lane_s16 (z1, z0, 0),
+               z0 = svmul_lane (z1, z0, 0))
+
+/*
+** mul_lane_0_s16_untied:
+**     mul     z0\.h, z1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_0_s16_untied, svint16_t,
+               z0 = svmul_lane_s16 (z1, z2, 0),
+               z0 = svmul_lane (z1, z2, 0))
+
+/*
+** mul_lane_1_s16:
+**     mul     z0\.h, z1\.h, z2\.h\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_1_s16, svint16_t,
+               z0 = svmul_lane_s16 (z1, z2, 1),
+               z0 = svmul_lane (z1, z2, 1))
+
+/*
+** mul_lane_2_s16:
+**     mul     z0\.h, z1\.h, z2\.h\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_2_s16, svint16_t,
+               z0 = svmul_lane_s16 (z1, z2, 2),
+               z0 = svmul_lane (z1, z2, 2))
+
+/*
+** mul_lane_3_s16:
+**     mul     z0\.h, z1\.h, z2\.h\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_3_s16, svint16_t,
+               z0 = svmul_lane_s16 (z1, z2, 3),
+               z0 = svmul_lane (z1, z2, 3))
+
+/*
+** mul_lane_4_s16:
+**     mul     z0\.h, z1\.h, z2\.h\[4\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_4_s16, svint16_t,
+               z0 = svmul_lane_s16 (z1, z2, 4),
+               z0 = svmul_lane (z1, z2, 4))
+
+/*
+** mul_lane_5_s16:
+**     mul     z0\.h, z1\.h, z2\.h\[5\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_5_s16, svint16_t,
+               z0 = svmul_lane_s16 (z1, z2, 5),
+               z0 = svmul_lane (z1, z2, 5))
+
+/*
+** mul_lane_6_s16:
+**     mul     z0\.h, z1\.h, z2\.h\[6\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_6_s16, svint16_t,
+               z0 = svmul_lane_s16 (z1, z2, 6),
+               z0 = svmul_lane (z1, z2, 6))
+
+/*
+** mul_lane_7_s16:
+**     mul     z0\.h, z1\.h, z2\.h\[7\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_7_s16, svint16_t,
+               z0 = svmul_lane_s16 (z1, z2, 7),
+               z0 = svmul_lane (z1, z2, 7))
+
+/*
+** mul_lane_z8_s16:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     mul     z0\.h, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mul_lane_z8_s16, svint16_t, svint16_t, z8,
+                   z0 = svmul_lane_s16 (z1, z8, 1),
+                   z0 = svmul_lane (z1, z8, 1))
+
+/*
+** mul_lane_z16_s16:
+**     mov     (z[0-7])\.d, z16\.d
+**     mul     z0\.h, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mul_lane_z16_s16, svint16_t, svint16_t, z16,
+                   z0 = svmul_lane_s16 (z1, z16, 1),
+                   z0 = svmul_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mul_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mul_lane_s32.c
new file mode 100644 (file)
index 0000000..3f81f22
--- /dev/null
@@ -0,0 +1,79 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mul_lane_0_s32_tied1:
+**     mul     z0\.s, z0\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_0_s32_tied1, svint32_t,
+               z0 = svmul_lane_s32 (z0, z1, 0),
+               z0 = svmul_lane (z0, z1, 0))
+
+/*
+** mul_lane_0_s32_tied2:
+**     mul     z0\.s, z1\.s, z0\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_0_s32_tied2, svint32_t,
+               z0 = svmul_lane_s32 (z1, z0, 0),
+               z0 = svmul_lane (z1, z0, 0))
+
+/*
+** mul_lane_0_s32_untied:
+**     mul     z0\.s, z1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_0_s32_untied, svint32_t,
+               z0 = svmul_lane_s32 (z1, z2, 0),
+               z0 = svmul_lane (z1, z2, 0))
+
+/*
+** mul_lane_1_s32:
+**     mul     z0\.s, z1\.s, z2\.s\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_1_s32, svint32_t,
+               z0 = svmul_lane_s32 (z1, z2, 1),
+               z0 = svmul_lane (z1, z2, 1))
+
+/*
+** mul_lane_2_s32:
+**     mul     z0\.s, z1\.s, z2\.s\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_2_s32, svint32_t,
+               z0 = svmul_lane_s32 (z1, z2, 2),
+               z0 = svmul_lane (z1, z2, 2))
+
+/*
+** mul_lane_3_s32:
+**     mul     z0\.s, z1\.s, z2\.s\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_3_s32, svint32_t,
+               z0 = svmul_lane_s32 (z1, z2, 3),
+               z0 = svmul_lane (z1, z2, 3))
+
+/*
+** mul_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     mul     z0\.s, z1\.s, \1\.s\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mul_lane_z8_s32, svint32_t, svint32_t, z8,
+                   z0 = svmul_lane_s32 (z1, z8, 1),
+                   z0 = svmul_lane (z1, z8, 1))
+
+/*
+** mul_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     mul     z0\.s, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mul_lane_z16_s32, svint32_t, svint32_t, z16,
+                   z0 = svmul_lane_s32 (z1, z16, 1),
+                   z0 = svmul_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mul_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mul_lane_s64.c
new file mode 100644 (file)
index 0000000..4d19cfa
--- /dev/null
@@ -0,0 +1,60 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mul_lane_0_s64_tied1:
+**     mul     z0\.d, z0\.d, z1\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_0_s64_tied1, svint64_t,
+               z0 = svmul_lane_s64 (z0, z1, 0),
+               z0 = svmul_lane (z0, z1, 0))
+
+/*
+** mul_lane_0_s64_tied2:
+**     mul     z0\.d, z1\.d, z0\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_0_s64_tied2, svint64_t,
+               z0 = svmul_lane_s64 (z1, z0, 0),
+               z0 = svmul_lane (z1, z0, 0))
+
+/*
+** mul_lane_0_s64_untied:
+**     mul     z0\.d, z1\.d, z2\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_0_s64_untied, svint64_t,
+               z0 = svmul_lane_s64 (z1, z2, 0),
+               z0 = svmul_lane (z1, z2, 0))
+
+/*
+** mul_lane_1_s64:
+**     mul     z0\.d, z1\.d, z2\.d\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_1_s64, svint64_t,
+               z0 = svmul_lane_s64 (z1, z2, 1),
+               z0 = svmul_lane (z1, z2, 1))
+
+/*
+** mul_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     mul     z0\.d, z1\.d, z15\.d\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mul_lane_z15_s64, svint64_t, svint64_t, z15,
+                   z0 = svmul_lane_s64 (z1, z15, 1),
+                   z0 = svmul_lane (z1, z15, 1))
+
+/*
+** mul_lane_z16_s64:
+**     mov     (z[0-7])\.d, z16\.d
+**     mul     z0\.d, z1\.d, \1\.d\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mul_lane_z16_s64, svint64_t, svint64_t, z16,
+                   z0 = svmul_lane_s64 (z1, z16, 1),
+                   z0 = svmul_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mul_lane_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mul_lane_u16.c
new file mode 100644 (file)
index 0000000..86b0bf8
--- /dev/null
@@ -0,0 +1,115 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mul_lane_0_u16_tied1:
+**     mul     z0\.h, z0\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_0_u16_tied1, svuint16_t,
+               z0 = svmul_lane_u16 (z0, z1, 0),
+               z0 = svmul_lane (z0, z1, 0))
+
+/*
+** mul_lane_0_u16_tied2:
+**     mul     z0\.h, z1\.h, z0\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_0_u16_tied2, svuint16_t,
+               z0 = svmul_lane_u16 (z1, z0, 0),
+               z0 = svmul_lane (z1, z0, 0))
+
+/*
+** mul_lane_0_u16_untied:
+**     mul     z0\.h, z1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_0_u16_untied, svuint16_t,
+               z0 = svmul_lane_u16 (z1, z2, 0),
+               z0 = svmul_lane (z1, z2, 0))
+
+/*
+** mul_lane_1_u16:
+**     mul     z0\.h, z1\.h, z2\.h\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_1_u16, svuint16_t,
+               z0 = svmul_lane_u16 (z1, z2, 1),
+               z0 = svmul_lane (z1, z2, 1))
+
+/*
+** mul_lane_2_u16:
+**     mul     z0\.h, z1\.h, z2\.h\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_2_u16, svuint16_t,
+               z0 = svmul_lane_u16 (z1, z2, 2),
+               z0 = svmul_lane (z1, z2, 2))
+
+/*
+** mul_lane_3_u16:
+**     mul     z0\.h, z1\.h, z2\.h\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_3_u16, svuint16_t,
+               z0 = svmul_lane_u16 (z1, z2, 3),
+               z0 = svmul_lane (z1, z2, 3))
+
+/*
+** mul_lane_4_u16:
+**     mul     z0\.h, z1\.h, z2\.h\[4\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_4_u16, svuint16_t,
+               z0 = svmul_lane_u16 (z1, z2, 4),
+               z0 = svmul_lane (z1, z2, 4))
+
+/*
+** mul_lane_5_u16:
+**     mul     z0\.h, z1\.h, z2\.h\[5\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_5_u16, svuint16_t,
+               z0 = svmul_lane_u16 (z1, z2, 5),
+               z0 = svmul_lane (z1, z2, 5))
+
+/*
+** mul_lane_6_u16:
+**     mul     z0\.h, z1\.h, z2\.h\[6\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_6_u16, svuint16_t,
+               z0 = svmul_lane_u16 (z1, z2, 6),
+               z0 = svmul_lane (z1, z2, 6))
+
+/*
+** mul_lane_7_u16:
+**     mul     z0\.h, z1\.h, z2\.h\[7\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_7_u16, svuint16_t,
+               z0 = svmul_lane_u16 (z1, z2, 7),
+               z0 = svmul_lane (z1, z2, 7))
+
+/*
+** mul_lane_z8_u16:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     mul     z0\.h, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mul_lane_z8_u16, svuint16_t, svuint16_t, z8,
+                   z0 = svmul_lane_u16 (z1, z8, 1),
+                   z0 = svmul_lane (z1, z8, 1))
+
+/*
+** mul_lane_z16_u16:
+**     mov     (z[0-7])\.d, z16\.d
+**     mul     z0\.h, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mul_lane_z16_u16, svuint16_t, svuint16_t, z16,
+                   z0 = svmul_lane_u16 (z1, z16, 1),
+                   z0 = svmul_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mul_lane_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mul_lane_u32.c
new file mode 100644 (file)
index 0000000..60d6b30
--- /dev/null
@@ -0,0 +1,79 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mul_lane_0_u32_tied1:
+**     mul     z0\.s, z0\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_0_u32_tied1, svuint32_t,
+               z0 = svmul_lane_u32 (z0, z1, 0),
+               z0 = svmul_lane (z0, z1, 0))
+
+/*
+** mul_lane_0_u32_tied2:
+**     mul     z0\.s, z1\.s, z0\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_0_u32_tied2, svuint32_t,
+               z0 = svmul_lane_u32 (z1, z0, 0),
+               z0 = svmul_lane (z1, z0, 0))
+
+/*
+** mul_lane_0_u32_untied:
+**     mul     z0\.s, z1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_0_u32_untied, svuint32_t,
+               z0 = svmul_lane_u32 (z1, z2, 0),
+               z0 = svmul_lane (z1, z2, 0))
+
+/*
+** mul_lane_1_u32:
+**     mul     z0\.s, z1\.s, z2\.s\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_1_u32, svuint32_t,
+               z0 = svmul_lane_u32 (z1, z2, 1),
+               z0 = svmul_lane (z1, z2, 1))
+
+/*
+** mul_lane_2_u32:
+**     mul     z0\.s, z1\.s, z2\.s\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_2_u32, svuint32_t,
+               z0 = svmul_lane_u32 (z1, z2, 2),
+               z0 = svmul_lane (z1, z2, 2))
+
+/*
+** mul_lane_3_u32:
+**     mul     z0\.s, z1\.s, z2\.s\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_3_u32, svuint32_t,
+               z0 = svmul_lane_u32 (z1, z2, 3),
+               z0 = svmul_lane (z1, z2, 3))
+
+/*
+** mul_lane_z8_u32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     mul     z0\.s, z1\.s, \1\.s\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mul_lane_z8_u32, svuint32_t, svuint32_t, z8,
+                   z0 = svmul_lane_u32 (z1, z8, 1),
+                   z0 = svmul_lane (z1, z8, 1))
+
+/*
+** mul_lane_z16_u32:
+**     mov     (z[0-7])\.d, z16\.d
+**     mul     z0\.s, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mul_lane_z16_u32, svuint32_t, svuint32_t, z16,
+                   z0 = svmul_lane_u32 (z1, z16, 1),
+                   z0 = svmul_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mul_lane_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mul_lane_u64.c
new file mode 100644 (file)
index 0000000..c315974
--- /dev/null
@@ -0,0 +1,60 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mul_lane_0_u64_tied1:
+**     mul     z0\.d, z0\.d, z1\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_0_u64_tied1, svuint64_t,
+               z0 = svmul_lane_u64 (z0, z1, 0),
+               z0 = svmul_lane (z0, z1, 0))
+
+/*
+** mul_lane_0_u64_tied2:
+**     mul     z0\.d, z1\.d, z0\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_0_u64_tied2, svuint64_t,
+               z0 = svmul_lane_u64 (z1, z0, 0),
+               z0 = svmul_lane (z1, z0, 0))
+
+/*
+** mul_lane_0_u64_untied:
+**     mul     z0\.d, z1\.d, z2\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_0_u64_untied, svuint64_t,
+               z0 = svmul_lane_u64 (z1, z2, 0),
+               z0 = svmul_lane (z1, z2, 0))
+
+/*
+** mul_lane_1_u64:
+**     mul     z0\.d, z1\.d, z2\.d\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (mul_lane_1_u64, svuint64_t,
+               z0 = svmul_lane_u64 (z1, z2, 1),
+               z0 = svmul_lane (z1, z2, 1))
+
+/*
+** mul_lane_z15_u64:
+**     str     d15, \[sp, -16\]!
+**     mul     z0\.d, z1\.d, z15\.d\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mul_lane_z15_u64, svuint64_t, svuint64_t, z15,
+                   z0 = svmul_lane_u64 (z1, z15, 1),
+                   z0 = svmul_lane (z1, z15, 1))
+
+/*
+** mul_lane_z16_u64:
+**     mov     (z[0-7])\.d, z16\.d
+**     mul     z0\.d, z1\.d, \1\.d\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mul_lane_z16_u64, svuint64_t, svuint64_t, z16,
+                   z0 = svmul_lane_u64 (z1, z16, 1),
+                   z0 = svmul_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_lane_s32.c
new file mode 100644 (file)
index 0000000..075216b
--- /dev/null
@@ -0,0 +1,115 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullb_lane_0_s32_tied1:
+**     smullb  z0\.s, z0\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_0_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svmullb_lane_s32 (z0, z1, 0),
+                   z0_res = svmullb_lane (z0, z1, 0))
+
+/*
+** mullb_lane_0_s32_tied2:
+**     smullb  z0\.s, z1\.h, z0\.h\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_0_s32_tied2, svint32_t, svint16_t,
+                   z0_res = svmullb_lane_s32 (z1, z0, 0),
+                   z0_res = svmullb_lane (z1, z0, 0))
+
+/*
+** mullb_lane_0_s32_untied:
+**     smullb  z0\.s, z1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_0_s32_untied, svint32_t, svint16_t,
+                   z0_res = svmullb_lane_s32 (z1, z2, 0),
+                   z0_res = svmullb_lane (z1, z2, 0))
+
+/*
+** mullb_lane_1_s32:
+**     smullb  z0\.s, z1\.h, z2\.h\[1\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_1_s32, svint32_t, svint16_t,
+                   z0_res = svmullb_lane_s32 (z1, z2, 1),
+                   z0_res = svmullb_lane (z1, z2, 1))
+
+/*
+** mullb_lane_2_s32:
+**     smullb  z0\.s, z1\.h, z2\.h\[2\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_2_s32, svint32_t, svint16_t,
+                   z0_res = svmullb_lane_s32 (z1, z2, 2),
+                   z0_res = svmullb_lane (z1, z2, 2))
+
+/*
+** mullb_lane_3_s32:
+**     smullb  z0\.s, z1\.h, z2\.h\[3\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_3_s32, svint32_t, svint16_t,
+                   z0_res = svmullb_lane_s32 (z1, z2, 3),
+                   z0_res = svmullb_lane (z1, z2, 3))
+
+/*
+** mullb_lane_4_s32:
+**     smullb  z0\.s, z1\.h, z2\.h\[4\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_4_s32, svint32_t, svint16_t,
+                   z0_res = svmullb_lane_s32 (z1, z2, 4),
+                   z0_res = svmullb_lane (z1, z2, 4))
+
+/*
+** mullb_lane_5_s32:
+**     smullb  z0\.s, z1\.h, z2\.h\[5\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_5_s32, svint32_t, svint16_t,
+                   z0_res = svmullb_lane_s32 (z1, z2, 5),
+                   z0_res = svmullb_lane (z1, z2, 5))
+
+/*
+** mullb_lane_6_s32:
+**     smullb  z0\.s, z1\.h, z2\.h\[6\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_6_s32, svint32_t, svint16_t,
+                   z0_res = svmullb_lane_s32 (z1, z2, 6),
+                   z0_res = svmullb_lane (z1, z2, 6))
+
+/*
+** mullb_lane_7_s32:
+**     smullb  z0\.s, z1\.h, z2\.h\[7\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_7_s32, svint32_t, svint16_t,
+                   z0_res = svmullb_lane_s32 (z1, z2, 7),
+                   z0_res = svmullb_lane (z1, z2, 7))
+
+/*
+** mullb_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     smullb  z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mullb_lane_z8_s32, svint32_t, svint16_t, z8,
+                   z0 = svmullb_lane_s32 (z1, z8, 1),
+                   z0 = svmullb_lane (z1, z8, 1))
+
+/*
+** mullb_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     smullb  z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mullb_lane_z16_s32, svint32_t, svint16_t, z16,
+                   z0 = svmullb_lane_s32 (z1, z16, 1),
+                   z0 = svmullb_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_lane_s64.c
new file mode 100644 (file)
index 0000000..0ec4906
--- /dev/null
@@ -0,0 +1,78 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullb_lane_0_s64_tied1:
+**     smullb  z0\.d, z0\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_0_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svmullb_lane_s64 (z0, z1, 0),
+                   z0_res = svmullb_lane (z0, z1, 0))
+
+/*
+** mullb_lane_0_s64_tied2:
+**     smullb  z0\.d, z1\.s, z0\.s\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_0_s64_tied2, svint64_t, svint32_t,
+                   z0_res = svmullb_lane_s64 (z1, z0, 0),
+                   z0_res = svmullb_lane (z1, z0, 0))
+
+/*
+** mullb_lane_0_s64_untied:
+**     smullb  z0\.d, z1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_0_s64_untied, svint64_t, svint32_t,
+                   z0_res = svmullb_lane_s64 (z1, z2, 0),
+                   z0_res = svmullb_lane (z1, z2, 0))
+
+/*
+** mullb_lane_1_s64:
+**     smullb  z0\.d, z1\.s, z2\.s\[1\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_1_s64, svint64_t, svint32_t,
+                   z0_res = svmullb_lane_s64 (z1, z2, 1),
+                   z0_res = svmullb_lane (z1, z2, 1))
+
+/*
+** mullb_lane_2_s64:
+**     smullb  z0\.d, z1\.s, z2\.s\[2\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_2_s64, svint64_t, svint32_t,
+                   z0_res = svmullb_lane_s64 (z1, z2, 2),
+                   z0_res = svmullb_lane (z1, z2, 2))
+
+/*
+** mullb_lane_3_s64:
+**     smullb  z0\.d, z1\.s, z2\.s\[3\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_3_s64, svint64_t, svint32_t,
+                   z0_res = svmullb_lane_s64 (z1, z2, 3),
+                   z0_res = svmullb_lane (z1, z2, 3))
+
+/*
+** mullb_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     smullb  z0\.d, z1\.s, z15\.s\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mullb_lane_z15_s64, svint64_t, svint32_t, z15,
+                   z0 = svmullb_lane_s64 (z1, z15, 1),
+                   z0 = svmullb_lane (z1, z15, 1))
+
+/*
+** mullb_lane_z16_s64:
+**     mov     (z[0-9]|z1[0-5])\.d, z16\.d
+**     smullb  z0\.d, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mullb_lane_z16_s64, svint64_t, svint32_t, z16,
+                   z0 = svmullb_lane_s64 (z1, z16, 1),
+                   z0 = svmullb_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_lane_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_lane_u32.c
new file mode 100644 (file)
index 0000000..d528736
--- /dev/null
@@ -0,0 +1,115 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullb_lane_0_u32_tied1:
+**     umullb  z0\.s, z0\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_0_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svmullb_lane_u32 (z0, z1, 0),
+                   z0_res = svmullb_lane (z0, z1, 0))
+
+/*
+** mullb_lane_0_u32_tied2:
+**     umullb  z0\.s, z1\.h, z0\.h\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_0_u32_tied2, svuint32_t, svuint16_t,
+                   z0_res = svmullb_lane_u32 (z1, z0, 0),
+                   z0_res = svmullb_lane (z1, z0, 0))
+
+/*
+** mullb_lane_0_u32_untied:
+**     umullb  z0\.s, z1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_0_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svmullb_lane_u32 (z1, z2, 0),
+                   z0_res = svmullb_lane (z1, z2, 0))
+
+/*
+** mullb_lane_1_u32:
+**     umullb  z0\.s, z1\.h, z2\.h\[1\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_1_u32, svuint32_t, svuint16_t,
+                   z0_res = svmullb_lane_u32 (z1, z2, 1),
+                   z0_res = svmullb_lane (z1, z2, 1))
+
+/*
+** mullb_lane_2_u32:
+**     umullb  z0\.s, z1\.h, z2\.h\[2\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_2_u32, svuint32_t, svuint16_t,
+                   z0_res = svmullb_lane_u32 (z1, z2, 2),
+                   z0_res = svmullb_lane (z1, z2, 2))
+
+/*
+** mullb_lane_3_u32:
+**     umullb  z0\.s, z1\.h, z2\.h\[3\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_3_u32, svuint32_t, svuint16_t,
+                   z0_res = svmullb_lane_u32 (z1, z2, 3),
+                   z0_res = svmullb_lane (z1, z2, 3))
+
+/*
+** mullb_lane_4_u32:
+**     umullb  z0\.s, z1\.h, z2\.h\[4\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_4_u32, svuint32_t, svuint16_t,
+                   z0_res = svmullb_lane_u32 (z1, z2, 4),
+                   z0_res = svmullb_lane (z1, z2, 4))
+
+/*
+** mullb_lane_5_u32:
+**     umullb  z0\.s, z1\.h, z2\.h\[5\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_5_u32, svuint32_t, svuint16_t,
+                   z0_res = svmullb_lane_u32 (z1, z2, 5),
+                   z0_res = svmullb_lane (z1, z2, 5))
+
+/*
+** mullb_lane_6_u32:
+**     umullb  z0\.s, z1\.h, z2\.h\[6\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_6_u32, svuint32_t, svuint16_t,
+                   z0_res = svmullb_lane_u32 (z1, z2, 6),
+                   z0_res = svmullb_lane (z1, z2, 6))
+
+/*
+** mullb_lane_7_u32:
+**     umullb  z0\.s, z1\.h, z2\.h\[7\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_7_u32, svuint32_t, svuint16_t,
+                   z0_res = svmullb_lane_u32 (z1, z2, 7),
+                   z0_res = svmullb_lane (z1, z2, 7))
+
+/*
+** mullb_lane_z8_u32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     umullb  z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mullb_lane_z8_u32, svuint32_t, svuint16_t, z8,
+                   z0 = svmullb_lane_u32 (z1, z8, 1),
+                   z0 = svmullb_lane (z1, z8, 1))
+
+/*
+** mullb_lane_z16_u32:
+**     mov     (z[0-7])\.d, z16\.d
+**     umullb  z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mullb_lane_z16_u32, svuint32_t, svuint16_t, z16,
+                   z0 = svmullb_lane_u32 (z1, z16, 1),
+                   z0 = svmullb_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_lane_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_lane_u64.c
new file mode 100644 (file)
index 0000000..a4fdddb
--- /dev/null
@@ -0,0 +1,78 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullb_lane_0_u64_tied1:
+**     umullb  z0\.d, z0\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_0_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svmullb_lane_u64 (z0, z1, 0),
+                   z0_res = svmullb_lane (z0, z1, 0))
+
+/*
+** mullb_lane_0_u64_tied2:
+**     umullb  z0\.d, z1\.s, z0\.s\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_0_u64_tied2, svuint64_t, svuint32_t,
+                   z0_res = svmullb_lane_u64 (z1, z0, 0),
+                   z0_res = svmullb_lane (z1, z0, 0))
+
+/*
+** mullb_lane_0_u64_untied:
+**     umullb  z0\.d, z1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_0_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svmullb_lane_u64 (z1, z2, 0),
+                   z0_res = svmullb_lane (z1, z2, 0))
+
+/*
+** mullb_lane_1_u64:
+**     umullb  z0\.d, z1\.s, z2\.s\[1\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_1_u64, svuint64_t, svuint32_t,
+                   z0_res = svmullb_lane_u64 (z1, z2, 1),
+                   z0_res = svmullb_lane (z1, z2, 1))
+
+/*
+** mullb_lane_2_u64:
+**     umullb  z0\.d, z1\.s, z2\.s\[2\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_2_u64, svuint64_t, svuint32_t,
+                   z0_res = svmullb_lane_u64 (z1, z2, 2),
+                   z0_res = svmullb_lane (z1, z2, 2))
+
+/*
+** mullb_lane_3_u64:
+**     umullb  z0\.d, z1\.s, z2\.s\[3\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_lane_3_u64, svuint64_t, svuint32_t,
+                   z0_res = svmullb_lane_u64 (z1, z2, 3),
+                   z0_res = svmullb_lane (z1, z2, 3))
+
+/*
+** mullb_lane_z15_u64:
+**     str     d15, \[sp, -16\]!
+**     umullb  z0\.d, z1\.s, z15\.s\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mullb_lane_z15_u64, svuint64_t, svuint32_t, z15,
+                   z0 = svmullb_lane_u64 (z1, z15, 1),
+                   z0 = svmullb_lane (z1, z15, 1))
+
+/*
+** mullb_lane_z16_u64:
+**     mov     (z[0-9]|z1[0-5])\.d, z16\.d
+**     umullb  z0\.d, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mullb_lane_z16_u64, svuint64_t, svuint32_t, z16,
+                   z0 = svmullb_lane_u64 (z1, z16, 1),
+                   z0 = svmullb_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_s16.c
new file mode 100644 (file)
index 0000000..9d6eb85
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullb_s16_tied1:
+**     smullb  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svmullb_s16 (z0, z1),
+                   z0_res = svmullb (z0, z1))
+
+/*
+** mullb_s16_tied2:
+**     smullb  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_s16_tied2, svint16_t, svint8_t,
+                   z0_res = svmullb_s16 (z1, z0),
+                   z0_res = svmullb (z1, z0))
+
+/*
+** mullb_s16_untied:
+**     smullb  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_s16_untied, svint16_t, svint8_t,
+                   z0_res = svmullb_s16 (z1, z2),
+                   z0_res = svmullb (z1, z2))
+
+/*
+** mullb_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     smullb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullb_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+                    z0_res = svmullb_n_s16 (z0, x0),
+                    z0_res = svmullb (z0, x0))
+
+/*
+** mullb_w0_s16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     smullb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullb_w0_s16_untied, svint16_t, svint8_t, int8_t,
+                    z0_res = svmullb_n_s16 (z1, x0),
+                    z0_res = svmullb (z1, x0))
+
+/*
+** mullb_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     smullb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_11_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svmullb_n_s16 (z0, 11),
+                   z0_res = svmullb (z0, 11))
+
+/*
+** mullb_11_s16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     smullb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_11_s16_untied, svint16_t, svint8_t,
+                   z0_res = svmullb_n_s16 (z1, 11),
+                   z0_res = svmullb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_s32.c
new file mode 100644 (file)
index 0000000..0f315c2
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullb_s32_tied1:
+**     smullb  z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svmullb_s32 (z0, z1),
+                   z0_res = svmullb (z0, z1))
+
+/*
+** mullb_s32_tied2:
+**     smullb  z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_s32_tied2, svint32_t, svint16_t,
+                   z0_res = svmullb_s32 (z1, z0),
+                   z0_res = svmullb (z1, z0))
+
+/*
+** mullb_s32_untied:
+**     smullb  z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_s32_untied, svint32_t, svint16_t,
+                   z0_res = svmullb_s32 (z1, z2),
+                   z0_res = svmullb (z1, z2))
+
+/*
+** mullb_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     smullb  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullb_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+                    z0_res = svmullb_n_s32 (z0, x0),
+                    z0_res = svmullb (z0, x0))
+
+/*
+** mullb_w0_s32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     smullb  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullb_w0_s32_untied, svint32_t, svint16_t, int16_t,
+                    z0_res = svmullb_n_s32 (z1, x0),
+                    z0_res = svmullb (z1, x0))
+
+/*
+** mullb_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     smullb  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_11_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svmullb_n_s32 (z0, 11),
+                   z0_res = svmullb (z0, 11))
+
+/*
+** mullb_11_s32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     smullb  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_11_s32_untied, svint32_t, svint16_t,
+                   z0_res = svmullb_n_s32 (z1, 11),
+                   z0_res = svmullb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_s64.c
new file mode 100644 (file)
index 0000000..1f48cb8
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullb_s64_tied1:
+**     smullb  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svmullb_s64 (z0, z1),
+                   z0_res = svmullb (z0, z1))
+
+/*
+** mullb_s64_tied2:
+**     smullb  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_s64_tied2, svint64_t, svint32_t,
+                   z0_res = svmullb_s64 (z1, z0),
+                   z0_res = svmullb (z1, z0))
+
+/*
+** mullb_s64_untied:
+**     smullb  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_s64_untied, svint64_t, svint32_t,
+                   z0_res = svmullb_s64 (z1, z2),
+                   z0_res = svmullb (z1, z2))
+
+/*
+** mullb_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     smullb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullb_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+                    z0_res = svmullb_n_s64 (z0, x0),
+                    z0_res = svmullb (z0, x0))
+
+/*
+** mullb_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     smullb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullb_w0_s64_untied, svint64_t, svint32_t, int32_t,
+                    z0_res = svmullb_n_s64 (z1, x0),
+                    z0_res = svmullb (z1, x0))
+
+/*
+** mullb_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     smullb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_11_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svmullb_n_s64 (z0, 11),
+                   z0_res = svmullb (z0, 11))
+
+/*
+** mullb_11_s64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     smullb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_11_s64_untied, svint64_t, svint32_t,
+                   z0_res = svmullb_n_s64 (z1, 11),
+                   z0_res = svmullb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_u16.c
new file mode 100644 (file)
index 0000000..2f03aff
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullb_u16_tied1:
+**     umullb  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svmullb_u16 (z0, z1),
+                   z0_res = svmullb (z0, z1))
+
+/*
+** mullb_u16_tied2:
+**     umullb  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_u16_tied2, svuint16_t, svuint8_t,
+                   z0_res = svmullb_u16 (z1, z0),
+                   z0_res = svmullb (z1, z0))
+
+/*
+** mullb_u16_untied:
+**     umullb  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svmullb_u16 (z1, z2),
+                   z0_res = svmullb (z1, z2))
+
+/*
+** mullb_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     umullb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullb_w0_u16_tied1, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svmullb_n_u16 (z0, x0),
+                    z0_res = svmullb (z0, x0))
+
+/*
+** mullb_w0_u16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     umullb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullb_w0_u16_untied, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svmullb_n_u16 (z1, x0),
+                    z0_res = svmullb (z1, x0))
+
+/*
+** mullb_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     umullb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_11_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svmullb_n_u16 (z0, 11),
+                   z0_res = svmullb (z0, 11))
+
+/*
+** mullb_11_u16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     umullb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_11_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svmullb_n_u16 (z1, 11),
+                   z0_res = svmullb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_u32.c
new file mode 100644 (file)
index 0000000..f61ad54
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullb_u32_tied1:
+**     umullb  z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svmullb_u32 (z0, z1),
+                   z0_res = svmullb (z0, z1))
+
+/*
+** mullb_u32_tied2:
+**     umullb  z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_u32_tied2, svuint32_t, svuint16_t,
+                   z0_res = svmullb_u32 (z1, z0),
+                   z0_res = svmullb (z1, z0))
+
+/*
+** mullb_u32_untied:
+**     umullb  z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svmullb_u32 (z1, z2),
+                   z0_res = svmullb (z1, z2))
+
+/*
+** mullb_w0_u32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     umullb  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullb_w0_u32_tied1, svuint32_t, svuint16_t, uint16_t,
+                    z0_res = svmullb_n_u32 (z0, x0),
+                    z0_res = svmullb (z0, x0))
+
+/*
+** mullb_w0_u32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     umullb  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullb_w0_u32_untied, svuint32_t, svuint16_t, uint16_t,
+                    z0_res = svmullb_n_u32 (z1, x0),
+                    z0_res = svmullb (z1, x0))
+
+/*
+** mullb_11_u32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     umullb  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_11_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svmullb_n_u32 (z0, 11),
+                   z0_res = svmullb (z0, 11))
+
+/*
+** mullb_11_u32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     umullb  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_11_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svmullb_n_u32 (z1, 11),
+                   z0_res = svmullb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullb_u64.c
new file mode 100644 (file)
index 0000000..726a0f1
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullb_u64_tied1:
+**     umullb  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svmullb_u64 (z0, z1),
+                   z0_res = svmullb (z0, z1))
+
+/*
+** mullb_u64_tied2:
+**     umullb  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_u64_tied2, svuint64_t, svuint32_t,
+                   z0_res = svmullb_u64 (z1, z0),
+                   z0_res = svmullb (z1, z0))
+
+/*
+** mullb_u64_untied:
+**     umullb  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svmullb_u64 (z1, z2),
+                   z0_res = svmullb (z1, z2))
+
+/*
+** mullb_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     umullb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullb_w0_u64_tied1, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svmullb_n_u64 (z0, x0),
+                    z0_res = svmullb (z0, x0))
+
+/*
+** mullb_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     umullb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullb_w0_u64_untied, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svmullb_n_u64 (z1, x0),
+                    z0_res = svmullb (z1, x0))
+
+/*
+** mullb_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     umullb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_11_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svmullb_n_u64 (z0, 11),
+                   z0_res = svmullb (z0, 11))
+
+/*
+** mullb_11_u64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     umullb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullb_11_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svmullb_n_u64 (z1, 11),
+                   z0_res = svmullb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_lane_s32.c
new file mode 100644 (file)
index 0000000..6213d88
--- /dev/null
@@ -0,0 +1,115 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullt_lane_0_s32_tied1:
+**     smullt  z0\.s, z0\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_0_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svmullt_lane_s32 (z0, z1, 0),
+                   z0_res = svmullt_lane (z0, z1, 0))
+
+/*
+** mullt_lane_0_s32_tied2:
+**     smullt  z0\.s, z1\.h, z0\.h\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_0_s32_tied2, svint32_t, svint16_t,
+                   z0_res = svmullt_lane_s32 (z1, z0, 0),
+                   z0_res = svmullt_lane (z1, z0, 0))
+
+/*
+** mullt_lane_0_s32_untied:
+**     smullt  z0\.s, z1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_0_s32_untied, svint32_t, svint16_t,
+                   z0_res = svmullt_lane_s32 (z1, z2, 0),
+                   z0_res = svmullt_lane (z1, z2, 0))
+
+/*
+** mullt_lane_1_s32:
+**     smullt  z0\.s, z1\.h, z2\.h\[1\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_1_s32, svint32_t, svint16_t,
+                   z0_res = svmullt_lane_s32 (z1, z2, 1),
+                   z0_res = svmullt_lane (z1, z2, 1))
+
+/*
+** mullt_lane_2_s32:
+**     smullt  z0\.s, z1\.h, z2\.h\[2\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_2_s32, svint32_t, svint16_t,
+                   z0_res = svmullt_lane_s32 (z1, z2, 2),
+                   z0_res = svmullt_lane (z1, z2, 2))
+
+/*
+** mullt_lane_3_s32:
+**     smullt  z0\.s, z1\.h, z2\.h\[3\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_3_s32, svint32_t, svint16_t,
+                   z0_res = svmullt_lane_s32 (z1, z2, 3),
+                   z0_res = svmullt_lane (z1, z2, 3))
+
+/*
+** mullt_lane_4_s32:
+**     smullt  z0\.s, z1\.h, z2\.h\[4\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_4_s32, svint32_t, svint16_t,
+                   z0_res = svmullt_lane_s32 (z1, z2, 4),
+                   z0_res = svmullt_lane (z1, z2, 4))
+
+/*
+** mullt_lane_5_s32:
+**     smullt  z0\.s, z1\.h, z2\.h\[5\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_5_s32, svint32_t, svint16_t,
+                   z0_res = svmullt_lane_s32 (z1, z2, 5),
+                   z0_res = svmullt_lane (z1, z2, 5))
+
+/*
+** mullt_lane_6_s32:
+**     smullt  z0\.s, z1\.h, z2\.h\[6\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_6_s32, svint32_t, svint16_t,
+                   z0_res = svmullt_lane_s32 (z1, z2, 6),
+                   z0_res = svmullt_lane (z1, z2, 6))
+
+/*
+** mullt_lane_7_s32:
+**     smullt  z0\.s, z1\.h, z2\.h\[7\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_7_s32, svint32_t, svint16_t,
+                   z0_res = svmullt_lane_s32 (z1, z2, 7),
+                   z0_res = svmullt_lane (z1, z2, 7))
+
+/*
+** mullt_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     smullt  z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mullt_lane_z8_s32, svint32_t, svint16_t, z8,
+                   z0 = svmullt_lane_s32 (z1, z8, 1),
+                   z0 = svmullt_lane (z1, z8, 1))
+
+/*
+** mullt_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     smullt  z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mullt_lane_z16_s32, svint32_t, svint16_t, z16,
+                   z0 = svmullt_lane_s32 (z1, z16, 1),
+                   z0 = svmullt_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_lane_s64.c
new file mode 100644 (file)
index 0000000..ad4aa39
--- /dev/null
@@ -0,0 +1,78 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullt_lane_0_s64_tied1:
+**     smullt  z0\.d, z0\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_0_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svmullt_lane_s64 (z0, z1, 0),
+                   z0_res = svmullt_lane (z0, z1, 0))
+
+/*
+** mullt_lane_0_s64_tied2:
+**     smullt  z0\.d, z1\.s, z0\.s\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_0_s64_tied2, svint64_t, svint32_t,
+                   z0_res = svmullt_lane_s64 (z1, z0, 0),
+                   z0_res = svmullt_lane (z1, z0, 0))
+
+/*
+** mullt_lane_0_s64_untied:
+**     smullt  z0\.d, z1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_0_s64_untied, svint64_t, svint32_t,
+                   z0_res = svmullt_lane_s64 (z1, z2, 0),
+                   z0_res = svmullt_lane (z1, z2, 0))
+
+/*
+** mullt_lane_1_s64:
+**     smullt  z0\.d, z1\.s, z2\.s\[1\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_1_s64, svint64_t, svint32_t,
+                   z0_res = svmullt_lane_s64 (z1, z2, 1),
+                   z0_res = svmullt_lane (z1, z2, 1))
+
+/*
+** mullt_lane_2_s64:
+**     smullt  z0\.d, z1\.s, z2\.s\[2\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_2_s64, svint64_t, svint32_t,
+                   z0_res = svmullt_lane_s64 (z1, z2, 2),
+                   z0_res = svmullt_lane (z1, z2, 2))
+
+/*
+** mullt_lane_3_s64:
+**     smullt  z0\.d, z1\.s, z2\.s\[3\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_3_s64, svint64_t, svint32_t,
+                   z0_res = svmullt_lane_s64 (z1, z2, 3),
+                   z0_res = svmullt_lane (z1, z2, 3))
+
+/*
+** mullt_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     smullt  z0\.d, z1\.s, z15\.s\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mullt_lane_z15_s64, svint64_t, svint32_t, z15,
+                   z0 = svmullt_lane_s64 (z1, z15, 1),
+                   z0 = svmullt_lane (z1, z15, 1))
+
+/*
+** mullt_lane_z16_s64:
+**     mov     (z[0-9]|z1[0-5])\.d, z16\.d
+**     smullt  z0\.d, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mullt_lane_z16_s64, svint64_t, svint32_t, z16,
+                   z0 = svmullt_lane_s64 (z1, z16, 1),
+                   z0 = svmullt_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_lane_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_lane_u32.c
new file mode 100644 (file)
index 0000000..c0a8a33
--- /dev/null
@@ -0,0 +1,115 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullt_lane_0_u32_tied1:
+**     umullt  z0\.s, z0\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_0_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svmullt_lane_u32 (z0, z1, 0),
+                   z0_res = svmullt_lane (z0, z1, 0))
+
+/*
+** mullt_lane_0_u32_tied2:
+**     umullt  z0\.s, z1\.h, z0\.h\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_0_u32_tied2, svuint32_t, svuint16_t,
+                   z0_res = svmullt_lane_u32 (z1, z0, 0),
+                   z0_res = svmullt_lane (z1, z0, 0))
+
+/*
+** mullt_lane_0_u32_untied:
+**     umullt  z0\.s, z1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_0_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svmullt_lane_u32 (z1, z2, 0),
+                   z0_res = svmullt_lane (z1, z2, 0))
+
+/*
+** mullt_lane_1_u32:
+**     umullt  z0\.s, z1\.h, z2\.h\[1\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_1_u32, svuint32_t, svuint16_t,
+                   z0_res = svmullt_lane_u32 (z1, z2, 1),
+                   z0_res = svmullt_lane (z1, z2, 1))
+
+/*
+** mullt_lane_2_u32:
+**     umullt  z0\.s, z1\.h, z2\.h\[2\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_2_u32, svuint32_t, svuint16_t,
+                   z0_res = svmullt_lane_u32 (z1, z2, 2),
+                   z0_res = svmullt_lane (z1, z2, 2))
+
+/*
+** mullt_lane_3_u32:
+**     umullt  z0\.s, z1\.h, z2\.h\[3\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_3_u32, svuint32_t, svuint16_t,
+                   z0_res = svmullt_lane_u32 (z1, z2, 3),
+                   z0_res = svmullt_lane (z1, z2, 3))
+
+/*
+** mullt_lane_4_u32:
+**     umullt  z0\.s, z1\.h, z2\.h\[4\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_4_u32, svuint32_t, svuint16_t,
+                   z0_res = svmullt_lane_u32 (z1, z2, 4),
+                   z0_res = svmullt_lane (z1, z2, 4))
+
+/*
+** mullt_lane_5_u32:
+**     umullt  z0\.s, z1\.h, z2\.h\[5\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_5_u32, svuint32_t, svuint16_t,
+                   z0_res = svmullt_lane_u32 (z1, z2, 5),
+                   z0_res = svmullt_lane (z1, z2, 5))
+
+/*
+** mullt_lane_6_u32:
+**     umullt  z0\.s, z1\.h, z2\.h\[6\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_6_u32, svuint32_t, svuint16_t,
+                   z0_res = svmullt_lane_u32 (z1, z2, 6),
+                   z0_res = svmullt_lane (z1, z2, 6))
+
+/*
+** mullt_lane_7_u32:
+**     umullt  z0\.s, z1\.h, z2\.h\[7\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_7_u32, svuint32_t, svuint16_t,
+                   z0_res = svmullt_lane_u32 (z1, z2, 7),
+                   z0_res = svmullt_lane (z1, z2, 7))
+
+/*
+** mullt_lane_z8_u32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     umullt  z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mullt_lane_z8_u32, svuint32_t, svuint16_t, z8,
+                   z0 = svmullt_lane_u32 (z1, z8, 1),
+                   z0 = svmullt_lane (z1, z8, 1))
+
+/*
+** mullt_lane_z16_u32:
+**     mov     (z[0-7])\.d, z16\.d
+**     umullt  z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mullt_lane_z16_u32, svuint32_t, svuint16_t, z16,
+                   z0 = svmullt_lane_u32 (z1, z16, 1),
+                   z0 = svmullt_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_lane_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_lane_u64.c
new file mode 100644 (file)
index 0000000..48e5aad
--- /dev/null
@@ -0,0 +1,78 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullt_lane_0_u64_tied1:
+**     umullt  z0\.d, z0\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_0_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svmullt_lane_u64 (z0, z1, 0),
+                   z0_res = svmullt_lane (z0, z1, 0))
+
+/*
+** mullt_lane_0_u64_tied2:
+**     umullt  z0\.d, z1\.s, z0\.s\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_0_u64_tied2, svuint64_t, svuint32_t,
+                   z0_res = svmullt_lane_u64 (z1, z0, 0),
+                   z0_res = svmullt_lane (z1, z0, 0))
+
+/*
+** mullt_lane_0_u64_untied:
+**     umullt  z0\.d, z1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_0_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svmullt_lane_u64 (z1, z2, 0),
+                   z0_res = svmullt_lane (z1, z2, 0))
+
+/*
+** mullt_lane_1_u64:
+**     umullt  z0\.d, z1\.s, z2\.s\[1\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_1_u64, svuint64_t, svuint32_t,
+                   z0_res = svmullt_lane_u64 (z1, z2, 1),
+                   z0_res = svmullt_lane (z1, z2, 1))
+
+/*
+** mullt_lane_2_u64:
+**     umullt  z0\.d, z1\.s, z2\.s\[2\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_2_u64, svuint64_t, svuint32_t,
+                   z0_res = svmullt_lane_u64 (z1, z2, 2),
+                   z0_res = svmullt_lane (z1, z2, 2))
+
+/*
+** mullt_lane_3_u64:
+**     umullt  z0\.d, z1\.s, z2\.s\[3\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_lane_3_u64, svuint64_t, svuint32_t,
+                   z0_res = svmullt_lane_u64 (z1, z2, 3),
+                   z0_res = svmullt_lane (z1, z2, 3))
+
+/*
+** mullt_lane_z15_u64:
+**     str     d15, \[sp, -16\]!
+**     umullt  z0\.d, z1\.s, z15\.s\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (mullt_lane_z15_u64, svuint64_t, svuint32_t, z15,
+                   z0 = svmullt_lane_u64 (z1, z15, 1),
+                   z0 = svmullt_lane (z1, z15, 1))
+
+/*
+** mullt_lane_z16_u64:
+**     mov     (z[0-9]|z1[0-5])\.d, z16\.d
+**     umullt  z0\.d, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (mullt_lane_z16_u64, svuint64_t, svuint32_t, z16,
+                   z0 = svmullt_lane_u64 (z1, z16, 1),
+                   z0 = svmullt_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_s16.c
new file mode 100644 (file)
index 0000000..c1ff07f
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullt_s16_tied1:
+**     smullt  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svmullt_s16 (z0, z1),
+                   z0_res = svmullt (z0, z1))
+
+/*
+** mullt_s16_tied2:
+**     smullt  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_s16_tied2, svint16_t, svint8_t,
+                   z0_res = svmullt_s16 (z1, z0),
+                   z0_res = svmullt (z1, z0))
+
+/*
+** mullt_s16_untied:
+**     smullt  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_s16_untied, svint16_t, svint8_t,
+                   z0_res = svmullt_s16 (z1, z2),
+                   z0_res = svmullt (z1, z2))
+
+/*
+** mullt_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     smullt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullt_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+                    z0_res = svmullt_n_s16 (z0, x0),
+                    z0_res = svmullt (z0, x0))
+
+/*
+** mullt_w0_s16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     smullt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullt_w0_s16_untied, svint16_t, svint8_t, int8_t,
+                    z0_res = svmullt_n_s16 (z1, x0),
+                    z0_res = svmullt (z1, x0))
+
+/*
+** mullt_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     smullt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_11_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svmullt_n_s16 (z0, 11),
+                   z0_res = svmullt (z0, 11))
+
+/*
+** mullt_11_s16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     smullt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_11_s16_untied, svint16_t, svint8_t,
+                   z0_res = svmullt_n_s16 (z1, 11),
+                   z0_res = svmullt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_s32.c
new file mode 100644 (file)
index 0000000..d557cc5
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullt_s32_tied1:
+**     smullt  z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svmullt_s32 (z0, z1),
+                   z0_res = svmullt (z0, z1))
+
+/*
+** mullt_s32_tied2:
+**     smullt  z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_s32_tied2, svint32_t, svint16_t,
+                   z0_res = svmullt_s32 (z1, z0),
+                   z0_res = svmullt (z1, z0))
+
+/*
+** mullt_s32_untied:
+**     smullt  z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_s32_untied, svint32_t, svint16_t,
+                   z0_res = svmullt_s32 (z1, z2),
+                   z0_res = svmullt (z1, z2))
+
+/*
+** mullt_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     smullt  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullt_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+                    z0_res = svmullt_n_s32 (z0, x0),
+                    z0_res = svmullt (z0, x0))
+
+/*
+** mullt_w0_s32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     smullt  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullt_w0_s32_untied, svint32_t, svint16_t, int16_t,
+                    z0_res = svmullt_n_s32 (z1, x0),
+                    z0_res = svmullt (z1, x0))
+
+/*
+** mullt_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     smullt  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_11_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svmullt_n_s32 (z0, 11),
+                   z0_res = svmullt (z0, 11))
+
+/*
+** mullt_11_s32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     smullt  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_11_s32_untied, svint32_t, svint16_t,
+                   z0_res = svmullt_n_s32 (z1, 11),
+                   z0_res = svmullt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_s64.c
new file mode 100644 (file)
index 0000000..fb13d4f
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullt_s64_tied1:
+**     smullt  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svmullt_s64 (z0, z1),
+                   z0_res = svmullt (z0, z1))
+
+/*
+** mullt_s64_tied2:
+**     smullt  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_s64_tied2, svint64_t, svint32_t,
+                   z0_res = svmullt_s64 (z1, z0),
+                   z0_res = svmullt (z1, z0))
+
+/*
+** mullt_s64_untied:
+**     smullt  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_s64_untied, svint64_t, svint32_t,
+                   z0_res = svmullt_s64 (z1, z2),
+                   z0_res = svmullt (z1, z2))
+
+/*
+** mullt_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     smullt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullt_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+                    z0_res = svmullt_n_s64 (z0, x0),
+                    z0_res = svmullt (z0, x0))
+
+/*
+** mullt_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     smullt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullt_w0_s64_untied, svint64_t, svint32_t, int32_t,
+                    z0_res = svmullt_n_s64 (z1, x0),
+                    z0_res = svmullt (z1, x0))
+
+/*
+** mullt_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     smullt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_11_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svmullt_n_s64 (z0, 11),
+                   z0_res = svmullt (z0, 11))
+
+/*
+** mullt_11_s64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     smullt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_11_s64_untied, svint64_t, svint32_t,
+                   z0_res = svmullt_n_s64 (z1, 11),
+                   z0_res = svmullt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_u16.c
new file mode 100644 (file)
index 0000000..39e3cdc
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullt_u16_tied1:
+**     umullt  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svmullt_u16 (z0, z1),
+                   z0_res = svmullt (z0, z1))
+
+/*
+** mullt_u16_tied2:
+**     umullt  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_u16_tied2, svuint16_t, svuint8_t,
+                   z0_res = svmullt_u16 (z1, z0),
+                   z0_res = svmullt (z1, z0))
+
+/*
+** mullt_u16_untied:
+**     umullt  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svmullt_u16 (z1, z2),
+                   z0_res = svmullt (z1, z2))
+
+/*
+** mullt_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     umullt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullt_w0_u16_tied1, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svmullt_n_u16 (z0, x0),
+                    z0_res = svmullt (z0, x0))
+
+/*
+** mullt_w0_u16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     umullt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullt_w0_u16_untied, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svmullt_n_u16 (z1, x0),
+                    z0_res = svmullt (z1, x0))
+
+/*
+** mullt_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     umullt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_11_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svmullt_n_u16 (z0, 11),
+                   z0_res = svmullt (z0, 11))
+
+/*
+** mullt_11_u16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     umullt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_11_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svmullt_n_u16 (z1, 11),
+                   z0_res = svmullt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_u32.c
new file mode 100644 (file)
index 0000000..a16bc48
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullt_u32_tied1:
+**     umullt  z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svmullt_u32 (z0, z1),
+                   z0_res = svmullt (z0, z1))
+
+/*
+** mullt_u32_tied2:
+**     umullt  z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_u32_tied2, svuint32_t, svuint16_t,
+                   z0_res = svmullt_u32 (z1, z0),
+                   z0_res = svmullt (z1, z0))
+
+/*
+** mullt_u32_untied:
+**     umullt  z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svmullt_u32 (z1, z2),
+                   z0_res = svmullt (z1, z2))
+
+/*
+** mullt_w0_u32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     umullt  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullt_w0_u32_tied1, svuint32_t, svuint16_t, uint16_t,
+                    z0_res = svmullt_n_u32 (z0, x0),
+                    z0_res = svmullt (z0, x0))
+
+/*
+** mullt_w0_u32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     umullt  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullt_w0_u32_untied, svuint32_t, svuint16_t, uint16_t,
+                    z0_res = svmullt_n_u32 (z1, x0),
+                    z0_res = svmullt (z1, x0))
+
+/*
+** mullt_11_u32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     umullt  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_11_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svmullt_n_u32 (z0, 11),
+                   z0_res = svmullt (z0, 11))
+
+/*
+** mullt_11_u32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     umullt  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_11_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svmullt_n_u32 (z1, 11),
+                   z0_res = svmullt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/mullt_u64.c
new file mode 100644 (file)
index 0000000..e1b3c89
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** mullt_u64_tied1:
+**     umullt  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svmullt_u64 (z0, z1),
+                   z0_res = svmullt (z0, z1))
+
+/*
+** mullt_u64_tied2:
+**     umullt  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_u64_tied2, svuint64_t, svuint32_t,
+                   z0_res = svmullt_u64 (z1, z0),
+                   z0_res = svmullt (z1, z0))
+
+/*
+** mullt_u64_untied:
+**     umullt  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svmullt_u64 (z1, z2),
+                   z0_res = svmullt (z1, z2))
+
+/*
+** mullt_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     umullt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullt_w0_u64_tied1, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svmullt_n_u64 (z0, x0),
+                    z0_res = svmullt (z0, x0))
+
+/*
+** mullt_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     umullt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (mullt_w0_u64_untied, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svmullt_n_u64 (z1, x0),
+                    z0_res = svmullt (z1, x0))
+
+/*
+** mullt_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     umullt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_11_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svmullt_n_u64 (z0, 11),
+                   z0_res = svmullt (z0, 11))
+
+/*
+** mullt_11_u64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     umullt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (mullt_11_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svmullt_n_u64 (z1, 11),
+                   z0_res = svmullt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_s16.c
new file mode 100644 (file)
index 0000000..4b1255c
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** nbsl_s16_tied1:
+**     nbsl    z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_s16_tied1, svint16_t,
+               z0 = svnbsl_s16 (z0, z1, z2),
+               z0 = svnbsl (z0, z1, z2))
+
+/*
+** nbsl_s16_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_s16_tied2, svint16_t,
+               z0 = svnbsl_s16 (z1, z0, z2),
+               z0 = svnbsl (z1, z0, z2))
+
+/*
+** nbsl_s16_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_s16_tied3, svint16_t,
+               z0 = svnbsl_s16 (z1, z2, z0),
+               z0 = svnbsl (z1, z2, z0))
+
+/*
+** nbsl_s16_untied:
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_s16_untied, svint16_t,
+               z0 = svnbsl_s16 (z1, z2, z3),
+               z0 = svnbsl (z1, z2, z3))
+
+/*
+** nbsl_w0_s16_tied1:
+**     mov     (z[0-9]+)\.h, w0
+**     nbsl    z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_w0_s16_tied1, svint16_t, int16_t,
+                z0 = svnbsl_n_s16 (z0, z1, x0),
+                z0 = svnbsl (z0, z1, x0))
+
+/*
+** nbsl_w0_s16_tied2:
+**     mov     (z[0-9]+)\.h, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_w0_s16_tied2, svint16_t, int16_t,
+                z0 = svnbsl_n_s16 (z1, z0, x0),
+                z0 = svnbsl (z1, z0, x0))
+
+/*
+** nbsl_w0_s16_untied:
+**     mov     (z[0-9]+)\.h, w0
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_w0_s16_untied, svint16_t, int16_t,
+                z0 = svnbsl_n_s16 (z1, z2, x0),
+                z0 = svnbsl (z1, z2, x0))
+
+/*
+** nbsl_11_s16_tied1:
+**     mov     (z[0-9]+)\.h, #11
+**     nbsl    z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_s16_tied1, svint16_t,
+               z0 = svnbsl_n_s16 (z0, z1, 11),
+               z0 = svnbsl (z0, z1, 11))
+
+/*
+** nbsl_11_s16_tied2:
+**     mov     (z[0-9]+)\.h, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_s16_tied2, svint16_t,
+               z0 = svnbsl_n_s16 (z1, z0, 11),
+               z0 = svnbsl (z1, z0, 11))
+
+/*
+** nbsl_11_s16_untied:
+**     mov     (z[0-9]+)\.h, #11
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_s16_untied, svint16_t,
+               z0 = svnbsl_n_s16 (z1, z2, 11),
+               z0 = svnbsl (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_s32.c
new file mode 100644 (file)
index 0000000..2bc94be
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** nbsl_s32_tied1:
+**     nbsl    z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_s32_tied1, svint32_t,
+               z0 = svnbsl_s32 (z0, z1, z2),
+               z0 = svnbsl (z0, z1, z2))
+
+/*
+** nbsl_s32_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_s32_tied2, svint32_t,
+               z0 = svnbsl_s32 (z1, z0, z2),
+               z0 = svnbsl (z1, z0, z2))
+
+/*
+** nbsl_s32_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_s32_tied3, svint32_t,
+               z0 = svnbsl_s32 (z1, z2, z0),
+               z0 = svnbsl (z1, z2, z0))
+
+/*
+** nbsl_s32_untied:
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_s32_untied, svint32_t,
+               z0 = svnbsl_s32 (z1, z2, z3),
+               z0 = svnbsl (z1, z2, z3))
+
+/*
+** nbsl_w0_s32_tied1:
+**     mov     (z[0-9]+)\.s, w0
+**     nbsl    z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_w0_s32_tied1, svint32_t, int32_t,
+                z0 = svnbsl_n_s32 (z0, z1, x0),
+                z0 = svnbsl (z0, z1, x0))
+
+/*
+** nbsl_w0_s32_tied2:
+**     mov     (z[0-9]+)\.s, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_w0_s32_tied2, svint32_t, int32_t,
+                z0 = svnbsl_n_s32 (z1, z0, x0),
+                z0 = svnbsl (z1, z0, x0))
+
+/*
+** nbsl_w0_s32_untied:
+**     mov     (z[0-9]+)\.s, w0
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_w0_s32_untied, svint32_t, int32_t,
+                z0 = svnbsl_n_s32 (z1, z2, x0),
+                z0 = svnbsl (z1, z2, x0))
+
+/*
+** nbsl_11_s32_tied1:
+**     mov     (z[0-9]+)\.s, #11
+**     nbsl    z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_s32_tied1, svint32_t,
+               z0 = svnbsl_n_s32 (z0, z1, 11),
+               z0 = svnbsl (z0, z1, 11))
+
+/*
+** nbsl_11_s32_tied2:
+**     mov     (z[0-9]+)\.s, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_s32_tied2, svint32_t,
+               z0 = svnbsl_n_s32 (z1, z0, 11),
+               z0 = svnbsl (z1, z0, 11))
+
+/*
+** nbsl_11_s32_untied:
+**     mov     (z[0-9]+)\.s, #11
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_s32_untied, svint32_t,
+               z0 = svnbsl_n_s32 (z1, z2, 11),
+               z0 = svnbsl (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_s64.c
new file mode 100644 (file)
index 0000000..afb2e7d
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** nbsl_s64_tied1:
+**     nbsl    z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_s64_tied1, svint64_t,
+               z0 = svnbsl_s64 (z0, z1, z2),
+               z0 = svnbsl (z0, z1, z2))
+
+/*
+** nbsl_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_s64_tied2, svint64_t,
+               z0 = svnbsl_s64 (z1, z0, z2),
+               z0 = svnbsl (z1, z0, z2))
+
+/*
+** nbsl_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_s64_tied3, svint64_t,
+               z0 = svnbsl_s64 (z1, z2, z0),
+               z0 = svnbsl (z1, z2, z0))
+
+/*
+** nbsl_s64_untied:
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_s64_untied, svint64_t,
+               z0 = svnbsl_s64 (z1, z2, z3),
+               z0 = svnbsl (z1, z2, z3))
+
+/*
+** nbsl_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     nbsl    z0\.d, z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_x0_s64_tied1, svint64_t, int64_t,
+                z0 = svnbsl_n_s64 (z0, z1, x0),
+                z0 = svnbsl (z0, z1, x0))
+
+/*
+** nbsl_x0_s64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_x0_s64_tied2, svint64_t, int64_t,
+                z0 = svnbsl_n_s64 (z1, z0, x0),
+                z0 = svnbsl (z1, z0, x0))
+
+/*
+** nbsl_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_x0_s64_untied, svint64_t, int64_t,
+                z0 = svnbsl_n_s64 (z1, z2, x0),
+                z0 = svnbsl (z1, z2, x0))
+
+/*
+** nbsl_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     nbsl    z0\.d, z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_s64_tied1, svint64_t,
+               z0 = svnbsl_n_s64 (z0, z1, 11),
+               z0 = svnbsl (z0, z1, 11))
+
+/*
+** nbsl_11_s64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_s64_tied2, svint64_t,
+               z0 = svnbsl_n_s64 (z1, z0, 11),
+               z0 = svnbsl (z1, z0, 11))
+
+/*
+** nbsl_11_s64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_s64_untied, svint64_t,
+               z0 = svnbsl_n_s64 (z1, z2, 11),
+               z0 = svnbsl (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_s8.c
new file mode 100644 (file)
index 0000000..237ee7d
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** nbsl_s8_tied1:
+**     nbsl    z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_s8_tied1, svint8_t,
+               z0 = svnbsl_s8 (z0, z1, z2),
+               z0 = svnbsl (z0, z1, z2))
+
+/*
+** nbsl_s8_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_s8_tied2, svint8_t,
+               z0 = svnbsl_s8 (z1, z0, z2),
+               z0 = svnbsl (z1, z0, z2))
+
+/*
+** nbsl_s8_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_s8_tied3, svint8_t,
+               z0 = svnbsl_s8 (z1, z2, z0),
+               z0 = svnbsl (z1, z2, z0))
+
+/*
+** nbsl_s8_untied:
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_s8_untied, svint8_t,
+               z0 = svnbsl_s8 (z1, z2, z3),
+               z0 = svnbsl (z1, z2, z3))
+
+/*
+** nbsl_w0_s8_tied1:
+**     mov     (z[0-9]+)\.b, w0
+**     nbsl    z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_w0_s8_tied1, svint8_t, int8_t,
+                z0 = svnbsl_n_s8 (z0, z1, x0),
+                z0 = svnbsl (z0, z1, x0))
+
+/*
+** nbsl_w0_s8_tied2:
+**     mov     (z[0-9]+)\.b, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_w0_s8_tied2, svint8_t, int8_t,
+                z0 = svnbsl_n_s8 (z1, z0, x0),
+                z0 = svnbsl (z1, z0, x0))
+
+/*
+** nbsl_w0_s8_untied:
+**     mov     (z[0-9]+)\.b, w0
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_w0_s8_untied, svint8_t, int8_t,
+                z0 = svnbsl_n_s8 (z1, z2, x0),
+                z0 = svnbsl (z1, z2, x0))
+
+/*
+** nbsl_11_s8_tied1:
+**     mov     (z[0-9]+)\.b, #11
+**     nbsl    z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_s8_tied1, svint8_t,
+               z0 = svnbsl_n_s8 (z0, z1, 11),
+               z0 = svnbsl (z0, z1, 11))
+
+/*
+** nbsl_11_s8_tied2:
+**     mov     (z[0-9]+)\.b, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_s8_tied2, svint8_t,
+               z0 = svnbsl_n_s8 (z1, z0, 11),
+               z0 = svnbsl (z1, z0, 11))
+
+/*
+** nbsl_11_s8_untied:
+**     mov     (z[0-9]+)\.b, #11
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_s8_untied, svint8_t,
+               z0 = svnbsl_n_s8 (z1, z2, 11),
+               z0 = svnbsl (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_u16.c
new file mode 100644 (file)
index 0000000..cba3938
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** nbsl_u16_tied1:
+**     nbsl    z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_u16_tied1, svuint16_t,
+               z0 = svnbsl_u16 (z0, z1, z2),
+               z0 = svnbsl (z0, z1, z2))
+
+/*
+** nbsl_u16_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_u16_tied2, svuint16_t,
+               z0 = svnbsl_u16 (z1, z0, z2),
+               z0 = svnbsl (z1, z0, z2))
+
+/*
+** nbsl_u16_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_u16_tied3, svuint16_t,
+               z0 = svnbsl_u16 (z1, z2, z0),
+               z0 = svnbsl (z1, z2, z0))
+
+/*
+** nbsl_u16_untied:
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_u16_untied, svuint16_t,
+               z0 = svnbsl_u16 (z1, z2, z3),
+               z0 = svnbsl (z1, z2, z3))
+
+/*
+** nbsl_w0_u16_tied1:
+**     mov     (z[0-9]+)\.h, w0
+**     nbsl    z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_w0_u16_tied1, svuint16_t, uint16_t,
+                z0 = svnbsl_n_u16 (z0, z1, x0),
+                z0 = svnbsl (z0, z1, x0))
+
+/*
+** nbsl_w0_u16_tied2:
+**     mov     (z[0-9]+)\.h, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_w0_u16_tied2, svuint16_t, uint16_t,
+                z0 = svnbsl_n_u16 (z1, z0, x0),
+                z0 = svnbsl (z1, z0, x0))
+
+/*
+** nbsl_w0_u16_untied:
+**     mov     (z[0-9]+)\.h, w0
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_w0_u16_untied, svuint16_t, uint16_t,
+                z0 = svnbsl_n_u16 (z1, z2, x0),
+                z0 = svnbsl (z1, z2, x0))
+
+/*
+** nbsl_11_u16_tied1:
+**     mov     (z[0-9]+)\.h, #11
+**     nbsl    z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_u16_tied1, svuint16_t,
+               z0 = svnbsl_n_u16 (z0, z1, 11),
+               z0 = svnbsl (z0, z1, 11))
+
+/*
+** nbsl_11_u16_tied2:
+**     mov     (z[0-9]+)\.h, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_u16_tied2, svuint16_t,
+               z0 = svnbsl_n_u16 (z1, z0, 11),
+               z0 = svnbsl (z1, z0, 11))
+
+/*
+** nbsl_11_u16_untied:
+**     mov     (z[0-9]+)\.h, #11
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_u16_untied, svuint16_t,
+               z0 = svnbsl_n_u16 (z1, z2, 11),
+               z0 = svnbsl (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_u32.c
new file mode 100644 (file)
index 0000000..3db7dda
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** nbsl_u32_tied1:
+**     nbsl    z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_u32_tied1, svuint32_t,
+               z0 = svnbsl_u32 (z0, z1, z2),
+               z0 = svnbsl (z0, z1, z2))
+
+/*
+** nbsl_u32_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_u32_tied2, svuint32_t,
+               z0 = svnbsl_u32 (z1, z0, z2),
+               z0 = svnbsl (z1, z0, z2))
+
+/*
+** nbsl_u32_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_u32_tied3, svuint32_t,
+               z0 = svnbsl_u32 (z1, z2, z0),
+               z0 = svnbsl (z1, z2, z0))
+
+/*
+** nbsl_u32_untied:
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_u32_untied, svuint32_t,
+               z0 = svnbsl_u32 (z1, z2, z3),
+               z0 = svnbsl (z1, z2, z3))
+
+/*
+** nbsl_w0_u32_tied1:
+**     mov     (z[0-9]+)\.s, w0
+**     nbsl    z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = svnbsl_n_u32 (z0, z1, x0),
+                z0 = svnbsl (z0, z1, x0))
+
+/*
+** nbsl_w0_u32_tied2:
+**     mov     (z[0-9]+)\.s, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_w0_u32_tied2, svuint32_t, uint32_t,
+                z0 = svnbsl_n_u32 (z1, z0, x0),
+                z0 = svnbsl (z1, z0, x0))
+
+/*
+** nbsl_w0_u32_untied:
+**     mov     (z[0-9]+)\.s, w0
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = svnbsl_n_u32 (z1, z2, x0),
+                z0 = svnbsl (z1, z2, x0))
+
+/*
+** nbsl_11_u32_tied1:
+**     mov     (z[0-9]+)\.s, #11
+**     nbsl    z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_u32_tied1, svuint32_t,
+               z0 = svnbsl_n_u32 (z0, z1, 11),
+               z0 = svnbsl (z0, z1, 11))
+
+/*
+** nbsl_11_u32_tied2:
+**     mov     (z[0-9]+)\.s, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_u32_tied2, svuint32_t,
+               z0 = svnbsl_n_u32 (z1, z0, 11),
+               z0 = svnbsl (z1, z0, 11))
+
+/*
+** nbsl_11_u32_untied:
+**     mov     (z[0-9]+)\.s, #11
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_u32_untied, svuint32_t,
+               z0 = svnbsl_n_u32 (z1, z2, 11),
+               z0 = svnbsl (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_u64.c
new file mode 100644 (file)
index 0000000..0efe618
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** nbsl_u64_tied1:
+**     nbsl    z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_u64_tied1, svuint64_t,
+               z0 = svnbsl_u64 (z0, z1, z2),
+               z0 = svnbsl (z0, z1, z2))
+
+/*
+** nbsl_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_u64_tied2, svuint64_t,
+               z0 = svnbsl_u64 (z1, z0, z2),
+               z0 = svnbsl (z1, z0, z2))
+
+/*
+** nbsl_u64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_u64_tied3, svuint64_t,
+               z0 = svnbsl_u64 (z1, z2, z0),
+               z0 = svnbsl (z1, z2, z0))
+
+/*
+** nbsl_u64_untied:
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_u64_untied, svuint64_t,
+               z0 = svnbsl_u64 (z1, z2, z3),
+               z0 = svnbsl (z1, z2, z3))
+
+/*
+** nbsl_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     nbsl    z0\.d, z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = svnbsl_n_u64 (z0, z1, x0),
+                z0 = svnbsl (z0, z1, x0))
+
+/*
+** nbsl_x0_u64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_x0_u64_tied2, svuint64_t, uint64_t,
+                z0 = svnbsl_n_u64 (z1, z0, x0),
+                z0 = svnbsl (z1, z0, x0))
+
+/*
+** nbsl_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = svnbsl_n_u64 (z1, z2, x0),
+                z0 = svnbsl (z1, z2, x0))
+
+/*
+** nbsl_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     nbsl    z0\.d, z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_u64_tied1, svuint64_t,
+               z0 = svnbsl_n_u64 (z0, z1, 11),
+               z0 = svnbsl (z0, z1, 11))
+
+/*
+** nbsl_11_u64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_u64_tied2, svuint64_t,
+               z0 = svnbsl_n_u64 (z1, z0, 11),
+               z0 = svnbsl (z1, z0, 11))
+
+/*
+** nbsl_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_u64_untied, svuint64_t,
+               z0 = svnbsl_n_u64 (z1, z2, 11),
+               z0 = svnbsl (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nbsl_u8.c
new file mode 100644 (file)
index 0000000..e2370f8
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** nbsl_u8_tied1:
+**     nbsl    z0\.d, z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_u8_tied1, svuint8_t,
+               z0 = svnbsl_u8 (z0, z1, z2),
+               z0 = svnbsl (z0, z1, z2))
+
+/*
+** nbsl_u8_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_u8_tied2, svuint8_t,
+               z0 = svnbsl_u8 (z1, z0, z2),
+               z0 = svnbsl (z1, z0, z2))
+
+/*
+** nbsl_u8_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_u8_tied3, svuint8_t,
+               z0 = svnbsl_u8 (z1, z2, z0),
+               z0 = svnbsl (z1, z2, z0))
+
+/*
+** nbsl_u8_untied:
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_u8_untied, svuint8_t,
+               z0 = svnbsl_u8 (z1, z2, z3),
+               z0 = svnbsl (z1, z2, z3))
+
+/*
+** nbsl_w0_u8_tied1:
+**     mov     (z[0-9]+)\.b, w0
+**     nbsl    z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_w0_u8_tied1, svuint8_t, uint8_t,
+                z0 = svnbsl_n_u8 (z0, z1, x0),
+                z0 = svnbsl (z0, z1, x0))
+
+/*
+** nbsl_w0_u8_tied2:
+**     mov     (z[0-9]+)\.b, w0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_w0_u8_tied2, svuint8_t, uint8_t,
+                z0 = svnbsl_n_u8 (z1, z0, x0),
+                z0 = svnbsl (z1, z0, x0))
+
+/*
+** nbsl_w0_u8_untied:
+**     mov     (z[0-9]+)\.b, w0
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (nbsl_w0_u8_untied, svuint8_t, uint8_t,
+                z0 = svnbsl_n_u8 (z1, z2, x0),
+                z0 = svnbsl (z1, z2, x0))
+
+/*
+** nbsl_11_u8_tied1:
+**     mov     (z[0-9]+)\.b, #11
+**     nbsl    z0\.d, z0\.d, z1\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_u8_tied1, svuint8_t,
+               z0 = svnbsl_n_u8 (z0, z1, 11),
+               z0 = svnbsl (z0, z1, 11))
+
+/*
+** nbsl_11_u8_tied2:
+**     mov     (z[0-9]+)\.b, #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, \2, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_u8_tied2, svuint8_t,
+               z0 = svnbsl_n_u8 (z1, z0, 11),
+               z0 = svnbsl (z1, z0, 11))
+
+/*
+** nbsl_11_u8_untied:
+**     mov     (z[0-9]+)\.b, #11
+**     movprfx z0, z1
+**     nbsl    z0\.d, z0\.d, z2\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (nbsl_11_u8_untied, svuint8_t,
+               z0 = svnbsl_n_u8 (z1, z2, 11),
+               z0 = svnbsl (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nmatch_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nmatch_s16.c
new file mode 100644 (file)
index 0000000..935b19a
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** nmatch_s16_tied:
+**     nmatch  p0\.h, p0/z, z0\.h, z1\.h
+**     ret
+*/
+TEST_COMPARE_Z (nmatch_s16_tied, svint16_t,
+               p0 = svnmatch_s16 (p0, z0, z1),
+               p0 = svnmatch (p0, z0, z1))
+
+/*
+** nmatch_s16_untied:
+**     nmatch  p0\.h, p1/z, z0\.h, z1\.h
+**     ret
+*/
+TEST_COMPARE_Z (nmatch_s16_untied, svint16_t,
+               p0 = svnmatch_s16 (p1, z0, z1),
+               p0 = svnmatch (p1, z0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nmatch_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nmatch_s8.c
new file mode 100644 (file)
index 0000000..8a00b30
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** nmatch_s8_tied:
+**     nmatch  p0\.b, p0/z, z0\.b, z1\.b
+**     ret
+*/
+TEST_COMPARE_Z (nmatch_s8_tied, svint8_t,
+               p0 = svnmatch_s8 (p0, z0, z1),
+               p0 = svnmatch (p0, z0, z1))
+
+/*
+** nmatch_s8_untied:
+**     nmatch  p0\.b, p1/z, z0\.b, z1\.b
+**     ret
+*/
+TEST_COMPARE_Z (nmatch_s8_untied, svint8_t,
+               p0 = svnmatch_s8 (p1, z0, z1),
+               p0 = svnmatch (p1, z0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nmatch_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nmatch_u16.c
new file mode 100644 (file)
index 0000000..868c20a
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** nmatch_u16_tied:
+**     nmatch  p0\.h, p0/z, z0\.h, z1\.h
+**     ret
+*/
+TEST_COMPARE_Z (nmatch_u16_tied, svuint16_t,
+               p0 = svnmatch_u16 (p0, z0, z1),
+               p0 = svnmatch (p0, z0, z1))
+
+/*
+** nmatch_u16_untied:
+**     nmatch  p0\.h, p1/z, z0\.h, z1\.h
+**     ret
+*/
+TEST_COMPARE_Z (nmatch_u16_untied, svuint16_t,
+               p0 = svnmatch_u16 (p1, z0, z1),
+               p0 = svnmatch (p1, z0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nmatch_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/nmatch_u8.c
new file mode 100644 (file)
index 0000000..af6b581
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** nmatch_u8_tied:
+**     nmatch  p0\.b, p0/z, z0\.b, z1\.b
+**     ret
+*/
+TEST_COMPARE_Z (nmatch_u8_tied, svuint8_t,
+               p0 = svnmatch_u8 (p0, z0, z1),
+               p0 = svnmatch (p0, z0, z1))
+
+/*
+** nmatch_u8_untied:
+**     nmatch  p0\.b, p1/z, z0\.b, z1\.b
+**     ret
+*/
+TEST_COMPARE_Z (nmatch_u8_untied, svuint8_t,
+               p0 = svnmatch_u8 (p1, z0, z1),
+               p0 = svnmatch (p1, z0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmul_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmul_u8.c
new file mode 100644 (file)
index 0000000..001b683
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** pmul_u8_tied1:
+**     pmul    z0\.b, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (pmul_u8_tied1, svuint8_t,
+               z0 = svpmul_u8 (z0, z1),
+               z0 = svpmul (z0, z1))
+
+/*
+** pmul_u8_tied2:
+**     pmul    z0\.b, z1\.b, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (pmul_u8_tied2, svuint8_t,
+               z0 = svpmul_u8 (z1, z0),
+               z0 = svpmul (z1, z0))
+
+/*
+** pmul_u8_untied:
+**     pmul    z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (pmul_u8_untied, svuint8_t,
+               z0 = svpmul_u8 (z1, z2),
+               z0 = svpmul (z1, z2))
+
+/*
+** pmul_w0_u8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     pmul    z0\.b, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (pmul_w0_u8_tied1, svuint8_t, uint8_t,
+                z0 = svpmul_n_u8 (z0, x0),
+                z0 = svpmul (z0, x0))
+
+/*
+** pmul_w0_u8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     pmul    z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (pmul_w0_u8_untied, svuint8_t, uint8_t,
+                z0 = svpmul_n_u8 (z1, x0),
+                z0 = svpmul (z1, x0))
+
+/*
+** pmul_11_u8_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     pmul    z0\.b, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (pmul_11_u8_tied1, svuint8_t,
+               z0 = svpmul_n_u8 (z0, 11),
+               z0 = svpmul (z0, 11))
+
+/*
+** pmul_11_u8_untied:
+**     mov     (z[0-9]+\.b), #11
+**     pmul    z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (pmul_11_u8_untied, svuint8_t,
+               z0 = svpmul_n_u8 (z1, 11),
+               z0 = svpmul (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullb_pair_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullb_pair_u32.c
new file mode 100644 (file)
index 0000000..f627fca
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** pmullb_pair_u32_tied1:
+**     pmullb  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (pmullb_pair_u32_tied1, svuint32_t,
+               z0 = svpmullb_pair_u32 (z0, z1),
+               z0 = svpmullb_pair (z0, z1))
+
+/*
+** pmullb_pair_u32_tied2:
+**     pmullb  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (pmullb_pair_u32_tied2, svuint32_t,
+               z0 = svpmullb_pair_u32 (z1, z0),
+               z0 = svpmullb_pair (z1, z0))
+
+/*
+** pmullb_pair_u32_untied:
+**     pmullb  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (pmullb_pair_u32_untied, svuint32_t,
+               z0 = svpmullb_pair_u32 (z1, z2),
+               z0 = svpmullb_pair (z1, z2))
+
+/*
+** pmullb_pair_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     pmullb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (pmullb_pair_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = svpmullb_pair_n_u32 (z0, x0),
+                z0 = svpmullb_pair (z0, x0))
+
+/*
+** pmullb_pair_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     pmullb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (pmullb_pair_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = svpmullb_pair_n_u32 (z1, x0),
+                z0 = svpmullb_pair (z1, x0))
+
+/*
+** pmullb_pair_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     pmullb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (pmullb_pair_11_u32_tied1, svuint32_t,
+               z0 = svpmullb_pair_n_u32 (z0, 11),
+               z0 = svpmullb_pair (z0, 11))
+
+/*
+** pmullb_pair_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     pmullb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (pmullb_pair_11_u32_untied, svuint32_t,
+               z0 = svpmullb_pair_n_u32 (z1, 11),
+               z0 = svpmullb_pair (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullb_pair_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullb_pair_u64.c
new file mode 100644 (file)
index 0000000..9446092
--- /dev/null
@@ -0,0 +1,72 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-aes"
+
+/*
+** pmullb_pair_u64_tied1:
+**     pmullb  z0\.q, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (pmullb_pair_u64_tied1, svuint64_t,
+               z0 = svpmullb_pair_u64 (z0, z1),
+               z0 = svpmullb_pair (z0, z1))
+
+/*
+** pmullb_pair_u64_tied2:
+**     pmullb  z0\.q, z1\.d, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (pmullb_pair_u64_tied2, svuint64_t,
+               z0 = svpmullb_pair_u64 (z1, z0),
+               z0 = svpmullb_pair (z1, z0))
+
+/*
+** pmullb_pair_u64_untied:
+**     pmullb  z0\.q, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (pmullb_pair_u64_untied, svuint64_t,
+               z0 = svpmullb_pair_u64 (z1, z2),
+               z0 = svpmullb_pair (z1, z2))
+
+/*
+** pmullb_pair_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     pmullb  z0\.q, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (pmullb_pair_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = svpmullb_pair_n_u64 (z0, x0),
+                z0 = svpmullb_pair (z0, x0))
+
+/*
+** pmullb_pair_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     pmullb  z0\.q, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (pmullb_pair_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = svpmullb_pair_n_u64 (z1, x0),
+                z0 = svpmullb_pair (z1, x0))
+
+/*
+** pmullb_pair_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     pmullb  z0\.q, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (pmullb_pair_11_u64_tied1, svuint64_t,
+               z0 = svpmullb_pair_n_u64 (z0, 11),
+               z0 = svpmullb_pair (z0, 11))
+
+/*
+** pmullb_pair_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     pmullb  z0\.q, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (pmullb_pair_11_u64_untied, svuint64_t,
+               z0 = svpmullb_pair_n_u64 (z1, 11),
+               z0 = svpmullb_pair (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullb_pair_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullb_pair_u8.c
new file mode 100644 (file)
index 0000000..f41ae80
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** pmullb_pair_u8_tied1:
+**     pmullb  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (pmullb_pair_u8_tied1, svuint8_t,
+               z0 = svpmullb_pair_u8 (z0, z1),
+               z0 = svpmullb_pair (z0, z1))
+
+/*
+** pmullb_pair_u8_tied2:
+**     pmullb  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (pmullb_pair_u8_tied2, svuint8_t,
+               z0 = svpmullb_pair_u8 (z1, z0),
+               z0 = svpmullb_pair (z1, z0))
+
+/*
+** pmullb_pair_u8_untied:
+**     pmullb  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (pmullb_pair_u8_untied, svuint8_t,
+               z0 = svpmullb_pair_u8 (z1, z2),
+               z0 = svpmullb_pair (z1, z2))
+
+/*
+** pmullb_pair_w0_u8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     pmullb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (pmullb_pair_w0_u8_tied1, svuint8_t, uint8_t,
+                z0 = svpmullb_pair_n_u8 (z0, x0),
+                z0 = svpmullb_pair (z0, x0))
+
+/*
+** pmullb_pair_w0_u8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     pmullb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (pmullb_pair_w0_u8_untied, svuint8_t, uint8_t,
+                z0 = svpmullb_pair_n_u8 (z1, x0),
+                z0 = svpmullb_pair (z1, x0))
+
+/*
+** pmullb_pair_11_u8_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     pmullb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (pmullb_pair_11_u8_tied1, svuint8_t,
+               z0 = svpmullb_pair_n_u8 (z0, 11),
+               z0 = svpmullb_pair (z0, 11))
+
+/*
+** pmullb_pair_11_u8_untied:
+**     mov     (z[0-9]+\.b), #11
+**     pmullb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (pmullb_pair_11_u8_untied, svuint8_t,
+               z0 = svpmullb_pair_n_u8 (z1, 11),
+               z0 = svpmullb_pair (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullb_u16.c
new file mode 100644 (file)
index 0000000..f960fca
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** pmullb_u16_tied1:
+**     pmullb  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullb_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svpmullb_u16 (z0, z1),
+                   z0_res = svpmullb (z0, z1))
+
+/*
+** pmullb_u16_tied2:
+**     pmullb  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullb_u16_tied2, svuint16_t, svuint8_t,
+                   z0_res = svpmullb_u16 (z1, z0),
+                   z0_res = svpmullb (z1, z0))
+
+/*
+** pmullb_u16_untied:
+**     pmullb  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullb_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svpmullb_u16 (z1, z2),
+                   z0_res = svpmullb (z1, z2))
+
+/*
+** pmullb_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     pmullb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (pmullb_w0_u16_tied1, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svpmullb_n_u16 (z0, x0),
+                    z0_res = svpmullb (z0, x0))
+
+/*
+** pmullb_w0_u16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     pmullb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (pmullb_w0_u16_untied, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svpmullb_n_u16 (z1, x0),
+                    z0_res = svpmullb (z1, x0))
+
+/*
+** pmullb_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     pmullb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullb_11_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svpmullb_n_u16 (z0, 11),
+                   z0_res = svpmullb (z0, 11))
+
+/*
+** pmullb_11_u16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     pmullb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullb_11_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svpmullb_n_u16 (z1, 11),
+                   z0_res = svpmullb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullb_u64.c
new file mode 100644 (file)
index 0000000..3e6698a
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** pmullb_u64_tied1:
+**     pmullb  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullb_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svpmullb_u64 (z0, z1),
+                   z0_res = svpmullb (z0, z1))
+
+/*
+** pmullb_u64_tied2:
+**     pmullb  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullb_u64_tied2, svuint64_t, svuint32_t,
+                   z0_res = svpmullb_u64 (z1, z0),
+                   z0_res = svpmullb (z1, z0))
+
+/*
+** pmullb_u64_untied:
+**     pmullb  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullb_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svpmullb_u64 (z1, z2),
+                   z0_res = svpmullb (z1, z2))
+
+/*
+** pmullb_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     pmullb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (pmullb_w0_u64_tied1, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svpmullb_n_u64 (z0, x0),
+                    z0_res = svpmullb (z0, x0))
+
+/*
+** pmullb_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     pmullb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (pmullb_w0_u64_untied, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svpmullb_n_u64 (z1, x0),
+                    z0_res = svpmullb (z1, x0))
+
+/*
+** pmullb_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     pmullb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullb_11_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svpmullb_n_u64 (z0, 11),
+                   z0_res = svpmullb (z0, 11))
+
+/*
+** pmullb_11_u64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     pmullb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullb_11_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svpmullb_n_u64 (z1, 11),
+                   z0_res = svpmullb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullt_pair_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullt_pair_u32.c
new file mode 100644 (file)
index 0000000..ed0a547
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** pmullt_pair_u32_tied1:
+**     pmullt  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (pmullt_pair_u32_tied1, svuint32_t,
+               z0 = svpmullt_pair_u32 (z0, z1),
+               z0 = svpmullt_pair (z0, z1))
+
+/*
+** pmullt_pair_u32_tied2:
+**     pmullt  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (pmullt_pair_u32_tied2, svuint32_t,
+               z0 = svpmullt_pair_u32 (z1, z0),
+               z0 = svpmullt_pair (z1, z0))
+
+/*
+** pmullt_pair_u32_untied:
+**     pmullt  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (pmullt_pair_u32_untied, svuint32_t,
+               z0 = svpmullt_pair_u32 (z1, z2),
+               z0 = svpmullt_pair (z1, z2))
+
+/*
+** pmullt_pair_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     pmullt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (pmullt_pair_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = svpmullt_pair_n_u32 (z0, x0),
+                z0 = svpmullt_pair (z0, x0))
+
+/*
+** pmullt_pair_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     pmullt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (pmullt_pair_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = svpmullt_pair_n_u32 (z1, x0),
+                z0 = svpmullt_pair (z1, x0))
+
+/*
+** pmullt_pair_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     pmullt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (pmullt_pair_11_u32_tied1, svuint32_t,
+               z0 = svpmullt_pair_n_u32 (z0, 11),
+               z0 = svpmullt_pair (z0, 11))
+
+/*
+** pmullt_pair_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     pmullt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (pmullt_pair_11_u32_untied, svuint32_t,
+               z0 = svpmullt_pair_n_u32 (z1, 11),
+               z0 = svpmullt_pair (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullt_pair_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullt_pair_u64.c
new file mode 100644 (file)
index 0000000..90e2e99
--- /dev/null
@@ -0,0 +1,72 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-aes"
+
+/*
+** pmullt_pair_u64_tied1:
+**     pmullt  z0\.q, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (pmullt_pair_u64_tied1, svuint64_t,
+               z0 = svpmullt_pair_u64 (z0, z1),
+               z0 = svpmullt_pair (z0, z1))
+
+/*
+** pmullt_pair_u64_tied2:
+**     pmullt  z0\.q, z1\.d, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (pmullt_pair_u64_tied2, svuint64_t,
+               z0 = svpmullt_pair_u64 (z1, z0),
+               z0 = svpmullt_pair (z1, z0))
+
+/*
+** pmullt_pair_u64_untied:
+**     pmullt  z0\.q, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (pmullt_pair_u64_untied, svuint64_t,
+               z0 = svpmullt_pair_u64 (z1, z2),
+               z0 = svpmullt_pair (z1, z2))
+
+/*
+** pmullt_pair_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     pmullt  z0\.q, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (pmullt_pair_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = svpmullt_pair_n_u64 (z0, x0),
+                z0 = svpmullt_pair (z0, x0))
+
+/*
+** pmullt_pair_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     pmullt  z0\.q, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (pmullt_pair_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = svpmullt_pair_n_u64 (z1, x0),
+                z0 = svpmullt_pair (z1, x0))
+
+/*
+** pmullt_pair_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     pmullt  z0\.q, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (pmullt_pair_11_u64_tied1, svuint64_t,
+               z0 = svpmullt_pair_n_u64 (z0, 11),
+               z0 = svpmullt_pair (z0, 11))
+
+/*
+** pmullt_pair_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     pmullt  z0\.q, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (pmullt_pair_11_u64_untied, svuint64_t,
+               z0 = svpmullt_pair_n_u64 (z1, 11),
+               z0 = svpmullt_pair (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullt_pair_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullt_pair_u8.c
new file mode 100644 (file)
index 0000000..580f34a
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** pmullt_pair_u8_tied1:
+**     pmullt  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (pmullt_pair_u8_tied1, svuint8_t,
+               z0 = svpmullt_pair_u8 (z0, z1),
+               z0 = svpmullt_pair (z0, z1))
+
+/*
+** pmullt_pair_u8_tied2:
+**     pmullt  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (pmullt_pair_u8_tied2, svuint8_t,
+               z0 = svpmullt_pair_u8 (z1, z0),
+               z0 = svpmullt_pair (z1, z0))
+
+/*
+** pmullt_pair_u8_untied:
+**     pmullt  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (pmullt_pair_u8_untied, svuint8_t,
+               z0 = svpmullt_pair_u8 (z1, z2),
+               z0 = svpmullt_pair (z1, z2))
+
+/*
+** pmullt_pair_w0_u8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     pmullt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (pmullt_pair_w0_u8_tied1, svuint8_t, uint8_t,
+                z0 = svpmullt_pair_n_u8 (z0, x0),
+                z0 = svpmullt_pair (z0, x0))
+
+/*
+** pmullt_pair_w0_u8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     pmullt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (pmullt_pair_w0_u8_untied, svuint8_t, uint8_t,
+                z0 = svpmullt_pair_n_u8 (z1, x0),
+                z0 = svpmullt_pair (z1, x0))
+
+/*
+** pmullt_pair_11_u8_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     pmullt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (pmullt_pair_11_u8_tied1, svuint8_t,
+               z0 = svpmullt_pair_n_u8 (z0, 11),
+               z0 = svpmullt_pair (z0, 11))
+
+/*
+** pmullt_pair_11_u8_untied:
+**     mov     (z[0-9]+\.b), #11
+**     pmullt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (pmullt_pair_11_u8_untied, svuint8_t,
+               z0 = svpmullt_pair_n_u8 (z1, 11),
+               z0 = svpmullt_pair (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullt_u16.c
new file mode 100644 (file)
index 0000000..52ddb40
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** pmullt_u16_tied1:
+**     pmullt  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullt_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svpmullt_u16 (z0, z1),
+                   z0_res = svpmullt (z0, z1))
+
+/*
+** pmullt_u16_tied2:
+**     pmullt  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullt_u16_tied2, svuint16_t, svuint8_t,
+                   z0_res = svpmullt_u16 (z1, z0),
+                   z0_res = svpmullt (z1, z0))
+
+/*
+** pmullt_u16_untied:
+**     pmullt  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullt_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svpmullt_u16 (z1, z2),
+                   z0_res = svpmullt (z1, z2))
+
+/*
+** pmullt_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     pmullt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (pmullt_w0_u16_tied1, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svpmullt_n_u16 (z0, x0),
+                    z0_res = svpmullt (z0, x0))
+
+/*
+** pmullt_w0_u16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     pmullt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (pmullt_w0_u16_untied, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svpmullt_n_u16 (z1, x0),
+                    z0_res = svpmullt (z1, x0))
+
+/*
+** pmullt_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     pmullt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullt_11_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svpmullt_n_u16 (z0, 11),
+                   z0_res = svpmullt (z0, 11))
+
+/*
+** pmullt_11_u16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     pmullt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullt_11_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svpmullt_n_u16 (z1, 11),
+                   z0_res = svpmullt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/pmullt_u64.c
new file mode 100644 (file)
index 0000000..0821e97
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** pmullt_u64_tied1:
+**     pmullt  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullt_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svpmullt_u64 (z0, z1),
+                   z0_res = svpmullt (z0, z1))
+
+/*
+** pmullt_u64_tied2:
+**     pmullt  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullt_u64_tied2, svuint64_t, svuint32_t,
+                   z0_res = svpmullt_u64 (z1, z0),
+                   z0_res = svpmullt (z1, z0))
+
+/*
+** pmullt_u64_untied:
+**     pmullt  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullt_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svpmullt_u64 (z1, z2),
+                   z0_res = svpmullt (z1, z2))
+
+/*
+** pmullt_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     pmullt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (pmullt_w0_u64_tied1, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svpmullt_n_u64 (z0, x0),
+                    z0_res = svpmullt (z0, x0))
+
+/*
+** pmullt_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     pmullt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (pmullt_w0_u64_untied, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svpmullt_n_u64 (z1, x0),
+                    z0_res = svpmullt (z1, x0))
+
+/*
+** pmullt_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     pmullt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullt_11_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svpmullt_n_u64 (z0, 11),
+                   z0_res = svpmullt (z0, 11))
+
+/*
+** pmullt_11_u64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     pmullt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (pmullt_11_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svpmullt_n_u64 (z1, 11),
+                   z0_res = svpmullt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qabs_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qabs_s16.c
new file mode 100644 (file)
index 0000000..0756488
--- /dev/null
@@ -0,0 +1,81 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qabs_s16_m_tied12:
+**     sqabs   z0\.h, p0/m, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s16_m_tied12, svint16_t,
+               z0 = svqabs_s16_m (z0, p0, z0),
+               z0 = svqabs_m (z0, p0, z0))
+
+/*
+** qabs_s16_m_tied1:
+**     sqabs   z0\.h, p0/m, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s16_m_tied1, svint16_t,
+               z0 = svqabs_s16_m (z0, p0, z1),
+               z0 = svqabs_m (z0, p0, z1))
+
+/*
+** qabs_s16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqabs   z0\.h, p0/m, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s16_m_tied2, svint16_t,
+               z0 = svqabs_s16_m (z1, p0, z0),
+               z0 = svqabs_m (z1, p0, z0))
+
+/*
+** qabs_s16_m_untied:
+**     movprfx z0, z2
+**     sqabs   z0\.h, p0/m, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s16_m_untied, svint16_t,
+               z0 = svqabs_s16_m (z2, p0, z1),
+               z0 = svqabs_m (z2, p0, z1))
+
+/*
+** qabs_s16_z_tied1:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.h, p0/z, \1\.h
+**     sqabs   z0\.h, p0/m, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s16_z_tied1, svint16_t,
+               z0 = svqabs_s16_z (p0, z0),
+               z0 = svqabs_z (p0, z0))
+
+/*
+** qabs_s16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqabs   z0\.h, p0/m, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s16_z_untied, svint16_t,
+               z0 = svqabs_s16_z (p0, z1),
+               z0 = svqabs_z (p0, z1))
+
+/*
+** qabs_s16_x_tied1:
+**     sqabs   z0\.h, p0/m, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s16_x_tied1, svint16_t,
+               z0 = svqabs_s16_x (p0, z0),
+               z0 = svqabs_x (p0, z0))
+
+/*
+** qabs_s16_x_untied:
+**     sqabs   z0\.h, p0/m, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s16_x_untied, svint16_t,
+               z0 = svqabs_s16_x (p0, z1),
+               z0 = svqabs_x (p0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qabs_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qabs_s32.c
new file mode 100644 (file)
index 0000000..5341f78
--- /dev/null
@@ -0,0 +1,81 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qabs_s32_m_tied12:
+**     sqabs   z0\.s, p0/m, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s32_m_tied12, svint32_t,
+               z0 = svqabs_s32_m (z0, p0, z0),
+               z0 = svqabs_m (z0, p0, z0))
+
+/*
+** qabs_s32_m_tied1:
+**     sqabs   z0\.s, p0/m, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s32_m_tied1, svint32_t,
+               z0 = svqabs_s32_m (z0, p0, z1),
+               z0 = svqabs_m (z0, p0, z1))
+
+/*
+** qabs_s32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqabs   z0\.s, p0/m, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s32_m_tied2, svint32_t,
+               z0 = svqabs_s32_m (z1, p0, z0),
+               z0 = svqabs_m (z1, p0, z0))
+
+/*
+** qabs_s32_m_untied:
+**     movprfx z0, z2
+**     sqabs   z0\.s, p0/m, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s32_m_untied, svint32_t,
+               z0 = svqabs_s32_m (z2, p0, z1),
+               z0 = svqabs_m (z2, p0, z1))
+
+/*
+** qabs_s32_z_tied1:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.s, p0/z, \1\.s
+**     sqabs   z0\.s, p0/m, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s32_z_tied1, svint32_t,
+               z0 = svqabs_s32_z (p0, z0),
+               z0 = svqabs_z (p0, z0))
+
+/*
+** qabs_s32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqabs   z0\.s, p0/m, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s32_z_untied, svint32_t,
+               z0 = svqabs_s32_z (p0, z1),
+               z0 = svqabs_z (p0, z1))
+
+/*
+** qabs_s32_x_tied1:
+**     sqabs   z0\.s, p0/m, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s32_x_tied1, svint32_t,
+               z0 = svqabs_s32_x (p0, z0),
+               z0 = svqabs_x (p0, z0))
+
+/*
+** qabs_s32_x_untied:
+**     sqabs   z0\.s, p0/m, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s32_x_untied, svint32_t,
+               z0 = svqabs_s32_x (p0, z1),
+               z0 = svqabs_x (p0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qabs_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qabs_s64.c
new file mode 100644 (file)
index 0000000..3679e65
--- /dev/null
@@ -0,0 +1,81 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qabs_s64_m_tied12:
+**     sqabs   z0\.d, p0/m, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s64_m_tied12, svint64_t,
+               z0 = svqabs_s64_m (z0, p0, z0),
+               z0 = svqabs_m (z0, p0, z0))
+
+/*
+** qabs_s64_m_tied1:
+**     sqabs   z0\.d, p0/m, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s64_m_tied1, svint64_t,
+               z0 = svqabs_s64_m (z0, p0, z1),
+               z0 = svqabs_m (z0, p0, z1))
+
+/*
+** qabs_s64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqabs   z0\.d, p0/m, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s64_m_tied2, svint64_t,
+               z0 = svqabs_s64_m (z1, p0, z0),
+               z0 = svqabs_m (z1, p0, z0))
+
+/*
+** qabs_s64_m_untied:
+**     movprfx z0, z2
+**     sqabs   z0\.d, p0/m, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s64_m_untied, svint64_t,
+               z0 = svqabs_s64_m (z2, p0, z1),
+               z0 = svqabs_m (z2, p0, z1))
+
+/*
+** qabs_s64_z_tied1:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0\.d, p0/z, \1
+**     sqabs   z0\.d, p0/m, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s64_z_tied1, svint64_t,
+               z0 = svqabs_s64_z (p0, z0),
+               z0 = svqabs_z (p0, z0))
+
+/*
+** qabs_s64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqabs   z0\.d, p0/m, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s64_z_untied, svint64_t,
+               z0 = svqabs_s64_z (p0, z1),
+               z0 = svqabs_z (p0, z1))
+
+/*
+** qabs_s64_x_tied1:
+**     sqabs   z0\.d, p0/m, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s64_x_tied1, svint64_t,
+               z0 = svqabs_s64_x (p0, z0),
+               z0 = svqabs_x (p0, z0))
+
+/*
+** qabs_s64_x_untied:
+**     sqabs   z0\.d, p0/m, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s64_x_untied, svint64_t,
+               z0 = svqabs_s64_x (p0, z1),
+               z0 = svqabs_x (p0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qabs_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qabs_s8.c
new file mode 100644 (file)
index 0000000..dca25f9
--- /dev/null
@@ -0,0 +1,81 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qabs_s8_m_tied12:
+**     sqabs   z0\.b, p0/m, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s8_m_tied12, svint8_t,
+               z0 = svqabs_s8_m (z0, p0, z0),
+               z0 = svqabs_m (z0, p0, z0))
+
+/*
+** qabs_s8_m_tied1:
+**     sqabs   z0\.b, p0/m, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s8_m_tied1, svint8_t,
+               z0 = svqabs_s8_m (z0, p0, z1),
+               z0 = svqabs_m (z0, p0, z1))
+
+/*
+** qabs_s8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqabs   z0\.b, p0/m, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s8_m_tied2, svint8_t,
+               z0 = svqabs_s8_m (z1, p0, z0),
+               z0 = svqabs_m (z1, p0, z0))
+
+/*
+** qabs_s8_m_untied:
+**     movprfx z0, z2
+**     sqabs   z0\.b, p0/m, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s8_m_untied, svint8_t,
+               z0 = svqabs_s8_m (z2, p0, z1),
+               z0 = svqabs_m (z2, p0, z1))
+
+/*
+** qabs_s8_z_tied1:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.b, p0/z, \1\.b
+**     sqabs   z0\.b, p0/m, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s8_z_tied1, svint8_t,
+               z0 = svqabs_s8_z (p0, z0),
+               z0 = svqabs_z (p0, z0))
+
+/*
+** qabs_s8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqabs   z0\.b, p0/m, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s8_z_untied, svint8_t,
+               z0 = svqabs_s8_z (p0, z1),
+               z0 = svqabs_z (p0, z1))
+
+/*
+** qabs_s8_x_tied1:
+**     sqabs   z0\.b, p0/m, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s8_x_tied1, svint8_t,
+               z0 = svqabs_s8_x (p0, z0),
+               z0 = svqabs_x (p0, z0))
+
+/*
+** qabs_s8_x_untied:
+**     sqabs   z0\.b, p0/m, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qabs_s8_x_untied, svint8_t,
+               z0 = svqabs_s8_x (p0, z1),
+               z0 = svqabs_x (p0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_s16.c
new file mode 100644 (file)
index 0000000..6330c42
--- /dev/null
@@ -0,0 +1,530 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qadd_s16_tied1:
+**     sqadd   z0\.h, (z0\.h, z1\.h|z1\.h, z0\.h)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s16_tied1, svint16_t,
+               z0 = svqadd_s16 (z0, z1),
+               z0 = svqadd (z0, z1))
+
+/*
+** qadd_s16_tied2:
+**     sqadd   z0\.h, (z0\.h, z1\.h|z1\.h, z0\.h)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s16_tied2, svint16_t,
+               z0 = svqadd_s16 (z1, z0),
+               z0 = svqadd (z1, z0))
+
+/*
+** qadd_s16_untied:
+**     sqadd   z0\.h, (z1\.h, z2\.h|z2\.h, z1\.h)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s16_untied, svint16_t,
+               z0 = svqadd_s16 (z1, z2),
+               z0 = svqadd (z1, z2))
+
+/*
+** qadd_w0_s16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqadd   z0\.h, (z0\.h, \1|\1, z0\.h)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s16_tied1, svint16_t, int16_t,
+                z0 = svqadd_n_s16 (z0, x0),
+                z0 = svqadd (z0, x0))
+
+/*
+** qadd_w0_s16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     sqadd   z0\.h, (z1\.h, \1|\1, z1\.h)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s16_untied, svint16_t, int16_t,
+                z0 = svqadd_n_s16 (z1, x0),
+                z0 = svqadd (z1, x0))
+
+/*
+** qadd_1_s16_tied1:
+**     sqadd   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s16_tied1, svint16_t,
+               z0 = svqadd_n_s16 (z0, 1),
+               z0 = svqadd (z0, 1))
+
+/*
+** qadd_1_s16_untied:
+**     movprfx z0, z1
+**     sqadd   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s16_untied, svint16_t,
+               z0 = svqadd_n_s16 (z1, 1),
+               z0 = svqadd (z1, 1))
+
+/*
+** qadd_127_s16:
+**     sqadd   z0\.h, z0\.h, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_s16, svint16_t,
+               z0 = svqadd_n_s16 (z0, 127),
+               z0 = svqadd (z0, 127))
+
+/*
+** qadd_128_s16:
+**     sqadd   z0\.h, z0\.h, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_s16, svint16_t,
+               z0 = svqadd_n_s16 (z0, 128),
+               z0 = svqadd (z0, 128))
+
+/*
+** qadd_255_s16:
+**     sqadd   z0\.h, z0\.h, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_s16, svint16_t,
+               z0 = svqadd_n_s16 (z0, 255),
+               z0 = svqadd (z0, 255))
+
+/*
+** qadd_m1_s16:
+**     sqsub   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_s16, svint16_t,
+               z0 = svqadd_n_s16 (z0, -1),
+               z0 = svqadd (z0, -1))
+
+/*
+** qadd_m127_s16:
+**     sqsub   z0\.h, z0\.h, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_s16, svint16_t,
+               z0 = svqadd_n_s16 (z0, -127),
+               z0 = svqadd (z0, -127))
+
+/*
+** qadd_m128_s16:
+**     sqsub   z0\.h, z0\.h, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_s16, svint16_t,
+               z0 = svqadd_n_s16 (z0, -128),
+               z0 = svqadd (z0, -128))
+
+/*
+** qadd_s16_m_tied1:
+**     sqadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s16_m_tied1, svint16_t,
+               z0 = svqadd_s16_m (p0, z0, z1),
+               z0 = svqadd_m (p0, z0, z1))
+
+/*
+** qadd_s16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqadd   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s16_m_tied2, svint16_t,
+               z0 = svqadd_s16_m (p0, z1, z0),
+               z0 = svqadd_m (p0, z1, z0))
+
+/*
+** qadd_s16_m_untied:
+**     movprfx z0, z1
+**     sqadd   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s16_m_untied, svint16_t,
+               z0 = svqadd_s16_m (p0, z1, z2),
+               z0 = svqadd_m (p0, z1, z2))
+
+/*
+** qadd_w0_s16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s16_m_tied1, svint16_t, int16_t,
+                z0 = svqadd_n_s16_m (p0, z0, x0),
+                z0 = svqadd_m (p0, z0, x0))
+
+/*
+** qadd_w0_s16_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     sqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s16_m_untied, svint16_t, int16_t,
+                z0 = svqadd_n_s16_m (p0, z1, x0),
+                z0 = svqadd_m (p0, z1, x0))
+
+/*
+** qadd_1_s16_m_tied1:
+**     mov     (z[0-9]+\.h), #1
+**     sqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s16_m_tied1, svint16_t,
+               z0 = svqadd_n_s16_m (p0, z0, 1),
+               z0 = svqadd_m (p0, z0, 1))
+
+/*
+** qadd_1_s16_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.h), #1
+**     movprfx z0, z1
+**     sqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s16_m_untied, svint16_t,
+               z0 = svqadd_n_s16_m (p0, z1, 1),
+               z0 = svqadd_m (p0, z1, 1))
+
+/*
+** qadd_127_s16_m:
+**     mov     (z[0-9]+\.h), #127
+**     sqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_s16_m, svint16_t,
+               z0 = svqadd_n_s16_m (p0, z0, 127),
+               z0 = svqadd_m (p0, z0, 127))
+
+/*
+** qadd_128_s16_m:
+**     mov     (z[0-9]+\.h), #128
+**     sqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_s16_m, svint16_t,
+               z0 = svqadd_n_s16_m (p0, z0, 128),
+               z0 = svqadd_m (p0, z0, 128))
+
+/*
+** qadd_255_s16_m:
+**     mov     (z[0-9]+\.h), #255
+**     sqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_s16_m, svint16_t,
+               z0 = svqadd_n_s16_m (p0, z0, 255),
+               z0 = svqadd_m (p0, z0, 255))
+
+/*
+** qadd_m1_s16_m:
+**     mov     (z[0-9]+)\.b, #-1
+**     sqadd   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_s16_m, svint16_t,
+               z0 = svqadd_n_s16_m (p0, z0, -1),
+               z0 = svqadd_m (p0, z0, -1))
+
+/*
+** qadd_m127_s16_m:
+**     mov     (z[0-9]+\.h), #-127
+**     sqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_s16_m, svint16_t,
+               z0 = svqadd_n_s16_m (p0, z0, -127),
+               z0 = svqadd_m (p0, z0, -127))
+
+/*
+** qadd_m128_s16_m:
+**     mov     (z[0-9]+\.h), #-128
+**     sqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_s16_m, svint16_t,
+               z0 = svqadd_n_s16_m (p0, z0, -128),
+               z0 = svqadd_m (p0, z0, -128))
+
+/*
+** qadd_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s16_z_tied1, svint16_t,
+               z0 = svqadd_s16_z (p0, z0, z1),
+               z0 = svqadd_z (p0, z0, z1))
+
+/*
+** qadd_s16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s16_z_tied2, svint16_t,
+               z0 = svqadd_s16_z (p0, z1, z0),
+               z0 = svqadd_z (p0, z1, z0))
+
+/*
+** qadd_s16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqadd   z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0\.h, p0/z, z2\.h
+**     sqadd   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s16_z_untied, svint16_t,
+               z0 = svqadd_s16_z (p0, z1, z2),
+               z0 = svqadd_z (p0, z1, z2))
+
+/*
+** qadd_w0_s16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s16_z_tied1, svint16_t, int16_t,
+                z0 = svqadd_n_s16_z (p0, z0, x0),
+                z0 = svqadd_z (p0, z0, x0))
+
+/*
+** qadd_w0_s16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqadd   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     sqadd   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s16_z_untied, svint16_t, int16_t,
+                z0 = svqadd_n_s16_z (p0, z1, x0),
+                z0 = svqadd_z (p0, z1, x0))
+
+/*
+** qadd_1_s16_z_tied1:
+**     mov     (z[0-9]+\.h), #1
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s16_z_tied1, svint16_t,
+               z0 = svqadd_n_s16_z (p0, z0, 1),
+               z0 = svqadd_z (p0, z0, 1))
+
+/*
+** qadd_1_s16_z_untied:
+**     mov     (z[0-9]+\.h), #1
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqadd   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     sqadd   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s16_z_untied, svint16_t,
+               z0 = svqadd_n_s16_z (p0, z1, 1),
+               z0 = svqadd_z (p0, z1, 1))
+
+/*
+** qadd_127_s16_z:
+**     mov     (z[0-9]+\.h), #127
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_s16_z, svint16_t,
+               z0 = svqadd_n_s16_z (p0, z0, 127),
+               z0 = svqadd_z (p0, z0, 127))
+
+/*
+** qadd_128_s16_z:
+**     mov     (z[0-9]+\.h), #128
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_s16_z, svint16_t,
+               z0 = svqadd_n_s16_z (p0, z0, 128),
+               z0 = svqadd_z (p0, z0, 128))
+
+/*
+** qadd_255_s16_z:
+**     mov     (z[0-9]+\.h), #255
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_s16_z, svint16_t,
+               z0 = svqadd_n_s16_z (p0, z0, 255),
+               z0 = svqadd_z (p0, z0, 255))
+
+/*
+** qadd_m1_s16_z:
+**     mov     (z[0-9]+)\.b, #-1
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqadd   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_s16_z, svint16_t,
+               z0 = svqadd_n_s16_z (p0, z0, -1),
+               z0 = svqadd_z (p0, z0, -1))
+
+/*
+** qadd_m127_s16_z:
+**     mov     (z[0-9]+\.h), #-127
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_s16_z, svint16_t,
+               z0 = svqadd_n_s16_z (p0, z0, -127),
+               z0 = svqadd_z (p0, z0, -127))
+
+/*
+** qadd_m128_s16_z:
+**     mov     (z[0-9]+\.h), #-128
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_s16_z, svint16_t,
+               z0 = svqadd_n_s16_z (p0, z0, -128),
+               z0 = svqadd_z (p0, z0, -128))
+
+/*
+** qadd_s16_x_tied1:
+**     sqadd   z0\.h, (z0\.h, z1\.h|z1\.h, z0\.h)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s16_x_tied1, svint16_t,
+               z0 = svqadd_s16_x (p0, z0, z1),
+               z0 = svqadd_x (p0, z0, z1))
+
+/*
+** qadd_s16_x_tied2:
+**     sqadd   z0\.h, (z0\.h, z1\.h|z1\.h, z0\.h)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s16_x_tied2, svint16_t,
+               z0 = svqadd_s16_x (p0, z1, z0),
+               z0 = svqadd_x (p0, z1, z0))
+
+/*
+** qadd_s16_x_untied:
+**     sqadd   z0\.h, (z1\.h, z2\.h|z2\.h, z1\.h)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s16_x_untied, svint16_t,
+               z0 = svqadd_s16_x (p0, z1, z2),
+               z0 = svqadd_x (p0, z1, z2))
+
+/*
+** qadd_w0_s16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqadd   z0\.h, (z0\.h, \1|\1, z0\.h)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s16_x_tied1, svint16_t, int16_t,
+                z0 = svqadd_n_s16_x (p0, z0, x0),
+                z0 = svqadd_x (p0, z0, x0))
+
+/*
+** qadd_w0_s16_x_untied:
+**     mov     (z[0-9]+\.h), w0
+**     sqadd   z0\.h, (z1\.h, \1|\1, z1\.h)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s16_x_untied, svint16_t, int16_t,
+                z0 = svqadd_n_s16_x (p0, z1, x0),
+                z0 = svqadd_x (p0, z1, x0))
+
+/*
+** qadd_1_s16_x_tied1:
+**     sqadd   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s16_x_tied1, svint16_t,
+               z0 = svqadd_n_s16_x (p0, z0, 1),
+               z0 = svqadd_x (p0, z0, 1))
+
+/*
+** qadd_1_s16_x_untied:
+**     movprfx z0, z1
+**     sqadd   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s16_x_untied, svint16_t,
+               z0 = svqadd_n_s16_x (p0, z1, 1),
+               z0 = svqadd_x (p0, z1, 1))
+
+/*
+** qadd_127_s16_x:
+**     sqadd   z0\.h, z0\.h, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_s16_x, svint16_t,
+               z0 = svqadd_n_s16_x (p0, z0, 127),
+               z0 = svqadd_x (p0, z0, 127))
+
+/*
+** qadd_128_s16_x:
+**     sqadd   z0\.h, z0\.h, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_s16_x, svint16_t,
+               z0 = svqadd_n_s16_x (p0, z0, 128),
+               z0 = svqadd_x (p0, z0, 128))
+
+/*
+** qadd_255_s16_x:
+**     sqadd   z0\.h, z0\.h, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_s16_x, svint16_t,
+               z0 = svqadd_n_s16_x (p0, z0, 255),
+               z0 = svqadd_x (p0, z0, 255))
+
+/*
+** qadd_m1_s16_x:
+**     sqsub   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_s16_x, svint16_t,
+               z0 = svqadd_n_s16_x (p0, z0, -1),
+               z0 = svqadd_x (p0, z0, -1))
+
+/*
+** qadd_m127_s16_x:
+**     sqsub   z0\.h, z0\.h, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_s16_x, svint16_t,
+               z0 = svqadd_n_s16_x (p0, z0, -127),
+               z0 = svqadd_x (p0, z0, -127))
+
+/*
+** qadd_m128_s16_x:
+**     sqsub   z0\.h, z0\.h, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_s16_x, svint16_t,
+               z0 = svqadd_n_s16_x (p0, z0, -128),
+               z0 = svqadd_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_s32.c
new file mode 100644 (file)
index 0000000..bab4874
--- /dev/null
@@ -0,0 +1,530 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qadd_s32_tied1:
+**     sqadd   z0\.s, (z0\.s, z1\.s|z1\.s, z0\.s)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s32_tied1, svint32_t,
+               z0 = svqadd_s32 (z0, z1),
+               z0 = svqadd (z0, z1))
+
+/*
+** qadd_s32_tied2:
+**     sqadd   z0\.s, (z0\.s, z1\.s|z1\.s, z0\.s)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s32_tied2, svint32_t,
+               z0 = svqadd_s32 (z1, z0),
+               z0 = svqadd (z1, z0))
+
+/*
+** qadd_s32_untied:
+**     sqadd   z0\.s, (z1\.s, z2\.s|z2\.s, z1\.s)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s32_untied, svint32_t,
+               z0 = svqadd_s32 (z1, z2),
+               z0 = svqadd (z1, z2))
+
+/*
+** qadd_w0_s32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqadd   z0\.s, (z0\.s, \1|\1, z0\.s)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s32_tied1, svint32_t, int32_t,
+                z0 = svqadd_n_s32 (z0, x0),
+                z0 = svqadd (z0, x0))
+
+/*
+** qadd_w0_s32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     sqadd   z0\.s, (z1\.s, \1|\1, z1\.s)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s32_untied, svint32_t, int32_t,
+                z0 = svqadd_n_s32 (z1, x0),
+                z0 = svqadd (z1, x0))
+
+/*
+** qadd_1_s32_tied1:
+**     sqadd   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s32_tied1, svint32_t,
+               z0 = svqadd_n_s32 (z0, 1),
+               z0 = svqadd (z0, 1))
+
+/*
+** qadd_1_s32_untied:
+**     movprfx z0, z1
+**     sqadd   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s32_untied, svint32_t,
+               z0 = svqadd_n_s32 (z1, 1),
+               z0 = svqadd (z1, 1))
+
+/*
+** qadd_127_s32:
+**     sqadd   z0\.s, z0\.s, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_s32, svint32_t,
+               z0 = svqadd_n_s32 (z0, 127),
+               z0 = svqadd (z0, 127))
+
+/*
+** qadd_128_s32:
+**     sqadd   z0\.s, z0\.s, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_s32, svint32_t,
+               z0 = svqadd_n_s32 (z0, 128),
+               z0 = svqadd (z0, 128))
+
+/*
+** qadd_255_s32:
+**     sqadd   z0\.s, z0\.s, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_s32, svint32_t,
+               z0 = svqadd_n_s32 (z0, 255),
+               z0 = svqadd (z0, 255))
+
+/*
+** qadd_m1_s32:
+**     sqsub   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_s32, svint32_t,
+               z0 = svqadd_n_s32 (z0, -1),
+               z0 = svqadd (z0, -1))
+
+/*
+** qadd_m127_s32:
+**     sqsub   z0\.s, z0\.s, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_s32, svint32_t,
+               z0 = svqadd_n_s32 (z0, -127),
+               z0 = svqadd (z0, -127))
+
+/*
+** qadd_m128_s32:
+**     sqsub   z0\.s, z0\.s, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_s32, svint32_t,
+               z0 = svqadd_n_s32 (z0, -128),
+               z0 = svqadd (z0, -128))
+
+/*
+** qadd_s32_m_tied1:
+**     sqadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s32_m_tied1, svint32_t,
+               z0 = svqadd_s32_m (p0, z0, z1),
+               z0 = svqadd_m (p0, z0, z1))
+
+/*
+** qadd_s32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqadd   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s32_m_tied2, svint32_t,
+               z0 = svqadd_s32_m (p0, z1, z0),
+               z0 = svqadd_m (p0, z1, z0))
+
+/*
+** qadd_s32_m_untied:
+**     movprfx z0, z1
+**     sqadd   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s32_m_untied, svint32_t,
+               z0 = svqadd_s32_m (p0, z1, z2),
+               z0 = svqadd_m (p0, z1, z2))
+
+/*
+** qadd_w0_s32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s32_m_tied1, svint32_t, int32_t,
+                z0 = svqadd_n_s32_m (p0, z0, x0),
+                z0 = svqadd_m (p0, z0, x0))
+
+/*
+** qadd_w0_s32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     sqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s32_m_untied, svint32_t, int32_t,
+                z0 = svqadd_n_s32_m (p0, z1, x0),
+                z0 = svqadd_m (p0, z1, x0))
+
+/*
+** qadd_1_s32_m_tied1:
+**     mov     (z[0-9]+\.s), #1
+**     sqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s32_m_tied1, svint32_t,
+               z0 = svqadd_n_s32_m (p0, z0, 1),
+               z0 = svqadd_m (p0, z0, 1))
+
+/*
+** qadd_1_s32_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.s), #1
+**     movprfx z0, z1
+**     sqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s32_m_untied, svint32_t,
+               z0 = svqadd_n_s32_m (p0, z1, 1),
+               z0 = svqadd_m (p0, z1, 1))
+
+/*
+** qadd_127_s32_m:
+**     mov     (z[0-9]+\.s), #127
+**     sqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_s32_m, svint32_t,
+               z0 = svqadd_n_s32_m (p0, z0, 127),
+               z0 = svqadd_m (p0, z0, 127))
+
+/*
+** qadd_128_s32_m:
+**     mov     (z[0-9]+\.s), #128
+**     sqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_s32_m, svint32_t,
+               z0 = svqadd_n_s32_m (p0, z0, 128),
+               z0 = svqadd_m (p0, z0, 128))
+
+/*
+** qadd_255_s32_m:
+**     mov     (z[0-9]+\.s), #255
+**     sqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_s32_m, svint32_t,
+               z0 = svqadd_n_s32_m (p0, z0, 255),
+               z0 = svqadd_m (p0, z0, 255))
+
+/*
+** qadd_m1_s32_m:
+**     mov     (z[0-9]+)\.b, #-1
+**     sqadd   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_s32_m, svint32_t,
+               z0 = svqadd_n_s32_m (p0, z0, -1),
+               z0 = svqadd_m (p0, z0, -1))
+
+/*
+** qadd_m127_s32_m:
+**     mov     (z[0-9]+\.s), #-127
+**     sqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_s32_m, svint32_t,
+               z0 = svqadd_n_s32_m (p0, z0, -127),
+               z0 = svqadd_m (p0, z0, -127))
+
+/*
+** qadd_m128_s32_m:
+**     mov     (z[0-9]+\.s), #-128
+**     sqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_s32_m, svint32_t,
+               z0 = svqadd_n_s32_m (p0, z0, -128),
+               z0 = svqadd_m (p0, z0, -128))
+
+/*
+** qadd_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s32_z_tied1, svint32_t,
+               z0 = svqadd_s32_z (p0, z0, z1),
+               z0 = svqadd_z (p0, z0, z1))
+
+/*
+** qadd_s32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s32_z_tied2, svint32_t,
+               z0 = svqadd_s32_z (p0, z1, z0),
+               z0 = svqadd_z (p0, z1, z0))
+
+/*
+** qadd_s32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqadd   z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0\.s, p0/z, z2\.s
+**     sqadd   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s32_z_untied, svint32_t,
+               z0 = svqadd_s32_z (p0, z1, z2),
+               z0 = svqadd_z (p0, z1, z2))
+
+/*
+** qadd_w0_s32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s32_z_tied1, svint32_t, int32_t,
+                z0 = svqadd_n_s32_z (p0, z0, x0),
+                z0 = svqadd_z (p0, z0, x0))
+
+/*
+** qadd_w0_s32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqadd   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     sqadd   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s32_z_untied, svint32_t, int32_t,
+                z0 = svqadd_n_s32_z (p0, z1, x0),
+                z0 = svqadd_z (p0, z1, x0))
+
+/*
+** qadd_1_s32_z_tied1:
+**     mov     (z[0-9]+\.s), #1
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s32_z_tied1, svint32_t,
+               z0 = svqadd_n_s32_z (p0, z0, 1),
+               z0 = svqadd_z (p0, z0, 1))
+
+/*
+** qadd_1_s32_z_untied:
+**     mov     (z[0-9]+\.s), #1
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqadd   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     sqadd   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s32_z_untied, svint32_t,
+               z0 = svqadd_n_s32_z (p0, z1, 1),
+               z0 = svqadd_z (p0, z1, 1))
+
+/*
+** qadd_127_s32_z:
+**     mov     (z[0-9]+\.s), #127
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_s32_z, svint32_t,
+               z0 = svqadd_n_s32_z (p0, z0, 127),
+               z0 = svqadd_z (p0, z0, 127))
+
+/*
+** qadd_128_s32_z:
+**     mov     (z[0-9]+\.s), #128
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_s32_z, svint32_t,
+               z0 = svqadd_n_s32_z (p0, z0, 128),
+               z0 = svqadd_z (p0, z0, 128))
+
+/*
+** qadd_255_s32_z:
+**     mov     (z[0-9]+\.s), #255
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_s32_z, svint32_t,
+               z0 = svqadd_n_s32_z (p0, z0, 255),
+               z0 = svqadd_z (p0, z0, 255))
+
+/*
+** qadd_m1_s32_z:
+**     mov     (z[0-9]+)\.b, #-1
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqadd   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_s32_z, svint32_t,
+               z0 = svqadd_n_s32_z (p0, z0, -1),
+               z0 = svqadd_z (p0, z0, -1))
+
+/*
+** qadd_m127_s32_z:
+**     mov     (z[0-9]+\.s), #-127
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_s32_z, svint32_t,
+               z0 = svqadd_n_s32_z (p0, z0, -127),
+               z0 = svqadd_z (p0, z0, -127))
+
+/*
+** qadd_m128_s32_z:
+**     mov     (z[0-9]+\.s), #-128
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_s32_z, svint32_t,
+               z0 = svqadd_n_s32_z (p0, z0, -128),
+               z0 = svqadd_z (p0, z0, -128))
+
+/*
+** qadd_s32_x_tied1:
+**     sqadd   z0\.s, (z0\.s, z1\.s|z1\.s, z0\.s)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s32_x_tied1, svint32_t,
+               z0 = svqadd_s32_x (p0, z0, z1),
+               z0 = svqadd_x (p0, z0, z1))
+
+/*
+** qadd_s32_x_tied2:
+**     sqadd   z0\.s, (z0\.s, z1\.s|z1\.s, z0\.s)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s32_x_tied2, svint32_t,
+               z0 = svqadd_s32_x (p0, z1, z0),
+               z0 = svqadd_x (p0, z1, z0))
+
+/*
+** qadd_s32_x_untied:
+**     sqadd   z0\.s, (z1\.s, z2\.s|z2\.s, z1\.s)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s32_x_untied, svint32_t,
+               z0 = svqadd_s32_x (p0, z1, z2),
+               z0 = svqadd_x (p0, z1, z2))
+
+/*
+** qadd_w0_s32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqadd   z0\.s, (z0\.s, \1|\1, z0\.s)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s32_x_tied1, svint32_t, int32_t,
+                z0 = svqadd_n_s32_x (p0, z0, x0),
+                z0 = svqadd_x (p0, z0, x0))
+
+/*
+** qadd_w0_s32_x_untied:
+**     mov     (z[0-9]+\.s), w0
+**     sqadd   z0\.s, (z1\.s, \1|\1, z1\.s)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s32_x_untied, svint32_t, int32_t,
+                z0 = svqadd_n_s32_x (p0, z1, x0),
+                z0 = svqadd_x (p0, z1, x0))
+
+/*
+** qadd_1_s32_x_tied1:
+**     sqadd   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s32_x_tied1, svint32_t,
+               z0 = svqadd_n_s32_x (p0, z0, 1),
+               z0 = svqadd_x (p0, z0, 1))
+
+/*
+** qadd_1_s32_x_untied:
+**     movprfx z0, z1
+**     sqadd   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s32_x_untied, svint32_t,
+               z0 = svqadd_n_s32_x (p0, z1, 1),
+               z0 = svqadd_x (p0, z1, 1))
+
+/*
+** qadd_127_s32_x:
+**     sqadd   z0\.s, z0\.s, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_s32_x, svint32_t,
+               z0 = svqadd_n_s32_x (p0, z0, 127),
+               z0 = svqadd_x (p0, z0, 127))
+
+/*
+** qadd_128_s32_x:
+**     sqadd   z0\.s, z0\.s, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_s32_x, svint32_t,
+               z0 = svqadd_n_s32_x (p0, z0, 128),
+               z0 = svqadd_x (p0, z0, 128))
+
+/*
+** qadd_255_s32_x:
+**     sqadd   z0\.s, z0\.s, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_s32_x, svint32_t,
+               z0 = svqadd_n_s32_x (p0, z0, 255),
+               z0 = svqadd_x (p0, z0, 255))
+
+/*
+** qadd_m1_s32_x:
+**     sqsub   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_s32_x, svint32_t,
+               z0 = svqadd_n_s32_x (p0, z0, -1),
+               z0 = svqadd_x (p0, z0, -1))
+
+/*
+** qadd_m127_s32_x:
+**     sqsub   z0\.s, z0\.s, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_s32_x, svint32_t,
+               z0 = svqadd_n_s32_x (p0, z0, -127),
+               z0 = svqadd_x (p0, z0, -127))
+
+/*
+** qadd_m128_s32_x:
+**     sqsub   z0\.s, z0\.s, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_s32_x, svint32_t,
+               z0 = svqadd_n_s32_x (p0, z0, -128),
+               z0 = svqadd_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_s64.c
new file mode 100644 (file)
index 0000000..c2ad921
--- /dev/null
@@ -0,0 +1,530 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qadd_s64_tied1:
+**     sqadd   z0\.d, (z0\.d, z1\.d|z1\.d, z0\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s64_tied1, svint64_t,
+               z0 = svqadd_s64 (z0, z1),
+               z0 = svqadd (z0, z1))
+
+/*
+** qadd_s64_tied2:
+**     sqadd   z0\.d, (z0\.d, z1\.d|z1\.d, z0\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s64_tied2, svint64_t,
+               z0 = svqadd_s64 (z1, z0),
+               z0 = svqadd (z1, z0))
+
+/*
+** qadd_s64_untied:
+**     sqadd   z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s64_untied, svint64_t,
+               z0 = svqadd_s64 (z1, z2),
+               z0 = svqadd (z1, z2))
+
+/*
+** qadd_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     sqadd   z0\.d, (z0\.d, \1|\1, z0\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_x0_s64_tied1, svint64_t, int64_t,
+                z0 = svqadd_n_s64 (z0, x0),
+                z0 = svqadd (z0, x0))
+
+/*
+** qadd_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     sqadd   z0\.d, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_x0_s64_untied, svint64_t, int64_t,
+                z0 = svqadd_n_s64 (z1, x0),
+                z0 = svqadd (z1, x0))
+
+/*
+** qadd_1_s64_tied1:
+**     sqadd   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s64_tied1, svint64_t,
+               z0 = svqadd_n_s64 (z0, 1),
+               z0 = svqadd (z0, 1))
+
+/*
+** qadd_1_s64_untied:
+**     movprfx z0, z1
+**     sqadd   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s64_untied, svint64_t,
+               z0 = svqadd_n_s64 (z1, 1),
+               z0 = svqadd (z1, 1))
+
+/*
+** qadd_127_s64:
+**     sqadd   z0\.d, z0\.d, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_s64, svint64_t,
+               z0 = svqadd_n_s64 (z0, 127),
+               z0 = svqadd (z0, 127))
+
+/*
+** qadd_128_s64:
+**     sqadd   z0\.d, z0\.d, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_s64, svint64_t,
+               z0 = svqadd_n_s64 (z0, 128),
+               z0 = svqadd (z0, 128))
+
+/*
+** qadd_255_s64:
+**     sqadd   z0\.d, z0\.d, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_s64, svint64_t,
+               z0 = svqadd_n_s64 (z0, 255),
+               z0 = svqadd (z0, 255))
+
+/*
+** qadd_m1_s64:
+**     sqsub   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_s64, svint64_t,
+               z0 = svqadd_n_s64 (z0, -1),
+               z0 = svqadd (z0, -1))
+
+/*
+** qadd_m127_s64:
+**     sqsub   z0\.d, z0\.d, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_s64, svint64_t,
+               z0 = svqadd_n_s64 (z0, -127),
+               z0 = svqadd (z0, -127))
+
+/*
+** qadd_m128_s64:
+**     sqsub   z0\.d, z0\.d, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_s64, svint64_t,
+               z0 = svqadd_n_s64 (z0, -128),
+               z0 = svqadd (z0, -128))
+
+/*
+** qadd_s64_m_tied1:
+**     sqadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s64_m_tied1, svint64_t,
+               z0 = svqadd_s64_m (p0, z0, z1),
+               z0 = svqadd_m (p0, z0, z1))
+
+/*
+** qadd_s64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s64_m_tied2, svint64_t,
+               z0 = svqadd_s64_m (p0, z1, z0),
+               z0 = svqadd_m (p0, z1, z0))
+
+/*
+** qadd_s64_m_untied:
+**     movprfx z0, z1
+**     sqadd   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s64_m_untied, svint64_t,
+               z0 = svqadd_s64_m (p0, z1, z2),
+               z0 = svqadd_m (p0, z1, z2))
+
+/*
+** qadd_x0_s64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     sqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_x0_s64_m_tied1, svint64_t, int64_t,
+                z0 = svqadd_n_s64_m (p0, z0, x0),
+                z0 = svqadd_m (p0, z0, x0))
+
+/*
+** qadd_x0_s64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     sqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_x0_s64_m_untied, svint64_t, int64_t,
+                z0 = svqadd_n_s64_m (p0, z1, x0),
+                z0 = svqadd_m (p0, z1, x0))
+
+/*
+** qadd_1_s64_m_tied1:
+**     mov     (z[0-9]+\.d), #1
+**     sqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s64_m_tied1, svint64_t,
+               z0 = svqadd_n_s64_m (p0, z0, 1),
+               z0 = svqadd_m (p0, z0, 1))
+
+/*
+** qadd_1_s64_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.d), #1
+**     movprfx z0, z1
+**     sqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s64_m_untied, svint64_t,
+               z0 = svqadd_n_s64_m (p0, z1, 1),
+               z0 = svqadd_m (p0, z1, 1))
+
+/*
+** qadd_127_s64_m:
+**     mov     (z[0-9]+\.d), #127
+**     sqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_s64_m, svint64_t,
+               z0 = svqadd_n_s64_m (p0, z0, 127),
+               z0 = svqadd_m (p0, z0, 127))
+
+/*
+** qadd_128_s64_m:
+**     mov     (z[0-9]+\.d), #128
+**     sqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_s64_m, svint64_t,
+               z0 = svqadd_n_s64_m (p0, z0, 128),
+               z0 = svqadd_m (p0, z0, 128))
+
+/*
+** qadd_255_s64_m:
+**     mov     (z[0-9]+\.d), #255
+**     sqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_s64_m, svint64_t,
+               z0 = svqadd_n_s64_m (p0, z0, 255),
+               z0 = svqadd_m (p0, z0, 255))
+
+/*
+** qadd_m1_s64_m:
+**     mov     (z[0-9]+)\.b, #-1
+**     sqadd   z0\.d, p0/m, z0\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_s64_m, svint64_t,
+               z0 = svqadd_n_s64_m (p0, z0, -1),
+               z0 = svqadd_m (p0, z0, -1))
+
+/*
+** qadd_m127_s64_m:
+**     mov     (z[0-9]+\.d), #-127
+**     sqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_s64_m, svint64_t,
+               z0 = svqadd_n_s64_m (p0, z0, -127),
+               z0 = svqadd_m (p0, z0, -127))
+
+/*
+** qadd_m128_s64_m:
+**     mov     (z[0-9]+\.d), #-128
+**     sqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_s64_m, svint64_t,
+               z0 = svqadd_n_s64_m (p0, z0, -128),
+               z0 = svqadd_m (p0, z0, -128))
+
+/*
+** qadd_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s64_z_tied1, svint64_t,
+               z0 = svqadd_s64_z (p0, z0, z1),
+               z0 = svqadd_z (p0, z0, z1))
+
+/*
+** qadd_s64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s64_z_tied2, svint64_t,
+               z0 = svqadd_s64_z (p0, z1, z0),
+               z0 = svqadd_z (p0, z1, z0))
+
+/*
+** qadd_s64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqadd   z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0\.d, p0/z, z2\.d
+**     sqadd   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s64_z_untied, svint64_t,
+               z0 = svqadd_s64_z (p0, z1, z2),
+               z0 = svqadd_z (p0, z1, z2))
+
+/*
+** qadd_x0_s64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_x0_s64_z_tied1, svint64_t, int64_t,
+                z0 = svqadd_n_s64_z (p0, z0, x0),
+                z0 = svqadd_z (p0, z0, x0))
+
+/*
+** qadd_x0_s64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqadd   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     sqadd   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_x0_s64_z_untied, svint64_t, int64_t,
+                z0 = svqadd_n_s64_z (p0, z1, x0),
+                z0 = svqadd_z (p0, z1, x0))
+
+/*
+** qadd_1_s64_z_tied1:
+**     mov     (z[0-9]+\.d), #1
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s64_z_tied1, svint64_t,
+               z0 = svqadd_n_s64_z (p0, z0, 1),
+               z0 = svqadd_z (p0, z0, 1))
+
+/*
+** qadd_1_s64_z_untied:
+**     mov     (z[0-9]+\.d), #1
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqadd   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     sqadd   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s64_z_untied, svint64_t,
+               z0 = svqadd_n_s64_z (p0, z1, 1),
+               z0 = svqadd_z (p0, z1, 1))
+
+/*
+** qadd_127_s64_z:
+**     mov     (z[0-9]+\.d), #127
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_s64_z, svint64_t,
+               z0 = svqadd_n_s64_z (p0, z0, 127),
+               z0 = svqadd_z (p0, z0, 127))
+
+/*
+** qadd_128_s64_z:
+**     mov     (z[0-9]+\.d), #128
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_s64_z, svint64_t,
+               z0 = svqadd_n_s64_z (p0, z0, 128),
+               z0 = svqadd_z (p0, z0, 128))
+
+/*
+** qadd_255_s64_z:
+**     mov     (z[0-9]+\.d), #255
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_s64_z, svint64_t,
+               z0 = svqadd_n_s64_z (p0, z0, 255),
+               z0 = svqadd_z (p0, z0, 255))
+
+/*
+** qadd_m1_s64_z:
+**     mov     (z[0-9]+)\.b, #-1
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqadd   z0\.d, p0/m, z0\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_s64_z, svint64_t,
+               z0 = svqadd_n_s64_z (p0, z0, -1),
+               z0 = svqadd_z (p0, z0, -1))
+
+/*
+** qadd_m127_s64_z:
+**     mov     (z[0-9]+\.d), #-127
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_s64_z, svint64_t,
+               z0 = svqadd_n_s64_z (p0, z0, -127),
+               z0 = svqadd_z (p0, z0, -127))
+
+/*
+** qadd_m128_s64_z:
+**     mov     (z[0-9]+\.d), #-128
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_s64_z, svint64_t,
+               z0 = svqadd_n_s64_z (p0, z0, -128),
+               z0 = svqadd_z (p0, z0, -128))
+
+/*
+** qadd_s64_x_tied1:
+**     sqadd   z0\.d, (z0\.d, z1\.d|z1\.d, z0\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s64_x_tied1, svint64_t,
+               z0 = svqadd_s64_x (p0, z0, z1),
+               z0 = svqadd_x (p0, z0, z1))
+
+/*
+** qadd_s64_x_tied2:
+**     sqadd   z0\.d, (z0\.d, z1\.d|z1\.d, z0\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s64_x_tied2, svint64_t,
+               z0 = svqadd_s64_x (p0, z1, z0),
+               z0 = svqadd_x (p0, z1, z0))
+
+/*
+** qadd_s64_x_untied:
+**     sqadd   z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s64_x_untied, svint64_t,
+               z0 = svqadd_s64_x (p0, z1, z2),
+               z0 = svqadd_x (p0, z1, z2))
+
+/*
+** qadd_x0_s64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     sqadd   z0\.d, (z0\.d, \1|\1, z0\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_x0_s64_x_tied1, svint64_t, int64_t,
+                z0 = svqadd_n_s64_x (p0, z0, x0),
+                z0 = svqadd_x (p0, z0, x0))
+
+/*
+** qadd_x0_s64_x_untied:
+**     mov     (z[0-9]+\.d), x0
+**     sqadd   z0\.d, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_x0_s64_x_untied, svint64_t, int64_t,
+                z0 = svqadd_n_s64_x (p0, z1, x0),
+                z0 = svqadd_x (p0, z1, x0))
+
+/*
+** qadd_1_s64_x_tied1:
+**     sqadd   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s64_x_tied1, svint64_t,
+               z0 = svqadd_n_s64_x (p0, z0, 1),
+               z0 = svqadd_x (p0, z0, 1))
+
+/*
+** qadd_1_s64_x_untied:
+**     movprfx z0, z1
+**     sqadd   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s64_x_untied, svint64_t,
+               z0 = svqadd_n_s64_x (p0, z1, 1),
+               z0 = svqadd_x (p0, z1, 1))
+
+/*
+** qadd_127_s64_x:
+**     sqadd   z0\.d, z0\.d, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_s64_x, svint64_t,
+               z0 = svqadd_n_s64_x (p0, z0, 127),
+               z0 = svqadd_x (p0, z0, 127))
+
+/*
+** qadd_128_s64_x:
+**     sqadd   z0\.d, z0\.d, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_s64_x, svint64_t,
+               z0 = svqadd_n_s64_x (p0, z0, 128),
+               z0 = svqadd_x (p0, z0, 128))
+
+/*
+** qadd_255_s64_x:
+**     sqadd   z0\.d, z0\.d, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_s64_x, svint64_t,
+               z0 = svqadd_n_s64_x (p0, z0, 255),
+               z0 = svqadd_x (p0, z0, 255))
+
+/*
+** qadd_m1_s64_x:
+**     sqsub   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_s64_x, svint64_t,
+               z0 = svqadd_n_s64_x (p0, z0, -1),
+               z0 = svqadd_x (p0, z0, -1))
+
+/*
+** qadd_m127_s64_x:
+**     sqsub   z0\.d, z0\.d, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_s64_x, svint64_t,
+               z0 = svqadd_n_s64_x (p0, z0, -127),
+               z0 = svqadd_x (p0, z0, -127))
+
+/*
+** qadd_m128_s64_x:
+**     sqsub   z0\.d, z0\.d, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_s64_x, svint64_t,
+               z0 = svqadd_n_s64_x (p0, z0, -128),
+               z0 = svqadd_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_s8.c
new file mode 100644 (file)
index 0000000..61343be
--- /dev/null
@@ -0,0 +1,530 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qadd_s8_tied1:
+**     sqadd   z0\.b, (z0\.b, z1\.b|z1\.b, z0\.b)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s8_tied1, svint8_t,
+               z0 = svqadd_s8 (z0, z1),
+               z0 = svqadd (z0, z1))
+
+/*
+** qadd_s8_tied2:
+**     sqadd   z0\.b, (z0\.b, z1\.b|z1\.b, z0\.b)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s8_tied2, svint8_t,
+               z0 = svqadd_s8 (z1, z0),
+               z0 = svqadd (z1, z0))
+
+/*
+** qadd_s8_untied:
+**     sqadd   z0\.b, (z1\.b, z2\.b|z2\.b, z1\.b)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s8_untied, svint8_t,
+               z0 = svqadd_s8 (z1, z2),
+               z0 = svqadd (z1, z2))
+
+/*
+** qadd_w0_s8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqadd   z0\.b, (z0\.b, \1|\1, z0\.b)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s8_tied1, svint8_t, int8_t,
+                z0 = svqadd_n_s8 (z0, x0),
+                z0 = svqadd (z0, x0))
+
+/*
+** qadd_w0_s8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     sqadd   z0\.b, (z1\.b, \1|\1, z1\.b)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s8_untied, svint8_t, int8_t,
+                z0 = svqadd_n_s8 (z1, x0),
+                z0 = svqadd (z1, x0))
+
+/*
+** qadd_1_s8_tied1:
+**     sqadd   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s8_tied1, svint8_t,
+               z0 = svqadd_n_s8 (z0, 1),
+               z0 = svqadd (z0, 1))
+
+/*
+** qadd_1_s8_untied:
+**     movprfx z0, z1
+**     sqadd   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s8_untied, svint8_t,
+               z0 = svqadd_n_s8 (z1, 1),
+               z0 = svqadd (z1, 1))
+
+/*
+** qadd_127_s8:
+**     sqadd   z0\.b, z0\.b, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_s8, svint8_t,
+               z0 = svqadd_n_s8 (z0, 127),
+               z0 = svqadd (z0, 127))
+
+/*
+** qadd_128_s8:
+**     sqsub   z0\.b, z0\.b, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_s8, svint8_t,
+               z0 = svqadd_n_s8 (z0, 128),
+               z0 = svqadd (z0, 128))
+
+/*
+** qadd_255_s8:
+**     sqsub   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_s8, svint8_t,
+               z0 = svqadd_n_s8 (z0, 255),
+               z0 = svqadd (z0, 255))
+
+/*
+** qadd_m1_s8:
+**     sqsub   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_s8, svint8_t,
+               z0 = svqadd_n_s8 (z0, -1),
+               z0 = svqadd (z0, -1))
+
+/*
+** qadd_m127_s8:
+**     sqsub   z0\.b, z0\.b, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_s8, svint8_t,
+               z0 = svqadd_n_s8 (z0, -127),
+               z0 = svqadd (z0, -127))
+
+/*
+** qadd_m128_s8:
+**     sqsub   z0\.b, z0\.b, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_s8, svint8_t,
+               z0 = svqadd_n_s8 (z0, -128),
+               z0 = svqadd (z0, -128))
+
+/*
+** qadd_s8_m_tied1:
+**     sqadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s8_m_tied1, svint8_t,
+               z0 = svqadd_s8_m (p0, z0, z1),
+               z0 = svqadd_m (p0, z0, z1))
+
+/*
+** qadd_s8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqadd   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s8_m_tied2, svint8_t,
+               z0 = svqadd_s8_m (p0, z1, z0),
+               z0 = svqadd_m (p0, z1, z0))
+
+/*
+** qadd_s8_m_untied:
+**     movprfx z0, z1
+**     sqadd   z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s8_m_untied, svint8_t,
+               z0 = svqadd_s8_m (p0, z1, z2),
+               z0 = svqadd_m (p0, z1, z2))
+
+/*
+** qadd_w0_s8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s8_m_tied1, svint8_t, int8_t,
+                z0 = svqadd_n_s8_m (p0, z0, x0),
+                z0 = svqadd_m (p0, z0, x0))
+
+/*
+** qadd_w0_s8_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s8_m_untied, svint8_t, int8_t,
+                z0 = svqadd_n_s8_m (p0, z1, x0),
+                z0 = svqadd_m (p0, z1, x0))
+
+/*
+** qadd_1_s8_m_tied1:
+**     mov     (z[0-9]+\.b), #1
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s8_m_tied1, svint8_t,
+               z0 = svqadd_n_s8_m (p0, z0, 1),
+               z0 = svqadd_m (p0, z0, 1))
+
+/*
+** qadd_1_s8_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.b), #1
+**     movprfx z0, z1
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s8_m_untied, svint8_t,
+               z0 = svqadd_n_s8_m (p0, z1, 1),
+               z0 = svqadd_m (p0, z1, 1))
+
+/*
+** qadd_127_s8_m:
+**     mov     (z[0-9]+\.b), #127
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_s8_m, svint8_t,
+               z0 = svqadd_n_s8_m (p0, z0, 127),
+               z0 = svqadd_m (p0, z0, 127))
+
+/*
+** qadd_128_s8_m:
+**     mov     (z[0-9]+\.b), #-128
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_s8_m, svint8_t,
+               z0 = svqadd_n_s8_m (p0, z0, 128),
+               z0 = svqadd_m (p0, z0, 128))
+
+/*
+** qadd_255_s8_m:
+**     mov     (z[0-9]+\.b), #-1
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_s8_m, svint8_t,
+               z0 = svqadd_n_s8_m (p0, z0, 255),
+               z0 = svqadd_m (p0, z0, 255))
+
+/*
+** qadd_m1_s8_m:
+**     mov     (z[0-9]+\.b), #-1
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_s8_m, svint8_t,
+               z0 = svqadd_n_s8_m (p0, z0, -1),
+               z0 = svqadd_m (p0, z0, -1))
+
+/*
+** qadd_m127_s8_m:
+**     mov     (z[0-9]+\.b), #-127
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_s8_m, svint8_t,
+               z0 = svqadd_n_s8_m (p0, z0, -127),
+               z0 = svqadd_m (p0, z0, -127))
+
+/*
+** qadd_m128_s8_m:
+**     mov     (z[0-9]+\.b), #-128
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_s8_m, svint8_t,
+               z0 = svqadd_n_s8_m (p0, z0, -128),
+               z0 = svqadd_m (p0, z0, -128))
+
+/*
+** qadd_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s8_z_tied1, svint8_t,
+               z0 = svqadd_s8_z (p0, z0, z1),
+               z0 = svqadd_z (p0, z0, z1))
+
+/*
+** qadd_s8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s8_z_tied2, svint8_t,
+               z0 = svqadd_s8_z (p0, z1, z0),
+               z0 = svqadd_z (p0, z1, z0))
+
+/*
+** qadd_s8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqadd   z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0\.b, p0/z, z2\.b
+**     sqadd   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s8_z_untied, svint8_t,
+               z0 = svqadd_s8_z (p0, z1, z2),
+               z0 = svqadd_z (p0, z1, z2))
+
+/*
+** qadd_w0_s8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s8_z_tied1, svint8_t, int8_t,
+                z0 = svqadd_n_s8_z (p0, z0, x0),
+                z0 = svqadd_z (p0, z0, x0))
+
+/*
+** qadd_w0_s8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     sqadd   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s8_z_untied, svint8_t, int8_t,
+                z0 = svqadd_n_s8_z (p0, z1, x0),
+                z0 = svqadd_z (p0, z1, x0))
+
+/*
+** qadd_1_s8_z_tied1:
+**     mov     (z[0-9]+\.b), #1
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s8_z_tied1, svint8_t,
+               z0 = svqadd_n_s8_z (p0, z0, 1),
+               z0 = svqadd_z (p0, z0, 1))
+
+/*
+** qadd_1_s8_z_untied:
+**     mov     (z[0-9]+\.b), #1
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     sqadd   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s8_z_untied, svint8_t,
+               z0 = svqadd_n_s8_z (p0, z1, 1),
+               z0 = svqadd_z (p0, z1, 1))
+
+/*
+** qadd_127_s8_z:
+**     mov     (z[0-9]+\.b), #127
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_s8_z, svint8_t,
+               z0 = svqadd_n_s8_z (p0, z0, 127),
+               z0 = svqadd_z (p0, z0, 127))
+
+/*
+** qadd_128_s8_z:
+**     mov     (z[0-9]+\.b), #-128
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_s8_z, svint8_t,
+               z0 = svqadd_n_s8_z (p0, z0, 128),
+               z0 = svqadd_z (p0, z0, 128))
+
+/*
+** qadd_255_s8_z:
+**     mov     (z[0-9]+\.b), #-1
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_s8_z, svint8_t,
+               z0 = svqadd_n_s8_z (p0, z0, 255),
+               z0 = svqadd_z (p0, z0, 255))
+
+/*
+** qadd_m1_s8_z:
+**     mov     (z[0-9]+\.b), #-1
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_s8_z, svint8_t,
+               z0 = svqadd_n_s8_z (p0, z0, -1),
+               z0 = svqadd_z (p0, z0, -1))
+
+/*
+** qadd_m127_s8_z:
+**     mov     (z[0-9]+\.b), #-127
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_s8_z, svint8_t,
+               z0 = svqadd_n_s8_z (p0, z0, -127),
+               z0 = svqadd_z (p0, z0, -127))
+
+/*
+** qadd_m128_s8_z:
+**     mov     (z[0-9]+\.b), #-128
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_s8_z, svint8_t,
+               z0 = svqadd_n_s8_z (p0, z0, -128),
+               z0 = svqadd_z (p0, z0, -128))
+
+/*
+** qadd_s8_x_tied1:
+**     sqadd   z0\.b, (z0\.b, z1\.b|z1\.b, z0\.b)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s8_x_tied1, svint8_t,
+               z0 = svqadd_s8_x (p0, z0, z1),
+               z0 = svqadd_x (p0, z0, z1))
+
+/*
+** qadd_s8_x_tied2:
+**     sqadd   z0\.b, (z0\.b, z1\.b|z1\.b, z0\.b)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s8_x_tied2, svint8_t,
+               z0 = svqadd_s8_x (p0, z1, z0),
+               z0 = svqadd_x (p0, z1, z0))
+
+/*
+** qadd_s8_x_untied:
+**     sqadd   z0\.b, (z1\.b, z2\.b|z2\.b, z1\.b)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_s8_x_untied, svint8_t,
+               z0 = svqadd_s8_x (p0, z1, z2),
+               z0 = svqadd_x (p0, z1, z2))
+
+/*
+** qadd_w0_s8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqadd   z0\.b, (z0\.b, \1|\1, z0\.b)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s8_x_tied1, svint8_t, int8_t,
+                z0 = svqadd_n_s8_x (p0, z0, x0),
+                z0 = svqadd_x (p0, z0, x0))
+
+/*
+** qadd_w0_s8_x_untied:
+**     mov     (z[0-9]+\.b), w0
+**     sqadd   z0\.b, (z1\.b, \1|\1, z1\.b)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_s8_x_untied, svint8_t, int8_t,
+                z0 = svqadd_n_s8_x (p0, z1, x0),
+                z0 = svqadd_x (p0, z1, x0))
+
+/*
+** qadd_1_s8_x_tied1:
+**     sqadd   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s8_x_tied1, svint8_t,
+               z0 = svqadd_n_s8_x (p0, z0, 1),
+               z0 = svqadd_x (p0, z0, 1))
+
+/*
+** qadd_1_s8_x_untied:
+**     movprfx z0, z1
+**     sqadd   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_s8_x_untied, svint8_t,
+               z0 = svqadd_n_s8_x (p0, z1, 1),
+               z0 = svqadd_x (p0, z1, 1))
+
+/*
+** qadd_127_s8_x:
+**     sqadd   z0\.b, z0\.b, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_s8_x, svint8_t,
+               z0 = svqadd_n_s8_x (p0, z0, 127),
+               z0 = svqadd_x (p0, z0, 127))
+
+/*
+** qadd_128_s8_x:
+**     sqsub   z0\.b, z0\.b, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_s8_x, svint8_t,
+               z0 = svqadd_n_s8_x (p0, z0, 128),
+               z0 = svqadd_x (p0, z0, 128))
+
+/*
+** qadd_255_s8_x:
+**     sqsub   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_s8_x, svint8_t,
+               z0 = svqadd_n_s8_x (p0, z0, 255),
+               z0 = svqadd_x (p0, z0, 255))
+
+/*
+** qadd_m1_s8_x:
+**     sqsub   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_s8_x, svint8_t,
+               z0 = svqadd_n_s8_x (p0, z0, -1),
+               z0 = svqadd_x (p0, z0, -1))
+
+/*
+** qadd_m127_s8_x:
+**     sqsub   z0\.b, z0\.b, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_s8_x, svint8_t,
+               z0 = svqadd_n_s8_x (p0, z0, -127),
+               z0 = svqadd_x (p0, z0, -127))
+
+/*
+** qadd_m128_s8_x:
+**     sqsub   z0\.b, z0\.b, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_s8_x, svint8_t,
+               z0 = svqadd_n_s8_x (p0, z0, -128),
+               z0 = svqadd_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_u16.c
new file mode 100644 (file)
index 0000000..f6c7ca9
--- /dev/null
@@ -0,0 +1,536 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qadd_u16_tied1:
+**     uqadd   z0\.h, (z0\.h, z1\.h|z1\.h, z0\.h)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u16_tied1, svuint16_t,
+               z0 = svqadd_u16 (z0, z1),
+               z0 = svqadd (z0, z1))
+
+/*
+** qadd_u16_tied2:
+**     uqadd   z0\.h, (z0\.h, z1\.h|z1\.h, z0\.h)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u16_tied2, svuint16_t,
+               z0 = svqadd_u16 (z1, z0),
+               z0 = svqadd (z1, z0))
+
+/*
+** qadd_u16_untied:
+**     uqadd   z0\.h, (z1\.h, z2\.h|z2\.h, z1\.h)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u16_untied, svuint16_t,
+               z0 = svqadd_u16 (z1, z2),
+               z0 = svqadd (z1, z2))
+
+/*
+** qadd_w0_u16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uqadd   z0\.h, (z0\.h, \1|\1, z0\.h)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u16_tied1, svuint16_t, uint16_t,
+                z0 = svqadd_n_u16 (z0, x0),
+                z0 = svqadd (z0, x0))
+
+/*
+** qadd_w0_u16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     uqadd   z0\.h, (z1\.h, \1|\1, z1\.h)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u16_untied, svuint16_t, uint16_t,
+                z0 = svqadd_n_u16 (z1, x0),
+                z0 = svqadd (z1, x0))
+
+/*
+** qadd_1_u16_tied1:
+**     uqadd   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u16_tied1, svuint16_t,
+               z0 = svqadd_n_u16 (z0, 1),
+               z0 = svqadd (z0, 1))
+
+/*
+** qadd_1_u16_untied:
+**     movprfx z0, z1
+**     uqadd   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u16_untied, svuint16_t,
+               z0 = svqadd_n_u16 (z1, 1),
+               z0 = svqadd (z1, 1))
+
+/*
+** qadd_127_u16:
+**     uqadd   z0\.h, z0\.h, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_u16, svuint16_t,
+               z0 = svqadd_n_u16 (z0, 127),
+               z0 = svqadd (z0, 127))
+
+/*
+** qadd_128_u16:
+**     uqadd   z0\.h, z0\.h, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_u16, svuint16_t,
+               z0 = svqadd_n_u16 (z0, 128),
+               z0 = svqadd (z0, 128))
+
+/*
+** qadd_255_u16:
+**     uqadd   z0\.h, z0\.h, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_u16, svuint16_t,
+               z0 = svqadd_n_u16 (z0, 255),
+               z0 = svqadd (z0, 255))
+
+/*
+** qadd_m1_u16:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqadd   z0\.h, (z0\.h, \1\.h|\1\.h, z0\.h)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_u16, svuint16_t,
+               z0 = svqadd_n_u16 (z0, -1),
+               z0 = svqadd (z0, -1))
+
+/*
+** qadd_m127_u16:
+**     mov     (z[0-9]+\.h), #-127
+**     uqadd   z0\.h, (z0\.h, \1|\1, z0\.h)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_u16, svuint16_t,
+               z0 = svqadd_n_u16 (z0, -127),
+               z0 = svqadd (z0, -127))
+
+/*
+** qadd_m128_u16:
+**     mov     (z[0-9]+\.h), #-128
+**     uqadd   z0\.h, (z0\.h, \1|\1, z0\.h)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_u16, svuint16_t,
+               z0 = svqadd_n_u16 (z0, -128),
+               z0 = svqadd (z0, -128))
+
+/*
+** qadd_u16_m_tied1:
+**     uqadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u16_m_tied1, svuint16_t,
+               z0 = svqadd_u16_m (p0, z0, z1),
+               z0 = svqadd_m (p0, z0, z1))
+
+/*
+** qadd_u16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uqadd   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u16_m_tied2, svuint16_t,
+               z0 = svqadd_u16_m (p0, z1, z0),
+               z0 = svqadd_m (p0, z1, z0))
+
+/*
+** qadd_u16_m_untied:
+**     movprfx z0, z1
+**     uqadd   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u16_m_untied, svuint16_t,
+               z0 = svqadd_u16_m (p0, z1, z2),
+               z0 = svqadd_m (p0, z1, z2))
+
+/*
+** qadd_w0_u16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u16_m_tied1, svuint16_t, uint16_t,
+                z0 = svqadd_n_u16_m (p0, z0, x0),
+                z0 = svqadd_m (p0, z0, x0))
+
+/*
+** qadd_w0_u16_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     uqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u16_m_untied, svuint16_t, uint16_t,
+                z0 = svqadd_n_u16_m (p0, z1, x0),
+                z0 = svqadd_m (p0, z1, x0))
+
+/*
+** qadd_1_u16_m_tied1:
+**     mov     (z[0-9]+\.h), #1
+**     uqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u16_m_tied1, svuint16_t,
+               z0 = svqadd_n_u16_m (p0, z0, 1),
+               z0 = svqadd_m (p0, z0, 1))
+
+/*
+** qadd_1_u16_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.h), #1
+**     movprfx z0, z1
+**     uqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u16_m_untied, svuint16_t,
+               z0 = svqadd_n_u16_m (p0, z1, 1),
+               z0 = svqadd_m (p0, z1, 1))
+
+/*
+** qadd_127_u16_m:
+**     mov     (z[0-9]+\.h), #127
+**     uqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_u16_m, svuint16_t,
+               z0 = svqadd_n_u16_m (p0, z0, 127),
+               z0 = svqadd_m (p0, z0, 127))
+
+/*
+** qadd_128_u16_m:
+**     mov     (z[0-9]+\.h), #128
+**     uqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_u16_m, svuint16_t,
+               z0 = svqadd_n_u16_m (p0, z0, 128),
+               z0 = svqadd_m (p0, z0, 128))
+
+/*
+** qadd_255_u16_m:
+**     mov     (z[0-9]+\.h), #255
+**     uqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_u16_m, svuint16_t,
+               z0 = svqadd_n_u16_m (p0, z0, 255),
+               z0 = svqadd_m (p0, z0, 255))
+
+/*
+** qadd_m1_u16_m:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqadd   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_u16_m, svuint16_t,
+               z0 = svqadd_n_u16_m (p0, z0, -1),
+               z0 = svqadd_m (p0, z0, -1))
+
+/*
+** qadd_m127_u16_m:
+**     mov     (z[0-9]+\.h), #-127
+**     uqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_u16_m, svuint16_t,
+               z0 = svqadd_n_u16_m (p0, z0, -127),
+               z0 = svqadd_m (p0, z0, -127))
+
+/*
+** qadd_m128_u16_m:
+**     mov     (z[0-9]+\.h), #-128
+**     uqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_u16_m, svuint16_t,
+               z0 = svqadd_n_u16_m (p0, z0, -128),
+               z0 = svqadd_m (p0, z0, -128))
+
+/*
+** qadd_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u16_z_tied1, svuint16_t,
+               z0 = svqadd_u16_z (p0, z0, z1),
+               z0 = svqadd_z (p0, z0, z1))
+
+/*
+** qadd_u16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqadd   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u16_z_tied2, svuint16_t,
+               z0 = svqadd_u16_z (p0, z1, z0),
+               z0 = svqadd_z (p0, z1, z0))
+
+/*
+** qadd_u16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uqadd   z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0\.h, p0/z, z2\.h
+**     uqadd   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u16_z_untied, svuint16_t,
+               z0 = svqadd_u16_z (p0, z1, z2),
+               z0 = svqadd_z (p0, z1, z2))
+
+/*
+** qadd_w0_u16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u16_z_tied1, svuint16_t, uint16_t,
+                z0 = svqadd_n_u16_z (p0, z0, x0),
+                z0 = svqadd_z (p0, z0, x0))
+
+/*
+** qadd_w0_u16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uqadd   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     uqadd   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u16_z_untied, svuint16_t, uint16_t,
+                z0 = svqadd_n_u16_z (p0, z1, x0),
+                z0 = svqadd_z (p0, z1, x0))
+
+/*
+** qadd_1_u16_z_tied1:
+**     mov     (z[0-9]+\.h), #1
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u16_z_tied1, svuint16_t,
+               z0 = svqadd_n_u16_z (p0, z0, 1),
+               z0 = svqadd_z (p0, z0, 1))
+
+/*
+** qadd_1_u16_z_untied:
+**     mov     (z[0-9]+\.h), #1
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uqadd   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     uqadd   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u16_z_untied, svuint16_t,
+               z0 = svqadd_n_u16_z (p0, z1, 1),
+               z0 = svqadd_z (p0, z1, 1))
+
+/*
+** qadd_127_u16_z:
+**     mov     (z[0-9]+\.h), #127
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_u16_z, svuint16_t,
+               z0 = svqadd_n_u16_z (p0, z0, 127),
+               z0 = svqadd_z (p0, z0, 127))
+
+/*
+** qadd_128_u16_z:
+**     mov     (z[0-9]+\.h), #128
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_u16_z, svuint16_t,
+               z0 = svqadd_n_u16_z (p0, z0, 128),
+               z0 = svqadd_z (p0, z0, 128))
+
+/*
+** qadd_255_u16_z:
+**     mov     (z[0-9]+\.h), #255
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_u16_z, svuint16_t,
+               z0 = svqadd_n_u16_z (p0, z0, 255),
+               z0 = svqadd_z (p0, z0, 255))
+
+/*
+** qadd_m1_u16_z:
+**     mov     (z[0-9]+)\.b, #-1
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqadd   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_u16_z, svuint16_t,
+               z0 = svqadd_n_u16_z (p0, z0, -1),
+               z0 = svqadd_z (p0, z0, -1))
+
+/*
+** qadd_m127_u16_z:
+**     mov     (z[0-9]+\.h), #-127
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_u16_z, svuint16_t,
+               z0 = svqadd_n_u16_z (p0, z0, -127),
+               z0 = svqadd_z (p0, z0, -127))
+
+/*
+** qadd_m128_u16_z:
+**     mov     (z[0-9]+\.h), #-128
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqadd   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_u16_z, svuint16_t,
+               z0 = svqadd_n_u16_z (p0, z0, -128),
+               z0 = svqadd_z (p0, z0, -128))
+
+/*
+** qadd_u16_x_tied1:
+**     uqadd   z0\.h, (z0\.h, z1\.h|z1\.h, z0\.h)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u16_x_tied1, svuint16_t,
+               z0 = svqadd_u16_x (p0, z0, z1),
+               z0 = svqadd_x (p0, z0, z1))
+
+/*
+** qadd_u16_x_tied2:
+**     uqadd   z0\.h, (z0\.h, z1\.h|z1\.h, z0\.h)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u16_x_tied2, svuint16_t,
+               z0 = svqadd_u16_x (p0, z1, z0),
+               z0 = svqadd_x (p0, z1, z0))
+
+/*
+** qadd_u16_x_untied:
+**     uqadd   z0\.h, (z1\.h, z2\.h|z2\.h, z1\.h)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u16_x_untied, svuint16_t,
+               z0 = svqadd_u16_x (p0, z1, z2),
+               z0 = svqadd_x (p0, z1, z2))
+
+/*
+** qadd_w0_u16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uqadd   z0\.h, (z0\.h, \1|\1, z0\.h)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u16_x_tied1, svuint16_t, uint16_t,
+                z0 = svqadd_n_u16_x (p0, z0, x0),
+                z0 = svqadd_x (p0, z0, x0))
+
+/*
+** qadd_w0_u16_x_untied:
+**     mov     (z[0-9]+\.h), w0
+**     uqadd   z0\.h, (z1\.h, \1|\1, z1\.h)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u16_x_untied, svuint16_t, uint16_t,
+                z0 = svqadd_n_u16_x (p0, z1, x0),
+                z0 = svqadd_x (p0, z1, x0))
+
+/*
+** qadd_1_u16_x_tied1:
+**     uqadd   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u16_x_tied1, svuint16_t,
+               z0 = svqadd_n_u16_x (p0, z0, 1),
+               z0 = svqadd_x (p0, z0, 1))
+
+/*
+** qadd_1_u16_x_untied:
+**     movprfx z0, z1
+**     uqadd   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u16_x_untied, svuint16_t,
+               z0 = svqadd_n_u16_x (p0, z1, 1),
+               z0 = svqadd_x (p0, z1, 1))
+
+/*
+** qadd_127_u16_x:
+**     uqadd   z0\.h, z0\.h, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_u16_x, svuint16_t,
+               z0 = svqadd_n_u16_x (p0, z0, 127),
+               z0 = svqadd_x (p0, z0, 127))
+
+/*
+** qadd_128_u16_x:
+**     uqadd   z0\.h, z0\.h, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_u16_x, svuint16_t,
+               z0 = svqadd_n_u16_x (p0, z0, 128),
+               z0 = svqadd_x (p0, z0, 128))
+
+/*
+** qadd_255_u16_x:
+**     uqadd   z0\.h, z0\.h, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_u16_x, svuint16_t,
+               z0 = svqadd_n_u16_x (p0, z0, 255),
+               z0 = svqadd_x (p0, z0, 255))
+
+/*
+** qadd_m1_u16_x:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqadd   z0\.h, (z0\.h, \1\.h|\1\.h, z0\.h)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_u16_x, svuint16_t,
+               z0 = svqadd_n_u16_x (p0, z0, -1),
+               z0 = svqadd_x (p0, z0, -1))
+
+/*
+** qadd_m127_u16_x:
+**     mov     (z[0-9]+\.h), #-127
+**     uqadd   z0\.h, (z0\.h, \1|\1, z0\.h)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_u16_x, svuint16_t,
+               z0 = svqadd_n_u16_x (p0, z0, -127),
+               z0 = svqadd_x (p0, z0, -127))
+
+/*
+** qadd_m128_u16_x:
+**     mov     (z[0-9]+\.h), #-128
+**     uqadd   z0\.h, (z0\.h, \1|\1, z0\.h)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_u16_x, svuint16_t,
+               z0 = svqadd_n_u16_x (p0, z0, -128),
+               z0 = svqadd_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_u32.c
new file mode 100644 (file)
index 0000000..7701d13
--- /dev/null
@@ -0,0 +1,536 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qadd_u32_tied1:
+**     uqadd   z0\.s, (z0\.s, z1\.s|z1\.s, z0\.s)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u32_tied1, svuint32_t,
+               z0 = svqadd_u32 (z0, z1),
+               z0 = svqadd (z0, z1))
+
+/*
+** qadd_u32_tied2:
+**     uqadd   z0\.s, (z0\.s, z1\.s|z1\.s, z0\.s)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u32_tied2, svuint32_t,
+               z0 = svqadd_u32 (z1, z0),
+               z0 = svqadd (z1, z0))
+
+/*
+** qadd_u32_untied:
+**     uqadd   z0\.s, (z1\.s, z2\.s|z2\.s, z1\.s)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u32_untied, svuint32_t,
+               z0 = svqadd_u32 (z1, z2),
+               z0 = svqadd (z1, z2))
+
+/*
+** qadd_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uqadd   z0\.s, (z0\.s, \1|\1, z0\.s)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = svqadd_n_u32 (z0, x0),
+                z0 = svqadd (z0, x0))
+
+/*
+** qadd_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     uqadd   z0\.s, (z1\.s, \1|\1, z1\.s)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = svqadd_n_u32 (z1, x0),
+                z0 = svqadd (z1, x0))
+
+/*
+** qadd_1_u32_tied1:
+**     uqadd   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u32_tied1, svuint32_t,
+               z0 = svqadd_n_u32 (z0, 1),
+               z0 = svqadd (z0, 1))
+
+/*
+** qadd_1_u32_untied:
+**     movprfx z0, z1
+**     uqadd   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u32_untied, svuint32_t,
+               z0 = svqadd_n_u32 (z1, 1),
+               z0 = svqadd (z1, 1))
+
+/*
+** qadd_127_u32:
+**     uqadd   z0\.s, z0\.s, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_u32, svuint32_t,
+               z0 = svqadd_n_u32 (z0, 127),
+               z0 = svqadd (z0, 127))
+
+/*
+** qadd_128_u32:
+**     uqadd   z0\.s, z0\.s, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_u32, svuint32_t,
+               z0 = svqadd_n_u32 (z0, 128),
+               z0 = svqadd (z0, 128))
+
+/*
+** qadd_255_u32:
+**     uqadd   z0\.s, z0\.s, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_u32, svuint32_t,
+               z0 = svqadd_n_u32 (z0, 255),
+               z0 = svqadd (z0, 255))
+
+/*
+** qadd_m1_u32:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqadd   z0\.s, (z0\.s, \1\.s|\1\.s, z0\.s)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_u32, svuint32_t,
+               z0 = svqadd_n_u32 (z0, -1),
+               z0 = svqadd (z0, -1))
+
+/*
+** qadd_m127_u32:
+**     mov     (z[0-9]+\.s), #-127
+**     uqadd   z0\.s, (z0\.s, \1|\1, z0\.s)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_u32, svuint32_t,
+               z0 = svqadd_n_u32 (z0, -127),
+               z0 = svqadd (z0, -127))
+
+/*
+** qadd_m128_u32:
+**     mov     (z[0-9]+\.s), #-128
+**     uqadd   z0\.s, (z0\.s, \1|\1, z0\.s)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_u32, svuint32_t,
+               z0 = svqadd_n_u32 (z0, -128),
+               z0 = svqadd (z0, -128))
+
+/*
+** qadd_u32_m_tied1:
+**     uqadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u32_m_tied1, svuint32_t,
+               z0 = svqadd_u32_m (p0, z0, z1),
+               z0 = svqadd_m (p0, z0, z1))
+
+/*
+** qadd_u32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uqadd   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u32_m_tied2, svuint32_t,
+               z0 = svqadd_u32_m (p0, z1, z0),
+               z0 = svqadd_m (p0, z1, z0))
+
+/*
+** qadd_u32_m_untied:
+**     movprfx z0, z1
+**     uqadd   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u32_m_untied, svuint32_t,
+               z0 = svqadd_u32_m (p0, z1, z2),
+               z0 = svqadd_m (p0, z1, z2))
+
+/*
+** qadd_w0_u32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u32_m_tied1, svuint32_t, uint32_t,
+                z0 = svqadd_n_u32_m (p0, z0, x0),
+                z0 = svqadd_m (p0, z0, x0))
+
+/*
+** qadd_w0_u32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     uqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u32_m_untied, svuint32_t, uint32_t,
+                z0 = svqadd_n_u32_m (p0, z1, x0),
+                z0 = svqadd_m (p0, z1, x0))
+
+/*
+** qadd_1_u32_m_tied1:
+**     mov     (z[0-9]+\.s), #1
+**     uqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u32_m_tied1, svuint32_t,
+               z0 = svqadd_n_u32_m (p0, z0, 1),
+               z0 = svqadd_m (p0, z0, 1))
+
+/*
+** qadd_1_u32_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.s), #1
+**     movprfx z0, z1
+**     uqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u32_m_untied, svuint32_t,
+               z0 = svqadd_n_u32_m (p0, z1, 1),
+               z0 = svqadd_m (p0, z1, 1))
+
+/*
+** qadd_127_u32_m:
+**     mov     (z[0-9]+\.s), #127
+**     uqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_u32_m, svuint32_t,
+               z0 = svqadd_n_u32_m (p0, z0, 127),
+               z0 = svqadd_m (p0, z0, 127))
+
+/*
+** qadd_128_u32_m:
+**     mov     (z[0-9]+\.s), #128
+**     uqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_u32_m, svuint32_t,
+               z0 = svqadd_n_u32_m (p0, z0, 128),
+               z0 = svqadd_m (p0, z0, 128))
+
+/*
+** qadd_255_u32_m:
+**     mov     (z[0-9]+\.s), #255
+**     uqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_u32_m, svuint32_t,
+               z0 = svqadd_n_u32_m (p0, z0, 255),
+               z0 = svqadd_m (p0, z0, 255))
+
+/*
+** qadd_m1_u32_m:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqadd   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_u32_m, svuint32_t,
+               z0 = svqadd_n_u32_m (p0, z0, -1),
+               z0 = svqadd_m (p0, z0, -1))
+
+/*
+** qadd_m127_u32_m:
+**     mov     (z[0-9]+\.s), #-127
+**     uqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_u32_m, svuint32_t,
+               z0 = svqadd_n_u32_m (p0, z0, -127),
+               z0 = svqadd_m (p0, z0, -127))
+
+/*
+** qadd_m128_u32_m:
+**     mov     (z[0-9]+\.s), #-128
+**     uqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_u32_m, svuint32_t,
+               z0 = svqadd_n_u32_m (p0, z0, -128),
+               z0 = svqadd_m (p0, z0, -128))
+
+/*
+** qadd_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u32_z_tied1, svuint32_t,
+               z0 = svqadd_u32_z (p0, z0, z1),
+               z0 = svqadd_z (p0, z0, z1))
+
+/*
+** qadd_u32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqadd   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u32_z_tied2, svuint32_t,
+               z0 = svqadd_u32_z (p0, z1, z0),
+               z0 = svqadd_z (p0, z1, z0))
+
+/*
+** qadd_u32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uqadd   z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0\.s, p0/z, z2\.s
+**     uqadd   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u32_z_untied, svuint32_t,
+               z0 = svqadd_u32_z (p0, z1, z2),
+               z0 = svqadd_z (p0, z1, z2))
+
+/*
+** qadd_w0_u32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u32_z_tied1, svuint32_t, uint32_t,
+                z0 = svqadd_n_u32_z (p0, z0, x0),
+                z0 = svqadd_z (p0, z0, x0))
+
+/*
+** qadd_w0_u32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uqadd   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     uqadd   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u32_z_untied, svuint32_t, uint32_t,
+                z0 = svqadd_n_u32_z (p0, z1, x0),
+                z0 = svqadd_z (p0, z1, x0))
+
+/*
+** qadd_1_u32_z_tied1:
+**     mov     (z[0-9]+\.s), #1
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u32_z_tied1, svuint32_t,
+               z0 = svqadd_n_u32_z (p0, z0, 1),
+               z0 = svqadd_z (p0, z0, 1))
+
+/*
+** qadd_1_u32_z_untied:
+**     mov     (z[0-9]+\.s), #1
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uqadd   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     uqadd   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u32_z_untied, svuint32_t,
+               z0 = svqadd_n_u32_z (p0, z1, 1),
+               z0 = svqadd_z (p0, z1, 1))
+
+/*
+** qadd_127_u32_z:
+**     mov     (z[0-9]+\.s), #127
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_u32_z, svuint32_t,
+               z0 = svqadd_n_u32_z (p0, z0, 127),
+               z0 = svqadd_z (p0, z0, 127))
+
+/*
+** qadd_128_u32_z:
+**     mov     (z[0-9]+\.s), #128
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_u32_z, svuint32_t,
+               z0 = svqadd_n_u32_z (p0, z0, 128),
+               z0 = svqadd_z (p0, z0, 128))
+
+/*
+** qadd_255_u32_z:
+**     mov     (z[0-9]+\.s), #255
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_u32_z, svuint32_t,
+               z0 = svqadd_n_u32_z (p0, z0, 255),
+               z0 = svqadd_z (p0, z0, 255))
+
+/*
+** qadd_m1_u32_z:
+**     mov     (z[0-9]+)\.b, #-1
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqadd   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_u32_z, svuint32_t,
+               z0 = svqadd_n_u32_z (p0, z0, -1),
+               z0 = svqadd_z (p0, z0, -1))
+
+/*
+** qadd_m127_u32_z:
+**     mov     (z[0-9]+\.s), #-127
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_u32_z, svuint32_t,
+               z0 = svqadd_n_u32_z (p0, z0, -127),
+               z0 = svqadd_z (p0, z0, -127))
+
+/*
+** qadd_m128_u32_z:
+**     mov     (z[0-9]+\.s), #-128
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqadd   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_u32_z, svuint32_t,
+               z0 = svqadd_n_u32_z (p0, z0, -128),
+               z0 = svqadd_z (p0, z0, -128))
+
+/*
+** qadd_u32_x_tied1:
+**     uqadd   z0\.s, (z0\.s, z1\.s|z1\.s, z0\.s)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u32_x_tied1, svuint32_t,
+               z0 = svqadd_u32_x (p0, z0, z1),
+               z0 = svqadd_x (p0, z0, z1))
+
+/*
+** qadd_u32_x_tied2:
+**     uqadd   z0\.s, (z0\.s, z1\.s|z1\.s, z0\.s)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u32_x_tied2, svuint32_t,
+               z0 = svqadd_u32_x (p0, z1, z0),
+               z0 = svqadd_x (p0, z1, z0))
+
+/*
+** qadd_u32_x_untied:
+**     uqadd   z0\.s, (z1\.s, z2\.s|z2\.s, z1\.s)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u32_x_untied, svuint32_t,
+               z0 = svqadd_u32_x (p0, z1, z2),
+               z0 = svqadd_x (p0, z1, z2))
+
+/*
+** qadd_w0_u32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uqadd   z0\.s, (z0\.s, \1|\1, z0\.s)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u32_x_tied1, svuint32_t, uint32_t,
+                z0 = svqadd_n_u32_x (p0, z0, x0),
+                z0 = svqadd_x (p0, z0, x0))
+
+/*
+** qadd_w0_u32_x_untied:
+**     mov     (z[0-9]+\.s), w0
+**     uqadd   z0\.s, (z1\.s, \1|\1, z1\.s)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u32_x_untied, svuint32_t, uint32_t,
+                z0 = svqadd_n_u32_x (p0, z1, x0),
+                z0 = svqadd_x (p0, z1, x0))
+
+/*
+** qadd_1_u32_x_tied1:
+**     uqadd   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u32_x_tied1, svuint32_t,
+               z0 = svqadd_n_u32_x (p0, z0, 1),
+               z0 = svqadd_x (p0, z0, 1))
+
+/*
+** qadd_1_u32_x_untied:
+**     movprfx z0, z1
+**     uqadd   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u32_x_untied, svuint32_t,
+               z0 = svqadd_n_u32_x (p0, z1, 1),
+               z0 = svqadd_x (p0, z1, 1))
+
+/*
+** qadd_127_u32_x:
+**     uqadd   z0\.s, z0\.s, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_u32_x, svuint32_t,
+               z0 = svqadd_n_u32_x (p0, z0, 127),
+               z0 = svqadd_x (p0, z0, 127))
+
+/*
+** qadd_128_u32_x:
+**     uqadd   z0\.s, z0\.s, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_u32_x, svuint32_t,
+               z0 = svqadd_n_u32_x (p0, z0, 128),
+               z0 = svqadd_x (p0, z0, 128))
+
+/*
+** qadd_255_u32_x:
+**     uqadd   z0\.s, z0\.s, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_u32_x, svuint32_t,
+               z0 = svqadd_n_u32_x (p0, z0, 255),
+               z0 = svqadd_x (p0, z0, 255))
+
+/*
+** qadd_m1_u32_x:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqadd   z0\.s, (z0\.s, \1\.s|\1\.s, z0\.s)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_u32_x, svuint32_t,
+               z0 = svqadd_n_u32_x (p0, z0, -1),
+               z0 = svqadd_x (p0, z0, -1))
+
+/*
+** qadd_m127_u32_x:
+**     mov     (z[0-9]+\.s), #-127
+**     uqadd   z0\.s, (z0\.s, \1|\1, z0\.s)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_u32_x, svuint32_t,
+               z0 = svqadd_n_u32_x (p0, z0, -127),
+               z0 = svqadd_x (p0, z0, -127))
+
+/*
+** qadd_m128_u32_x:
+**     mov     (z[0-9]+\.s), #-128
+**     uqadd   z0\.s, (z0\.s, \1|\1, z0\.s)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_u32_x, svuint32_t,
+               z0 = svqadd_n_u32_x (p0, z0, -128),
+               z0 = svqadd_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_u64.c
new file mode 100644 (file)
index 0000000..df8c3f8
--- /dev/null
@@ -0,0 +1,536 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qadd_u64_tied1:
+**     uqadd   z0\.d, (z0\.d, z1\.d|z1\.d, z0\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u64_tied1, svuint64_t,
+               z0 = svqadd_u64 (z0, z1),
+               z0 = svqadd (z0, z1))
+
+/*
+** qadd_u64_tied2:
+**     uqadd   z0\.d, (z0\.d, z1\.d|z1\.d, z0\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u64_tied2, svuint64_t,
+               z0 = svqadd_u64 (z1, z0),
+               z0 = svqadd (z1, z0))
+
+/*
+** qadd_u64_untied:
+**     uqadd   z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u64_untied, svuint64_t,
+               z0 = svqadd_u64 (z1, z2),
+               z0 = svqadd (z1, z2))
+
+/*
+** qadd_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     uqadd   z0\.d, (z0\.d, \1|\1, z0\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = svqadd_n_u64 (z0, x0),
+                z0 = svqadd (z0, x0))
+
+/*
+** qadd_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     uqadd   z0\.d, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = svqadd_n_u64 (z1, x0),
+                z0 = svqadd (z1, x0))
+
+/*
+** qadd_1_u64_tied1:
+**     uqadd   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u64_tied1, svuint64_t,
+               z0 = svqadd_n_u64 (z0, 1),
+               z0 = svqadd (z0, 1))
+
+/*
+** qadd_1_u64_untied:
+**     movprfx z0, z1
+**     uqadd   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u64_untied, svuint64_t,
+               z0 = svqadd_n_u64 (z1, 1),
+               z0 = svqadd (z1, 1))
+
+/*
+** qadd_127_u64:
+**     uqadd   z0\.d, z0\.d, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_u64, svuint64_t,
+               z0 = svqadd_n_u64 (z0, 127),
+               z0 = svqadd (z0, 127))
+
+/*
+** qadd_128_u64:
+**     uqadd   z0\.d, z0\.d, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_u64, svuint64_t,
+               z0 = svqadd_n_u64 (z0, 128),
+               z0 = svqadd (z0, 128))
+
+/*
+** qadd_255_u64:
+**     uqadd   z0\.d, z0\.d, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_u64, svuint64_t,
+               z0 = svqadd_n_u64 (z0, 255),
+               z0 = svqadd (z0, 255))
+
+/*
+** qadd_m1_u64:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqadd   z0\.d, (z0\.d, \1\.d|\1\.d, z0\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_u64, svuint64_t,
+               z0 = svqadd_n_u64 (z0, -1),
+               z0 = svqadd (z0, -1))
+
+/*
+** qadd_m127_u64:
+**     mov     (z[0-9]+\.d), #-127
+**     uqadd   z0\.d, (z0\.d, \1|\1, z0\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_u64, svuint64_t,
+               z0 = svqadd_n_u64 (z0, -127),
+               z0 = svqadd (z0, -127))
+
+/*
+** qadd_m128_u64:
+**     mov     (z[0-9]+\.d), #-128
+**     uqadd   z0\.d, (z0\.d, \1|\1, z0\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_u64, svuint64_t,
+               z0 = svqadd_n_u64 (z0, -128),
+               z0 = svqadd (z0, -128))
+
+/*
+** qadd_u64_m_tied1:
+**     uqadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u64_m_tied1, svuint64_t,
+               z0 = svqadd_u64_m (p0, z0, z1),
+               z0 = svqadd_m (p0, z0, z1))
+
+/*
+** qadd_u64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     uqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u64_m_tied2, svuint64_t,
+               z0 = svqadd_u64_m (p0, z1, z0),
+               z0 = svqadd_m (p0, z1, z0))
+
+/*
+** qadd_u64_m_untied:
+**     movprfx z0, z1
+**     uqadd   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u64_m_untied, svuint64_t,
+               z0 = svqadd_u64_m (p0, z1, z2),
+               z0 = svqadd_m (p0, z1, z2))
+
+/*
+** qadd_x0_u64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     uqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_x0_u64_m_tied1, svuint64_t, uint64_t,
+                z0 = svqadd_n_u64_m (p0, z0, x0),
+                z0 = svqadd_m (p0, z0, x0))
+
+/*
+** qadd_x0_u64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     uqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_x0_u64_m_untied, svuint64_t, uint64_t,
+                z0 = svqadd_n_u64_m (p0, z1, x0),
+                z0 = svqadd_m (p0, z1, x0))
+
+/*
+** qadd_1_u64_m_tied1:
+**     mov     (z[0-9]+\.d), #1
+**     uqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u64_m_tied1, svuint64_t,
+               z0 = svqadd_n_u64_m (p0, z0, 1),
+               z0 = svqadd_m (p0, z0, 1))
+
+/*
+** qadd_1_u64_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.d), #1
+**     movprfx z0, z1
+**     uqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u64_m_untied, svuint64_t,
+               z0 = svqadd_n_u64_m (p0, z1, 1),
+               z0 = svqadd_m (p0, z1, 1))
+
+/*
+** qadd_127_u64_m:
+**     mov     (z[0-9]+\.d), #127
+**     uqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_u64_m, svuint64_t,
+               z0 = svqadd_n_u64_m (p0, z0, 127),
+               z0 = svqadd_m (p0, z0, 127))
+
+/*
+** qadd_128_u64_m:
+**     mov     (z[0-9]+\.d), #128
+**     uqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_u64_m, svuint64_t,
+               z0 = svqadd_n_u64_m (p0, z0, 128),
+               z0 = svqadd_m (p0, z0, 128))
+
+/*
+** qadd_255_u64_m:
+**     mov     (z[0-9]+\.d), #255
+**     uqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_u64_m, svuint64_t,
+               z0 = svqadd_n_u64_m (p0, z0, 255),
+               z0 = svqadd_m (p0, z0, 255))
+
+/*
+** qadd_m1_u64_m:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqadd   z0\.d, p0/m, z0\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_u64_m, svuint64_t,
+               z0 = svqadd_n_u64_m (p0, z0, -1),
+               z0 = svqadd_m (p0, z0, -1))
+
+/*
+** qadd_m127_u64_m:
+**     mov     (z[0-9]+\.d), #-127
+**     uqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_u64_m, svuint64_t,
+               z0 = svqadd_n_u64_m (p0, z0, -127),
+               z0 = svqadd_m (p0, z0, -127))
+
+/*
+** qadd_m128_u64_m:
+**     mov     (z[0-9]+\.d), #-128
+**     uqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_u64_m, svuint64_t,
+               z0 = svqadd_n_u64_m (p0, z0, -128),
+               z0 = svqadd_m (p0, z0, -128))
+
+/*
+** qadd_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u64_z_tied1, svuint64_t,
+               z0 = svqadd_u64_z (p0, z0, z1),
+               z0 = svqadd_z (p0, z0, z1))
+
+/*
+** qadd_u64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqadd   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u64_z_tied2, svuint64_t,
+               z0 = svqadd_u64_z (p0, z1, z0),
+               z0 = svqadd_z (p0, z1, z0))
+
+/*
+** qadd_u64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uqadd   z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0\.d, p0/z, z2\.d
+**     uqadd   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u64_z_untied, svuint64_t,
+               z0 = svqadd_u64_z (p0, z1, z2),
+               z0 = svqadd_z (p0, z1, z2))
+
+/*
+** qadd_x0_u64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_x0_u64_z_tied1, svuint64_t, uint64_t,
+                z0 = svqadd_n_u64_z (p0, z0, x0),
+                z0 = svqadd_z (p0, z0, x0))
+
+/*
+** qadd_x0_u64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uqadd   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     uqadd   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_x0_u64_z_untied, svuint64_t, uint64_t,
+                z0 = svqadd_n_u64_z (p0, z1, x0),
+                z0 = svqadd_z (p0, z1, x0))
+
+/*
+** qadd_1_u64_z_tied1:
+**     mov     (z[0-9]+\.d), #1
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u64_z_tied1, svuint64_t,
+               z0 = svqadd_n_u64_z (p0, z0, 1),
+               z0 = svqadd_z (p0, z0, 1))
+
+/*
+** qadd_1_u64_z_untied:
+**     mov     (z[0-9]+\.d), #1
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uqadd   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     uqadd   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u64_z_untied, svuint64_t,
+               z0 = svqadd_n_u64_z (p0, z1, 1),
+               z0 = svqadd_z (p0, z1, 1))
+
+/*
+** qadd_127_u64_z:
+**     mov     (z[0-9]+\.d), #127
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_u64_z, svuint64_t,
+               z0 = svqadd_n_u64_z (p0, z0, 127),
+               z0 = svqadd_z (p0, z0, 127))
+
+/*
+** qadd_128_u64_z:
+**     mov     (z[0-9]+\.d), #128
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_u64_z, svuint64_t,
+               z0 = svqadd_n_u64_z (p0, z0, 128),
+               z0 = svqadd_z (p0, z0, 128))
+
+/*
+** qadd_255_u64_z:
+**     mov     (z[0-9]+\.d), #255
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_u64_z, svuint64_t,
+               z0 = svqadd_n_u64_z (p0, z0, 255),
+               z0 = svqadd_z (p0, z0, 255))
+
+/*
+** qadd_m1_u64_z:
+**     mov     (z[0-9]+)\.b, #-1
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqadd   z0\.d, p0/m, z0\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_u64_z, svuint64_t,
+               z0 = svqadd_n_u64_z (p0, z0, -1),
+               z0 = svqadd_z (p0, z0, -1))
+
+/*
+** qadd_m127_u64_z:
+**     mov     (z[0-9]+\.d), #-127
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_u64_z, svuint64_t,
+               z0 = svqadd_n_u64_z (p0, z0, -127),
+               z0 = svqadd_z (p0, z0, -127))
+
+/*
+** qadd_m128_u64_z:
+**     mov     (z[0-9]+\.d), #-128
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqadd   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_u64_z, svuint64_t,
+               z0 = svqadd_n_u64_z (p0, z0, -128),
+               z0 = svqadd_z (p0, z0, -128))
+
+/*
+** qadd_u64_x_tied1:
+**     uqadd   z0\.d, (z0\.d, z1\.d|z1\.d, z0\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u64_x_tied1, svuint64_t,
+               z0 = svqadd_u64_x (p0, z0, z1),
+               z0 = svqadd_x (p0, z0, z1))
+
+/*
+** qadd_u64_x_tied2:
+**     uqadd   z0\.d, (z0\.d, z1\.d|z1\.d, z0\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u64_x_tied2, svuint64_t,
+               z0 = svqadd_u64_x (p0, z1, z0),
+               z0 = svqadd_x (p0, z1, z0))
+
+/*
+** qadd_u64_x_untied:
+**     uqadd   z0\.d, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u64_x_untied, svuint64_t,
+               z0 = svqadd_u64_x (p0, z1, z2),
+               z0 = svqadd_x (p0, z1, z2))
+
+/*
+** qadd_x0_u64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     uqadd   z0\.d, (z0\.d, \1|\1, z0\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_x0_u64_x_tied1, svuint64_t, uint64_t,
+                z0 = svqadd_n_u64_x (p0, z0, x0),
+                z0 = svqadd_x (p0, z0, x0))
+
+/*
+** qadd_x0_u64_x_untied:
+**     mov     (z[0-9]+\.d), x0
+**     uqadd   z0\.d, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_x0_u64_x_untied, svuint64_t, uint64_t,
+                z0 = svqadd_n_u64_x (p0, z1, x0),
+                z0 = svqadd_x (p0, z1, x0))
+
+/*
+** qadd_1_u64_x_tied1:
+**     uqadd   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u64_x_tied1, svuint64_t,
+               z0 = svqadd_n_u64_x (p0, z0, 1),
+               z0 = svqadd_x (p0, z0, 1))
+
+/*
+** qadd_1_u64_x_untied:
+**     movprfx z0, z1
+**     uqadd   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u64_x_untied, svuint64_t,
+               z0 = svqadd_n_u64_x (p0, z1, 1),
+               z0 = svqadd_x (p0, z1, 1))
+
+/*
+** qadd_127_u64_x:
+**     uqadd   z0\.d, z0\.d, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_u64_x, svuint64_t,
+               z0 = svqadd_n_u64_x (p0, z0, 127),
+               z0 = svqadd_x (p0, z0, 127))
+
+/*
+** qadd_128_u64_x:
+**     uqadd   z0\.d, z0\.d, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_u64_x, svuint64_t,
+               z0 = svqadd_n_u64_x (p0, z0, 128),
+               z0 = svqadd_x (p0, z0, 128))
+
+/*
+** qadd_255_u64_x:
+**     uqadd   z0\.d, z0\.d, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_u64_x, svuint64_t,
+               z0 = svqadd_n_u64_x (p0, z0, 255),
+               z0 = svqadd_x (p0, z0, 255))
+
+/*
+** qadd_m1_u64_x:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqadd   z0\.d, (z0\.d, \1\.d|\1\.d, z0\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_u64_x, svuint64_t,
+               z0 = svqadd_n_u64_x (p0, z0, -1),
+               z0 = svqadd_x (p0, z0, -1))
+
+/*
+** qadd_m127_u64_x:
+**     mov     (z[0-9]+\.d), #-127
+**     uqadd   z0\.d, (z0\.d, \1|\1, z0\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_u64_x, svuint64_t,
+               z0 = svqadd_n_u64_x (p0, z0, -127),
+               z0 = svqadd_x (p0, z0, -127))
+
+/*
+** qadd_m128_u64_x:
+**     mov     (z[0-9]+\.d), #-128
+**     uqadd   z0\.d, (z0\.d, \1|\1, z0\.d)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_u64_x, svuint64_t,
+               z0 = svqadd_n_u64_x (p0, z0, -128),
+               z0 = svqadd_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qadd_u8.c
new file mode 100644 (file)
index 0000000..6c856e2
--- /dev/null
@@ -0,0 +1,530 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qadd_u8_tied1:
+**     uqadd   z0\.b, (z0\.b, z1\.b|z1\.b, z0\.b)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u8_tied1, svuint8_t,
+               z0 = svqadd_u8 (z0, z1),
+               z0 = svqadd (z0, z1))
+
+/*
+** qadd_u8_tied2:
+**     uqadd   z0\.b, (z0\.b, z1\.b|z1\.b, z0\.b)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u8_tied2, svuint8_t,
+               z0 = svqadd_u8 (z1, z0),
+               z0 = svqadd (z1, z0))
+
+/*
+** qadd_u8_untied:
+**     uqadd   z0\.b, (z1\.b, z2\.b|z2\.b, z1\.b)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u8_untied, svuint8_t,
+               z0 = svqadd_u8 (z1, z2),
+               z0 = svqadd (z1, z2))
+
+/*
+** qadd_w0_u8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uqadd   z0\.b, (z0\.b, \1|\1, z0\.b)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u8_tied1, svuint8_t, uint8_t,
+                z0 = svqadd_n_u8 (z0, x0),
+                z0 = svqadd (z0, x0))
+
+/*
+** qadd_w0_u8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     uqadd   z0\.b, (z1\.b, \1|\1, z1\.b)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u8_untied, svuint8_t, uint8_t,
+                z0 = svqadd_n_u8 (z1, x0),
+                z0 = svqadd (z1, x0))
+
+/*
+** qadd_1_u8_tied1:
+**     uqadd   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u8_tied1, svuint8_t,
+               z0 = svqadd_n_u8 (z0, 1),
+               z0 = svqadd (z0, 1))
+
+/*
+** qadd_1_u8_untied:
+**     movprfx z0, z1
+**     uqadd   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u8_untied, svuint8_t,
+               z0 = svqadd_n_u8 (z1, 1),
+               z0 = svqadd (z1, 1))
+
+/*
+** qadd_127_u8:
+**     uqadd   z0\.b, z0\.b, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_u8, svuint8_t,
+               z0 = svqadd_n_u8 (z0, 127),
+               z0 = svqadd (z0, 127))
+
+/*
+** qadd_128_u8:
+**     uqadd   z0\.b, z0\.b, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_u8, svuint8_t,
+               z0 = svqadd_n_u8 (z0, 128),
+               z0 = svqadd (z0, 128))
+
+/*
+** qadd_255_u8:
+**     uqadd   z0\.b, z0\.b, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_u8, svuint8_t,
+               z0 = svqadd_n_u8 (z0, 255),
+               z0 = svqadd (z0, 255))
+
+/*
+** qadd_m1_u8:
+**     uqadd   z0\.b, z0\.b, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_u8, svuint8_t,
+               z0 = svqadd_n_u8 (z0, -1),
+               z0 = svqadd (z0, -1))
+
+/*
+** qadd_m127_u8:
+**     uqadd   z0\.b, z0\.b, #129
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_u8, svuint8_t,
+               z0 = svqadd_n_u8 (z0, -127),
+               z0 = svqadd (z0, -127))
+
+/*
+** qadd_m128_u8:
+**     uqadd   z0\.b, z0\.b, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_u8, svuint8_t,
+               z0 = svqadd_n_u8 (z0, -128),
+               z0 = svqadd (z0, -128))
+
+/*
+** qadd_u8_m_tied1:
+**     uqadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u8_m_tied1, svuint8_t,
+               z0 = svqadd_u8_m (p0, z0, z1),
+               z0 = svqadd_m (p0, z0, z1))
+
+/*
+** qadd_u8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uqadd   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u8_m_tied2, svuint8_t,
+               z0 = svqadd_u8_m (p0, z1, z0),
+               z0 = svqadd_m (p0, z1, z0))
+
+/*
+** qadd_u8_m_untied:
+**     movprfx z0, z1
+**     uqadd   z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u8_m_untied, svuint8_t,
+               z0 = svqadd_u8_m (p0, z1, z2),
+               z0 = svqadd_m (p0, z1, z2))
+
+/*
+** qadd_w0_u8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u8_m_tied1, svuint8_t, uint8_t,
+                z0 = svqadd_n_u8_m (p0, z0, x0),
+                z0 = svqadd_m (p0, z0, x0))
+
+/*
+** qadd_w0_u8_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u8_m_untied, svuint8_t, uint8_t,
+                z0 = svqadd_n_u8_m (p0, z1, x0),
+                z0 = svqadd_m (p0, z1, x0))
+
+/*
+** qadd_1_u8_m_tied1:
+**     mov     (z[0-9]+\.b), #1
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u8_m_tied1, svuint8_t,
+               z0 = svqadd_n_u8_m (p0, z0, 1),
+               z0 = svqadd_m (p0, z0, 1))
+
+/*
+** qadd_1_u8_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.b), #1
+**     movprfx z0, z1
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u8_m_untied, svuint8_t,
+               z0 = svqadd_n_u8_m (p0, z1, 1),
+               z0 = svqadd_m (p0, z1, 1))
+
+/*
+** qadd_127_u8_m:
+**     mov     (z[0-9]+\.b), #127
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_u8_m, svuint8_t,
+               z0 = svqadd_n_u8_m (p0, z0, 127),
+               z0 = svqadd_m (p0, z0, 127))
+
+/*
+** qadd_128_u8_m:
+**     mov     (z[0-9]+\.b), #-128
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_u8_m, svuint8_t,
+               z0 = svqadd_n_u8_m (p0, z0, 128),
+               z0 = svqadd_m (p0, z0, 128))
+
+/*
+** qadd_255_u8_m:
+**     mov     (z[0-9]+\.b), #-1
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_u8_m, svuint8_t,
+               z0 = svqadd_n_u8_m (p0, z0, 255),
+               z0 = svqadd_m (p0, z0, 255))
+
+/*
+** qadd_m1_u8_m:
+**     mov     (z[0-9]+\.b), #-1
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_u8_m, svuint8_t,
+               z0 = svqadd_n_u8_m (p0, z0, -1),
+               z0 = svqadd_m (p0, z0, -1))
+
+/*
+** qadd_m127_u8_m:
+**     mov     (z[0-9]+\.b), #-127
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_u8_m, svuint8_t,
+               z0 = svqadd_n_u8_m (p0, z0, -127),
+               z0 = svqadd_m (p0, z0, -127))
+
+/*
+** qadd_m128_u8_m:
+**     mov     (z[0-9]+\.b), #-128
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_u8_m, svuint8_t,
+               z0 = svqadd_n_u8_m (p0, z0, -128),
+               z0 = svqadd_m (p0, z0, -128))
+
+/*
+** qadd_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u8_z_tied1, svuint8_t,
+               z0 = svqadd_u8_z (p0, z0, z1),
+               z0 = svqadd_z (p0, z0, z1))
+
+/*
+** qadd_u8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqadd   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u8_z_tied2, svuint8_t,
+               z0 = svqadd_u8_z (p0, z1, z0),
+               z0 = svqadd_z (p0, z1, z0))
+
+/*
+** qadd_u8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uqadd   z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0\.b, p0/z, z2\.b
+**     uqadd   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u8_z_untied, svuint8_t,
+               z0 = svqadd_u8_z (p0, z1, z2),
+               z0 = svqadd_z (p0, z1, z2))
+
+/*
+** qadd_w0_u8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u8_z_tied1, svuint8_t, uint8_t,
+                z0 = svqadd_n_u8_z (p0, z0, x0),
+                z0 = svqadd_z (p0, z0, x0))
+
+/*
+** qadd_w0_u8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     uqadd   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u8_z_untied, svuint8_t, uint8_t,
+                z0 = svqadd_n_u8_z (p0, z1, x0),
+                z0 = svqadd_z (p0, z1, x0))
+
+/*
+** qadd_1_u8_z_tied1:
+**     mov     (z[0-9]+\.b), #1
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u8_z_tied1, svuint8_t,
+               z0 = svqadd_n_u8_z (p0, z0, 1),
+               z0 = svqadd_z (p0, z0, 1))
+
+/*
+** qadd_1_u8_z_untied:
+**     mov     (z[0-9]+\.b), #1
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     uqadd   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u8_z_untied, svuint8_t,
+               z0 = svqadd_n_u8_z (p0, z1, 1),
+               z0 = svqadd_z (p0, z1, 1))
+
+/*
+** qadd_127_u8_z:
+**     mov     (z[0-9]+\.b), #127
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_u8_z, svuint8_t,
+               z0 = svqadd_n_u8_z (p0, z0, 127),
+               z0 = svqadd_z (p0, z0, 127))
+
+/*
+** qadd_128_u8_z:
+**     mov     (z[0-9]+\.b), #-128
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_u8_z, svuint8_t,
+               z0 = svqadd_n_u8_z (p0, z0, 128),
+               z0 = svqadd_z (p0, z0, 128))
+
+/*
+** qadd_255_u8_z:
+**     mov     (z[0-9]+\.b), #-1
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_u8_z, svuint8_t,
+               z0 = svqadd_n_u8_z (p0, z0, 255),
+               z0 = svqadd_z (p0, z0, 255))
+
+/*
+** qadd_m1_u8_z:
+**     mov     (z[0-9]+\.b), #-1
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_u8_z, svuint8_t,
+               z0 = svqadd_n_u8_z (p0, z0, -1),
+               z0 = svqadd_z (p0, z0, -1))
+
+/*
+** qadd_m127_u8_z:
+**     mov     (z[0-9]+\.b), #-127
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_u8_z, svuint8_t,
+               z0 = svqadd_n_u8_z (p0, z0, -127),
+               z0 = svqadd_z (p0, z0, -127))
+
+/*
+** qadd_m128_u8_z:
+**     mov     (z[0-9]+\.b), #-128
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqadd   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_u8_z, svuint8_t,
+               z0 = svqadd_n_u8_z (p0, z0, -128),
+               z0 = svqadd_z (p0, z0, -128))
+
+/*
+** qadd_u8_x_tied1:
+**     uqadd   z0\.b, (z0\.b, z1\.b|z1\.b, z0\.b)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u8_x_tied1, svuint8_t,
+               z0 = svqadd_u8_x (p0, z0, z1),
+               z0 = svqadd_x (p0, z0, z1))
+
+/*
+** qadd_u8_x_tied2:
+**     uqadd   z0\.b, (z0\.b, z1\.b|z1\.b, z0\.b)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u8_x_tied2, svuint8_t,
+               z0 = svqadd_u8_x (p0, z1, z0),
+               z0 = svqadd_x (p0, z1, z0))
+
+/*
+** qadd_u8_x_untied:
+**     uqadd   z0\.b, (z1\.b, z2\.b|z2\.b, z1\.b)
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_u8_x_untied, svuint8_t,
+               z0 = svqadd_u8_x (p0, z1, z2),
+               z0 = svqadd_x (p0, z1, z2))
+
+/*
+** qadd_w0_u8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uqadd   z0\.b, (z0\.b, \1|\1, z0\.b)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u8_x_tied1, svuint8_t, uint8_t,
+                z0 = svqadd_n_u8_x (p0, z0, x0),
+                z0 = svqadd_x (p0, z0, x0))
+
+/*
+** qadd_w0_u8_x_untied:
+**     mov     (z[0-9]+\.b), w0
+**     uqadd   z0\.b, (z1\.b, \1|\1, z1\.b)
+**     ret
+*/
+TEST_UNIFORM_ZX (qadd_w0_u8_x_untied, svuint8_t, uint8_t,
+                z0 = svqadd_n_u8_x (p0, z1, x0),
+                z0 = svqadd_x (p0, z1, x0))
+
+/*
+** qadd_1_u8_x_tied1:
+**     uqadd   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u8_x_tied1, svuint8_t,
+               z0 = svqadd_n_u8_x (p0, z0, 1),
+               z0 = svqadd_x (p0, z0, 1))
+
+/*
+** qadd_1_u8_x_untied:
+**     movprfx z0, z1
+**     uqadd   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_1_u8_x_untied, svuint8_t,
+               z0 = svqadd_n_u8_x (p0, z1, 1),
+               z0 = svqadd_x (p0, z1, 1))
+
+/*
+** qadd_127_u8_x:
+**     uqadd   z0\.b, z0\.b, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_127_u8_x, svuint8_t,
+               z0 = svqadd_n_u8_x (p0, z0, 127),
+               z0 = svqadd_x (p0, z0, 127))
+
+/*
+** qadd_128_u8_x:
+**     uqadd   z0\.b, z0\.b, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_128_u8_x, svuint8_t,
+               z0 = svqadd_n_u8_x (p0, z0, 128),
+               z0 = svqadd_x (p0, z0, 128))
+
+/*
+** qadd_255_u8_x:
+**     uqadd   z0\.b, z0\.b, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_255_u8_x, svuint8_t,
+               z0 = svqadd_n_u8_x (p0, z0, 255),
+               z0 = svqadd_x (p0, z0, 255))
+
+/*
+** qadd_m1_u8_x:
+**     uqadd   z0\.b, z0\.b, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m1_u8_x, svuint8_t,
+               z0 = svqadd_n_u8_x (p0, z0, -1),
+               z0 = svqadd_x (p0, z0, -1))
+
+/*
+** qadd_m127_u8_x:
+**     uqadd   z0\.b, z0\.b, #129
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m127_u8_x, svuint8_t,
+               z0 = svqadd_n_u8_x (p0, z0, -127),
+               z0 = svqadd_x (p0, z0, -127))
+
+/*
+** qadd_m128_u8_x:
+**     uqadd   z0\.b, z0\.b, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qadd_m128_u8_x, svuint8_t,
+               z0 = svqadd_n_u8_x (p0, z0, -128),
+               z0 = svqadd_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qcadd_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qcadd_s16.c
new file mode 100644 (file)
index 0000000..c7f312c
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qcadd_90_s16_tied1:
+**     sqcadd  z0\.h, z0\.h, z1\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_90_s16_tied1, svint16_t,
+               z0 = svqcadd_s16 (z0, z1, 90),
+               z0 = svqcadd (z0, z1, 90))
+
+/*
+** qcadd_90_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqcadd  z0\.h, z0\.h, \1\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_90_s16_tied2, svint16_t,
+               z0 = svqcadd_s16 (z1, z0, 90),
+               z0 = svqcadd (z1, z0, 90))
+
+/*
+** qcadd_90_s16_untied:
+**     movprfx z0, z1
+**     sqcadd  z0\.h, z0\.h, z2\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_90_s16_untied, svint16_t,
+               z0 = svqcadd_s16 (z1, z2, 90),
+               z0 = svqcadd (z1, z2, 90))
+
+/*
+** qcadd_270_s16_tied1:
+**     sqcadd  z0\.h, z0\.h, z1\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_270_s16_tied1, svint16_t,
+               z0 = svqcadd_s16 (z0, z1, 270),
+               z0 = svqcadd (z0, z1, 270))
+
+/*
+** qcadd_270_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqcadd  z0\.h, z0\.h, \1\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_270_s16_tied2, svint16_t,
+               z0 = svqcadd_s16 (z1, z0, 270),
+               z0 = svqcadd (z1, z0, 270))
+
+/*
+** qcadd_270_s16_untied:
+**     movprfx z0, z1
+**     sqcadd  z0\.h, z0\.h, z2\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_270_s16_untied, svint16_t,
+               z0 = svqcadd_s16 (z1, z2, 270),
+               z0 = svqcadd (z1, z2, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qcadd_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qcadd_s32.c
new file mode 100644 (file)
index 0000000..b3c951d
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qcadd_90_s32_tied1:
+**     sqcadd  z0\.s, z0\.s, z1\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_90_s32_tied1, svint32_t,
+               z0 = svqcadd_s32 (z0, z1, 90),
+               z0 = svqcadd (z0, z1, 90))
+
+/*
+** qcadd_90_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqcadd  z0\.s, z0\.s, \1\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_90_s32_tied2, svint32_t,
+               z0 = svqcadd_s32 (z1, z0, 90),
+               z0 = svqcadd (z1, z0, 90))
+
+/*
+** qcadd_90_s32_untied:
+**     movprfx z0, z1
+**     sqcadd  z0\.s, z0\.s, z2\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_90_s32_untied, svint32_t,
+               z0 = svqcadd_s32 (z1, z2, 90),
+               z0 = svqcadd (z1, z2, 90))
+
+/*
+** qcadd_270_s32_tied1:
+**     sqcadd  z0\.s, z0\.s, z1\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_270_s32_tied1, svint32_t,
+               z0 = svqcadd_s32 (z0, z1, 270),
+               z0 = svqcadd (z0, z1, 270))
+
+/*
+** qcadd_270_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqcadd  z0\.s, z0\.s, \1\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_270_s32_tied2, svint32_t,
+               z0 = svqcadd_s32 (z1, z0, 270),
+               z0 = svqcadd (z1, z0, 270))
+
+/*
+** qcadd_270_s32_untied:
+**     movprfx z0, z1
+**     sqcadd  z0\.s, z0\.s, z2\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_270_s32_untied, svint32_t,
+               z0 = svqcadd_s32 (z1, z2, 270),
+               z0 = svqcadd (z1, z2, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qcadd_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qcadd_s64.c
new file mode 100644 (file)
index 0000000..6156a4c
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qcadd_90_s64_tied1:
+**     sqcadd  z0\.d, z0\.d, z1\.d, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_90_s64_tied1, svint64_t,
+               z0 = svqcadd_s64 (z0, z1, 90),
+               z0 = svqcadd (z0, z1, 90))
+
+/*
+** qcadd_90_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqcadd  z0\.d, z0\.d, \1, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_90_s64_tied2, svint64_t,
+               z0 = svqcadd_s64 (z1, z0, 90),
+               z0 = svqcadd (z1, z0, 90))
+
+/*
+** qcadd_90_s64_untied:
+**     movprfx z0, z1
+**     sqcadd  z0\.d, z0\.d, z2\.d, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_90_s64_untied, svint64_t,
+               z0 = svqcadd_s64 (z1, z2, 90),
+               z0 = svqcadd (z1, z2, 90))
+
+/*
+** qcadd_270_s64_tied1:
+**     sqcadd  z0\.d, z0\.d, z1\.d, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_270_s64_tied1, svint64_t,
+               z0 = svqcadd_s64 (z0, z1, 270),
+               z0 = svqcadd (z0, z1, 270))
+
+/*
+** qcadd_270_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqcadd  z0\.d, z0\.d, \1, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_270_s64_tied2, svint64_t,
+               z0 = svqcadd_s64 (z1, z0, 270),
+               z0 = svqcadd (z1, z0, 270))
+
+/*
+** qcadd_270_s64_untied:
+**     movprfx z0, z1
+**     sqcadd  z0\.d, z0\.d, z2\.d, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_270_s64_untied, svint64_t,
+               z0 = svqcadd_s64 (z1, z2, 270),
+               z0 = svqcadd (z1, z2, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qcadd_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qcadd_s8.c
new file mode 100644 (file)
index 0000000..e4486c0
--- /dev/null
@@ -0,0 +1,63 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qcadd_90_s8_tied1:
+**     sqcadd  z0\.b, z0\.b, z1\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_90_s8_tied1, svint8_t,
+               z0 = svqcadd_s8 (z0, z1, 90),
+               z0 = svqcadd (z0, z1, 90))
+
+/*
+** qcadd_90_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqcadd  z0\.b, z0\.b, \1\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_90_s8_tied2, svint8_t,
+               z0 = svqcadd_s8 (z1, z0, 90),
+               z0 = svqcadd (z1, z0, 90))
+
+/*
+** qcadd_90_s8_untied:
+**     movprfx z0, z1
+**     sqcadd  z0\.b, z0\.b, z2\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_90_s8_untied, svint8_t,
+               z0 = svqcadd_s8 (z1, z2, 90),
+               z0 = svqcadd (z1, z2, 90))
+
+/*
+** qcadd_270_s8_tied1:
+**     sqcadd  z0\.b, z0\.b, z1\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_270_s8_tied1, svint8_t,
+               z0 = svqcadd_s8 (z0, z1, 270),
+               z0 = svqcadd (z0, z1, 270))
+
+/*
+** qcadd_270_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqcadd  z0\.b, z0\.b, \1\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_270_s8_tied2, svint8_t,
+               z0 = svqcadd_s8 (z1, z0, 270),
+               z0 = svqcadd (z1, z0, 270))
+
+/*
+** qcadd_270_s8_untied:
+**     movprfx z0, z1
+**     sqcadd  z0\.b, z0\.b, z2\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qcadd_270_s8_untied, svint8_t,
+               z0 = svqcadd_s8 (z1, z2, 270),
+               z0 = svqcadd (z1, z2, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalb_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalb_lane_s32.c
new file mode 100644 (file)
index 0000000..d37a483
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlalb_lane_0_s32_tied1:
+**     sqdmlalb        z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlalb_lane_0_s32_tied1, svint32_t, svint16_t,
+            z0 = svqdmlalb_lane_s32 (z0, z4, z5, 0),
+            z0 = svqdmlalb_lane (z0, z4, z5, 0))
+
+/*
+** qdmlalb_lane_0_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalb        z0\.s, \1\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalb_lane_0_s32_tied2, svint32_t, svint16_t,
+                z0_res = svqdmlalb_lane_s32 (z4, z0, z1, 0),
+                z0_res = svqdmlalb_lane (z4, z0, z1, 0))
+
+/*
+** qdmlalb_lane_0_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalb        z0\.s, z1\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalb_lane_0_s32_tied3, svint32_t, svint16_t,
+                z0_res = svqdmlalb_lane_s32 (z4, z1, z0, 0),
+                z0_res = svqdmlalb_lane (z4, z1, z0, 0))
+
+/*
+** qdmlalb_lane_0_s32_untied:
+**     movprfx z0, z1
+**     sqdmlalb        z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlalb_lane_0_s32_untied, svint32_t, svint16_t,
+            z0 = svqdmlalb_lane_s32 (z1, z4, z5, 0),
+            z0 = svqdmlalb_lane (z1, z4, z5, 0))
+
+/*
+** qdmlalb_lane_1_s32:
+**     sqdmlalb        z0\.s, z4\.h, z5\.h\[1\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlalb_lane_1_s32, svint32_t, svint16_t,
+            z0 = svqdmlalb_lane_s32 (z0, z4, z5, 1),
+            z0 = svqdmlalb_lane (z0, z4, z5, 1))
+
+/*
+** qdmlalb_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     sqdmlalb        z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmlalb_lane_z8_s32, svint32_t, svint16_t, z8,
+                   z0 = svqdmlalb_lane_s32 (z0, z1, z8, 1),
+                   z0 = svqdmlalb_lane (z0, z1, z8, 1))
+
+/*
+** qdmlalb_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqdmlalb        z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmlalb_lane_z16_s32, svint32_t, svint16_t, z16,
+                   z0 = svqdmlalb_lane_s32 (z0, z1, z16, 1),
+                   z0 = svqdmlalb_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalb_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalb_lane_s64.c
new file mode 100644 (file)
index 0000000..ea84f20
--- /dev/null
@@ -0,0 +1,65 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlalb_lane_0_s64_tied1:
+**     sqdmlalb        z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlalb_lane_0_s64_tied1, svint64_t, svint32_t,
+            z0 = svqdmlalb_lane_s64 (z0, z4, z5, 0),
+            z0 = svqdmlalb_lane (z0, z4, z5, 0))
+
+/*
+** qdmlalb_lane_0_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalb        z0\.d, \1\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalb_lane_0_s64_tied2, svint64_t, svint32_t,
+                z0_res = svqdmlalb_lane_s64 (z4, z0, z1, 0),
+                z0_res = svqdmlalb_lane (z4, z0, z1, 0))
+
+/*
+** qdmlalb_lane_0_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalb        z0\.d, z1\.s, \1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalb_lane_0_s64_tied3, svint64_t, svint32_t,
+                z0_res = svqdmlalb_lane_s64 (z4, z1, z0, 0),
+                z0_res = svqdmlalb_lane (z4, z1, z0, 0))
+
+/*
+** qdmlalb_lane_0_s64_untied:
+**     movprfx z0, z1
+**     sqdmlalb        z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlalb_lane_0_s64_untied, svint64_t, svint32_t,
+            z0 = svqdmlalb_lane_s64 (z1, z4, z5, 0),
+            z0 = svqdmlalb_lane (z1, z4, z5, 0))
+
+/*
+** qdmlalb_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     sqdmlalb        z0\.d, z1\.s, z15\.s\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmlalb_lane_z15_s64, svint64_t, svint32_t, z15,
+                   z0 = svqdmlalb_lane_s64 (z0, z1, z15, 1),
+                   z0 = svqdmlalb_lane (z0, z1, z15, 1))
+
+/*
+** qdmlalb_lane_z16_s64:
+**     mov     (z[0-9]|z1[0-5])\.d, z16\.d
+**     sqdmlalb        z0\.d, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmlalb_lane_z16_s64, svint64_t, svint32_t, z16,
+                   z0 = svqdmlalb_lane_s64 (z0, z1, z16, 1),
+                   z0 = svqdmlalb_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalb_s16.c
new file mode 100644 (file)
index 0000000..4d1e903
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlalb_s16_tied1:
+**     sqdmlalb        z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (qdmlalb_s16_tied1, svint16_t, svint8_t,
+            z0 = svqdmlalb_s16 (z0, z4, z5),
+            z0 = svqdmlalb (z0, z4, z5))
+
+/*
+** qdmlalb_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalb        z0\.h, \1\.b, z1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalb_s16_tied2, svint16_t, svint8_t,
+                z0_res = svqdmlalb_s16 (z4, z0, z1),
+                z0_res = svqdmlalb (z4, z0, z1))
+
+/*
+** qdmlalb_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalb        z0\.h, z1\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalb_s16_tied3, svint16_t, svint8_t,
+                z0_res = svqdmlalb_s16 (z4, z1, z0),
+                z0_res = svqdmlalb (z4, z1, z0))
+
+/*
+** qdmlalb_s16_untied:
+**     movprfx z0, z1
+**     sqdmlalb        z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (qdmlalb_s16_untied, svint16_t, svint8_t,
+            z0 = svqdmlalb_s16 (z1, z4, z5),
+            z0 = svqdmlalb (z1, z4, z5))
+
+/*
+** qdmlalb_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqdmlalb        z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlalb_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+             z0 = svqdmlalb_n_s16 (z0, z4, x0),
+             z0 = svqdmlalb (z0, z4, x0))
+
+/*
+** qdmlalb_w0_s16_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     sqdmlalb        z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlalb_w0_s16_untied, svint16_t, svint8_t, int8_t,
+             z0 = svqdmlalb_n_s16 (z1, z4, x0),
+             z0 = svqdmlalb (z1, z4, x0))
+
+/*
+** qdmlalb_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     sqdmlalb        z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlalb_11_s16_tied1, svint16_t, svint8_t,
+            z0 = svqdmlalb_n_s16 (z0, z4, 11),
+            z0 = svqdmlalb (z0, z4, 11))
+
+/*
+** qdmlalb_11_s16_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     sqdmlalb        z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlalb_11_s16_untied, svint16_t, svint8_t,
+            z0 = svqdmlalb_n_s16 (z1, z4, 11),
+            z0 = svqdmlalb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalb_s32.c
new file mode 100644 (file)
index 0000000..9437377
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlalb_s32_tied1:
+**     sqdmlalb        z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (qdmlalb_s32_tied1, svint32_t, svint16_t,
+            z0 = svqdmlalb_s32 (z0, z4, z5),
+            z0 = svqdmlalb (z0, z4, z5))
+
+/*
+** qdmlalb_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalb        z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalb_s32_tied2, svint32_t, svint16_t,
+                z0_res = svqdmlalb_s32 (z4, z0, z1),
+                z0_res = svqdmlalb (z4, z0, z1))
+
+/*
+** qdmlalb_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalb        z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalb_s32_tied3, svint32_t, svint16_t,
+                z0_res = svqdmlalb_s32 (z4, z1, z0),
+                z0_res = svqdmlalb (z4, z1, z0))
+
+/*
+** qdmlalb_s32_untied:
+**     movprfx z0, z1
+**     sqdmlalb        z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (qdmlalb_s32_untied, svint32_t, svint16_t,
+            z0 = svqdmlalb_s32 (z1, z4, z5),
+            z0 = svqdmlalb (z1, z4, z5))
+
+/*
+** qdmlalb_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqdmlalb        z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlalb_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+             z0 = svqdmlalb_n_s32 (z0, z4, x0),
+             z0 = svqdmlalb (z0, z4, x0))
+
+/*
+** qdmlalb_w0_s32_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     sqdmlalb        z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlalb_w0_s32_untied, svint32_t, svint16_t, int16_t,
+             z0 = svqdmlalb_n_s32 (z1, z4, x0),
+             z0 = svqdmlalb (z1, z4, x0))
+
+/*
+** qdmlalb_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     sqdmlalb        z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlalb_11_s32_tied1, svint32_t, svint16_t,
+            z0 = svqdmlalb_n_s32 (z0, z4, 11),
+            z0 = svqdmlalb (z0, z4, 11))
+
+/*
+** qdmlalb_11_s32_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     sqdmlalb        z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlalb_11_s32_untied, svint32_t, svint16_t,
+            z0 = svqdmlalb_n_s32 (z1, z4, 11),
+            z0 = svqdmlalb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalb_s64.c
new file mode 100644 (file)
index 0000000..8ac848b
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlalb_s64_tied1:
+**     sqdmlalb        z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (qdmlalb_s64_tied1, svint64_t, svint32_t,
+            z0 = svqdmlalb_s64 (z0, z4, z5),
+            z0 = svqdmlalb (z0, z4, z5))
+
+/*
+** qdmlalb_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalb        z0\.d, \1\.s, z1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalb_s64_tied2, svint64_t, svint32_t,
+                z0_res = svqdmlalb_s64 (z4, z0, z1),
+                z0_res = svqdmlalb (z4, z0, z1))
+
+/*
+** qdmlalb_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalb        z0\.d, z1\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalb_s64_tied3, svint64_t, svint32_t,
+                z0_res = svqdmlalb_s64 (z4, z1, z0),
+                z0_res = svqdmlalb (z4, z1, z0))
+
+/*
+** qdmlalb_s64_untied:
+**     movprfx z0, z1
+**     sqdmlalb        z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (qdmlalb_s64_untied, svint64_t, svint32_t,
+            z0 = svqdmlalb_s64 (z1, z4, z5),
+            z0 = svqdmlalb (z1, z4, z5))
+
+/*
+** qdmlalb_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqdmlalb        z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlalb_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+             z0 = svqdmlalb_n_s64 (z0, z4, x0),
+             z0 = svqdmlalb (z0, z4, x0))
+
+/*
+** qdmlalb_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     sqdmlalb        z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlalb_w0_s64_untied, svint64_t, svint32_t, int32_t,
+             z0 = svqdmlalb_n_s64 (z1, z4, x0),
+             z0 = svqdmlalb (z1, z4, x0))
+
+/*
+** qdmlalb_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     sqdmlalb        z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlalb_11_s64_tied1, svint64_t, svint32_t,
+            z0 = svqdmlalb_n_s64 (z0, z4, 11),
+            z0 = svqdmlalb (z0, z4, 11))
+
+/*
+** qdmlalb_11_s64_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     sqdmlalb        z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlalb_11_s64_untied, svint64_t, svint32_t,
+            z0 = svqdmlalb_n_s64 (z1, z4, 11),
+            z0 = svqdmlalb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalbt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalbt_s16.c
new file mode 100644 (file)
index 0000000..d591db3
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlalbt_s16_tied1:
+**     sqdmlalbt       z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (qdmlalbt_s16_tied1, svint16_t, svint8_t,
+            z0 = svqdmlalbt_s16 (z0, z4, z5),
+            z0 = svqdmlalbt (z0, z4, z5))
+
+/*
+** qdmlalbt_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalbt       z0\.h, \1\.b, z1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalbt_s16_tied2, svint16_t, svint8_t,
+                z0_res = svqdmlalbt_s16 (z4, z0, z1),
+                z0_res = svqdmlalbt (z4, z0, z1))
+
+/*
+** qdmlalbt_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalbt       z0\.h, z1\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalbt_s16_tied3, svint16_t, svint8_t,
+                z0_res = svqdmlalbt_s16 (z4, z1, z0),
+                z0_res = svqdmlalbt (z4, z1, z0))
+
+/*
+** qdmlalbt_s16_untied:
+**     movprfx z0, z1
+**     sqdmlalbt       z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (qdmlalbt_s16_untied, svint16_t, svint8_t,
+            z0 = svqdmlalbt_s16 (z1, z4, z5),
+            z0 = svqdmlalbt (z1, z4, z5))
+
+/*
+** qdmlalbt_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqdmlalbt       z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlalbt_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+             z0 = svqdmlalbt_n_s16 (z0, z4, x0),
+             z0 = svqdmlalbt (z0, z4, x0))
+
+/*
+** qdmlalbt_w0_s16_untied: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     sqdmlalbt       z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlalbt_w0_s16_untied, svint16_t, svint8_t, int8_t,
+             z0 = svqdmlalbt_n_s16 (z1, z4, x0),
+             z0 = svqdmlalbt (z1, z4, x0))
+
+/*
+** qdmlalbt_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     sqdmlalbt       z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlalbt_11_s16_tied1, svint16_t, svint8_t,
+            z0 = svqdmlalbt_n_s16 (z0, z4, 11),
+            z0 = svqdmlalbt (z0, z4, 11))
+
+/*
+** qdmlalbt_11_s16_untied: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     sqdmlalbt       z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlalbt_11_s16_untied, svint16_t, svint8_t,
+            z0 = svqdmlalbt_n_s16 (z1, z4, 11),
+            z0 = svqdmlalbt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalbt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalbt_s32.c
new file mode 100644 (file)
index 0000000..e8326fe
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlalbt_s32_tied1:
+**     sqdmlalbt       z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (qdmlalbt_s32_tied1, svint32_t, svint16_t,
+            z0 = svqdmlalbt_s32 (z0, z4, z5),
+            z0 = svqdmlalbt (z0, z4, z5))
+
+/*
+** qdmlalbt_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalbt       z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalbt_s32_tied2, svint32_t, svint16_t,
+                z0_res = svqdmlalbt_s32 (z4, z0, z1),
+                z0_res = svqdmlalbt (z4, z0, z1))
+
+/*
+** qdmlalbt_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalbt       z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalbt_s32_tied3, svint32_t, svint16_t,
+                z0_res = svqdmlalbt_s32 (z4, z1, z0),
+                z0_res = svqdmlalbt (z4, z1, z0))
+
+/*
+** qdmlalbt_s32_untied:
+**     movprfx z0, z1
+**     sqdmlalbt       z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (qdmlalbt_s32_untied, svint32_t, svint16_t,
+            z0 = svqdmlalbt_s32 (z1, z4, z5),
+            z0 = svqdmlalbt (z1, z4, z5))
+
+/*
+** qdmlalbt_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqdmlalbt       z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlalbt_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+             z0 = svqdmlalbt_n_s32 (z0, z4, x0),
+             z0 = svqdmlalbt (z0, z4, x0))
+
+/*
+** qdmlalbt_w0_s32_untied: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     sqdmlalbt       z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlalbt_w0_s32_untied, svint32_t, svint16_t, int16_t,
+             z0 = svqdmlalbt_n_s32 (z1, z4, x0),
+             z0 = svqdmlalbt (z1, z4, x0))
+
+/*
+** qdmlalbt_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     sqdmlalbt       z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlalbt_11_s32_tied1, svint32_t, svint16_t,
+            z0 = svqdmlalbt_n_s32 (z0, z4, 11),
+            z0 = svqdmlalbt (z0, z4, 11))
+
+/*
+** qdmlalbt_11_s32_untied: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     sqdmlalbt       z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlalbt_11_s32_untied, svint32_t, svint16_t,
+            z0 = svqdmlalbt_n_s32 (z1, z4, 11),
+            z0 = svqdmlalbt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalbt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalbt_s64.c
new file mode 100644 (file)
index 0000000..f29e4de
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlalbt_s64_tied1:
+**     sqdmlalbt       z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (qdmlalbt_s64_tied1, svint64_t, svint32_t,
+            z0 = svqdmlalbt_s64 (z0, z4, z5),
+            z0 = svqdmlalbt (z0, z4, z5))
+
+/*
+** qdmlalbt_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalbt       z0\.d, \1\.s, z1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalbt_s64_tied2, svint64_t, svint32_t,
+                z0_res = svqdmlalbt_s64 (z4, z0, z1),
+                z0_res = svqdmlalbt (z4, z0, z1))
+
+/*
+** qdmlalbt_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalbt       z0\.d, z1\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalbt_s64_tied3, svint64_t, svint32_t,
+                z0_res = svqdmlalbt_s64 (z4, z1, z0),
+                z0_res = svqdmlalbt (z4, z1, z0))
+
+/*
+** qdmlalbt_s64_untied:
+**     movprfx z0, z1
+**     sqdmlalbt       z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (qdmlalbt_s64_untied, svint64_t, svint32_t,
+            z0 = svqdmlalbt_s64 (z1, z4, z5),
+            z0 = svqdmlalbt (z1, z4, z5))
+
+/*
+** qdmlalbt_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqdmlalbt       z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlalbt_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+             z0 = svqdmlalbt_n_s64 (z0, z4, x0),
+             z0 = svqdmlalbt (z0, z4, x0))
+
+/*
+** qdmlalbt_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     sqdmlalbt       z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlalbt_w0_s64_untied, svint64_t, svint32_t, int32_t,
+             z0 = svqdmlalbt_n_s64 (z1, z4, x0),
+             z0 = svqdmlalbt (z1, z4, x0))
+
+/*
+** qdmlalbt_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     sqdmlalbt       z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlalbt_11_s64_tied1, svint64_t, svint32_t,
+            z0 = svqdmlalbt_n_s64 (z0, z4, 11),
+            z0 = svqdmlalbt (z0, z4, 11))
+
+/*
+** qdmlalbt_11_s64_untied: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     sqdmlalbt       z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlalbt_11_s64_untied, svint64_t, svint32_t,
+            z0 = svqdmlalbt_n_s64 (z1, z4, 11),
+            z0 = svqdmlalbt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalt_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalt_lane_s32.c
new file mode 100644 (file)
index 0000000..3eee233
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlalt_lane_0_s32_tied1:
+**     sqdmlalt        z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlalt_lane_0_s32_tied1, svint32_t, svint16_t,
+            z0 = svqdmlalt_lane_s32 (z0, z4, z5, 0),
+            z0 = svqdmlalt_lane (z0, z4, z5, 0))
+
+/*
+** qdmlalt_lane_0_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalt        z0\.s, \1\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalt_lane_0_s32_tied2, svint32_t, svint16_t,
+                z0_res = svqdmlalt_lane_s32 (z4, z0, z1, 0),
+                z0_res = svqdmlalt_lane (z4, z0, z1, 0))
+
+/*
+** qdmlalt_lane_0_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalt        z0\.s, z1\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalt_lane_0_s32_tied3, svint32_t, svint16_t,
+                z0_res = svqdmlalt_lane_s32 (z4, z1, z0, 0),
+                z0_res = svqdmlalt_lane (z4, z1, z0, 0))
+
+/*
+** qdmlalt_lane_0_s32_untied:
+**     movprfx z0, z1
+**     sqdmlalt        z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlalt_lane_0_s32_untied, svint32_t, svint16_t,
+            z0 = svqdmlalt_lane_s32 (z1, z4, z5, 0),
+            z0 = svqdmlalt_lane (z1, z4, z5, 0))
+
+/*
+** qdmlalt_lane_1_s32:
+**     sqdmlalt        z0\.s, z4\.h, z5\.h\[1\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlalt_lane_1_s32, svint32_t, svint16_t,
+            z0 = svqdmlalt_lane_s32 (z0, z4, z5, 1),
+            z0 = svqdmlalt_lane (z0, z4, z5, 1))
+
+/*
+** qdmlalt_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     sqdmlalt        z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmlalt_lane_z8_s32, svint32_t, svint16_t, z8,
+                   z0 = svqdmlalt_lane_s32 (z0, z1, z8, 1),
+                   z0 = svqdmlalt_lane (z0, z1, z8, 1))
+
+/*
+** qdmlalt_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqdmlalt        z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmlalt_lane_z16_s32, svint32_t, svint16_t, z16,
+                   z0 = svqdmlalt_lane_s32 (z0, z1, z16, 1),
+                   z0 = svqdmlalt_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalt_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalt_lane_s64.c
new file mode 100644 (file)
index 0000000..ae48c41
--- /dev/null
@@ -0,0 +1,65 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlalt_lane_0_s64_tied1:
+**     sqdmlalt        z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlalt_lane_0_s64_tied1, svint64_t, svint32_t,
+            z0 = svqdmlalt_lane_s64 (z0, z4, z5, 0),
+            z0 = svqdmlalt_lane (z0, z4, z5, 0))
+
+/*
+** qdmlalt_lane_0_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalt        z0\.d, \1\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalt_lane_0_s64_tied2, svint64_t, svint32_t,
+                z0_res = svqdmlalt_lane_s64 (z4, z0, z1, 0),
+                z0_res = svqdmlalt_lane (z4, z0, z1, 0))
+
+/*
+** qdmlalt_lane_0_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalt        z0\.d, z1\.s, \1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalt_lane_0_s64_tied3, svint64_t, svint32_t,
+                z0_res = svqdmlalt_lane_s64 (z4, z1, z0, 0),
+                z0_res = svqdmlalt_lane (z4, z1, z0, 0))
+
+/*
+** qdmlalt_lane_0_s64_untied:
+**     movprfx z0, z1
+**     sqdmlalt        z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlalt_lane_0_s64_untied, svint64_t, svint32_t,
+            z0 = svqdmlalt_lane_s64 (z1, z4, z5, 0),
+            z0 = svqdmlalt_lane (z1, z4, z5, 0))
+
+/*
+** qdmlalt_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     sqdmlalt        z0\.d, z1\.s, z15\.s\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmlalt_lane_z15_s64, svint64_t, svint32_t, z15,
+                   z0 = svqdmlalt_lane_s64 (z0, z1, z15, 1),
+                   z0 = svqdmlalt_lane (z0, z1, z15, 1))
+
+/*
+** qdmlalt_lane_z16_s64:
+**     mov     (z[0-9]|z1[0-5])\.d, z16\.d
+**     sqdmlalt        z0\.d, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmlalt_lane_z16_s64, svint64_t, svint32_t, z16,
+                   z0 = svqdmlalt_lane_s64 (z0, z1, z16, 1),
+                   z0 = svqdmlalt_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalt_s16.c
new file mode 100644 (file)
index 0000000..2ce6638
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlalt_s16_tied1:
+**     sqdmlalt        z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (qdmlalt_s16_tied1, svint16_t, svint8_t,
+            z0 = svqdmlalt_s16 (z0, z4, z5),
+            z0 = svqdmlalt (z0, z4, z5))
+
+/*
+** qdmlalt_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalt        z0\.h, \1\.b, z1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalt_s16_tied2, svint16_t, svint8_t,
+                z0_res = svqdmlalt_s16 (z4, z0, z1),
+                z0_res = svqdmlalt (z4, z0, z1))
+
+/*
+** qdmlalt_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalt        z0\.h, z1\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalt_s16_tied3, svint16_t, svint8_t,
+                z0_res = svqdmlalt_s16 (z4, z1, z0),
+                z0_res = svqdmlalt (z4, z1, z0))
+
+/*
+** qdmlalt_s16_untied:
+**     movprfx z0, z1
+**     sqdmlalt        z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (qdmlalt_s16_untied, svint16_t, svint8_t,
+            z0 = svqdmlalt_s16 (z1, z4, z5),
+            z0 = svqdmlalt (z1, z4, z5))
+
+/*
+** qdmlalt_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqdmlalt        z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlalt_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+             z0 = svqdmlalt_n_s16 (z0, z4, x0),
+             z0 = svqdmlalt (z0, z4, x0))
+
+/*
+** qdmlalt_w0_s16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     sqdmlalt        z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlalt_w0_s16_untied, svint16_t, svint8_t, int8_t,
+             z0 = svqdmlalt_n_s16 (z1, z4, x0),
+             z0 = svqdmlalt (z1, z4, x0))
+
+/*
+** qdmlalt_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     sqdmlalt        z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlalt_11_s16_tied1, svint16_t, svint8_t,
+            z0 = svqdmlalt_n_s16 (z0, z4, 11),
+            z0 = svqdmlalt (z0, z4, 11))
+
+/*
+** qdmlalt_11_s16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     sqdmlalt        z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlalt_11_s16_untied, svint16_t, svint8_t,
+            z0 = svqdmlalt_n_s16 (z1, z4, 11),
+            z0 = svqdmlalt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalt_s32.c
new file mode 100644 (file)
index 0000000..ec0909d
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlalt_s32_tied1:
+**     sqdmlalt        z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (qdmlalt_s32_tied1, svint32_t, svint16_t,
+            z0 = svqdmlalt_s32 (z0, z4, z5),
+            z0 = svqdmlalt (z0, z4, z5))
+
+/*
+** qdmlalt_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalt        z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalt_s32_tied2, svint32_t, svint16_t,
+                z0_res = svqdmlalt_s32 (z4, z0, z1),
+                z0_res = svqdmlalt (z4, z0, z1))
+
+/*
+** qdmlalt_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalt        z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalt_s32_tied3, svint32_t, svint16_t,
+                z0_res = svqdmlalt_s32 (z4, z1, z0),
+                z0_res = svqdmlalt (z4, z1, z0))
+
+/*
+** qdmlalt_s32_untied:
+**     movprfx z0, z1
+**     sqdmlalt        z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (qdmlalt_s32_untied, svint32_t, svint16_t,
+            z0 = svqdmlalt_s32 (z1, z4, z5),
+            z0 = svqdmlalt (z1, z4, z5))
+
+/*
+** qdmlalt_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqdmlalt        z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlalt_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+             z0 = svqdmlalt_n_s32 (z0, z4, x0),
+             z0 = svqdmlalt (z0, z4, x0))
+
+/*
+** qdmlalt_w0_s32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     sqdmlalt        z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlalt_w0_s32_untied, svint32_t, svint16_t, int16_t,
+             z0 = svqdmlalt_n_s32 (z1, z4, x0),
+             z0 = svqdmlalt (z1, z4, x0))
+
+/*
+** qdmlalt_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     sqdmlalt        z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlalt_11_s32_tied1, svint32_t, svint16_t,
+            z0 = svqdmlalt_n_s32 (z0, z4, 11),
+            z0 = svqdmlalt (z0, z4, 11))
+
+/*
+** qdmlalt_11_s32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     sqdmlalt        z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlalt_11_s32_untied, svint32_t, svint16_t,
+            z0 = svqdmlalt_n_s32 (z1, z4, 11),
+            z0 = svqdmlalt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlalt_s64.c
new file mode 100644 (file)
index 0000000..4919dc2
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlalt_s64_tied1:
+**     sqdmlalt        z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (qdmlalt_s64_tied1, svint64_t, svint32_t,
+            z0 = svqdmlalt_s64 (z0, z4, z5),
+            z0 = svqdmlalt (z0, z4, z5))
+
+/*
+** qdmlalt_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalt        z0\.d, \1\.s, z1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalt_s64_tied2, svint64_t, svint32_t,
+                z0_res = svqdmlalt_s64 (z4, z0, z1),
+                z0_res = svqdmlalt (z4, z0, z1))
+
+/*
+** qdmlalt_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlalt        z0\.d, z1\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlalt_s64_tied3, svint64_t, svint32_t,
+                z0_res = svqdmlalt_s64 (z4, z1, z0),
+                z0_res = svqdmlalt (z4, z1, z0))
+
+/*
+** qdmlalt_s64_untied:
+**     movprfx z0, z1
+**     sqdmlalt        z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (qdmlalt_s64_untied, svint64_t, svint32_t,
+            z0 = svqdmlalt_s64 (z1, z4, z5),
+            z0 = svqdmlalt (z1, z4, z5))
+
+/*
+** qdmlalt_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqdmlalt        z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlalt_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+             z0 = svqdmlalt_n_s64 (z0, z4, x0),
+             z0 = svqdmlalt (z0, z4, x0))
+
+/*
+** qdmlalt_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     sqdmlalt        z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlalt_w0_s64_untied, svint64_t, svint32_t, int32_t,
+             z0 = svqdmlalt_n_s64 (z1, z4, x0),
+             z0 = svqdmlalt (z1, z4, x0))
+
+/*
+** qdmlalt_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     sqdmlalt        z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlalt_11_s64_tied1, svint64_t, svint32_t,
+            z0 = svqdmlalt_n_s64 (z0, z4, 11),
+            z0 = svqdmlalt (z0, z4, 11))
+
+/*
+** qdmlalt_11_s64_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     sqdmlalt        z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlalt_11_s64_untied, svint64_t, svint32_t,
+            z0 = svqdmlalt_n_s64 (z1, z4, 11),
+            z0 = svqdmlalt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslb_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslb_lane_s32.c
new file mode 100644 (file)
index 0000000..918b151
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlslb_lane_0_s32_tied1:
+**     sqdmlslb        z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlslb_lane_0_s32_tied1, svint32_t, svint16_t,
+            z0 = svqdmlslb_lane_s32 (z0, z4, z5, 0),
+            z0 = svqdmlslb_lane (z0, z4, z5, 0))
+
+/*
+** qdmlslb_lane_0_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslb        z0\.s, \1\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslb_lane_0_s32_tied2, svint32_t, svint16_t,
+                z0_res = svqdmlslb_lane_s32 (z4, z0, z1, 0),
+                z0_res = svqdmlslb_lane (z4, z0, z1, 0))
+
+/*
+** qdmlslb_lane_0_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslb        z0\.s, z1\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslb_lane_0_s32_tied3, svint32_t, svint16_t,
+                z0_res = svqdmlslb_lane_s32 (z4, z1, z0, 0),
+                z0_res = svqdmlslb_lane (z4, z1, z0, 0))
+
+/*
+** qdmlslb_lane_0_s32_untied:
+**     movprfx z0, z1
+**     sqdmlslb        z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlslb_lane_0_s32_untied, svint32_t, svint16_t,
+            z0 = svqdmlslb_lane_s32 (z1, z4, z5, 0),
+            z0 = svqdmlslb_lane (z1, z4, z5, 0))
+
+/*
+** qdmlslb_lane_1_s32:
+**     sqdmlslb        z0\.s, z4\.h, z5\.h\[1\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlslb_lane_1_s32, svint32_t, svint16_t,
+            z0 = svqdmlslb_lane_s32 (z0, z4, z5, 1),
+            z0 = svqdmlslb_lane (z0, z4, z5, 1))
+
+/*
+** qdmlslb_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     sqdmlslb        z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmlslb_lane_z8_s32, svint32_t, svint16_t, z8,
+                   z0 = svqdmlslb_lane_s32 (z0, z1, z8, 1),
+                   z0 = svqdmlslb_lane (z0, z1, z8, 1))
+
+/*
+** qdmlslb_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqdmlslb        z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmlslb_lane_z16_s32, svint32_t, svint16_t, z16,
+                   z0 = svqdmlslb_lane_s32 (z0, z1, z16, 1),
+                   z0 = svqdmlslb_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslb_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslb_lane_s64.c
new file mode 100644 (file)
index 0000000..dd56eff
--- /dev/null
@@ -0,0 +1,65 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlslb_lane_0_s64_tied1:
+**     sqdmlslb        z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlslb_lane_0_s64_tied1, svint64_t, svint32_t,
+            z0 = svqdmlslb_lane_s64 (z0, z4, z5, 0),
+            z0 = svqdmlslb_lane (z0, z4, z5, 0))
+
+/*
+** qdmlslb_lane_0_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslb        z0\.d, \1\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslb_lane_0_s64_tied2, svint64_t, svint32_t,
+                z0_res = svqdmlslb_lane_s64 (z4, z0, z1, 0),
+                z0_res = svqdmlslb_lane (z4, z0, z1, 0))
+
+/*
+** qdmlslb_lane_0_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslb        z0\.d, z1\.s, \1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslb_lane_0_s64_tied3, svint64_t, svint32_t,
+                z0_res = svqdmlslb_lane_s64 (z4, z1, z0, 0),
+                z0_res = svqdmlslb_lane (z4, z1, z0, 0))
+
+/*
+** qdmlslb_lane_0_s64_untied:
+**     movprfx z0, z1
+**     sqdmlslb        z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlslb_lane_0_s64_untied, svint64_t, svint32_t,
+            z0 = svqdmlslb_lane_s64 (z1, z4, z5, 0),
+            z0 = svqdmlslb_lane (z1, z4, z5, 0))
+
+/*
+** qdmlslb_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     sqdmlslb        z0\.d, z1\.s, z15\.s\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmlslb_lane_z15_s64, svint64_t, svint32_t, z15,
+                   z0 = svqdmlslb_lane_s64 (z0, z1, z15, 1),
+                   z0 = svqdmlslb_lane (z0, z1, z15, 1))
+
+/*
+** qdmlslb_lane_z16_s64:
+**     mov     (z[0-9]|z1[0-5])\.d, z16\.d
+**     sqdmlslb        z0\.d, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmlslb_lane_z16_s64, svint64_t, svint32_t, z16,
+                   z0 = svqdmlslb_lane_s64 (z0, z1, z16, 1),
+                   z0 = svqdmlslb_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslb_s16.c
new file mode 100644 (file)
index 0000000..146d4a3
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlslb_s16_tied1:
+**     sqdmlslb        z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (qdmlslb_s16_tied1, svint16_t, svint8_t,
+            z0 = svqdmlslb_s16 (z0, z4, z5),
+            z0 = svqdmlslb (z0, z4, z5))
+
+/*
+** qdmlslb_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslb        z0\.h, \1\.b, z1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslb_s16_tied2, svint16_t, svint8_t,
+                z0_res = svqdmlslb_s16 (z4, z0, z1),
+                z0_res = svqdmlslb (z4, z0, z1))
+
+/*
+** qdmlslb_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslb        z0\.h, z1\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslb_s16_tied3, svint16_t, svint8_t,
+                z0_res = svqdmlslb_s16 (z4, z1, z0),
+                z0_res = svqdmlslb (z4, z1, z0))
+
+/*
+** qdmlslb_s16_untied:
+**     movprfx z0, z1
+**     sqdmlslb        z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (qdmlslb_s16_untied, svint16_t, svint8_t,
+            z0 = svqdmlslb_s16 (z1, z4, z5),
+            z0 = svqdmlslb (z1, z4, z5))
+
+/*
+** qdmlslb_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqdmlslb        z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlslb_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+             z0 = svqdmlslb_n_s16 (z0, z4, x0),
+             z0 = svqdmlslb (z0, z4, x0))
+
+/*
+** qdmlslb_w0_s16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     sqdmlslb        z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlslb_w0_s16_untied, svint16_t, svint8_t, int8_t,
+             z0 = svqdmlslb_n_s16 (z1, z4, x0),
+             z0 = svqdmlslb (z1, z4, x0))
+
+/*
+** qdmlslb_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     sqdmlslb        z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlslb_11_s16_tied1, svint16_t, svint8_t,
+            z0 = svqdmlslb_n_s16 (z0, z4, 11),
+            z0 = svqdmlslb (z0, z4, 11))
+
+/*
+** qdmlslb_11_s16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     sqdmlslb        z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlslb_11_s16_untied, svint16_t, svint8_t,
+            z0 = svqdmlslb_n_s16 (z1, z4, 11),
+            z0 = svqdmlslb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslb_s32.c
new file mode 100644 (file)
index 0000000..af0ffb1
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlslb_s32_tied1:
+**     sqdmlslb        z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (qdmlslb_s32_tied1, svint32_t, svint16_t,
+            z0 = svqdmlslb_s32 (z0, z4, z5),
+            z0 = svqdmlslb (z0, z4, z5))
+
+/*
+** qdmlslb_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslb        z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslb_s32_tied2, svint32_t, svint16_t,
+                z0_res = svqdmlslb_s32 (z4, z0, z1),
+                z0_res = svqdmlslb (z4, z0, z1))
+
+/*
+** qdmlslb_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslb        z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslb_s32_tied3, svint32_t, svint16_t,
+                z0_res = svqdmlslb_s32 (z4, z1, z0),
+                z0_res = svqdmlslb (z4, z1, z0))
+
+/*
+** qdmlslb_s32_untied:
+**     movprfx z0, z1
+**     sqdmlslb        z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (qdmlslb_s32_untied, svint32_t, svint16_t,
+            z0 = svqdmlslb_s32 (z1, z4, z5),
+            z0 = svqdmlslb (z1, z4, z5))
+
+/*
+** qdmlslb_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqdmlslb        z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlslb_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+             z0 = svqdmlslb_n_s32 (z0, z4, x0),
+             z0 = svqdmlslb (z0, z4, x0))
+
+/*
+** qdmlslb_w0_s32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     sqdmlslb        z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlslb_w0_s32_untied, svint32_t, svint16_t, int16_t,
+             z0 = svqdmlslb_n_s32 (z1, z4, x0),
+             z0 = svqdmlslb (z1, z4, x0))
+
+/*
+** qdmlslb_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     sqdmlslb        z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlslb_11_s32_tied1, svint32_t, svint16_t,
+            z0 = svqdmlslb_n_s32 (z0, z4, 11),
+            z0 = svqdmlslb (z0, z4, 11))
+
+/*
+** qdmlslb_11_s32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     sqdmlslb        z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlslb_11_s32_untied, svint32_t, svint16_t,
+            z0 = svqdmlslb_n_s32 (z1, z4, 11),
+            z0 = svqdmlslb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslb_s64.c
new file mode 100644 (file)
index 0000000..124e537
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlslb_s64_tied1:
+**     sqdmlslb        z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (qdmlslb_s64_tied1, svint64_t, svint32_t,
+            z0 = svqdmlslb_s64 (z0, z4, z5),
+            z0 = svqdmlslb (z0, z4, z5))
+
+/*
+** qdmlslb_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslb        z0\.d, \1\.s, z1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslb_s64_tied2, svint64_t, svint32_t,
+                z0_res = svqdmlslb_s64 (z4, z0, z1),
+                z0_res = svqdmlslb (z4, z0, z1))
+
+/*
+** qdmlslb_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslb        z0\.d, z1\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslb_s64_tied3, svint64_t, svint32_t,
+                z0_res = svqdmlslb_s64 (z4, z1, z0),
+                z0_res = svqdmlslb (z4, z1, z0))
+
+/*
+** qdmlslb_s64_untied:
+**     movprfx z0, z1
+**     sqdmlslb        z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (qdmlslb_s64_untied, svint64_t, svint32_t,
+            z0 = svqdmlslb_s64 (z1, z4, z5),
+            z0 = svqdmlslb (z1, z4, z5))
+
+/*
+** qdmlslb_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqdmlslb        z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlslb_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+             z0 = svqdmlslb_n_s64 (z0, z4, x0),
+             z0 = svqdmlslb (z0, z4, x0))
+
+/*
+** qdmlslb_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     sqdmlslb        z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlslb_w0_s64_untied, svint64_t, svint32_t, int32_t,
+             z0 = svqdmlslb_n_s64 (z1, z4, x0),
+             z0 = svqdmlslb (z1, z4, x0))
+
+/*
+** qdmlslb_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     sqdmlslb        z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlslb_11_s64_tied1, svint64_t, svint32_t,
+            z0 = svqdmlslb_n_s64 (z0, z4, 11),
+            z0 = svqdmlslb (z0, z4, 11))
+
+/*
+** qdmlslb_11_s64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     sqdmlslb        z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlslb_11_s64_untied, svint64_t, svint32_t,
+            z0 = svqdmlslb_n_s64 (z1, z4, 11),
+            z0 = svqdmlslb (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslbt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslbt_s16.c
new file mode 100644 (file)
index 0000000..d3dda45
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlslbt_s16_tied1:
+**     sqdmlslbt       z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (qdmlslbt_s16_tied1, svint16_t, svint8_t,
+            z0 = svqdmlslbt_s16 (z0, z4, z5),
+            z0 = svqdmlslbt (z0, z4, z5))
+
+/*
+** qdmlslbt_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslbt       z0\.h, \1\.b, z1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslbt_s16_tied2, svint16_t, svint8_t,
+                z0_res = svqdmlslbt_s16 (z4, z0, z1),
+                z0_res = svqdmlslbt (z4, z0, z1))
+
+/*
+** qdmlslbt_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslbt       z0\.h, z1\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslbt_s16_tied3, svint16_t, svint8_t,
+                z0_res = svqdmlslbt_s16 (z4, z1, z0),
+                z0_res = svqdmlslbt (z4, z1, z0))
+
+/*
+** qdmlslbt_s16_untied:
+**     movprfx z0, z1
+**     sqdmlslbt       z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (qdmlslbt_s16_untied, svint16_t, svint8_t,
+            z0 = svqdmlslbt_s16 (z1, z4, z5),
+            z0 = svqdmlslbt (z1, z4, z5))
+
+/*
+** qdmlslbt_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqdmlslbt       z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlslbt_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+             z0 = svqdmlslbt_n_s16 (z0, z4, x0),
+             z0 = svqdmlslbt (z0, z4, x0))
+
+/*
+** qdmlslbt_w0_s16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     sqdmlslbt       z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlslbt_w0_s16_untied, svint16_t, svint8_t, int8_t,
+             z0 = svqdmlslbt_n_s16 (z1, z4, x0),
+             z0 = svqdmlslbt (z1, z4, x0))
+
+/*
+** qdmlslbt_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     sqdmlslbt       z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlslbt_11_s16_tied1, svint16_t, svint8_t,
+            z0 = svqdmlslbt_n_s16 (z0, z4, 11),
+            z0 = svqdmlslbt (z0, z4, 11))
+
+/*
+** qdmlslbt_11_s16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     sqdmlslbt       z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlslbt_11_s16_untied, svint16_t, svint8_t,
+            z0 = svqdmlslbt_n_s16 (z1, z4, 11),
+            z0 = svqdmlslbt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslbt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslbt_s32.c
new file mode 100644 (file)
index 0000000..6785ece
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlslbt_s32_tied1:
+**     sqdmlslbt       z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (qdmlslbt_s32_tied1, svint32_t, svint16_t,
+            z0 = svqdmlslbt_s32 (z0, z4, z5),
+            z0 = svqdmlslbt (z0, z4, z5))
+
+/*
+** qdmlslbt_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslbt       z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslbt_s32_tied2, svint32_t, svint16_t,
+                z0_res = svqdmlslbt_s32 (z4, z0, z1),
+                z0_res = svqdmlslbt (z4, z0, z1))
+
+/*
+** qdmlslbt_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslbt       z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslbt_s32_tied3, svint32_t, svint16_t,
+                z0_res = svqdmlslbt_s32 (z4, z1, z0),
+                z0_res = svqdmlslbt (z4, z1, z0))
+
+/*
+** qdmlslbt_s32_untied:
+**     movprfx z0, z1
+**     sqdmlslbt       z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (qdmlslbt_s32_untied, svint32_t, svint16_t,
+            z0 = svqdmlslbt_s32 (z1, z4, z5),
+            z0 = svqdmlslbt (z1, z4, z5))
+
+/*
+** qdmlslbt_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqdmlslbt       z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlslbt_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+             z0 = svqdmlslbt_n_s32 (z0, z4, x0),
+             z0 = svqdmlslbt (z0, z4, x0))
+
+/*
+** qdmlslbt_w0_s32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     sqdmlslbt       z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlslbt_w0_s32_untied, svint32_t, svint16_t, int16_t,
+             z0 = svqdmlslbt_n_s32 (z1, z4, x0),
+             z0 = svqdmlslbt (z1, z4, x0))
+
+/*
+** qdmlslbt_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     sqdmlslbt       z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlslbt_11_s32_tied1, svint32_t, svint16_t,
+            z0 = svqdmlslbt_n_s32 (z0, z4, 11),
+            z0 = svqdmlslbt (z0, z4, 11))
+
+/*
+** qdmlslbt_11_s32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     sqdmlslbt       z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlslbt_11_s32_untied, svint32_t, svint16_t,
+            z0 = svqdmlslbt_n_s32 (z1, z4, 11),
+            z0 = svqdmlslbt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslbt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslbt_s64.c
new file mode 100644 (file)
index 0000000..6f605e7
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlslbt_s64_tied1:
+**     sqdmlslbt       z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (qdmlslbt_s64_tied1, svint64_t, svint32_t,
+            z0 = svqdmlslbt_s64 (z0, z4, z5),
+            z0 = svqdmlslbt (z0, z4, z5))
+
+/*
+** qdmlslbt_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslbt       z0\.d, \1\.s, z1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslbt_s64_tied2, svint64_t, svint32_t,
+                z0_res = svqdmlslbt_s64 (z4, z0, z1),
+                z0_res = svqdmlslbt (z4, z0, z1))
+
+/*
+** qdmlslbt_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslbt       z0\.d, z1\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslbt_s64_tied3, svint64_t, svint32_t,
+                z0_res = svqdmlslbt_s64 (z4, z1, z0),
+                z0_res = svqdmlslbt (z4, z1, z0))
+
+/*
+** qdmlslbt_s64_untied:
+**     movprfx z0, z1
+**     sqdmlslbt       z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (qdmlslbt_s64_untied, svint64_t, svint32_t,
+            z0 = svqdmlslbt_s64 (z1, z4, z5),
+            z0 = svqdmlslbt (z1, z4, z5))
+
+/*
+** qdmlslbt_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqdmlslbt       z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlslbt_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+             z0 = svqdmlslbt_n_s64 (z0, z4, x0),
+             z0 = svqdmlslbt (z0, z4, x0))
+
+/*
+** qdmlslbt_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     sqdmlslbt       z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlslbt_w0_s64_untied, svint64_t, svint32_t, int32_t,
+             z0 = svqdmlslbt_n_s64 (z1, z4, x0),
+             z0 = svqdmlslbt (z1, z4, x0))
+
+/*
+** qdmlslbt_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     sqdmlslbt       z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlslbt_11_s64_tied1, svint64_t, svint32_t,
+            z0 = svqdmlslbt_n_s64 (z0, z4, 11),
+            z0 = svqdmlslbt (z0, z4, 11))
+
+/*
+** qdmlslbt_11_s64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     sqdmlslbt       z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlslbt_11_s64_untied, svint64_t, svint32_t,
+            z0 = svqdmlslbt_n_s64 (z1, z4, 11),
+            z0 = svqdmlslbt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslt_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslt_lane_s32.c
new file mode 100644 (file)
index 0000000..261f006
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlslt_lane_0_s32_tied1:
+**     sqdmlslt        z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlslt_lane_0_s32_tied1, svint32_t, svint16_t,
+            z0 = svqdmlslt_lane_s32 (z0, z4, z5, 0),
+            z0 = svqdmlslt_lane (z0, z4, z5, 0))
+
+/*
+** qdmlslt_lane_0_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslt        z0\.s, \1\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslt_lane_0_s32_tied2, svint32_t, svint16_t,
+                z0_res = svqdmlslt_lane_s32 (z4, z0, z1, 0),
+                z0_res = svqdmlslt_lane (z4, z0, z1, 0))
+
+/*
+** qdmlslt_lane_0_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslt        z0\.s, z1\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslt_lane_0_s32_tied3, svint32_t, svint16_t,
+                z0_res = svqdmlslt_lane_s32 (z4, z1, z0, 0),
+                z0_res = svqdmlslt_lane (z4, z1, z0, 0))
+
+/*
+** qdmlslt_lane_0_s32_untied:
+**     movprfx z0, z1
+**     sqdmlslt        z0\.s, z4\.h, z5\.h\[0\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlslt_lane_0_s32_untied, svint32_t, svint16_t,
+            z0 = svqdmlslt_lane_s32 (z1, z4, z5, 0),
+            z0 = svqdmlslt_lane (z1, z4, z5, 0))
+
+/*
+** qdmlslt_lane_1_s32:
+**     sqdmlslt        z0\.s, z4\.h, z5\.h\[1\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlslt_lane_1_s32, svint32_t, svint16_t,
+            z0 = svqdmlslt_lane_s32 (z0, z4, z5, 1),
+            z0 = svqdmlslt_lane (z0, z4, z5, 1))
+
+/*
+** qdmlslt_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     sqdmlslt        z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmlslt_lane_z8_s32, svint32_t, svint16_t, z8,
+                   z0 = svqdmlslt_lane_s32 (z0, z1, z8, 1),
+                   z0 = svqdmlslt_lane (z0, z1, z8, 1))
+
+/*
+** qdmlslt_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqdmlslt        z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmlslt_lane_z16_s32, svint32_t, svint16_t, z16,
+                   z0 = svqdmlslt_lane_s32 (z0, z1, z16, 1),
+                   z0 = svqdmlslt_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslt_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslt_lane_s64.c
new file mode 100644 (file)
index 0000000..8ba52ea
--- /dev/null
@@ -0,0 +1,65 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlslt_lane_0_s64_tied1:
+**     sqdmlslt        z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlslt_lane_0_s64_tied1, svint64_t, svint32_t,
+            z0 = svqdmlslt_lane_s64 (z0, z4, z5, 0),
+            z0 = svqdmlslt_lane (z0, z4, z5, 0))
+
+/*
+** qdmlslt_lane_0_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslt        z0\.d, \1\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslt_lane_0_s64_tied2, svint64_t, svint32_t,
+                z0_res = svqdmlslt_lane_s64 (z4, z0, z1, 0),
+                z0_res = svqdmlslt_lane (z4, z0, z1, 0))
+
+/*
+** qdmlslt_lane_0_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslt        z0\.d, z1\.s, \1\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslt_lane_0_s64_tied3, svint64_t, svint32_t,
+                z0_res = svqdmlslt_lane_s64 (z4, z1, z0, 0),
+                z0_res = svqdmlslt_lane (z4, z1, z0, 0))
+
+/*
+** qdmlslt_lane_0_s64_untied:
+**     movprfx z0, z1
+**     sqdmlslt        z0\.d, z4\.s, z5\.s\[0\]
+**     ret
+*/
+TEST_DUAL_Z (qdmlslt_lane_0_s64_untied, svint64_t, svint32_t,
+            z0 = svqdmlslt_lane_s64 (z1, z4, z5, 0),
+            z0 = svqdmlslt_lane (z1, z4, z5, 0))
+
+/*
+** qdmlslt_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     sqdmlslt        z0\.d, z1\.s, z15\.s\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmlslt_lane_z15_s64, svint64_t, svint32_t, z15,
+                   z0 = svqdmlslt_lane_s64 (z0, z1, z15, 1),
+                   z0 = svqdmlslt_lane (z0, z1, z15, 1))
+
+/*
+** qdmlslt_lane_z16_s64:
+**     mov     (z[0-9]|z1[0-5])\.d, z16\.d
+**     sqdmlslt        z0\.d, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmlslt_lane_z16_s64, svint64_t, svint32_t, z16,
+                   z0 = svqdmlslt_lane_s64 (z0, z1, z16, 1),
+                   z0 = svqdmlslt_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslt_s16.c
new file mode 100644 (file)
index 0000000..99c0b2b
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlslt_s16_tied1:
+**     sqdmlslt        z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (qdmlslt_s16_tied1, svint16_t, svint8_t,
+            z0 = svqdmlslt_s16 (z0, z4, z5),
+            z0 = svqdmlslt (z0, z4, z5))
+
+/*
+** qdmlslt_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslt        z0\.h, \1\.b, z1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslt_s16_tied2, svint16_t, svint8_t,
+                z0_res = svqdmlslt_s16 (z4, z0, z1),
+                z0_res = svqdmlslt (z4, z0, z1))
+
+/*
+** qdmlslt_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslt        z0\.h, z1\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslt_s16_tied3, svint16_t, svint8_t,
+                z0_res = svqdmlslt_s16 (z4, z1, z0),
+                z0_res = svqdmlslt (z4, z1, z0))
+
+/*
+** qdmlslt_s16_untied:
+**     movprfx z0, z1
+**     sqdmlslt        z0\.h, z4\.b, z5\.b
+**     ret
+*/
+TEST_DUAL_Z (qdmlslt_s16_untied, svint16_t, svint8_t,
+            z0 = svqdmlslt_s16 (z1, z4, z5),
+            z0 = svqdmlslt (z1, z4, z5))
+
+/*
+** qdmlslt_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqdmlslt        z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlslt_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+             z0 = svqdmlslt_n_s16 (z0, z4, x0),
+             z0 = svqdmlslt (z0, z4, x0))
+
+/*
+** qdmlslt_w0_s16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     sqdmlslt        z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlslt_w0_s16_untied, svint16_t, svint8_t, int8_t,
+             z0 = svqdmlslt_n_s16 (z1, z4, x0),
+             z0 = svqdmlslt (z1, z4, x0))
+
+/*
+** qdmlslt_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     sqdmlslt        z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlslt_11_s16_tied1, svint16_t, svint8_t,
+            z0 = svqdmlslt_n_s16 (z0, z4, 11),
+            z0 = svqdmlslt (z0, z4, 11))
+
+/*
+** qdmlslt_11_s16_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     sqdmlslt        z0\.h, z4\.b, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlslt_11_s16_untied, svint16_t, svint8_t,
+            z0 = svqdmlslt_n_s16 (z1, z4, 11),
+            z0 = svqdmlslt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslt_s32.c
new file mode 100644 (file)
index 0000000..c7cbbfe
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlslt_s32_tied1:
+**     sqdmlslt        z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (qdmlslt_s32_tied1, svint32_t, svint16_t,
+            z0 = svqdmlslt_s32 (z0, z4, z5),
+            z0 = svqdmlslt (z0, z4, z5))
+
+/*
+** qdmlslt_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslt        z0\.s, \1\.h, z1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslt_s32_tied2, svint32_t, svint16_t,
+                z0_res = svqdmlslt_s32 (z4, z0, z1),
+                z0_res = svqdmlslt (z4, z0, z1))
+
+/*
+** qdmlslt_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslt        z0\.s, z1\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslt_s32_tied3, svint32_t, svint16_t,
+                z0_res = svqdmlslt_s32 (z4, z1, z0),
+                z0_res = svqdmlslt (z4, z1, z0))
+
+/*
+** qdmlslt_s32_untied:
+**     movprfx z0, z1
+**     sqdmlslt        z0\.s, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (qdmlslt_s32_untied, svint32_t, svint16_t,
+            z0 = svqdmlslt_s32 (z1, z4, z5),
+            z0 = svqdmlslt (z1, z4, z5))
+
+/*
+** qdmlslt_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqdmlslt        z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlslt_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+             z0 = svqdmlslt_n_s32 (z0, z4, x0),
+             z0 = svqdmlslt (z0, z4, x0))
+
+/*
+** qdmlslt_w0_s32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     sqdmlslt        z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlslt_w0_s32_untied, svint32_t, svint16_t, int16_t,
+             z0 = svqdmlslt_n_s32 (z1, z4, x0),
+             z0 = svqdmlslt (z1, z4, x0))
+
+/*
+** qdmlslt_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     sqdmlslt        z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlslt_11_s32_tied1, svint32_t, svint16_t,
+            z0 = svqdmlslt_n_s32 (z0, z4, 11),
+            z0 = svqdmlslt (z0, z4, 11))
+
+/*
+** qdmlslt_11_s32_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     sqdmlslt        z0\.s, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlslt_11_s32_untied, svint32_t, svint16_t,
+            z0 = svqdmlslt_n_s32 (z1, z4, 11),
+            z0 = svqdmlslt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmlslt_s64.c
new file mode 100644 (file)
index 0000000..37fc3c7
--- /dev/null
@@ -0,0 +1,86 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmlslt_s64_tied1:
+**     sqdmlslt        z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (qdmlslt_s64_tied1, svint64_t, svint32_t,
+            z0 = svqdmlslt_s64 (z0, z4, z5),
+            z0 = svqdmlslt (z0, z4, z5))
+
+/*
+** qdmlslt_s64_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslt        z0\.d, \1\.s, z1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslt_s64_tied2, svint64_t, svint32_t,
+                z0_res = svqdmlslt_s64 (z4, z0, z1),
+                z0_res = svqdmlslt (z4, z0, z1))
+
+/*
+** qdmlslt_s64_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqdmlslt        z0\.d, z1\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qdmlslt_s64_tied3, svint64_t, svint32_t,
+                z0_res = svqdmlslt_s64 (z4, z1, z0),
+                z0_res = svqdmlslt (z4, z1, z0))
+
+/*
+** qdmlslt_s64_untied:
+**     movprfx z0, z1
+**     sqdmlslt        z0\.d, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (qdmlslt_s64_untied, svint64_t, svint32_t,
+            z0 = svqdmlslt_s64 (z1, z4, z5),
+            z0 = svqdmlslt (z1, z4, z5))
+
+/*
+** qdmlslt_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqdmlslt        z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlslt_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+             z0 = svqdmlslt_n_s64 (z0, z4, x0),
+             z0 = svqdmlslt (z0, z4, x0))
+
+/*
+** qdmlslt_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     sqdmlslt        z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (qdmlslt_w0_s64_untied, svint64_t, svint32_t, int32_t,
+             z0 = svqdmlslt_n_s64 (z1, z4, x0),
+             z0 = svqdmlslt (z1, z4, x0))
+
+/*
+** qdmlslt_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     sqdmlslt        z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlslt_11_s64_tied1, svint64_t, svint32_t,
+            z0 = svqdmlslt_n_s64 (z0, z4, 11),
+            z0 = svqdmlslt (z0, z4, 11))
+
+/*
+** qdmlslt_11_s64_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     sqdmlslt        z0\.d, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (qdmlslt_11_s64_untied, svint64_t, svint32_t,
+            z0 = svqdmlslt_n_s64 (z1, z4, 11),
+            z0 = svqdmlslt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_lane_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_lane_s16.c
new file mode 100644 (file)
index 0000000..27978f7
--- /dev/null
@@ -0,0 +1,115 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmulh_lane_0_s16_tied1:
+**     sqdmulh z0\.h, z0\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_0_s16_tied1, svint16_t,
+               z0 = svqdmulh_lane_s16 (z0, z1, 0),
+               z0 = svqdmulh_lane (z0, z1, 0))
+
+/*
+** qdmulh_lane_0_s16_tied2:
+**     sqdmulh z0\.h, z1\.h, z0\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_0_s16_tied2, svint16_t,
+               z0 = svqdmulh_lane_s16 (z1, z0, 0),
+               z0 = svqdmulh_lane (z1, z0, 0))
+
+/*
+** qdmulh_lane_0_s16_untied:
+**     sqdmulh z0\.h, z1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_0_s16_untied, svint16_t,
+               z0 = svqdmulh_lane_s16 (z1, z2, 0),
+               z0 = svqdmulh_lane (z1, z2, 0))
+
+/*
+** qdmulh_lane_1_s16:
+**     sqdmulh z0\.h, z1\.h, z2\.h\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_1_s16, svint16_t,
+               z0 = svqdmulh_lane_s16 (z1, z2, 1),
+               z0 = svqdmulh_lane (z1, z2, 1))
+
+/*
+** qdmulh_lane_2_s16:
+**     sqdmulh z0\.h, z1\.h, z2\.h\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_2_s16, svint16_t,
+               z0 = svqdmulh_lane_s16 (z1, z2, 2),
+               z0 = svqdmulh_lane (z1, z2, 2))
+
+/*
+** qdmulh_lane_3_s16:
+**     sqdmulh z0\.h, z1\.h, z2\.h\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_3_s16, svint16_t,
+               z0 = svqdmulh_lane_s16 (z1, z2, 3),
+               z0 = svqdmulh_lane (z1, z2, 3))
+
+/*
+** qdmulh_lane_4_s16:
+**     sqdmulh z0\.h, z1\.h, z2\.h\[4\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_4_s16, svint16_t,
+               z0 = svqdmulh_lane_s16 (z1, z2, 4),
+               z0 = svqdmulh_lane (z1, z2, 4))
+
+/*
+** qdmulh_lane_5_s16:
+**     sqdmulh z0\.h, z1\.h, z2\.h\[5\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_5_s16, svint16_t,
+               z0 = svqdmulh_lane_s16 (z1, z2, 5),
+               z0 = svqdmulh_lane (z1, z2, 5))
+
+/*
+** qdmulh_lane_6_s16:
+**     sqdmulh z0\.h, z1\.h, z2\.h\[6\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_6_s16, svint16_t,
+               z0 = svqdmulh_lane_s16 (z1, z2, 6),
+               z0 = svqdmulh_lane (z1, z2, 6))
+
+/*
+** qdmulh_lane_7_s16:
+**     sqdmulh z0\.h, z1\.h, z2\.h\[7\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_7_s16, svint16_t,
+               z0 = svqdmulh_lane_s16 (z1, z2, 7),
+               z0 = svqdmulh_lane (z1, z2, 7))
+
+/*
+** qdmulh_lane_z8_s16:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     sqdmulh z0\.h, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmulh_lane_z8_s16, svint16_t, svint16_t, z8,
+                   z0 = svqdmulh_lane_s16 (z1, z8, 1),
+                   z0 = svqdmulh_lane (z1, z8, 1))
+
+/*
+** qdmulh_lane_z16_s16:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqdmulh z0\.h, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmulh_lane_z16_s16, svint16_t, svint16_t, z16,
+                   z0 = svqdmulh_lane_s16 (z1, z16, 1),
+                   z0 = svqdmulh_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_lane_s32.c
new file mode 100644 (file)
index 0000000..706e9d6
--- /dev/null
@@ -0,0 +1,79 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmulh_lane_0_s32_tied1:
+**     sqdmulh z0\.s, z0\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_0_s32_tied1, svint32_t,
+               z0 = svqdmulh_lane_s32 (z0, z1, 0),
+               z0 = svqdmulh_lane (z0, z1, 0))
+
+/*
+** qdmulh_lane_0_s32_tied2:
+**     sqdmulh z0\.s, z1\.s, z0\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_0_s32_tied2, svint32_t,
+               z0 = svqdmulh_lane_s32 (z1, z0, 0),
+               z0 = svqdmulh_lane (z1, z0, 0))
+
+/*
+** qdmulh_lane_0_s32_untied:
+**     sqdmulh z0\.s, z1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_0_s32_untied, svint32_t,
+               z0 = svqdmulh_lane_s32 (z1, z2, 0),
+               z0 = svqdmulh_lane (z1, z2, 0))
+
+/*
+** qdmulh_lane_1_s32:
+**     sqdmulh z0\.s, z1\.s, z2\.s\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_1_s32, svint32_t,
+               z0 = svqdmulh_lane_s32 (z1, z2, 1),
+               z0 = svqdmulh_lane (z1, z2, 1))
+
+/*
+** qdmulh_lane_2_s32:
+**     sqdmulh z0\.s, z1\.s, z2\.s\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_2_s32, svint32_t,
+               z0 = svqdmulh_lane_s32 (z1, z2, 2),
+               z0 = svqdmulh_lane (z1, z2, 2))
+
+/*
+** qdmulh_lane_3_s32:
+**     sqdmulh z0\.s, z1\.s, z2\.s\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_3_s32, svint32_t,
+               z0 = svqdmulh_lane_s32 (z1, z2, 3),
+               z0 = svqdmulh_lane (z1, z2, 3))
+
+/*
+** qdmulh_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     sqdmulh z0\.s, z1\.s, \1\.s\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmulh_lane_z8_s32, svint32_t, svint32_t, z8,
+                   z0 = svqdmulh_lane_s32 (z1, z8, 1),
+                   z0 = svqdmulh_lane (z1, z8, 1))
+
+/*
+** qdmulh_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqdmulh z0\.s, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmulh_lane_z16_s32, svint32_t, svint32_t, z16,
+                   z0 = svqdmulh_lane_s32 (z1, z16, 1),
+                   z0 = svqdmulh_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_lane_s64.c
new file mode 100644 (file)
index 0000000..4a992fe
--- /dev/null
@@ -0,0 +1,60 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmulh_lane_0_s64_tied1:
+**     sqdmulh z0\.d, z0\.d, z1\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_0_s64_tied1, svint64_t,
+               z0 = svqdmulh_lane_s64 (z0, z1, 0),
+               z0 = svqdmulh_lane (z0, z1, 0))
+
+/*
+** qdmulh_lane_0_s64_tied2:
+**     sqdmulh z0\.d, z1\.d, z0\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_0_s64_tied2, svint64_t,
+               z0 = svqdmulh_lane_s64 (z1, z0, 0),
+               z0 = svqdmulh_lane (z1, z0, 0))
+
+/*
+** qdmulh_lane_0_s64_untied:
+**     sqdmulh z0\.d, z1\.d, z2\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_0_s64_untied, svint64_t,
+               z0 = svqdmulh_lane_s64 (z1, z2, 0),
+               z0 = svqdmulh_lane (z1, z2, 0))
+
+/*
+** qdmulh_lane_1_s64:
+**     sqdmulh z0\.d, z1\.d, z2\.d\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_lane_1_s64, svint64_t,
+               z0 = svqdmulh_lane_s64 (z1, z2, 1),
+               z0 = svqdmulh_lane (z1, z2, 1))
+
+/*
+** qdmulh_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     sqdmulh z0\.d, z1\.d, z15\.d\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmulh_lane_z15_s64, svint64_t, svint64_t, z15,
+                   z0 = svqdmulh_lane_s64 (z1, z15, 1),
+                   z0 = svqdmulh_lane (z1, z15, 1))
+
+/*
+** qdmulh_lane_z16_s64:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqdmulh z0\.d, z1\.d, \1\.d\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmulh_lane_z16_s64, svint64_t, svint64_t, z16,
+                   z0 = svqdmulh_lane_s64 (z1, z16, 1),
+                   z0 = svqdmulh_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_s16.c
new file mode 100644 (file)
index 0000000..aaf056d
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmulh_s16_tied1:
+**     sqdmulh z0\.h, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_s16_tied1, svint16_t,
+               z0 = svqdmulh_s16 (z0, z1),
+               z0 = svqdmulh (z0, z1))
+
+/*
+** qdmulh_s16_tied2:
+**     sqdmulh z0\.h, z1\.h, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_s16_tied2, svint16_t,
+               z0 = svqdmulh_s16 (z1, z0),
+               z0 = svqdmulh (z1, z0))
+
+/*
+** qdmulh_s16_untied:
+**     sqdmulh z0\.h, z1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_s16_untied, svint16_t,
+               z0 = svqdmulh_s16 (z1, z2),
+               z0 = svqdmulh (z1, z2))
+
+/*
+** qdmulh_w0_s16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqdmulh z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qdmulh_w0_s16_tied1, svint16_t, int16_t,
+                z0 = svqdmulh_n_s16 (z0, x0),
+                z0 = svqdmulh (z0, x0))
+
+/*
+** qdmulh_w0_s16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     sqdmulh z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qdmulh_w0_s16_untied, svint16_t, int16_t,
+                z0 = svqdmulh_n_s16 (z1, x0),
+                z0 = svqdmulh (z1, x0))
+
+/*
+** qdmulh_11_s16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     sqdmulh z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_11_s16_tied1, svint16_t,
+               z0 = svqdmulh_n_s16 (z0, 11),
+               z0 = svqdmulh (z0, 11))
+
+/*
+** qdmulh_11_s16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     sqdmulh z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_11_s16_untied, svint16_t,
+               z0 = svqdmulh_n_s16 (z1, 11),
+               z0 = svqdmulh (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_s32.c
new file mode 100644 (file)
index 0000000..6862721
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmulh_s32_tied1:
+**     sqdmulh z0\.s, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_s32_tied1, svint32_t,
+               z0 = svqdmulh_s32 (z0, z1),
+               z0 = svqdmulh (z0, z1))
+
+/*
+** qdmulh_s32_tied2:
+**     sqdmulh z0\.s, z1\.s, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_s32_tied2, svint32_t,
+               z0 = svqdmulh_s32 (z1, z0),
+               z0 = svqdmulh (z1, z0))
+
+/*
+** qdmulh_s32_untied:
+**     sqdmulh z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_s32_untied, svint32_t,
+               z0 = svqdmulh_s32 (z1, z2),
+               z0 = svqdmulh (z1, z2))
+
+/*
+** qdmulh_w0_s32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqdmulh z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qdmulh_w0_s32_tied1, svint32_t, int32_t,
+                z0 = svqdmulh_n_s32 (z0, x0),
+                z0 = svqdmulh (z0, x0))
+
+/*
+** qdmulh_w0_s32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     sqdmulh z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qdmulh_w0_s32_untied, svint32_t, int32_t,
+                z0 = svqdmulh_n_s32 (z1, x0),
+                z0 = svqdmulh (z1, x0))
+
+/*
+** qdmulh_11_s32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     sqdmulh z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_11_s32_tied1, svint32_t,
+               z0 = svqdmulh_n_s32 (z0, 11),
+               z0 = svqdmulh (z0, 11))
+
+/*
+** qdmulh_11_s32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     sqdmulh z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_11_s32_untied, svint32_t,
+               z0 = svqdmulh_n_s32 (z1, 11),
+               z0 = svqdmulh (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_s64.c
new file mode 100644 (file)
index 0000000..dd47c09
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmulh_s64_tied1:
+**     sqdmulh z0\.d, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_s64_tied1, svint64_t,
+               z0 = svqdmulh_s64 (z0, z1),
+               z0 = svqdmulh (z0, z1))
+
+/*
+** qdmulh_s64_tied2:
+**     sqdmulh z0\.d, z1\.d, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_s64_tied2, svint64_t,
+               z0 = svqdmulh_s64 (z1, z0),
+               z0 = svqdmulh (z1, z0))
+
+/*
+** qdmulh_s64_untied:
+**     sqdmulh z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_s64_untied, svint64_t,
+               z0 = svqdmulh_s64 (z1, z2),
+               z0 = svqdmulh (z1, z2))
+
+/*
+** qdmulh_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     sqdmulh z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qdmulh_x0_s64_tied1, svint64_t, int64_t,
+                z0 = svqdmulh_n_s64 (z0, x0),
+                z0 = svqdmulh (z0, x0))
+
+/*
+** qdmulh_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     sqdmulh z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qdmulh_x0_s64_untied, svint64_t, int64_t,
+                z0 = svqdmulh_n_s64 (z1, x0),
+                z0 = svqdmulh (z1, x0))
+
+/*
+** qdmulh_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     sqdmulh z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_11_s64_tied1, svint64_t,
+               z0 = svqdmulh_n_s64 (z0, 11),
+               z0 = svqdmulh (z0, 11))
+
+/*
+** qdmulh_11_s64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     sqdmulh z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_11_s64_untied, svint64_t,
+               z0 = svqdmulh_n_s64 (z1, 11),
+               z0 = svqdmulh (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmulh_s8.c
new file mode 100644 (file)
index 0000000..31d9e52
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmulh_s8_tied1:
+**     sqdmulh z0\.b, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_s8_tied1, svint8_t,
+               z0 = svqdmulh_s8 (z0, z1),
+               z0 = svqdmulh (z0, z1))
+
+/*
+** qdmulh_s8_tied2:
+**     sqdmulh z0\.b, z1\.b, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_s8_tied2, svint8_t,
+               z0 = svqdmulh_s8 (z1, z0),
+               z0 = svqdmulh (z1, z0))
+
+/*
+** qdmulh_s8_untied:
+**     sqdmulh z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_s8_untied, svint8_t,
+               z0 = svqdmulh_s8 (z1, z2),
+               z0 = svqdmulh (z1, z2))
+
+/*
+** qdmulh_w0_s8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqdmulh z0\.b, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qdmulh_w0_s8_tied1, svint8_t, int8_t,
+                z0 = svqdmulh_n_s8 (z0, x0),
+                z0 = svqdmulh (z0, x0))
+
+/*
+** qdmulh_w0_s8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     sqdmulh z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qdmulh_w0_s8_untied, svint8_t, int8_t,
+                z0 = svqdmulh_n_s8 (z1, x0),
+                z0 = svqdmulh (z1, x0))
+
+/*
+** qdmulh_11_s8_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     sqdmulh z0\.b, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_11_s8_tied1, svint8_t,
+               z0 = svqdmulh_n_s8 (z0, 11),
+               z0 = svqdmulh (z0, 11))
+
+/*
+** qdmulh_11_s8_untied:
+**     mov     (z[0-9]+\.b), #11
+**     sqdmulh z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qdmulh_11_s8_untied, svint8_t,
+               z0 = svqdmulh_n_s8 (z1, 11),
+               z0 = svqdmulh (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullb_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullb_lane_s32.c
new file mode 100644 (file)
index 0000000..c65f372
--- /dev/null
@@ -0,0 +1,115 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmullb_lane_0_s32_tied1:
+**     sqdmullb        z0\.s, z0\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_lane_0_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svqdmullb_lane_s32 (z0, z1, 0),
+                   z0_res = svqdmullb_lane (z0, z1, 0))
+
+/*
+** qdmullb_lane_0_s32_tied2:
+**     sqdmullb        z0\.s, z1\.h, z0\.h\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_lane_0_s32_tied2, svint32_t, svint16_t,
+                   z0_res = svqdmullb_lane_s32 (z1, z0, 0),
+                   z0_res = svqdmullb_lane (z1, z0, 0))
+
+/*
+** qdmullb_lane_0_s32_untied:
+**     sqdmullb        z0\.s, z1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_lane_0_s32_untied, svint32_t, svint16_t,
+                   z0_res = svqdmullb_lane_s32 (z1, z2, 0),
+                   z0_res = svqdmullb_lane (z1, z2, 0))
+
+/*
+** qdmullb_lane_1_s32:
+**     sqdmullb        z0\.s, z1\.h, z2\.h\[1\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_lane_1_s32, svint32_t, svint16_t,
+                   z0_res = svqdmullb_lane_s32 (z1, z2, 1),
+                   z0_res = svqdmullb_lane (z1, z2, 1))
+
+/*
+** qdmullb_lane_2_s32:
+**     sqdmullb        z0\.s, z1\.h, z2\.h\[2\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_lane_2_s32, svint32_t, svint16_t,
+                   z0_res = svqdmullb_lane_s32 (z1, z2, 2),
+                   z0_res = svqdmullb_lane (z1, z2, 2))
+
+/*
+** qdmullb_lane_3_s32:
+**     sqdmullb        z0\.s, z1\.h, z2\.h\[3\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_lane_3_s32, svint32_t, svint16_t,
+                   z0_res = svqdmullb_lane_s32 (z1, z2, 3),
+                   z0_res = svqdmullb_lane (z1, z2, 3))
+
+/*
+** qdmullb_lane_4_s32:
+**     sqdmullb        z0\.s, z1\.h, z2\.h\[4\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_lane_4_s32, svint32_t, svint16_t,
+                   z0_res = svqdmullb_lane_s32 (z1, z2, 4),
+                   z0_res = svqdmullb_lane (z1, z2, 4))
+
+/*
+** qdmullb_lane_5_s32:
+**     sqdmullb        z0\.s, z1\.h, z2\.h\[5\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_lane_5_s32, svint32_t, svint16_t,
+                   z0_res = svqdmullb_lane_s32 (z1, z2, 5),
+                   z0_res = svqdmullb_lane (z1, z2, 5))
+
+/*
+** qdmullb_lane_6_s32:
+**     sqdmullb        z0\.s, z1\.h, z2\.h\[6\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_lane_6_s32, svint32_t, svint16_t,
+                   z0_res = svqdmullb_lane_s32 (z1, z2, 6),
+                   z0_res = svqdmullb_lane (z1, z2, 6))
+
+/*
+** qdmullb_lane_7_s32:
+**     sqdmullb        z0\.s, z1\.h, z2\.h\[7\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_lane_7_s32, svint32_t, svint16_t,
+                   z0_res = svqdmullb_lane_s32 (z1, z2, 7),
+                   z0_res = svqdmullb_lane (z1, z2, 7))
+
+/*
+** qdmullb_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     sqdmullb        z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmullb_lane_z8_s32, svint32_t, svint16_t, z8,
+                   z0 = svqdmullb_lane_s32 (z1, z8, 1),
+                   z0 = svqdmullb_lane (z1, z8, 1))
+
+/*
+** qdmullb_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqdmullb        z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmullb_lane_z16_s32, svint32_t, svint16_t, z16,
+                   z0 = svqdmullb_lane_s32 (z1, z16, 1),
+                   z0 = svqdmullb_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullb_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullb_lane_s64.c
new file mode 100644 (file)
index 0000000..d2f6847
--- /dev/null
@@ -0,0 +1,78 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmullb_lane_0_s64_tied1:
+**     sqdmullb        z0\.d, z0\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_lane_0_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svqdmullb_lane_s64 (z0, z1, 0),
+                   z0_res = svqdmullb_lane (z0, z1, 0))
+
+/*
+** qdmullb_lane_0_s64_tied2:
+**     sqdmullb        z0\.d, z1\.s, z0\.s\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_lane_0_s64_tied2, svint64_t, svint32_t,
+                   z0_res = svqdmullb_lane_s64 (z1, z0, 0),
+                   z0_res = svqdmullb_lane (z1, z0, 0))
+
+/*
+** qdmullb_lane_0_s64_untied:
+**     sqdmullb        z0\.d, z1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_lane_0_s64_untied, svint64_t, svint32_t,
+                   z0_res = svqdmullb_lane_s64 (z1, z2, 0),
+                   z0_res = svqdmullb_lane (z1, z2, 0))
+
+/*
+** qdmullb_lane_1_s64:
+**     sqdmullb        z0\.d, z1\.s, z2\.s\[1\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_lane_1_s64, svint64_t, svint32_t,
+                   z0_res = svqdmullb_lane_s64 (z1, z2, 1),
+                   z0_res = svqdmullb_lane (z1, z2, 1))
+
+/*
+** qdmullb_lane_2_s64:
+**     sqdmullb        z0\.d, z1\.s, z2\.s\[2\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_lane_2_s64, svint64_t, svint32_t,
+                   z0_res = svqdmullb_lane_s64 (z1, z2, 2),
+                   z0_res = svqdmullb_lane (z1, z2, 2))
+
+/*
+** qdmullb_lane_3_s64:
+**     sqdmullb        z0\.d, z1\.s, z2\.s\[3\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_lane_3_s64, svint64_t, svint32_t,
+                   z0_res = svqdmullb_lane_s64 (z1, z2, 3),
+                   z0_res = svqdmullb_lane (z1, z2, 3))
+
+/*
+** qdmullb_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     sqdmullb        z0\.d, z1\.s, z15\.s\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmullb_lane_z15_s64, svint64_t, svint32_t, z15,
+                   z0 = svqdmullb_lane_s64 (z1, z15, 1),
+                   z0 = svqdmullb_lane (z1, z15, 1))
+
+/*
+** qdmullb_lane_z16_s64:
+**     mov     (z[0-9]|z1[0-5])\.d, z16\.d
+**     sqdmullb        z0\.d, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmullb_lane_z16_s64, svint64_t, svint32_t, z16,
+                   z0 = svqdmullb_lane_s64 (z1, z16, 1),
+                   z0 = svqdmullb_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullb_s16.c
new file mode 100644 (file)
index 0000000..966a1a3
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmullb_s16_tied1:
+**     sqdmullb        z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svqdmullb_s16 (z0, z1),
+                   z0_res = svqdmullb (z0, z1))
+
+/*
+** qdmullb_s16_tied2:
+**     sqdmullb        z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_s16_tied2, svint16_t, svint8_t,
+                   z0_res = svqdmullb_s16 (z1, z0),
+                   z0_res = svqdmullb (z1, z0))
+
+/*
+** qdmullb_s16_untied:
+**     sqdmullb        z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_s16_untied, svint16_t, svint8_t,
+                   z0_res = svqdmullb_s16 (z1, z2),
+                   z0_res = svqdmullb (z1, z2))
+
+/*
+** qdmullb_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqdmullb        z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (qdmullb_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+                    z0_res = svqdmullb_n_s16 (z0, x0),
+                    z0_res = svqdmullb (z0, x0))
+
+/*
+** qdmullb_w0_s16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     sqdmullb        z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (qdmullb_w0_s16_untied, svint16_t, svint8_t, int8_t,
+                    z0_res = svqdmullb_n_s16 (z1, x0),
+                    z0_res = svqdmullb (z1, x0))
+
+/*
+** qdmullb_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     sqdmullb        z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_11_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svqdmullb_n_s16 (z0, 11),
+                   z0_res = svqdmullb (z0, 11))
+
+/*
+** qdmullb_11_s16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     sqdmullb        z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_11_s16_untied, svint16_t, svint8_t,
+                   z0_res = svqdmullb_n_s16 (z1, 11),
+                   z0_res = svqdmullb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullb_s32.c
new file mode 100644 (file)
index 0000000..dd79b3b
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmullb_s32_tied1:
+**     sqdmullb        z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svqdmullb_s32 (z0, z1),
+                   z0_res = svqdmullb (z0, z1))
+
+/*
+** qdmullb_s32_tied2:
+**     sqdmullb        z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_s32_tied2, svint32_t, svint16_t,
+                   z0_res = svqdmullb_s32 (z1, z0),
+                   z0_res = svqdmullb (z1, z0))
+
+/*
+** qdmullb_s32_untied:
+**     sqdmullb        z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_s32_untied, svint32_t, svint16_t,
+                   z0_res = svqdmullb_s32 (z1, z2),
+                   z0_res = svqdmullb (z1, z2))
+
+/*
+** qdmullb_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqdmullb        z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (qdmullb_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+                    z0_res = svqdmullb_n_s32 (z0, x0),
+                    z0_res = svqdmullb (z0, x0))
+
+/*
+** qdmullb_w0_s32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     sqdmullb        z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (qdmullb_w0_s32_untied, svint32_t, svint16_t, int16_t,
+                    z0_res = svqdmullb_n_s32 (z1, x0),
+                    z0_res = svqdmullb (z1, x0))
+
+/*
+** qdmullb_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     sqdmullb        z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_11_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svqdmullb_n_s32 (z0, 11),
+                   z0_res = svqdmullb (z0, 11))
+
+/*
+** qdmullb_11_s32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     sqdmullb        z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_11_s32_untied, svint32_t, svint16_t,
+                   z0_res = svqdmullb_n_s32 (z1, 11),
+                   z0_res = svqdmullb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullb_s64.c
new file mode 100644 (file)
index 0000000..b657870
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmullb_s64_tied1:
+**     sqdmullb        z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svqdmullb_s64 (z0, z1),
+                   z0_res = svqdmullb (z0, z1))
+
+/*
+** qdmullb_s64_tied2:
+**     sqdmullb        z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_s64_tied2, svint64_t, svint32_t,
+                   z0_res = svqdmullb_s64 (z1, z0),
+                   z0_res = svqdmullb (z1, z0))
+
+/*
+** qdmullb_s64_untied:
+**     sqdmullb        z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_s64_untied, svint64_t, svint32_t,
+                   z0_res = svqdmullb_s64 (z1, z2),
+                   z0_res = svqdmullb (z1, z2))
+
+/*
+** qdmullb_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqdmullb        z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (qdmullb_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+                    z0_res = svqdmullb_n_s64 (z0, x0),
+                    z0_res = svqdmullb (z0, x0))
+
+/*
+** qdmullb_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     sqdmullb        z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (qdmullb_w0_s64_untied, svint64_t, svint32_t, int32_t,
+                    z0_res = svqdmullb_n_s64 (z1, x0),
+                    z0_res = svqdmullb (z1, x0))
+
+/*
+** qdmullb_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     sqdmullb        z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_11_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svqdmullb_n_s64 (z0, 11),
+                   z0_res = svqdmullb (z0, 11))
+
+/*
+** qdmullb_11_s64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     sqdmullb        z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullb_11_s64_untied, svint64_t, svint32_t,
+                   z0_res = svqdmullb_n_s64 (z1, 11),
+                   z0_res = svqdmullb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullt_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullt_lane_s32.c
new file mode 100644 (file)
index 0000000..8c7e1ce
--- /dev/null
@@ -0,0 +1,115 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmullt_lane_0_s32_tied1:
+**     sqdmullt        z0\.s, z0\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_lane_0_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svqdmullt_lane_s32 (z0, z1, 0),
+                   z0_res = svqdmullt_lane (z0, z1, 0))
+
+/*
+** qdmullt_lane_0_s32_tied2:
+**     sqdmullt        z0\.s, z1\.h, z0\.h\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_lane_0_s32_tied2, svint32_t, svint16_t,
+                   z0_res = svqdmullt_lane_s32 (z1, z0, 0),
+                   z0_res = svqdmullt_lane (z1, z0, 0))
+
+/*
+** qdmullt_lane_0_s32_untied:
+**     sqdmullt        z0\.s, z1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_lane_0_s32_untied, svint32_t, svint16_t,
+                   z0_res = svqdmullt_lane_s32 (z1, z2, 0),
+                   z0_res = svqdmullt_lane (z1, z2, 0))
+
+/*
+** qdmullt_lane_1_s32:
+**     sqdmullt        z0\.s, z1\.h, z2\.h\[1\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_lane_1_s32, svint32_t, svint16_t,
+                   z0_res = svqdmullt_lane_s32 (z1, z2, 1),
+                   z0_res = svqdmullt_lane (z1, z2, 1))
+
+/*
+** qdmullt_lane_2_s32:
+**     sqdmullt        z0\.s, z1\.h, z2\.h\[2\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_lane_2_s32, svint32_t, svint16_t,
+                   z0_res = svqdmullt_lane_s32 (z1, z2, 2),
+                   z0_res = svqdmullt_lane (z1, z2, 2))
+
+/*
+** qdmullt_lane_3_s32:
+**     sqdmullt        z0\.s, z1\.h, z2\.h\[3\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_lane_3_s32, svint32_t, svint16_t,
+                   z0_res = svqdmullt_lane_s32 (z1, z2, 3),
+                   z0_res = svqdmullt_lane (z1, z2, 3))
+
+/*
+** qdmullt_lane_4_s32:
+**     sqdmullt        z0\.s, z1\.h, z2\.h\[4\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_lane_4_s32, svint32_t, svint16_t,
+                   z0_res = svqdmullt_lane_s32 (z1, z2, 4),
+                   z0_res = svqdmullt_lane (z1, z2, 4))
+
+/*
+** qdmullt_lane_5_s32:
+**     sqdmullt        z0\.s, z1\.h, z2\.h\[5\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_lane_5_s32, svint32_t, svint16_t,
+                   z0_res = svqdmullt_lane_s32 (z1, z2, 5),
+                   z0_res = svqdmullt_lane (z1, z2, 5))
+
+/*
+** qdmullt_lane_6_s32:
+**     sqdmullt        z0\.s, z1\.h, z2\.h\[6\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_lane_6_s32, svint32_t, svint16_t,
+                   z0_res = svqdmullt_lane_s32 (z1, z2, 6),
+                   z0_res = svqdmullt_lane (z1, z2, 6))
+
+/*
+** qdmullt_lane_7_s32:
+**     sqdmullt        z0\.s, z1\.h, z2\.h\[7\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_lane_7_s32, svint32_t, svint16_t,
+                   z0_res = svqdmullt_lane_s32 (z1, z2, 7),
+                   z0_res = svqdmullt_lane (z1, z2, 7))
+
+/*
+** qdmullt_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     sqdmullt        z0\.s, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmullt_lane_z8_s32, svint32_t, svint16_t, z8,
+                   z0 = svqdmullt_lane_s32 (z1, z8, 1),
+                   z0 = svqdmullt_lane (z1, z8, 1))
+
+/*
+** qdmullt_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqdmullt        z0\.s, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmullt_lane_z16_s32, svint32_t, svint16_t, z16,
+                   z0 = svqdmullt_lane_s32 (z1, z16, 1),
+                   z0 = svqdmullt_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullt_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullt_lane_s64.c
new file mode 100644 (file)
index 0000000..b1399ee
--- /dev/null
@@ -0,0 +1,78 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmullt_lane_0_s64_tied1:
+**     sqdmullt        z0\.d, z0\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_lane_0_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svqdmullt_lane_s64 (z0, z1, 0),
+                   z0_res = svqdmullt_lane (z0, z1, 0))
+
+/*
+** qdmullt_lane_0_s64_tied2:
+**     sqdmullt        z0\.d, z1\.s, z0\.s\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_lane_0_s64_tied2, svint64_t, svint32_t,
+                   z0_res = svqdmullt_lane_s64 (z1, z0, 0),
+                   z0_res = svqdmullt_lane (z1, z0, 0))
+
+/*
+** qdmullt_lane_0_s64_untied:
+**     sqdmullt        z0\.d, z1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_lane_0_s64_untied, svint64_t, svint32_t,
+                   z0_res = svqdmullt_lane_s64 (z1, z2, 0),
+                   z0_res = svqdmullt_lane (z1, z2, 0))
+
+/*
+** qdmullt_lane_1_s64:
+**     sqdmullt        z0\.d, z1\.s, z2\.s\[1\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_lane_1_s64, svint64_t, svint32_t,
+                   z0_res = svqdmullt_lane_s64 (z1, z2, 1),
+                   z0_res = svqdmullt_lane (z1, z2, 1))
+
+/*
+** qdmullt_lane_2_s64:
+**     sqdmullt        z0\.d, z1\.s, z2\.s\[2\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_lane_2_s64, svint64_t, svint32_t,
+                   z0_res = svqdmullt_lane_s64 (z1, z2, 2),
+                   z0_res = svqdmullt_lane (z1, z2, 2))
+
+/*
+** qdmullt_lane_3_s64:
+**     sqdmullt        z0\.d, z1\.s, z2\.s\[3\]
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_lane_3_s64, svint64_t, svint32_t,
+                   z0_res = svqdmullt_lane_s64 (z1, z2, 3),
+                   z0_res = svqdmullt_lane (z1, z2, 3))
+
+/*
+** qdmullt_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     sqdmullt        z0\.d, z1\.s, z15\.s\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmullt_lane_z15_s64, svint64_t, svint32_t, z15,
+                   z0 = svqdmullt_lane_s64 (z1, z15, 1),
+                   z0 = svqdmullt_lane (z1, z15, 1))
+
+/*
+** qdmullt_lane_z16_s64:
+**     mov     (z[0-9]|z1[0-5])\.d, z16\.d
+**     sqdmullt        z0\.d, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qdmullt_lane_z16_s64, svint64_t, svint32_t, z16,
+                   z0 = svqdmullt_lane_s64 (z1, z16, 1),
+                   z0 = svqdmullt_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullt_s16.c
new file mode 100644 (file)
index 0000000..1792707
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmullt_s16_tied1:
+**     sqdmullt        z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svqdmullt_s16 (z0, z1),
+                   z0_res = svqdmullt (z0, z1))
+
+/*
+** qdmullt_s16_tied2:
+**     sqdmullt        z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_s16_tied2, svint16_t, svint8_t,
+                   z0_res = svqdmullt_s16 (z1, z0),
+                   z0_res = svqdmullt (z1, z0))
+
+/*
+** qdmullt_s16_untied:
+**     sqdmullt        z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_s16_untied, svint16_t, svint8_t,
+                   z0_res = svqdmullt_s16 (z1, z2),
+                   z0_res = svqdmullt (z1, z2))
+
+/*
+** qdmullt_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqdmullt        z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (qdmullt_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+                    z0_res = svqdmullt_n_s16 (z0, x0),
+                    z0_res = svqdmullt (z0, x0))
+
+/*
+** qdmullt_w0_s16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     sqdmullt        z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (qdmullt_w0_s16_untied, svint16_t, svint8_t, int8_t,
+                    z0_res = svqdmullt_n_s16 (z1, x0),
+                    z0_res = svqdmullt (z1, x0))
+
+/*
+** qdmullt_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     sqdmullt        z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_11_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svqdmullt_n_s16 (z0, 11),
+                   z0_res = svqdmullt (z0, 11))
+
+/*
+** qdmullt_11_s16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     sqdmullt        z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_11_s16_untied, svint16_t, svint8_t,
+                   z0_res = svqdmullt_n_s16 (z1, 11),
+                   z0_res = svqdmullt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullt_s32.c
new file mode 100644 (file)
index 0000000..c5020cf
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmullt_s32_tied1:
+**     sqdmullt        z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svqdmullt_s32 (z0, z1),
+                   z0_res = svqdmullt (z0, z1))
+
+/*
+** qdmullt_s32_tied2:
+**     sqdmullt        z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_s32_tied2, svint32_t, svint16_t,
+                   z0_res = svqdmullt_s32 (z1, z0),
+                   z0_res = svqdmullt (z1, z0))
+
+/*
+** qdmullt_s32_untied:
+**     sqdmullt        z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_s32_untied, svint32_t, svint16_t,
+                   z0_res = svqdmullt_s32 (z1, z2),
+                   z0_res = svqdmullt (z1, z2))
+
+/*
+** qdmullt_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqdmullt        z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (qdmullt_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+                    z0_res = svqdmullt_n_s32 (z0, x0),
+                    z0_res = svqdmullt (z0, x0))
+
+/*
+** qdmullt_w0_s32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     sqdmullt        z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (qdmullt_w0_s32_untied, svint32_t, svint16_t, int16_t,
+                    z0_res = svqdmullt_n_s32 (z1, x0),
+                    z0_res = svqdmullt (z1, x0))
+
+/*
+** qdmullt_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     sqdmullt        z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_11_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svqdmullt_n_s32 (z0, 11),
+                   z0_res = svqdmullt (z0, 11))
+
+/*
+** qdmullt_11_s32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     sqdmullt        z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_11_s32_untied, svint32_t, svint16_t,
+                   z0_res = svqdmullt_n_s32 (z1, 11),
+                   z0_res = svqdmullt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qdmullt_s64.c
new file mode 100644 (file)
index 0000000..e77fe1c
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qdmullt_s64_tied1:
+**     sqdmullt        z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svqdmullt_s64 (z0, z1),
+                   z0_res = svqdmullt (z0, z1))
+
+/*
+** qdmullt_s64_tied2:
+**     sqdmullt        z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_s64_tied2, svint64_t, svint32_t,
+                   z0_res = svqdmullt_s64 (z1, z0),
+                   z0_res = svqdmullt (z1, z0))
+
+/*
+** qdmullt_s64_untied:
+**     sqdmullt        z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_s64_untied, svint64_t, svint32_t,
+                   z0_res = svqdmullt_s64 (z1, z2),
+                   z0_res = svqdmullt (z1, z2))
+
+/*
+** qdmullt_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqdmullt        z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (qdmullt_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+                    z0_res = svqdmullt_n_s64 (z0, x0),
+                    z0_res = svqdmullt (z0, x0))
+
+/*
+** qdmullt_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     sqdmullt        z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (qdmullt_w0_s64_untied, svint64_t, svint32_t, int32_t,
+                    z0_res = svqdmullt_n_s64 (z1, x0),
+                    z0_res = svqdmullt (z1, x0))
+
+/*
+** qdmullt_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     sqdmullt        z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_11_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svqdmullt_n_s64 (z0, 11),
+                   z0_res = svqdmullt (z0, 11))
+
+/*
+** qdmullt_11_s64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     sqdmullt        z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qdmullt_11_s64_untied, svint64_t, svint32_t,
+                   z0_res = svqdmullt_n_s64 (z1, 11),
+                   z0_res = svqdmullt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qneg_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qneg_s16.c
new file mode 100644 (file)
index 0000000..ca78f9d
--- /dev/null
@@ -0,0 +1,81 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qneg_s16_m_tied12:
+**     sqneg   z0\.h, p0/m, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s16_m_tied12, svint16_t,
+               z0 = svqneg_s16_m (z0, p0, z0),
+               z0 = svqneg_m (z0, p0, z0))
+
+/*
+** qneg_s16_m_tied1:
+**     sqneg   z0\.h, p0/m, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s16_m_tied1, svint16_t,
+               z0 = svqneg_s16_m (z0, p0, z1),
+               z0 = svqneg_m (z0, p0, z1))
+
+/*
+** qneg_s16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqneg   z0\.h, p0/m, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s16_m_tied2, svint16_t,
+               z0 = svqneg_s16_m (z1, p0, z0),
+               z0 = svqneg_m (z1, p0, z0))
+
+/*
+** qneg_s16_m_untied:
+**     movprfx z0, z2
+**     sqneg   z0\.h, p0/m, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s16_m_untied, svint16_t,
+               z0 = svqneg_s16_m (z2, p0, z1),
+               z0 = svqneg_m (z2, p0, z1))
+
+/*
+** qneg_s16_z_tied1:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.h, p0/z, \1\.h
+**     sqneg   z0\.h, p0/m, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s16_z_tied1, svint16_t,
+               z0 = svqneg_s16_z (p0, z0),
+               z0 = svqneg_z (p0, z0))
+
+/*
+** qneg_s16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqneg   z0\.h, p0/m, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s16_z_untied, svint16_t,
+               z0 = svqneg_s16_z (p0, z1),
+               z0 = svqneg_z (p0, z1))
+
+/*
+** qneg_s16_x_tied1:
+**     sqneg   z0\.h, p0/m, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s16_x_tied1, svint16_t,
+               z0 = svqneg_s16_x (p0, z0),
+               z0 = svqneg_x (p0, z0))
+
+/*
+** qneg_s16_x_untied:
+**     sqneg   z0\.h, p0/m, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s16_x_untied, svint16_t,
+               z0 = svqneg_s16_x (p0, z1),
+               z0 = svqneg_x (p0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qneg_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qneg_s32.c
new file mode 100644 (file)
index 0000000..3d2ed87
--- /dev/null
@@ -0,0 +1,81 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qneg_s32_m_tied12:
+**     sqneg   z0\.s, p0/m, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s32_m_tied12, svint32_t,
+               z0 = svqneg_s32_m (z0, p0, z0),
+               z0 = svqneg_m (z0, p0, z0))
+
+/*
+** qneg_s32_m_tied1:
+**     sqneg   z0\.s, p0/m, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s32_m_tied1, svint32_t,
+               z0 = svqneg_s32_m (z0, p0, z1),
+               z0 = svqneg_m (z0, p0, z1))
+
+/*
+** qneg_s32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqneg   z0\.s, p0/m, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s32_m_tied2, svint32_t,
+               z0 = svqneg_s32_m (z1, p0, z0),
+               z0 = svqneg_m (z1, p0, z0))
+
+/*
+** qneg_s32_m_untied:
+**     movprfx z0, z2
+**     sqneg   z0\.s, p0/m, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s32_m_untied, svint32_t,
+               z0 = svqneg_s32_m (z2, p0, z1),
+               z0 = svqneg_m (z2, p0, z1))
+
+/*
+** qneg_s32_z_tied1:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.s, p0/z, \1\.s
+**     sqneg   z0\.s, p0/m, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s32_z_tied1, svint32_t,
+               z0 = svqneg_s32_z (p0, z0),
+               z0 = svqneg_z (p0, z0))
+
+/*
+** qneg_s32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqneg   z0\.s, p0/m, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s32_z_untied, svint32_t,
+               z0 = svqneg_s32_z (p0, z1),
+               z0 = svqneg_z (p0, z1))
+
+/*
+** qneg_s32_x_tied1:
+**     sqneg   z0\.s, p0/m, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s32_x_tied1, svint32_t,
+               z0 = svqneg_s32_x (p0, z0),
+               z0 = svqneg_x (p0, z0))
+
+/*
+** qneg_s32_x_untied:
+**     sqneg   z0\.s, p0/m, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s32_x_untied, svint32_t,
+               z0 = svqneg_s32_x (p0, z1),
+               z0 = svqneg_x (p0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qneg_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qneg_s64.c
new file mode 100644 (file)
index 0000000..e137986
--- /dev/null
@@ -0,0 +1,81 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qneg_s64_m_tied12:
+**     sqneg   z0\.d, p0/m, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s64_m_tied12, svint64_t,
+               z0 = svqneg_s64_m (z0, p0, z0),
+               z0 = svqneg_m (z0, p0, z0))
+
+/*
+** qneg_s64_m_tied1:
+**     sqneg   z0\.d, p0/m, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s64_m_tied1, svint64_t,
+               z0 = svqneg_s64_m (z0, p0, z1),
+               z0 = svqneg_m (z0, p0, z1))
+
+/*
+** qneg_s64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqneg   z0\.d, p0/m, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s64_m_tied2, svint64_t,
+               z0 = svqneg_s64_m (z1, p0, z0),
+               z0 = svqneg_m (z1, p0, z0))
+
+/*
+** qneg_s64_m_untied:
+**     movprfx z0, z2
+**     sqneg   z0\.d, p0/m, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s64_m_untied, svint64_t,
+               z0 = svqneg_s64_m (z2, p0, z1),
+               z0 = svqneg_m (z2, p0, z1))
+
+/*
+** qneg_s64_z_tied1:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0\.d, p0/z, \1
+**     sqneg   z0\.d, p0/m, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s64_z_tied1, svint64_t,
+               z0 = svqneg_s64_z (p0, z0),
+               z0 = svqneg_z (p0, z0))
+
+/*
+** qneg_s64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqneg   z0\.d, p0/m, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s64_z_untied, svint64_t,
+               z0 = svqneg_s64_z (p0, z1),
+               z0 = svqneg_z (p0, z1))
+
+/*
+** qneg_s64_x_tied1:
+**     sqneg   z0\.d, p0/m, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s64_x_tied1, svint64_t,
+               z0 = svqneg_s64_x (p0, z0),
+               z0 = svqneg_x (p0, z0))
+
+/*
+** qneg_s64_x_untied:
+**     sqneg   z0\.d, p0/m, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s64_x_untied, svint64_t,
+               z0 = svqneg_s64_x (p0, z1),
+               z0 = svqneg_x (p0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qneg_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qneg_s8.c
new file mode 100644 (file)
index 0000000..13c60ef
--- /dev/null
@@ -0,0 +1,81 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qneg_s8_m_tied12:
+**     sqneg   z0\.b, p0/m, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s8_m_tied12, svint8_t,
+               z0 = svqneg_s8_m (z0, p0, z0),
+               z0 = svqneg_m (z0, p0, z0))
+
+/*
+** qneg_s8_m_tied1:
+**     sqneg   z0\.b, p0/m, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s8_m_tied1, svint8_t,
+               z0 = svqneg_s8_m (z0, p0, z1),
+               z0 = svqneg_m (z0, p0, z1))
+
+/*
+** qneg_s8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqneg   z0\.b, p0/m, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s8_m_tied2, svint8_t,
+               z0 = svqneg_s8_m (z1, p0, z0),
+               z0 = svqneg_m (z1, p0, z0))
+
+/*
+** qneg_s8_m_untied:
+**     movprfx z0, z2
+**     sqneg   z0\.b, p0/m, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s8_m_untied, svint8_t,
+               z0 = svqneg_s8_m (z2, p0, z1),
+               z0 = svqneg_m (z2, p0, z1))
+
+/*
+** qneg_s8_z_tied1:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.b, p0/z, \1\.b
+**     sqneg   z0\.b, p0/m, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s8_z_tied1, svint8_t,
+               z0 = svqneg_s8_z (p0, z0),
+               z0 = svqneg_z (p0, z0))
+
+/*
+** qneg_s8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqneg   z0\.b, p0/m, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s8_z_untied, svint8_t,
+               z0 = svqneg_s8_z (p0, z1),
+               z0 = svqneg_z (p0, z1))
+
+/*
+** qneg_s8_x_tied1:
+**     sqneg   z0\.b, p0/m, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s8_x_tied1, svint8_t,
+               z0 = svqneg_s8_x (p0, z0),
+               z0 = svqneg_x (p0, z0))
+
+/*
+** qneg_s8_x_untied:
+**     sqneg   z0\.b, p0/m, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qneg_s8_x_untied, svint8_t,
+               z0 = svqneg_s8_x (p0, z1),
+               z0 = svqneg_x (p0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdcmlah_lane_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdcmlah_lane_s16.c
new file mode 100644 (file)
index 0000000..0efe60c
--- /dev/null
@@ -0,0 +1,216 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdcmlah_lane_0_0_s16_tied1:
+**     sqrdcmlah       z0\.h, z1\.h, z2\.h\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_0_s16_tied1, svint16_t,
+               z0 = svqrdcmlah_lane_s16 (z0, z1, z2, 0, 0),
+               z0 = svqrdcmlah_lane (z0, z1, z2, 0, 0))
+
+/*
+** qrdcmlah_lane_0_0_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, \1\.h, z2\.h\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_0_s16_tied2, svint16_t,
+               z0 = svqrdcmlah_lane_s16 (z1, z0, z2, 0, 0),
+               z0 = svqrdcmlah_lane (z1, z0, z2, 0, 0))
+
+/*
+** qrdcmlah_lane_0_0_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, z2\.h, \1\.h\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_0_s16_tied3, svint16_t,
+               z0 = svqrdcmlah_lane_s16 (z1, z2, z0, 0, 0),
+               z0 = svqrdcmlah_lane (z1, z2, z0, 0, 0))
+
+/*
+** qrdcmlah_lane_0_0_s16_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, z2\.h, z3\.h\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_0_s16_untied, svint16_t,
+               z0 = svqrdcmlah_lane_s16 (z1, z2, z3, 0, 0),
+               z0 = svqrdcmlah_lane (z1, z2, z3, 0, 0))
+
+/*
+** qrdcmlah_lane_0_90_s16_tied1:
+**     sqrdcmlah       z0\.h, z1\.h, z2\.h\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_90_s16_tied1, svint16_t,
+               z0 = svqrdcmlah_lane_s16 (z0, z1, z2, 0, 90),
+               z0 = svqrdcmlah_lane (z0, z1, z2, 0, 90))
+
+/*
+** qrdcmlah_lane_0_90_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, \1\.h, z2\.h\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_90_s16_tied2, svint16_t,
+               z0 = svqrdcmlah_lane_s16 (z1, z0, z2, 0, 90),
+               z0 = svqrdcmlah_lane (z1, z0, z2, 0, 90))
+
+/*
+** qrdcmlah_lane_0_90_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, z2\.h, \1\.h\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_90_s16_tied3, svint16_t,
+               z0 = svqrdcmlah_lane_s16 (z1, z2, z0, 0, 90),
+               z0 = svqrdcmlah_lane (z1, z2, z0, 0, 90))
+
+/*
+** qrdcmlah_lane_0_90_s16_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, z2\.h, z3\.h\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_90_s16_untied, svint16_t,
+               z0 = svqrdcmlah_lane_s16 (z1, z2, z3, 0, 90),
+               z0 = svqrdcmlah_lane (z1, z2, z3, 0, 90))
+
+/*
+** qrdcmlah_lane_0_180_s16_tied1:
+**     sqrdcmlah       z0\.h, z1\.h, z2\.h\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_180_s16_tied1, svint16_t,
+               z0 = svqrdcmlah_lane_s16 (z0, z1, z2, 0, 180),
+               z0 = svqrdcmlah_lane (z0, z1, z2, 0, 180))
+
+/*
+** qrdcmlah_lane_0_180_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, \1\.h, z2\.h\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_180_s16_tied2, svint16_t,
+               z0 = svqrdcmlah_lane_s16 (z1, z0, z2, 0, 180),
+               z0 = svqrdcmlah_lane (z1, z0, z2, 0, 180))
+
+/*
+** qrdcmlah_lane_0_180_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, z2\.h, \1\.h\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_180_s16_tied3, svint16_t,
+               z0 = svqrdcmlah_lane_s16 (z1, z2, z0, 0, 180),
+               z0 = svqrdcmlah_lane (z1, z2, z0, 0, 180))
+
+/*
+** qrdcmlah_lane_0_180_s16_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, z2\.h, z3\.h\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_180_s16_untied, svint16_t,
+               z0 = svqrdcmlah_lane_s16 (z1, z2, z3, 0, 180),
+               z0 = svqrdcmlah_lane (z1, z2, z3, 0, 180))
+
+/*
+** qrdcmlah_lane_0_270_s16_tied1:
+**     sqrdcmlah       z0\.h, z1\.h, z2\.h\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_270_s16_tied1, svint16_t,
+               z0 = svqrdcmlah_lane_s16 (z0, z1, z2, 0, 270),
+               z0 = svqrdcmlah_lane (z0, z1, z2, 0, 270))
+
+/*
+** qrdcmlah_lane_0_270_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, \1\.h, z2\.h\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_270_s16_tied2, svint16_t,
+               z0 = svqrdcmlah_lane_s16 (z1, z0, z2, 0, 270),
+               z0 = svqrdcmlah_lane (z1, z0, z2, 0, 270))
+
+/*
+** qrdcmlah_lane_0_270_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, z2\.h, \1\.h\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_270_s16_tied3, svint16_t,
+               z0 = svqrdcmlah_lane_s16 (z1, z2, z0, 0, 270),
+               z0 = svqrdcmlah_lane (z1, z2, z0, 0, 270))
+
+/*
+** qrdcmlah_lane_0_270_s16_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, z2\.h, z3\.h\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_270_s16_untied, svint16_t,
+               z0 = svqrdcmlah_lane_s16 (z1, z2, z3, 0, 270),
+               z0 = svqrdcmlah_lane (z1, z2, z3, 0, 270))
+
+/*
+** qrdcmlah_lane_1_s16:
+**     sqrdcmlah       z0\.h, z1\.h, z2\.h\[1\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_1_s16, svint16_t,
+               z0 = svqrdcmlah_lane_s16 (z0, z1, z2, 1, 0),
+               z0 = svqrdcmlah_lane (z0, z1, z2, 1, 0))
+
+/*
+** qrdcmlah_lane_2_s16:
+**     sqrdcmlah       z0\.h, z1\.h, z2\.h\[2\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_2_s16, svint16_t,
+               z0 = svqrdcmlah_lane_s16 (z0, z1, z2, 2, 0),
+               z0 = svqrdcmlah_lane (z0, z1, z2, 2, 0))
+
+/*
+** qrdcmlah_lane_3_s16:
+**     sqrdcmlah       z0\.h, z1\.h, z2\.h\[3\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_3_s16, svint16_t,
+               z0 = svqrdcmlah_lane_s16 (z0, z1, z2, 3, 0),
+               z0 = svqrdcmlah_lane (z0, z1, z2, 3, 0))
+
+/*
+** qrdcmlah_lane_z8_s16:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     sqrdcmlah       z0\.h, z1\.h, \1\.h\[1\], #0
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdcmlah_lane_z8_s16, svint16_t, svint16_t, z8,
+                   z0 = svqrdcmlah_lane_s16 (z0, z1, z8, 1, 0),
+                   z0 = svqrdcmlah_lane (z0, z1, z8, 1, 0))
+
+/*
+** qrdcmlah_lane_z16_s16:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqrdcmlah       z0\.h, z1\.h, \1\.h\[1\], #0
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdcmlah_lane_z16_s16, svint16_t, svint16_t, z16,
+                   z0 = svqrdcmlah_lane_s16 (z0, z1, z16, 1, 0),
+                   z0 = svqrdcmlah_lane (z0, z1, z16, 1, 0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdcmlah_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdcmlah_lane_s32.c
new file mode 100644 (file)
index 0000000..41525ea
--- /dev/null
@@ -0,0 +1,198 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdcmlah_lane_0_0_s32_tied1:
+**     sqrdcmlah       z0\.s, z1\.s, z2\.s\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_0_s32_tied1, svint32_t,
+               z0 = svqrdcmlah_lane_s32 (z0, z1, z2, 0, 0),
+               z0 = svqrdcmlah_lane (z0, z1, z2, 0, 0))
+
+/*
+** qrdcmlah_lane_0_0_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, \1\.s, z2\.s\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_0_s32_tied2, svint32_t,
+               z0 = svqrdcmlah_lane_s32 (z1, z0, z2, 0, 0),
+               z0 = svqrdcmlah_lane (z1, z0, z2, 0, 0))
+
+/*
+** qrdcmlah_lane_0_0_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, z2\.s, \1\.s\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_0_s32_tied3, svint32_t,
+               z0 = svqrdcmlah_lane_s32 (z1, z2, z0, 0, 0),
+               z0 = svqrdcmlah_lane (z1, z2, z0, 0, 0))
+
+/*
+** qrdcmlah_lane_0_0_s32_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, z2\.s, z3\.s\[0\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_0_s32_untied, svint32_t,
+               z0 = svqrdcmlah_lane_s32 (z1, z2, z3, 0, 0),
+               z0 = svqrdcmlah_lane (z1, z2, z3, 0, 0))
+
+/*
+** qrdcmlah_lane_0_90_s32_tied1:
+**     sqrdcmlah       z0\.s, z1\.s, z2\.s\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_90_s32_tied1, svint32_t,
+               z0 = svqrdcmlah_lane_s32 (z0, z1, z2, 0, 90),
+               z0 = svqrdcmlah_lane (z0, z1, z2, 0, 90))
+
+/*
+** qrdcmlah_lane_0_90_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, \1\.s, z2\.s\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_90_s32_tied2, svint32_t,
+               z0 = svqrdcmlah_lane_s32 (z1, z0, z2, 0, 90),
+               z0 = svqrdcmlah_lane (z1, z0, z2, 0, 90))
+
+/*
+** qrdcmlah_lane_0_90_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, z2\.s, \1\.s\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_90_s32_tied3, svint32_t,
+               z0 = svqrdcmlah_lane_s32 (z1, z2, z0, 0, 90),
+               z0 = svqrdcmlah_lane (z1, z2, z0, 0, 90))
+
+/*
+** qrdcmlah_lane_0_90_s32_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, z2\.s, z3\.s\[0\], #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_90_s32_untied, svint32_t,
+               z0 = svqrdcmlah_lane_s32 (z1, z2, z3, 0, 90),
+               z0 = svqrdcmlah_lane (z1, z2, z3, 0, 90))
+
+/*
+** qrdcmlah_lane_0_180_s32_tied1:
+**     sqrdcmlah       z0\.s, z1\.s, z2\.s\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_180_s32_tied1, svint32_t,
+               z0 = svqrdcmlah_lane_s32 (z0, z1, z2, 0, 180),
+               z0 = svqrdcmlah_lane (z0, z1, z2, 0, 180))
+
+/*
+** qrdcmlah_lane_0_180_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, \1\.s, z2\.s\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_180_s32_tied2, svint32_t,
+               z0 = svqrdcmlah_lane_s32 (z1, z0, z2, 0, 180),
+               z0 = svqrdcmlah_lane (z1, z0, z2, 0, 180))
+
+/*
+** qrdcmlah_lane_0_180_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, z2\.s, \1\.s\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_180_s32_tied3, svint32_t,
+               z0 = svqrdcmlah_lane_s32 (z1, z2, z0, 0, 180),
+               z0 = svqrdcmlah_lane (z1, z2, z0, 0, 180))
+
+/*
+** qrdcmlah_lane_0_180_s32_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, z2\.s, z3\.s\[0\], #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_180_s32_untied, svint32_t,
+               z0 = svqrdcmlah_lane_s32 (z1, z2, z3, 0, 180),
+               z0 = svqrdcmlah_lane (z1, z2, z3, 0, 180))
+
+/*
+** qrdcmlah_lane_0_270_s32_tied1:
+**     sqrdcmlah       z0\.s, z1\.s, z2\.s\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_270_s32_tied1, svint32_t,
+               z0 = svqrdcmlah_lane_s32 (z0, z1, z2, 0, 270),
+               z0 = svqrdcmlah_lane (z0, z1, z2, 0, 270))
+
+/*
+** qrdcmlah_lane_0_270_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, \1\.s, z2\.s\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_270_s32_tied2, svint32_t,
+               z0 = svqrdcmlah_lane_s32 (z1, z0, z2, 0, 270),
+               z0 = svqrdcmlah_lane (z1, z0, z2, 0, 270))
+
+/*
+** qrdcmlah_lane_0_270_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, z2\.s, \1\.s\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_270_s32_tied3, svint32_t,
+               z0 = svqrdcmlah_lane_s32 (z1, z2, z0, 0, 270),
+               z0 = svqrdcmlah_lane (z1, z2, z0, 0, 270))
+
+/*
+** qrdcmlah_lane_0_270_s32_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, z2\.s, z3\.s\[0\], #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_0_270_s32_untied, svint32_t,
+               z0 = svqrdcmlah_lane_s32 (z1, z2, z3, 0, 270),
+               z0 = svqrdcmlah_lane (z1, z2, z3, 0, 270))
+
+/*
+** qrdcmlah_lane_1_s32:
+**     sqrdcmlah       z0\.s, z1\.s, z2\.s\[1\], #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_lane_1_s32, svint32_t,
+               z0 = svqrdcmlah_lane_s32 (z0, z1, z2, 1, 0),
+               z0 = svqrdcmlah_lane (z0, z1, z2, 1, 0))
+
+/*
+** qrdcmlah_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     sqrdcmlah       z0\.s, z1\.s, \1\.s\[1\], #0
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdcmlah_lane_z8_s32, svint32_t, svint32_t, z8,
+                   z0 = svqrdcmlah_lane_s32 (z0, z1, z8, 1, 0),
+                   z0 = svqrdcmlah_lane (z0, z1, z8, 1, 0))
+
+/*
+** qrdcmlah_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqrdcmlah       z0\.s, z1\.s, \1\.s\[1\], #0
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdcmlah_lane_z16_s32, svint32_t, svint32_t, z16,
+                   z0 = svqrdcmlah_lane_s32 (z0, z1, z16, 1, 0),
+                   z0 = svqrdcmlah_lane (z0, z1, z16, 1, 0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdcmlah_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdcmlah_s16.c
new file mode 100644 (file)
index 0000000..9ce1650
--- /dev/null
@@ -0,0 +1,167 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdcmlah_0_s16_tied1:
+**     sqrdcmlah       z0\.h, z1\.h, z2\.h, #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_0_s16_tied1, svint16_t,
+               z0 = svqrdcmlah_s16 (z0, z1, z2, 0),
+               z0 = svqrdcmlah (z0, z1, z2, 0))
+
+/*
+** qrdcmlah_0_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, \1\.h, z2\.h, #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_0_s16_tied2, svint16_t,
+               z0 = svqrdcmlah_s16 (z1, z0, z2, 0),
+               z0 = svqrdcmlah (z1, z0, z2, 0))
+
+/*
+** qrdcmlah_0_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, z2\.h, \1\.h, #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_0_s16_tied3, svint16_t,
+               z0 = svqrdcmlah_s16 (z1, z2, z0, 0),
+               z0 = svqrdcmlah (z1, z2, z0, 0))
+
+/*
+** qrdcmlah_0_s16_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, z2\.h, z3\.h, #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_0_s16_untied, svint16_t,
+               z0 = svqrdcmlah_s16 (z1, z2, z3, 0),
+               z0 = svqrdcmlah (z1, z2, z3, 0))
+
+/*
+** qrdcmlah_90_s16_tied1:
+**     sqrdcmlah       z0\.h, z1\.h, z2\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_90_s16_tied1, svint16_t,
+               z0 = svqrdcmlah_s16 (z0, z1, z2, 90),
+               z0 = svqrdcmlah (z0, z1, z2, 90))
+
+/*
+** qrdcmlah_90_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, \1\.h, z2\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_90_s16_tied2, svint16_t,
+               z0 = svqrdcmlah_s16 (z1, z0, z2, 90),
+               z0 = svqrdcmlah (z1, z0, z2, 90))
+
+/*
+** qrdcmlah_90_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, z2\.h, \1\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_90_s16_tied3, svint16_t,
+               z0 = svqrdcmlah_s16 (z1, z2, z0, 90),
+               z0 = svqrdcmlah (z1, z2, z0, 90))
+
+/*
+** qrdcmlah_90_s16_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, z2\.h, z3\.h, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_90_s16_untied, svint16_t,
+               z0 = svqrdcmlah_s16 (z1, z2, z3, 90),
+               z0 = svqrdcmlah (z1, z2, z3, 90))
+
+/*
+** qrdcmlah_180_s16_tied1:
+**     sqrdcmlah       z0\.h, z1\.h, z2\.h, #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_180_s16_tied1, svint16_t,
+               z0 = svqrdcmlah_s16 (z0, z1, z2, 180),
+               z0 = svqrdcmlah (z0, z1, z2, 180))
+
+/*
+** qrdcmlah_180_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, \1\.h, z2\.h, #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_180_s16_tied2, svint16_t,
+               z0 = svqrdcmlah_s16 (z1, z0, z2, 180),
+               z0 = svqrdcmlah (z1, z0, z2, 180))
+
+/*
+** qrdcmlah_180_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, z2\.h, \1\.h, #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_180_s16_tied3, svint16_t,
+               z0 = svqrdcmlah_s16 (z1, z2, z0, 180),
+               z0 = svqrdcmlah (z1, z2, z0, 180))
+
+/*
+** qrdcmlah_180_s16_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, z2\.h, z3\.h, #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_180_s16_untied, svint16_t,
+               z0 = svqrdcmlah_s16 (z1, z2, z3, 180),
+               z0 = svqrdcmlah (z1, z2, z3, 180))
+
+/*
+** qrdcmlah_270_s16_tied1:
+**     sqrdcmlah       z0\.h, z1\.h, z2\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_270_s16_tied1, svint16_t,
+               z0 = svqrdcmlah_s16 (z0, z1, z2, 270),
+               z0 = svqrdcmlah (z0, z1, z2, 270))
+
+/*
+** qrdcmlah_270_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, \1\.h, z2\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_270_s16_tied2, svint16_t,
+               z0 = svqrdcmlah_s16 (z1, z0, z2, 270),
+               z0 = svqrdcmlah (z1, z0, z2, 270))
+
+/*
+** qrdcmlah_270_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, z2\.h, \1\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_270_s16_tied3, svint16_t,
+               z0 = svqrdcmlah_s16 (z1, z2, z0, 270),
+               z0 = svqrdcmlah (z1, z2, z0, 270))
+
+/*
+** qrdcmlah_270_s16_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.h, z2\.h, z3\.h, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_270_s16_untied, svint16_t,
+               z0 = svqrdcmlah_s16 (z1, z2, z3, 270),
+               z0 = svqrdcmlah (z1, z2, z3, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdcmlah_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdcmlah_s32.c
new file mode 100644 (file)
index 0000000..4179610
--- /dev/null
@@ -0,0 +1,167 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdcmlah_0_s32_tied1:
+**     sqrdcmlah       z0\.s, z1\.s, z2\.s, #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_0_s32_tied1, svint32_t,
+               z0 = svqrdcmlah_s32 (z0, z1, z2, 0),
+               z0 = svqrdcmlah (z0, z1, z2, 0))
+
+/*
+** qrdcmlah_0_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, \1\.s, z2\.s, #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_0_s32_tied2, svint32_t,
+               z0 = svqrdcmlah_s32 (z1, z0, z2, 0),
+               z0 = svqrdcmlah (z1, z0, z2, 0))
+
+/*
+** qrdcmlah_0_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, z2\.s, \1\.s, #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_0_s32_tied3, svint32_t,
+               z0 = svqrdcmlah_s32 (z1, z2, z0, 0),
+               z0 = svqrdcmlah (z1, z2, z0, 0))
+
+/*
+** qrdcmlah_0_s32_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, z2\.s, z3\.s, #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_0_s32_untied, svint32_t,
+               z0 = svqrdcmlah_s32 (z1, z2, z3, 0),
+               z0 = svqrdcmlah (z1, z2, z3, 0))
+
+/*
+** qrdcmlah_90_s32_tied1:
+**     sqrdcmlah       z0\.s, z1\.s, z2\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_90_s32_tied1, svint32_t,
+               z0 = svqrdcmlah_s32 (z0, z1, z2, 90),
+               z0 = svqrdcmlah (z0, z1, z2, 90))
+
+/*
+** qrdcmlah_90_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, \1\.s, z2\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_90_s32_tied2, svint32_t,
+               z0 = svqrdcmlah_s32 (z1, z0, z2, 90),
+               z0 = svqrdcmlah (z1, z0, z2, 90))
+
+/*
+** qrdcmlah_90_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, z2\.s, \1\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_90_s32_tied3, svint32_t,
+               z0 = svqrdcmlah_s32 (z1, z2, z0, 90),
+               z0 = svqrdcmlah (z1, z2, z0, 90))
+
+/*
+** qrdcmlah_90_s32_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, z2\.s, z3\.s, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_90_s32_untied, svint32_t,
+               z0 = svqrdcmlah_s32 (z1, z2, z3, 90),
+               z0 = svqrdcmlah (z1, z2, z3, 90))
+
+/*
+** qrdcmlah_180_s32_tied1:
+**     sqrdcmlah       z0\.s, z1\.s, z2\.s, #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_180_s32_tied1, svint32_t,
+               z0 = svqrdcmlah_s32 (z0, z1, z2, 180),
+               z0 = svqrdcmlah (z0, z1, z2, 180))
+
+/*
+** qrdcmlah_180_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, \1\.s, z2\.s, #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_180_s32_tied2, svint32_t,
+               z0 = svqrdcmlah_s32 (z1, z0, z2, 180),
+               z0 = svqrdcmlah (z1, z0, z2, 180))
+
+/*
+** qrdcmlah_180_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, z2\.s, \1\.s, #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_180_s32_tied3, svint32_t,
+               z0 = svqrdcmlah_s32 (z1, z2, z0, 180),
+               z0 = svqrdcmlah (z1, z2, z0, 180))
+
+/*
+** qrdcmlah_180_s32_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, z2\.s, z3\.s, #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_180_s32_untied, svint32_t,
+               z0 = svqrdcmlah_s32 (z1, z2, z3, 180),
+               z0 = svqrdcmlah (z1, z2, z3, 180))
+
+/*
+** qrdcmlah_270_s32_tied1:
+**     sqrdcmlah       z0\.s, z1\.s, z2\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_270_s32_tied1, svint32_t,
+               z0 = svqrdcmlah_s32 (z0, z1, z2, 270),
+               z0 = svqrdcmlah (z0, z1, z2, 270))
+
+/*
+** qrdcmlah_270_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, \1\.s, z2\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_270_s32_tied2, svint32_t,
+               z0 = svqrdcmlah_s32 (z1, z0, z2, 270),
+               z0 = svqrdcmlah (z1, z0, z2, 270))
+
+/*
+** qrdcmlah_270_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, z2\.s, \1\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_270_s32_tied3, svint32_t,
+               z0 = svqrdcmlah_s32 (z1, z2, z0, 270),
+               z0 = svqrdcmlah (z1, z2, z0, 270))
+
+/*
+** qrdcmlah_270_s32_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.s, z2\.s, z3\.s, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_270_s32_untied, svint32_t,
+               z0 = svqrdcmlah_s32 (z1, z2, z3, 270),
+               z0 = svqrdcmlah (z1, z2, z3, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdcmlah_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdcmlah_s64.c
new file mode 100644 (file)
index 0000000..518d8a6
--- /dev/null
@@ -0,0 +1,167 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdcmlah_0_s64_tied1:
+**     sqrdcmlah       z0\.d, z1\.d, z2\.d, #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_0_s64_tied1, svint64_t,
+               z0 = svqrdcmlah_s64 (z0, z1, z2, 0),
+               z0 = svqrdcmlah (z0, z1, z2, 0))
+
+/*
+** qrdcmlah_0_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.d, \1, z2\.d, #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_0_s64_tied2, svint64_t,
+               z0 = svqrdcmlah_s64 (z1, z0, z2, 0),
+               z0 = svqrdcmlah (z1, z0, z2, 0))
+
+/*
+** qrdcmlah_0_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.d, z2\.d, \1, #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_0_s64_tied3, svint64_t,
+               z0 = svqrdcmlah_s64 (z1, z2, z0, 0),
+               z0 = svqrdcmlah (z1, z2, z0, 0))
+
+/*
+** qrdcmlah_0_s64_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.d, z2\.d, z3\.d, #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_0_s64_untied, svint64_t,
+               z0 = svqrdcmlah_s64 (z1, z2, z3, 0),
+               z0 = svqrdcmlah (z1, z2, z3, 0))
+
+/*
+** qrdcmlah_90_s64_tied1:
+**     sqrdcmlah       z0\.d, z1\.d, z2\.d, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_90_s64_tied1, svint64_t,
+               z0 = svqrdcmlah_s64 (z0, z1, z2, 90),
+               z0 = svqrdcmlah (z0, z1, z2, 90))
+
+/*
+** qrdcmlah_90_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.d, \1, z2\.d, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_90_s64_tied2, svint64_t,
+               z0 = svqrdcmlah_s64 (z1, z0, z2, 90),
+               z0 = svqrdcmlah (z1, z0, z2, 90))
+
+/*
+** qrdcmlah_90_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.d, z2\.d, \1, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_90_s64_tied3, svint64_t,
+               z0 = svqrdcmlah_s64 (z1, z2, z0, 90),
+               z0 = svqrdcmlah (z1, z2, z0, 90))
+
+/*
+** qrdcmlah_90_s64_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.d, z2\.d, z3\.d, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_90_s64_untied, svint64_t,
+               z0 = svqrdcmlah_s64 (z1, z2, z3, 90),
+               z0 = svqrdcmlah (z1, z2, z3, 90))
+
+/*
+** qrdcmlah_180_s64_tied1:
+**     sqrdcmlah       z0\.d, z1\.d, z2\.d, #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_180_s64_tied1, svint64_t,
+               z0 = svqrdcmlah_s64 (z0, z1, z2, 180),
+               z0 = svqrdcmlah (z0, z1, z2, 180))
+
+/*
+** qrdcmlah_180_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.d, \1, z2\.d, #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_180_s64_tied2, svint64_t,
+               z0 = svqrdcmlah_s64 (z1, z0, z2, 180),
+               z0 = svqrdcmlah (z1, z0, z2, 180))
+
+/*
+** qrdcmlah_180_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.d, z2\.d, \1, #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_180_s64_tied3, svint64_t,
+               z0 = svqrdcmlah_s64 (z1, z2, z0, 180),
+               z0 = svqrdcmlah (z1, z2, z0, 180))
+
+/*
+** qrdcmlah_180_s64_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.d, z2\.d, z3\.d, #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_180_s64_untied, svint64_t,
+               z0 = svqrdcmlah_s64 (z1, z2, z3, 180),
+               z0 = svqrdcmlah (z1, z2, z3, 180))
+
+/*
+** qrdcmlah_270_s64_tied1:
+**     sqrdcmlah       z0\.d, z1\.d, z2\.d, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_270_s64_tied1, svint64_t,
+               z0 = svqrdcmlah_s64 (z0, z1, z2, 270),
+               z0 = svqrdcmlah (z0, z1, z2, 270))
+
+/*
+** qrdcmlah_270_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.d, \1, z2\.d, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_270_s64_tied2, svint64_t,
+               z0 = svqrdcmlah_s64 (z1, z0, z2, 270),
+               z0 = svqrdcmlah (z1, z0, z2, 270))
+
+/*
+** qrdcmlah_270_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.d, z2\.d, \1, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_270_s64_tied3, svint64_t,
+               z0 = svqrdcmlah_s64 (z1, z2, z0, 270),
+               z0 = svqrdcmlah (z1, z2, z0, 270))
+
+/*
+** qrdcmlah_270_s64_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.d, z2\.d, z3\.d, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_270_s64_untied, svint64_t,
+               z0 = svqrdcmlah_s64 (z1, z2, z3, 270),
+               z0 = svqrdcmlah (z1, z2, z3, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdcmlah_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdcmlah_s8.c
new file mode 100644 (file)
index 0000000..04b8d79
--- /dev/null
@@ -0,0 +1,167 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdcmlah_0_s8_tied1:
+**     sqrdcmlah       z0\.b, z1\.b, z2\.b, #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_0_s8_tied1, svint8_t,
+               z0 = svqrdcmlah_s8 (z0, z1, z2, 0),
+               z0 = svqrdcmlah (z0, z1, z2, 0))
+
+/*
+** qrdcmlah_0_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.b, \1\.b, z2\.b, #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_0_s8_tied2, svint8_t,
+               z0 = svqrdcmlah_s8 (z1, z0, z2, 0),
+               z0 = svqrdcmlah (z1, z0, z2, 0))
+
+/*
+** qrdcmlah_0_s8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.b, z2\.b, \1\.b, #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_0_s8_tied3, svint8_t,
+               z0 = svqrdcmlah_s8 (z1, z2, z0, 0),
+               z0 = svqrdcmlah (z1, z2, z0, 0))
+
+/*
+** qrdcmlah_0_s8_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.b, z2\.b, z3\.b, #0
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_0_s8_untied, svint8_t,
+               z0 = svqrdcmlah_s8 (z1, z2, z3, 0),
+               z0 = svqrdcmlah (z1, z2, z3, 0))
+
+/*
+** qrdcmlah_90_s8_tied1:
+**     sqrdcmlah       z0\.b, z1\.b, z2\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_90_s8_tied1, svint8_t,
+               z0 = svqrdcmlah_s8 (z0, z1, z2, 90),
+               z0 = svqrdcmlah (z0, z1, z2, 90))
+
+/*
+** qrdcmlah_90_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.b, \1\.b, z2\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_90_s8_tied2, svint8_t,
+               z0 = svqrdcmlah_s8 (z1, z0, z2, 90),
+               z0 = svqrdcmlah (z1, z0, z2, 90))
+
+/*
+** qrdcmlah_90_s8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.b, z2\.b, \1\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_90_s8_tied3, svint8_t,
+               z0 = svqrdcmlah_s8 (z1, z2, z0, 90),
+               z0 = svqrdcmlah (z1, z2, z0, 90))
+
+/*
+** qrdcmlah_90_s8_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.b, z2\.b, z3\.b, #90
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_90_s8_untied, svint8_t,
+               z0 = svqrdcmlah_s8 (z1, z2, z3, 90),
+               z0 = svqrdcmlah (z1, z2, z3, 90))
+
+/*
+** qrdcmlah_180_s8_tied1:
+**     sqrdcmlah       z0\.b, z1\.b, z2\.b, #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_180_s8_tied1, svint8_t,
+               z0 = svqrdcmlah_s8 (z0, z1, z2, 180),
+               z0 = svqrdcmlah (z0, z1, z2, 180))
+
+/*
+** qrdcmlah_180_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.b, \1\.b, z2\.b, #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_180_s8_tied2, svint8_t,
+               z0 = svqrdcmlah_s8 (z1, z0, z2, 180),
+               z0 = svqrdcmlah (z1, z0, z2, 180))
+
+/*
+** qrdcmlah_180_s8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.b, z2\.b, \1\.b, #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_180_s8_tied3, svint8_t,
+               z0 = svqrdcmlah_s8 (z1, z2, z0, 180),
+               z0 = svqrdcmlah (z1, z2, z0, 180))
+
+/*
+** qrdcmlah_180_s8_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.b, z2\.b, z3\.b, #180
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_180_s8_untied, svint8_t,
+               z0 = svqrdcmlah_s8 (z1, z2, z3, 180),
+               z0 = svqrdcmlah (z1, z2, z3, 180))
+
+/*
+** qrdcmlah_270_s8_tied1:
+**     sqrdcmlah       z0\.b, z1\.b, z2\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_270_s8_tied1, svint8_t,
+               z0 = svqrdcmlah_s8 (z0, z1, z2, 270),
+               z0 = svqrdcmlah (z0, z1, z2, 270))
+
+/*
+** qrdcmlah_270_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.b, \1\.b, z2\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_270_s8_tied2, svint8_t,
+               z0 = svqrdcmlah_s8 (z1, z0, z2, 270),
+               z0 = svqrdcmlah (z1, z0, z2, 270))
+
+/*
+** qrdcmlah_270_s8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.b, z2\.b, \1\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_270_s8_tied3, svint8_t,
+               z0 = svqrdcmlah_s8 (z1, z2, z0, 270),
+               z0 = svqrdcmlah (z1, z2, z0, 270))
+
+/*
+** qrdcmlah_270_s8_untied:
+**     movprfx z0, z1
+**     sqrdcmlah       z0\.b, z2\.b, z3\.b, #270
+**     ret
+*/
+TEST_UNIFORM_Z (qrdcmlah_270_s8_untied, svint8_t,
+               z0 = svqrdcmlah_s8 (z1, z2, z3, 270),
+               z0 = svqrdcmlah (z1, z2, z3, 270))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_lane_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_lane_s16.c
new file mode 100644 (file)
index 0000000..dbe9d06
--- /dev/null
@@ -0,0 +1,129 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmlah_lane_0_s16_tied1:
+**     sqrdmlah        z0\.h, z1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_0_s16_tied1, svint16_t,
+               z0 = svqrdmlah_lane_s16 (z0, z1, z2, 0),
+               z0 = svqrdmlah_lane (z0, z1, z2, 0))
+
+/*
+** qrdmlah_lane_0_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.h, \1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_0_s16_tied2, svint16_t,
+               z0 = svqrdmlah_lane_s16 (z1, z0, z2, 0),
+               z0 = svqrdmlah_lane (z1, z0, z2, 0))
+
+/*
+** qrdmlah_lane_0_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.h, z2\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_0_s16_tied3, svint16_t,
+               z0 = svqrdmlah_lane_s16 (z1, z2, z0, 0),
+               z0 = svqrdmlah_lane (z1, z2, z0, 0))
+
+/*
+** qrdmlah_lane_0_s16_untied:
+**     movprfx z0, z1
+**     sqrdmlah        z0\.h, z2\.h, z3\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_0_s16_untied, svint16_t,
+               z0 = svqrdmlah_lane_s16 (z1, z2, z3, 0),
+               z0 = svqrdmlah_lane (z1, z2, z3, 0))
+
+/*
+** qrdmlah_lane_1_s16:
+**     sqrdmlah        z0\.h, z1\.h, z2\.h\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_1_s16, svint16_t,
+               z0 = svqrdmlah_lane_s16 (z0, z1, z2, 1),
+               z0 = svqrdmlah_lane (z0, z1, z2, 1))
+
+/*
+** qrdmlah_lane_2_s16:
+**     sqrdmlah        z0\.h, z1\.h, z2\.h\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_2_s16, svint16_t,
+               z0 = svqrdmlah_lane_s16 (z0, z1, z2, 2),
+               z0 = svqrdmlah_lane (z0, z1, z2, 2))
+
+/*
+** qrdmlah_lane_3_s16:
+**     sqrdmlah        z0\.h, z1\.h, z2\.h\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_3_s16, svint16_t,
+               z0 = svqrdmlah_lane_s16 (z0, z1, z2, 3),
+               z0 = svqrdmlah_lane (z0, z1, z2, 3))
+
+/*
+** qrdmlah_lane_4_s16:
+**     sqrdmlah        z0\.h, z1\.h, z2\.h\[4\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_4_s16, svint16_t,
+               z0 = svqrdmlah_lane_s16 (z0, z1, z2, 4),
+               z0 = svqrdmlah_lane (z0, z1, z2, 4))
+
+/*
+** qrdmlah_lane_5_s16:
+**     sqrdmlah        z0\.h, z1\.h, z2\.h\[5\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_5_s16, svint16_t,
+               z0 = svqrdmlah_lane_s16 (z0, z1, z2, 5),
+               z0 = svqrdmlah_lane (z0, z1, z2, 5))
+
+/*
+** qrdmlah_lane_6_s16:
+**     sqrdmlah        z0\.h, z1\.h, z2\.h\[6\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_6_s16, svint16_t,
+               z0 = svqrdmlah_lane_s16 (z0, z1, z2, 6),
+               z0 = svqrdmlah_lane (z0, z1, z2, 6))
+
+/*
+** qrdmlah_lane_7_s16:
+**     sqrdmlah        z0\.h, z1\.h, z2\.h\[7\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_7_s16, svint16_t,
+               z0 = svqrdmlah_lane_s16 (z0, z1, z2, 7),
+               z0 = svqrdmlah_lane (z0, z1, z2, 7))
+
+/*
+** qrdmlah_lane_z8_s16:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     sqrdmlah        z0\.h, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdmlah_lane_z8_s16, svint16_t, svint16_t, z8,
+                   z0 = svqrdmlah_lane_s16 (z0, z1, z8, 1),
+                   z0 = svqrdmlah_lane (z0, z1, z8, 1))
+
+/*
+** qrdmlah_lane_z16_s16:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqrdmlah        z0\.h, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdmlah_lane_z16_s16, svint16_t, svint16_t, z16,
+                   z0 = svqrdmlah_lane_s16 (z0, z1, z16, 1),
+                   z0 = svqrdmlah_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_lane_s32.c
new file mode 100644 (file)
index 0000000..e4adbb4
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmlah_lane_0_s32_tied1:
+**     sqrdmlah        z0\.s, z1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_0_s32_tied1, svint32_t,
+               z0 = svqrdmlah_lane_s32 (z0, z1, z2, 0),
+               z0 = svqrdmlah_lane (z0, z1, z2, 0))
+
+/*
+** qrdmlah_lane_0_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.s, \1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_0_s32_tied2, svint32_t,
+               z0 = svqrdmlah_lane_s32 (z1, z0, z2, 0),
+               z0 = svqrdmlah_lane (z1, z0, z2, 0))
+
+/*
+** qrdmlah_lane_0_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.s, z2\.s, \1\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_0_s32_tied3, svint32_t,
+               z0 = svqrdmlah_lane_s32 (z1, z2, z0, 0),
+               z0 = svqrdmlah_lane (z1, z2, z0, 0))
+
+/*
+** qrdmlah_lane_0_s32_untied:
+**     movprfx z0, z1
+**     sqrdmlah        z0\.s, z2\.s, z3\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_0_s32_untied, svint32_t,
+               z0 = svqrdmlah_lane_s32 (z1, z2, z3, 0),
+               z0 = svqrdmlah_lane (z1, z2, z3, 0))
+
+/*
+** qrdmlah_lane_1_s32:
+**     sqrdmlah        z0\.s, z1\.s, z2\.s\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_1_s32, svint32_t,
+               z0 = svqrdmlah_lane_s32 (z0, z1, z2, 1),
+               z0 = svqrdmlah_lane (z0, z1, z2, 1))
+
+/*
+** qrdmlah_lane_2_s32:
+**     sqrdmlah        z0\.s, z1\.s, z2\.s\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_2_s32, svint32_t,
+               z0 = svqrdmlah_lane_s32 (z0, z1, z2, 2),
+               z0 = svqrdmlah_lane (z0, z1, z2, 2))
+
+/*
+** qrdmlah_lane_3_s32:
+**     sqrdmlah        z0\.s, z1\.s, z2\.s\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_3_s32, svint32_t,
+               z0 = svqrdmlah_lane_s32 (z0, z1, z2, 3),
+               z0 = svqrdmlah_lane (z0, z1, z2, 3))
+
+/*
+** qrdmlah_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     sqrdmlah        z0\.s, z1\.s, \1\.s\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdmlah_lane_z8_s32, svint32_t, svint32_t, z8,
+                   z0 = svqrdmlah_lane_s32 (z0, z1, z8, 1),
+                   z0 = svqrdmlah_lane (z0, z1, z8, 1))
+
+/*
+** qrdmlah_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqrdmlah        z0\.s, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdmlah_lane_z16_s32, svint32_t, svint32_t, z16,
+                   z0 = svqrdmlah_lane_s32 (z0, z1, z16, 1),
+                   z0 = svqrdmlah_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_lane_s64.c
new file mode 100644 (file)
index 0000000..fe0180c
--- /dev/null
@@ -0,0 +1,74 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmlah_lane_0_s64_tied1:
+**     sqrdmlah        z0\.d, z1\.d, z2\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_0_s64_tied1, svint64_t,
+               z0 = svqrdmlah_lane_s64 (z0, z1, z2, 0),
+               z0 = svqrdmlah_lane (z0, z1, z2, 0))
+
+/*
+** qrdmlah_lane_0_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.d, \1, z2\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_0_s64_tied2, svint64_t,
+               z0 = svqrdmlah_lane_s64 (z1, z0, z2, 0),
+               z0 = svqrdmlah_lane (z1, z0, z2, 0))
+
+/*
+** qrdmlah_lane_0_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.d, z2\.d, \1\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_0_s64_tied3, svint64_t,
+               z0 = svqrdmlah_lane_s64 (z1, z2, z0, 0),
+               z0 = svqrdmlah_lane (z1, z2, z0, 0))
+
+/*
+** qrdmlah_lane_0_s64_untied:
+**     movprfx z0, z1
+**     sqrdmlah        z0\.d, z2\.d, z3\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_0_s64_untied, svint64_t,
+               z0 = svqrdmlah_lane_s64 (z1, z2, z3, 0),
+               z0 = svqrdmlah_lane (z1, z2, z3, 0))
+
+/*
+** qrdmlah_lane_1_s64:
+**     sqrdmlah        z0\.d, z1\.d, z2\.d\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_lane_1_s64, svint64_t,
+               z0 = svqrdmlah_lane_s64 (z0, z1, z2, 1),
+               z0 = svqrdmlah_lane (z0, z1, z2, 1))
+
+/*
+** qrdmlah_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     sqrdmlah        z0\.d, z1\.d, z15\.d\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdmlah_lane_z15_s64, svint64_t, svint64_t, z15,
+                   z0 = svqrdmlah_lane_s64 (z0, z1, z15, 1),
+                   z0 = svqrdmlah_lane (z0, z1, z15, 1))
+
+/*
+** qrdmlah_lane_z16_s64:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqrdmlah        z0\.d, z1\.d, \1\.d\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdmlah_lane_z16_s64, svint64_t, svint64_t, z16,
+                   z0 = svqrdmlah_lane_s64 (z0, z1, z16, 1),
+                   z0 = svqrdmlah_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_s16.c
new file mode 100644 (file)
index 0000000..559acab
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmlah_s16_tied1:
+**     sqrdmlah        z0\.h, z1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_s16_tied1, svint16_t,
+               z0 = svqrdmlah_s16 (z0, z1, z2),
+               z0 = svqrdmlah (z0, z1, z2))
+
+/*
+** qrdmlah_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.h, \1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_s16_tied2, svint16_t,
+               z0 = svqrdmlah_s16 (z1, z0, z2),
+               z0 = svqrdmlah (z1, z0, z2))
+
+/*
+** qrdmlah_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.h, z2\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_s16_tied3, svint16_t,
+               z0 = svqrdmlah_s16 (z1, z2, z0),
+               z0 = svqrdmlah (z1, z2, z0))
+
+/*
+** qrdmlah_s16_untied:
+**     movprfx z0, z1
+**     sqrdmlah        z0\.h, z2\.h, z3\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_s16_untied, svint16_t,
+               z0 = svqrdmlah_s16 (z1, z2, z3),
+               z0 = svqrdmlah (z1, z2, z3))
+
+/*
+** qrdmlah_w0_s16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqrdmlah        z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlah_w0_s16_tied1, svint16_t, int16_t,
+                z0 = svqrdmlah_n_s16 (z0, z1, x0),
+                z0 = svqrdmlah (z0, z1, x0))
+
+/*
+** qrdmlah_w0_s16_tied2:
+**     mov     (z[0-9]+\.h), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.h, \2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlah_w0_s16_tied2, svint16_t, int16_t,
+                z0 = svqrdmlah_n_s16 (z1, z0, x0),
+                z0 = svqrdmlah (z1, z0, x0))
+
+/*
+** qrdmlah_w0_s16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     sqrdmlah        z0\.h, z2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlah_w0_s16_untied, svint16_t, int16_t,
+                z0 = svqrdmlah_n_s16 (z1, z2, x0),
+                z0 = svqrdmlah (z1, z2, x0))
+
+/*
+** qrdmlah_11_s16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     sqrdmlah        z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_11_s16_tied1, svint16_t,
+               z0 = svqrdmlah_n_s16 (z0, z1, 11),
+               z0 = svqrdmlah (z0, z1, 11))
+
+/*
+** qrdmlah_11_s16_tied2:
+**     mov     (z[0-9]+\.h), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.h, \2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_11_s16_tied2, svint16_t,
+               z0 = svqrdmlah_n_s16 (z1, z0, 11),
+               z0 = svqrdmlah (z1, z0, 11))
+
+/*
+** qrdmlah_11_s16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     sqrdmlah        z0\.h, z2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_11_s16_untied, svint16_t,
+               z0 = svqrdmlah_n_s16 (z1, z2, 11),
+               z0 = svqrdmlah (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_s32.c
new file mode 100644 (file)
index 0000000..4ca61f3
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmlah_s32_tied1:
+**     sqrdmlah        z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_s32_tied1, svint32_t,
+               z0 = svqrdmlah_s32 (z0, z1, z2),
+               z0 = svqrdmlah (z0, z1, z2))
+
+/*
+** qrdmlah_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.s, \1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_s32_tied2, svint32_t,
+               z0 = svqrdmlah_s32 (z1, z0, z2),
+               z0 = svqrdmlah (z1, z0, z2))
+
+/*
+** qrdmlah_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.s, z2\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_s32_tied3, svint32_t,
+               z0 = svqrdmlah_s32 (z1, z2, z0),
+               z0 = svqrdmlah (z1, z2, z0))
+
+/*
+** qrdmlah_s32_untied:
+**     movprfx z0, z1
+**     sqrdmlah        z0\.s, z2\.s, z3\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_s32_untied, svint32_t,
+               z0 = svqrdmlah_s32 (z1, z2, z3),
+               z0 = svqrdmlah (z1, z2, z3))
+
+/*
+** qrdmlah_w0_s32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqrdmlah        z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlah_w0_s32_tied1, svint32_t, int32_t,
+                z0 = svqrdmlah_n_s32 (z0, z1, x0),
+                z0 = svqrdmlah (z0, z1, x0))
+
+/*
+** qrdmlah_w0_s32_tied2:
+**     mov     (z[0-9]+\.s), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlah_w0_s32_tied2, svint32_t, int32_t,
+                z0 = svqrdmlah_n_s32 (z1, z0, x0),
+                z0 = svqrdmlah (z1, z0, x0))
+
+/*
+** qrdmlah_w0_s32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     sqrdmlah        z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlah_w0_s32_untied, svint32_t, int32_t,
+                z0 = svqrdmlah_n_s32 (z1, z2, x0),
+                z0 = svqrdmlah (z1, z2, x0))
+
+/*
+** qrdmlah_11_s32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     sqrdmlah        z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_11_s32_tied1, svint32_t,
+               z0 = svqrdmlah_n_s32 (z0, z1, 11),
+               z0 = svqrdmlah (z0, z1, 11))
+
+/*
+** qrdmlah_11_s32_tied2:
+**     mov     (z[0-9]+\.s), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_11_s32_tied2, svint32_t,
+               z0 = svqrdmlah_n_s32 (z1, z0, 11),
+               z0 = svqrdmlah (z1, z0, 11))
+
+/*
+** qrdmlah_11_s32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     sqrdmlah        z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_11_s32_untied, svint32_t,
+               z0 = svqrdmlah_n_s32 (z1, z2, 11),
+               z0 = svqrdmlah (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_s64.c
new file mode 100644 (file)
index 0000000..48468e3
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmlah_s64_tied1:
+**     sqrdmlah        z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_s64_tied1, svint64_t,
+               z0 = svqrdmlah_s64 (z0, z1, z2),
+               z0 = svqrdmlah (z0, z1, z2))
+
+/*
+** qrdmlah_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_s64_tied2, svint64_t,
+               z0 = svqrdmlah_s64 (z1, z0, z2),
+               z0 = svqrdmlah (z1, z0, z2))
+
+/*
+** qrdmlah_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_s64_tied3, svint64_t,
+               z0 = svqrdmlah_s64 (z1, z2, z0),
+               z0 = svqrdmlah (z1, z2, z0))
+
+/*
+** qrdmlah_s64_untied:
+**     movprfx z0, z1
+**     sqrdmlah        z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_s64_untied, svint64_t,
+               z0 = svqrdmlah_s64 (z1, z2, z3),
+               z0 = svqrdmlah (z1, z2, z3))
+
+/*
+** qrdmlah_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     sqrdmlah        z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlah_x0_s64_tied1, svint64_t, int64_t,
+                z0 = svqrdmlah_n_s64 (z0, z1, x0),
+                z0 = svqrdmlah (z0, z1, x0))
+
+/*
+** qrdmlah_x0_s64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlah_x0_s64_tied2, svint64_t, int64_t,
+                z0 = svqrdmlah_n_s64 (z1, z0, x0),
+                z0 = svqrdmlah (z1, z0, x0))
+
+/*
+** qrdmlah_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     sqrdmlah        z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlah_x0_s64_untied, svint64_t, int64_t,
+                z0 = svqrdmlah_n_s64 (z1, z2, x0),
+                z0 = svqrdmlah (z1, z2, x0))
+
+/*
+** qrdmlah_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     sqrdmlah        z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_11_s64_tied1, svint64_t,
+               z0 = svqrdmlah_n_s64 (z0, z1, 11),
+               z0 = svqrdmlah (z0, z1, 11))
+
+/*
+** qrdmlah_11_s64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_11_s64_tied2, svint64_t,
+               z0 = svqrdmlah_n_s64 (z1, z0, 11),
+               z0 = svqrdmlah (z1, z0, 11))
+
+/*
+** qrdmlah_11_s64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     sqrdmlah        z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_11_s64_untied, svint64_t,
+               z0 = svqrdmlah_n_s64 (z1, z2, 11),
+               z0 = svqrdmlah (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlah_s8.c
new file mode 100644 (file)
index 0000000..b50f6a0
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmlah_s8_tied1:
+**     sqrdmlah        z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_s8_tied1, svint8_t,
+               z0 = svqrdmlah_s8 (z0, z1, z2),
+               z0 = svqrdmlah (z0, z1, z2))
+
+/*
+** qrdmlah_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.b, \1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_s8_tied2, svint8_t,
+               z0 = svqrdmlah_s8 (z1, z0, z2),
+               z0 = svqrdmlah (z1, z0, z2))
+
+/*
+** qrdmlah_s8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.b, z2\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_s8_tied3, svint8_t,
+               z0 = svqrdmlah_s8 (z1, z2, z0),
+               z0 = svqrdmlah (z1, z2, z0))
+
+/*
+** qrdmlah_s8_untied:
+**     movprfx z0, z1
+**     sqrdmlah        z0\.b, z2\.b, z3\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_s8_untied, svint8_t,
+               z0 = svqrdmlah_s8 (z1, z2, z3),
+               z0 = svqrdmlah (z1, z2, z3))
+
+/*
+** qrdmlah_w0_s8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqrdmlah        z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlah_w0_s8_tied1, svint8_t, int8_t,
+                z0 = svqrdmlah_n_s8 (z0, z1, x0),
+                z0 = svqrdmlah (z0, z1, x0))
+
+/*
+** qrdmlah_w0_s8_tied2:
+**     mov     (z[0-9]+\.b), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.b, \2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlah_w0_s8_tied2, svint8_t, int8_t,
+                z0 = svqrdmlah_n_s8 (z1, z0, x0),
+                z0 = svqrdmlah (z1, z0, x0))
+
+/*
+** qrdmlah_w0_s8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     sqrdmlah        z0\.b, z2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlah_w0_s8_untied, svint8_t, int8_t,
+                z0 = svqrdmlah_n_s8 (z1, z2, x0),
+                z0 = svqrdmlah (z1, z2, x0))
+
+/*
+** qrdmlah_11_s8_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     sqrdmlah        z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_11_s8_tied1, svint8_t,
+               z0 = svqrdmlah_n_s8 (z0, z1, 11),
+               z0 = svqrdmlah (z0, z1, 11))
+
+/*
+** qrdmlah_11_s8_tied2:
+**     mov     (z[0-9]+\.b), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlah        z0\.b, \2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_11_s8_tied2, svint8_t,
+               z0 = svqrdmlah_n_s8 (z1, z0, 11),
+               z0 = svqrdmlah (z1, z0, 11))
+
+/*
+** qrdmlah_11_s8_untied:
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     sqrdmlah        z0\.b, z2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlah_11_s8_untied, svint8_t,
+               z0 = svqrdmlah_n_s8 (z1, z2, 11),
+               z0 = svqrdmlah (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_lane_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_lane_s16.c
new file mode 100644 (file)
index 0000000..52b3c14
--- /dev/null
@@ -0,0 +1,129 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmlsh_lane_0_s16_tied1:
+**     sqrdmlsh        z0\.h, z1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_0_s16_tied1, svint16_t,
+               z0 = svqrdmlsh_lane_s16 (z0, z1, z2, 0),
+               z0 = svqrdmlsh_lane (z0, z1, z2, 0))
+
+/*
+** qrdmlsh_lane_0_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.h, \1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_0_s16_tied2, svint16_t,
+               z0 = svqrdmlsh_lane_s16 (z1, z0, z2, 0),
+               z0 = svqrdmlsh_lane (z1, z0, z2, 0))
+
+/*
+** qrdmlsh_lane_0_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.h, z2\.h, \1\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_0_s16_tied3, svint16_t,
+               z0 = svqrdmlsh_lane_s16 (z1, z2, z0, 0),
+               z0 = svqrdmlsh_lane (z1, z2, z0, 0))
+
+/*
+** qrdmlsh_lane_0_s16_untied:
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.h, z2\.h, z3\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_0_s16_untied, svint16_t,
+               z0 = svqrdmlsh_lane_s16 (z1, z2, z3, 0),
+               z0 = svqrdmlsh_lane (z1, z2, z3, 0))
+
+/*
+** qrdmlsh_lane_1_s16:
+**     sqrdmlsh        z0\.h, z1\.h, z2\.h\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_1_s16, svint16_t,
+               z0 = svqrdmlsh_lane_s16 (z0, z1, z2, 1),
+               z0 = svqrdmlsh_lane (z0, z1, z2, 1))
+
+/*
+** qrdmlsh_lane_2_s16:
+**     sqrdmlsh        z0\.h, z1\.h, z2\.h\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_2_s16, svint16_t,
+               z0 = svqrdmlsh_lane_s16 (z0, z1, z2, 2),
+               z0 = svqrdmlsh_lane (z0, z1, z2, 2))
+
+/*
+** qrdmlsh_lane_3_s16:
+**     sqrdmlsh        z0\.h, z1\.h, z2\.h\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_3_s16, svint16_t,
+               z0 = svqrdmlsh_lane_s16 (z0, z1, z2, 3),
+               z0 = svqrdmlsh_lane (z0, z1, z2, 3))
+
+/*
+** qrdmlsh_lane_4_s16:
+**     sqrdmlsh        z0\.h, z1\.h, z2\.h\[4\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_4_s16, svint16_t,
+               z0 = svqrdmlsh_lane_s16 (z0, z1, z2, 4),
+               z0 = svqrdmlsh_lane (z0, z1, z2, 4))
+
+/*
+** qrdmlsh_lane_5_s16:
+**     sqrdmlsh        z0\.h, z1\.h, z2\.h\[5\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_5_s16, svint16_t,
+               z0 = svqrdmlsh_lane_s16 (z0, z1, z2, 5),
+               z0 = svqrdmlsh_lane (z0, z1, z2, 5))
+
+/*
+** qrdmlsh_lane_6_s16:
+**     sqrdmlsh        z0\.h, z1\.h, z2\.h\[6\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_6_s16, svint16_t,
+               z0 = svqrdmlsh_lane_s16 (z0, z1, z2, 6),
+               z0 = svqrdmlsh_lane (z0, z1, z2, 6))
+
+/*
+** qrdmlsh_lane_7_s16:
+**     sqrdmlsh        z0\.h, z1\.h, z2\.h\[7\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_7_s16, svint16_t,
+               z0 = svqrdmlsh_lane_s16 (z0, z1, z2, 7),
+               z0 = svqrdmlsh_lane (z0, z1, z2, 7))
+
+/*
+** qrdmlsh_lane_z8_s16:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     sqrdmlsh        z0\.h, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdmlsh_lane_z8_s16, svint16_t, svint16_t, z8,
+                   z0 = svqrdmlsh_lane_s16 (z0, z1, z8, 1),
+                   z0 = svqrdmlsh_lane (z0, z1, z8, 1))
+
+/*
+** qrdmlsh_lane_z16_s16:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqrdmlsh        z0\.h, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdmlsh_lane_z16_s16, svint16_t, svint16_t, z16,
+                   z0 = svqrdmlsh_lane_s16 (z0, z1, z16, 1),
+                   z0 = svqrdmlsh_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_lane_s32.c
new file mode 100644 (file)
index 0000000..527988b
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmlsh_lane_0_s32_tied1:
+**     sqrdmlsh        z0\.s, z1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_0_s32_tied1, svint32_t,
+               z0 = svqrdmlsh_lane_s32 (z0, z1, z2, 0),
+               z0 = svqrdmlsh_lane (z0, z1, z2, 0))
+
+/*
+** qrdmlsh_lane_0_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.s, \1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_0_s32_tied2, svint32_t,
+               z0 = svqrdmlsh_lane_s32 (z1, z0, z2, 0),
+               z0 = svqrdmlsh_lane (z1, z0, z2, 0))
+
+/*
+** qrdmlsh_lane_0_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.s, z2\.s, \1\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_0_s32_tied3, svint32_t,
+               z0 = svqrdmlsh_lane_s32 (z1, z2, z0, 0),
+               z0 = svqrdmlsh_lane (z1, z2, z0, 0))
+
+/*
+** qrdmlsh_lane_0_s32_untied:
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.s, z2\.s, z3\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_0_s32_untied, svint32_t,
+               z0 = svqrdmlsh_lane_s32 (z1, z2, z3, 0),
+               z0 = svqrdmlsh_lane (z1, z2, z3, 0))
+
+/*
+** qrdmlsh_lane_1_s32:
+**     sqrdmlsh        z0\.s, z1\.s, z2\.s\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_1_s32, svint32_t,
+               z0 = svqrdmlsh_lane_s32 (z0, z1, z2, 1),
+               z0 = svqrdmlsh_lane (z0, z1, z2, 1))
+
+/*
+** qrdmlsh_lane_2_s32:
+**     sqrdmlsh        z0\.s, z1\.s, z2\.s\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_2_s32, svint32_t,
+               z0 = svqrdmlsh_lane_s32 (z0, z1, z2, 2),
+               z0 = svqrdmlsh_lane (z0, z1, z2, 2))
+
+/*
+** qrdmlsh_lane_3_s32:
+**     sqrdmlsh        z0\.s, z1\.s, z2\.s\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_3_s32, svint32_t,
+               z0 = svqrdmlsh_lane_s32 (z0, z1, z2, 3),
+               z0 = svqrdmlsh_lane (z0, z1, z2, 3))
+
+/*
+** qrdmlsh_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     sqrdmlsh        z0\.s, z1\.s, \1\.s\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdmlsh_lane_z8_s32, svint32_t, svint32_t, z8,
+                   z0 = svqrdmlsh_lane_s32 (z0, z1, z8, 1),
+                   z0 = svqrdmlsh_lane (z0, z1, z8, 1))
+
+/*
+** qrdmlsh_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqrdmlsh        z0\.s, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdmlsh_lane_z16_s32, svint32_t, svint32_t, z16,
+                   z0 = svqrdmlsh_lane_s32 (z0, z1, z16, 1),
+                   z0 = svqrdmlsh_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_lane_s64.c
new file mode 100644 (file)
index 0000000..abebec1
--- /dev/null
@@ -0,0 +1,74 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmlsh_lane_0_s64_tied1:
+**     sqrdmlsh        z0\.d, z1\.d, z2\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_0_s64_tied1, svint64_t,
+               z0 = svqrdmlsh_lane_s64 (z0, z1, z2, 0),
+               z0 = svqrdmlsh_lane (z0, z1, z2, 0))
+
+/*
+** qrdmlsh_lane_0_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.d, \1, z2\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_0_s64_tied2, svint64_t,
+               z0 = svqrdmlsh_lane_s64 (z1, z0, z2, 0),
+               z0 = svqrdmlsh_lane (z1, z0, z2, 0))
+
+/*
+** qrdmlsh_lane_0_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.d, z2\.d, \1\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_0_s64_tied3, svint64_t,
+               z0 = svqrdmlsh_lane_s64 (z1, z2, z0, 0),
+               z0 = svqrdmlsh_lane (z1, z2, z0, 0))
+
+/*
+** qrdmlsh_lane_0_s64_untied:
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.d, z2\.d, z3\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_0_s64_untied, svint64_t,
+               z0 = svqrdmlsh_lane_s64 (z1, z2, z3, 0),
+               z0 = svqrdmlsh_lane (z1, z2, z3, 0))
+
+/*
+** qrdmlsh_lane_1_s64:
+**     sqrdmlsh        z0\.d, z1\.d, z2\.d\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_lane_1_s64, svint64_t,
+               z0 = svqrdmlsh_lane_s64 (z0, z1, z2, 1),
+               z0 = svqrdmlsh_lane (z0, z1, z2, 1))
+
+/*
+** qrdmlsh_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     sqrdmlsh        z0\.d, z1\.d, z15\.d\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdmlsh_lane_z15_s64, svint64_t, svint64_t, z15,
+                   z0 = svqrdmlsh_lane_s64 (z0, z1, z15, 1),
+                   z0 = svqrdmlsh_lane (z0, z1, z15, 1))
+
+/*
+** qrdmlsh_lane_z16_s64:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqrdmlsh        z0\.d, z1\.d, \1\.d\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdmlsh_lane_z16_s64, svint64_t, svint64_t, z16,
+                   z0 = svqrdmlsh_lane_s64 (z0, z1, z16, 1),
+                   z0 = svqrdmlsh_lane (z0, z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_s16.c
new file mode 100644 (file)
index 0000000..eb4e810
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmlsh_s16_tied1:
+**     sqrdmlsh        z0\.h, z1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_s16_tied1, svint16_t,
+               z0 = svqrdmlsh_s16 (z0, z1, z2),
+               z0 = svqrdmlsh (z0, z1, z2))
+
+/*
+** qrdmlsh_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.h, \1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_s16_tied2, svint16_t,
+               z0 = svqrdmlsh_s16 (z1, z0, z2),
+               z0 = svqrdmlsh (z1, z0, z2))
+
+/*
+** qrdmlsh_s16_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.h, z2\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_s16_tied3, svint16_t,
+               z0 = svqrdmlsh_s16 (z1, z2, z0),
+               z0 = svqrdmlsh (z1, z2, z0))
+
+/*
+** qrdmlsh_s16_untied:
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.h, z2\.h, z3\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_s16_untied, svint16_t,
+               z0 = svqrdmlsh_s16 (z1, z2, z3),
+               z0 = svqrdmlsh (z1, z2, z3))
+
+/*
+** qrdmlsh_w0_s16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqrdmlsh        z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlsh_w0_s16_tied1, svint16_t, int16_t,
+                z0 = svqrdmlsh_n_s16 (z0, z1, x0),
+                z0 = svqrdmlsh (z0, z1, x0))
+
+/*
+** qrdmlsh_w0_s16_tied2:
+**     mov     (z[0-9]+\.h), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.h, \2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlsh_w0_s16_tied2, svint16_t, int16_t,
+                z0 = svqrdmlsh_n_s16 (z1, z0, x0),
+                z0 = svqrdmlsh (z1, z0, x0))
+
+/*
+** qrdmlsh_w0_s16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.h, z2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlsh_w0_s16_untied, svint16_t, int16_t,
+                z0 = svqrdmlsh_n_s16 (z1, z2, x0),
+                z0 = svqrdmlsh (z1, z2, x0))
+
+/*
+** qrdmlsh_11_s16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     sqrdmlsh        z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_11_s16_tied1, svint16_t,
+               z0 = svqrdmlsh_n_s16 (z0, z1, 11),
+               z0 = svqrdmlsh (z0, z1, 11))
+
+/*
+** qrdmlsh_11_s16_tied2:
+**     mov     (z[0-9]+\.h), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.h, \2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_11_s16_tied2, svint16_t,
+               z0 = svqrdmlsh_n_s16 (z1, z0, 11),
+               z0 = svqrdmlsh (z1, z0, 11))
+
+/*
+** qrdmlsh_11_s16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.h, z2\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_11_s16_untied, svint16_t,
+               z0 = svqrdmlsh_n_s16 (z1, z2, 11),
+               z0 = svqrdmlsh (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_s32.c
new file mode 100644 (file)
index 0000000..25ba965
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmlsh_s32_tied1:
+**     sqrdmlsh        z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_s32_tied1, svint32_t,
+               z0 = svqrdmlsh_s32 (z0, z1, z2),
+               z0 = svqrdmlsh (z0, z1, z2))
+
+/*
+** qrdmlsh_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.s, \1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_s32_tied2, svint32_t,
+               z0 = svqrdmlsh_s32 (z1, z0, z2),
+               z0 = svqrdmlsh (z1, z0, z2))
+
+/*
+** qrdmlsh_s32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.s, z2\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_s32_tied3, svint32_t,
+               z0 = svqrdmlsh_s32 (z1, z2, z0),
+               z0 = svqrdmlsh (z1, z2, z0))
+
+/*
+** qrdmlsh_s32_untied:
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.s, z2\.s, z3\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_s32_untied, svint32_t,
+               z0 = svqrdmlsh_s32 (z1, z2, z3),
+               z0 = svqrdmlsh (z1, z2, z3))
+
+/*
+** qrdmlsh_w0_s32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqrdmlsh        z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlsh_w0_s32_tied1, svint32_t, int32_t,
+                z0 = svqrdmlsh_n_s32 (z0, z1, x0),
+                z0 = svqrdmlsh (z0, z1, x0))
+
+/*
+** qrdmlsh_w0_s32_tied2:
+**     mov     (z[0-9]+\.s), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlsh_w0_s32_tied2, svint32_t, int32_t,
+                z0 = svqrdmlsh_n_s32 (z1, z0, x0),
+                z0 = svqrdmlsh (z1, z0, x0))
+
+/*
+** qrdmlsh_w0_s32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlsh_w0_s32_untied, svint32_t, int32_t,
+                z0 = svqrdmlsh_n_s32 (z1, z2, x0),
+                z0 = svqrdmlsh (z1, z2, x0))
+
+/*
+** qrdmlsh_11_s32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     sqrdmlsh        z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_11_s32_tied1, svint32_t,
+               z0 = svqrdmlsh_n_s32 (z0, z1, 11),
+               z0 = svqrdmlsh (z0, z1, 11))
+
+/*
+** qrdmlsh_11_s32_tied2:
+**     mov     (z[0-9]+\.s), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_11_s32_tied2, svint32_t,
+               z0 = svqrdmlsh_n_s32 (z1, z0, 11),
+               z0 = svqrdmlsh (z1, z0, 11))
+
+/*
+** qrdmlsh_11_s32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_11_s32_untied, svint32_t,
+               z0 = svqrdmlsh_n_s32 (z1, z2, 11),
+               z0 = svqrdmlsh (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_s64.c
new file mode 100644 (file)
index 0000000..71ca2c2
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmlsh_s64_tied1:
+**     sqrdmlsh        z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_s64_tied1, svint64_t,
+               z0 = svqrdmlsh_s64 (z0, z1, z2),
+               z0 = svqrdmlsh (z0, z1, z2))
+
+/*
+** qrdmlsh_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_s64_tied2, svint64_t,
+               z0 = svqrdmlsh_s64 (z1, z0, z2),
+               z0 = svqrdmlsh (z1, z0, z2))
+
+/*
+** qrdmlsh_s64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_s64_tied3, svint64_t,
+               z0 = svqrdmlsh_s64 (z1, z2, z0),
+               z0 = svqrdmlsh (z1, z2, z0))
+
+/*
+** qrdmlsh_s64_untied:
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_s64_untied, svint64_t,
+               z0 = svqrdmlsh_s64 (z1, z2, z3),
+               z0 = svqrdmlsh (z1, z2, z3))
+
+/*
+** qrdmlsh_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     sqrdmlsh        z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlsh_x0_s64_tied1, svint64_t, int64_t,
+                z0 = svqrdmlsh_n_s64 (z0, z1, x0),
+                z0 = svqrdmlsh (z0, z1, x0))
+
+/*
+** qrdmlsh_x0_s64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlsh_x0_s64_tied2, svint64_t, int64_t,
+                z0 = svqrdmlsh_n_s64 (z1, z0, x0),
+                z0 = svqrdmlsh (z1, z0, x0))
+
+/*
+** qrdmlsh_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlsh_x0_s64_untied, svint64_t, int64_t,
+                z0 = svqrdmlsh_n_s64 (z1, z2, x0),
+                z0 = svqrdmlsh (z1, z2, x0))
+
+/*
+** qrdmlsh_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     sqrdmlsh        z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_11_s64_tied1, svint64_t,
+               z0 = svqrdmlsh_n_s64 (z0, z1, 11),
+               z0 = svqrdmlsh (z0, z1, 11))
+
+/*
+** qrdmlsh_11_s64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_11_s64_tied2, svint64_t,
+               z0 = svqrdmlsh_n_s64 (z1, z0, 11),
+               z0 = svqrdmlsh (z1, z0, 11))
+
+/*
+** qrdmlsh_11_s64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_11_s64_untied, svint64_t,
+               z0 = svqrdmlsh_n_s64 (z1, z2, 11),
+               z0 = svqrdmlsh (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmlsh_s8.c
new file mode 100644 (file)
index 0000000..ecb4d85
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmlsh_s8_tied1:
+**     sqrdmlsh        z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_s8_tied1, svint8_t,
+               z0 = svqrdmlsh_s8 (z0, z1, z2),
+               z0 = svqrdmlsh (z0, z1, z2))
+
+/*
+** qrdmlsh_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.b, \1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_s8_tied2, svint8_t,
+               z0 = svqrdmlsh_s8 (z1, z0, z2),
+               z0 = svqrdmlsh (z1, z0, z2))
+
+/*
+** qrdmlsh_s8_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.b, z2\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_s8_tied3, svint8_t,
+               z0 = svqrdmlsh_s8 (z1, z2, z0),
+               z0 = svqrdmlsh (z1, z2, z0))
+
+/*
+** qrdmlsh_s8_untied:
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.b, z2\.b, z3\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_s8_untied, svint8_t,
+               z0 = svqrdmlsh_s8 (z1, z2, z3),
+               z0 = svqrdmlsh (z1, z2, z3))
+
+/*
+** qrdmlsh_w0_s8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqrdmlsh        z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlsh_w0_s8_tied1, svint8_t, int8_t,
+                z0 = svqrdmlsh_n_s8 (z0, z1, x0),
+                z0 = svqrdmlsh (z0, z1, x0))
+
+/*
+** qrdmlsh_w0_s8_tied2:
+**     mov     (z[0-9]+\.b), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.b, \2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlsh_w0_s8_tied2, svint8_t, int8_t,
+                z0 = svqrdmlsh_n_s8 (z1, z0, x0),
+                z0 = svqrdmlsh (z1, z0, x0))
+
+/*
+** qrdmlsh_w0_s8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.b, z2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmlsh_w0_s8_untied, svint8_t, int8_t,
+                z0 = svqrdmlsh_n_s8 (z1, z2, x0),
+                z0 = svqrdmlsh (z1, z2, x0))
+
+/*
+** qrdmlsh_11_s8_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     sqrdmlsh        z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_11_s8_tied1, svint8_t,
+               z0 = svqrdmlsh_n_s8 (z0, z1, 11),
+               z0 = svqrdmlsh (z0, z1, 11))
+
+/*
+** qrdmlsh_11_s8_tied2:
+**     mov     (z[0-9]+\.b), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.b, \2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_11_s8_tied2, svint8_t,
+               z0 = svqrdmlsh_n_s8 (z1, z0, 11),
+               z0 = svqrdmlsh (z1, z0, 11))
+
+/*
+** qrdmlsh_11_s8_untied:
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     sqrdmlsh        z0\.b, z2\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmlsh_11_s8_untied, svint8_t,
+               z0 = svqrdmlsh_n_s8 (z1, z2, 11),
+               z0 = svqrdmlsh (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_lane_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_lane_s16.c
new file mode 100644 (file)
index 0000000..0ae55a8
--- /dev/null
@@ -0,0 +1,115 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmulh_lane_0_s16_tied1:
+**     sqrdmulh        z0\.h, z0\.h, z1\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_0_s16_tied1, svint16_t,
+               z0 = svqrdmulh_lane_s16 (z0, z1, 0),
+               z0 = svqrdmulh_lane (z0, z1, 0))
+
+/*
+** qrdmulh_lane_0_s16_tied2:
+**     sqrdmulh        z0\.h, z1\.h, z0\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_0_s16_tied2, svint16_t,
+               z0 = svqrdmulh_lane_s16 (z1, z0, 0),
+               z0 = svqrdmulh_lane (z1, z0, 0))
+
+/*
+** qrdmulh_lane_0_s16_untied:
+**     sqrdmulh        z0\.h, z1\.h, z2\.h\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_0_s16_untied, svint16_t,
+               z0 = svqrdmulh_lane_s16 (z1, z2, 0),
+               z0 = svqrdmulh_lane (z1, z2, 0))
+
+/*
+** qrdmulh_lane_1_s16:
+**     sqrdmulh        z0\.h, z1\.h, z2\.h\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_1_s16, svint16_t,
+               z0 = svqrdmulh_lane_s16 (z1, z2, 1),
+               z0 = svqrdmulh_lane (z1, z2, 1))
+
+/*
+** qrdmulh_lane_2_s16:
+**     sqrdmulh        z0\.h, z1\.h, z2\.h\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_2_s16, svint16_t,
+               z0 = svqrdmulh_lane_s16 (z1, z2, 2),
+               z0 = svqrdmulh_lane (z1, z2, 2))
+
+/*
+** qrdmulh_lane_3_s16:
+**     sqrdmulh        z0\.h, z1\.h, z2\.h\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_3_s16, svint16_t,
+               z0 = svqrdmulh_lane_s16 (z1, z2, 3),
+               z0 = svqrdmulh_lane (z1, z2, 3))
+
+/*
+** qrdmulh_lane_4_s16:
+**     sqrdmulh        z0\.h, z1\.h, z2\.h\[4\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_4_s16, svint16_t,
+               z0 = svqrdmulh_lane_s16 (z1, z2, 4),
+               z0 = svqrdmulh_lane (z1, z2, 4))
+
+/*
+** qrdmulh_lane_5_s16:
+**     sqrdmulh        z0\.h, z1\.h, z2\.h\[5\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_5_s16, svint16_t,
+               z0 = svqrdmulh_lane_s16 (z1, z2, 5),
+               z0 = svqrdmulh_lane (z1, z2, 5))
+
+/*
+** qrdmulh_lane_6_s16:
+**     sqrdmulh        z0\.h, z1\.h, z2\.h\[6\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_6_s16, svint16_t,
+               z0 = svqrdmulh_lane_s16 (z1, z2, 6),
+               z0 = svqrdmulh_lane (z1, z2, 6))
+
+/*
+** qrdmulh_lane_7_s16:
+**     sqrdmulh        z0\.h, z1\.h, z2\.h\[7\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_7_s16, svint16_t,
+               z0 = svqrdmulh_lane_s16 (z1, z2, 7),
+               z0 = svqrdmulh_lane (z1, z2, 7))
+
+/*
+** qrdmulh_lane_z8_s16:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     sqrdmulh        z0\.h, z1\.h, \1\.h\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdmulh_lane_z8_s16, svint16_t, svint16_t, z8,
+                   z0 = svqrdmulh_lane_s16 (z1, z8, 1),
+                   z0 = svqrdmulh_lane (z1, z8, 1))
+
+/*
+** qrdmulh_lane_z16_s16:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqrdmulh        z0\.h, z1\.h, \1\.h\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdmulh_lane_z16_s16, svint16_t, svint16_t, z16,
+                   z0 = svqrdmulh_lane_s16 (z1, z16, 1),
+                   z0 = svqrdmulh_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_lane_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_lane_s32.c
new file mode 100644 (file)
index 0000000..38eb7cf
--- /dev/null
@@ -0,0 +1,79 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmulh_lane_0_s32_tied1:
+**     sqrdmulh        z0\.s, z0\.s, z1\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_0_s32_tied1, svint32_t,
+               z0 = svqrdmulh_lane_s32 (z0, z1, 0),
+               z0 = svqrdmulh_lane (z0, z1, 0))
+
+/*
+** qrdmulh_lane_0_s32_tied2:
+**     sqrdmulh        z0\.s, z1\.s, z0\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_0_s32_tied2, svint32_t,
+               z0 = svqrdmulh_lane_s32 (z1, z0, 0),
+               z0 = svqrdmulh_lane (z1, z0, 0))
+
+/*
+** qrdmulh_lane_0_s32_untied:
+**     sqrdmulh        z0\.s, z1\.s, z2\.s\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_0_s32_untied, svint32_t,
+               z0 = svqrdmulh_lane_s32 (z1, z2, 0),
+               z0 = svqrdmulh_lane (z1, z2, 0))
+
+/*
+** qrdmulh_lane_1_s32:
+**     sqrdmulh        z0\.s, z1\.s, z2\.s\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_1_s32, svint32_t,
+               z0 = svqrdmulh_lane_s32 (z1, z2, 1),
+               z0 = svqrdmulh_lane (z1, z2, 1))
+
+/*
+** qrdmulh_lane_2_s32:
+**     sqrdmulh        z0\.s, z1\.s, z2\.s\[2\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_2_s32, svint32_t,
+               z0 = svqrdmulh_lane_s32 (z1, z2, 2),
+               z0 = svqrdmulh_lane (z1, z2, 2))
+
+/*
+** qrdmulh_lane_3_s32:
+**     sqrdmulh        z0\.s, z1\.s, z2\.s\[3\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_3_s32, svint32_t,
+               z0 = svqrdmulh_lane_s32 (z1, z2, 3),
+               z0 = svqrdmulh_lane (z1, z2, 3))
+
+/*
+** qrdmulh_lane_z8_s32:
+**     str     d8, \[sp, -16\]!
+**     mov     (z[0-7])\.d, z8\.d
+**     sqrdmulh        z0\.s, z1\.s, \1\.s\[1\]
+**     ldr     d8, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdmulh_lane_z8_s32, svint32_t, svint32_t, z8,
+                   z0 = svqrdmulh_lane_s32 (z1, z8, 1),
+                   z0 = svqrdmulh_lane (z1, z8, 1))
+
+/*
+** qrdmulh_lane_z16_s32:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqrdmulh        z0\.s, z1\.s, \1\.s\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdmulh_lane_z16_s32, svint32_t, svint32_t, z16,
+                   z0 = svqrdmulh_lane_s32 (z1, z16, 1),
+                   z0 = svqrdmulh_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_lane_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_lane_s64.c
new file mode 100644 (file)
index 0000000..45416f2
--- /dev/null
@@ -0,0 +1,60 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmulh_lane_0_s64_tied1:
+**     sqrdmulh        z0\.d, z0\.d, z1\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_0_s64_tied1, svint64_t,
+               z0 = svqrdmulh_lane_s64 (z0, z1, 0),
+               z0 = svqrdmulh_lane (z0, z1, 0))
+
+/*
+** qrdmulh_lane_0_s64_tied2:
+**     sqrdmulh        z0\.d, z1\.d, z0\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_0_s64_tied2, svint64_t,
+               z0 = svqrdmulh_lane_s64 (z1, z0, 0),
+               z0 = svqrdmulh_lane (z1, z0, 0))
+
+/*
+** qrdmulh_lane_0_s64_untied:
+**     sqrdmulh        z0\.d, z1\.d, z2\.d\[0\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_0_s64_untied, svint64_t,
+               z0 = svqrdmulh_lane_s64 (z1, z2, 0),
+               z0 = svqrdmulh_lane (z1, z2, 0))
+
+/*
+** qrdmulh_lane_1_s64:
+**     sqrdmulh        z0\.d, z1\.d, z2\.d\[1\]
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_lane_1_s64, svint64_t,
+               z0 = svqrdmulh_lane_s64 (z1, z2, 1),
+               z0 = svqrdmulh_lane (z1, z2, 1))
+
+/*
+** qrdmulh_lane_z15_s64:
+**     str     d15, \[sp, -16\]!
+**     sqrdmulh        z0\.d, z1\.d, z15\.d\[1\]
+**     ldr     d15, \[sp\], 16
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdmulh_lane_z15_s64, svint64_t, svint64_t, z15,
+                   z0 = svqrdmulh_lane_s64 (z1, z15, 1),
+                   z0 = svqrdmulh_lane (z1, z15, 1))
+
+/*
+** qrdmulh_lane_z16_s64:
+**     mov     (z[0-7])\.d, z16\.d
+**     sqrdmulh        z0\.d, z1\.d, \1\.d\[1\]
+**     ret
+*/
+TEST_DUAL_LANE_REG (qrdmulh_lane_z16_s64, svint64_t, svint64_t, z16,
+                   z0 = svqrdmulh_lane_s64 (z1, z16, 1),
+                   z0 = svqrdmulh_lane (z1, z16, 1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_s16.c
new file mode 100644 (file)
index 0000000..86c49fa
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmulh_s16_tied1:
+**     sqrdmulh        z0\.h, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_s16_tied1, svint16_t,
+               z0 = svqrdmulh_s16 (z0, z1),
+               z0 = svqrdmulh (z0, z1))
+
+/*
+** qrdmulh_s16_tied2:
+**     sqrdmulh        z0\.h, z1\.h, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_s16_tied2, svint16_t,
+               z0 = svqrdmulh_s16 (z1, z0),
+               z0 = svqrdmulh (z1, z0))
+
+/*
+** qrdmulh_s16_untied:
+**     sqrdmulh        z0\.h, z1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_s16_untied, svint16_t,
+               z0 = svqrdmulh_s16 (z1, z2),
+               z0 = svqrdmulh (z1, z2))
+
+/*
+** qrdmulh_w0_s16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqrdmulh        z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmulh_w0_s16_tied1, svint16_t, int16_t,
+                z0 = svqrdmulh_n_s16 (z0, x0),
+                z0 = svqrdmulh (z0, x0))
+
+/*
+** qrdmulh_w0_s16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     sqrdmulh        z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmulh_w0_s16_untied, svint16_t, int16_t,
+                z0 = svqrdmulh_n_s16 (z1, x0),
+                z0 = svqrdmulh (z1, x0))
+
+/*
+** qrdmulh_11_s16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     sqrdmulh        z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_11_s16_tied1, svint16_t,
+               z0 = svqrdmulh_n_s16 (z0, 11),
+               z0 = svqrdmulh (z0, 11))
+
+/*
+** qrdmulh_11_s16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     sqrdmulh        z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_11_s16_untied, svint16_t,
+               z0 = svqrdmulh_n_s16 (z1, 11),
+               z0 = svqrdmulh (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_s32.c
new file mode 100644 (file)
index 0000000..7aba428
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmulh_s32_tied1:
+**     sqrdmulh        z0\.s, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_s32_tied1, svint32_t,
+               z0 = svqrdmulh_s32 (z0, z1),
+               z0 = svqrdmulh (z0, z1))
+
+/*
+** qrdmulh_s32_tied2:
+**     sqrdmulh        z0\.s, z1\.s, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_s32_tied2, svint32_t,
+               z0 = svqrdmulh_s32 (z1, z0),
+               z0 = svqrdmulh (z1, z0))
+
+/*
+** qrdmulh_s32_untied:
+**     sqrdmulh        z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_s32_untied, svint32_t,
+               z0 = svqrdmulh_s32 (z1, z2),
+               z0 = svqrdmulh (z1, z2))
+
+/*
+** qrdmulh_w0_s32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqrdmulh        z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmulh_w0_s32_tied1, svint32_t, int32_t,
+                z0 = svqrdmulh_n_s32 (z0, x0),
+                z0 = svqrdmulh (z0, x0))
+
+/*
+** qrdmulh_w0_s32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     sqrdmulh        z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmulh_w0_s32_untied, svint32_t, int32_t,
+                z0 = svqrdmulh_n_s32 (z1, x0),
+                z0 = svqrdmulh (z1, x0))
+
+/*
+** qrdmulh_11_s32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     sqrdmulh        z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_11_s32_tied1, svint32_t,
+               z0 = svqrdmulh_n_s32 (z0, 11),
+               z0 = svqrdmulh (z0, 11))
+
+/*
+** qrdmulh_11_s32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     sqrdmulh        z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_11_s32_untied, svint32_t,
+               z0 = svqrdmulh_n_s32 (z1, 11),
+               z0 = svqrdmulh (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_s64.c
new file mode 100644 (file)
index 0000000..f5920a4
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmulh_s64_tied1:
+**     sqrdmulh        z0\.d, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_s64_tied1, svint64_t,
+               z0 = svqrdmulh_s64 (z0, z1),
+               z0 = svqrdmulh (z0, z1))
+
+/*
+** qrdmulh_s64_tied2:
+**     sqrdmulh        z0\.d, z1\.d, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_s64_tied2, svint64_t,
+               z0 = svqrdmulh_s64 (z1, z0),
+               z0 = svqrdmulh (z1, z0))
+
+/*
+** qrdmulh_s64_untied:
+**     sqrdmulh        z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_s64_untied, svint64_t,
+               z0 = svqrdmulh_s64 (z1, z2),
+               z0 = svqrdmulh (z1, z2))
+
+/*
+** qrdmulh_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     sqrdmulh        z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmulh_x0_s64_tied1, svint64_t, int64_t,
+                z0 = svqrdmulh_n_s64 (z0, x0),
+                z0 = svqrdmulh (z0, x0))
+
+/*
+** qrdmulh_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     sqrdmulh        z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmulh_x0_s64_untied, svint64_t, int64_t,
+                z0 = svqrdmulh_n_s64 (z1, x0),
+                z0 = svqrdmulh (z1, x0))
+
+/*
+** qrdmulh_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     sqrdmulh        z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_11_s64_tied1, svint64_t,
+               z0 = svqrdmulh_n_s64 (z0, 11),
+               z0 = svqrdmulh (z0, 11))
+
+/*
+** qrdmulh_11_s64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     sqrdmulh        z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_11_s64_untied, svint64_t,
+               z0 = svqrdmulh_n_s64 (z1, 11),
+               z0 = svqrdmulh (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrdmulh_s8.c
new file mode 100644 (file)
index 0000000..37cafcf
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrdmulh_s8_tied1:
+**     sqrdmulh        z0\.b, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_s8_tied1, svint8_t,
+               z0 = svqrdmulh_s8 (z0, z1),
+               z0 = svqrdmulh (z0, z1))
+
+/*
+** qrdmulh_s8_tied2:
+**     sqrdmulh        z0\.b, z1\.b, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_s8_tied2, svint8_t,
+               z0 = svqrdmulh_s8 (z1, z0),
+               z0 = svqrdmulh (z1, z0))
+
+/*
+** qrdmulh_s8_untied:
+**     sqrdmulh        z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_s8_untied, svint8_t,
+               z0 = svqrdmulh_s8 (z1, z2),
+               z0 = svqrdmulh (z1, z2))
+
+/*
+** qrdmulh_w0_s8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqrdmulh        z0\.b, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmulh_w0_s8_tied1, svint8_t, int8_t,
+                z0 = svqrdmulh_n_s8 (z0, x0),
+                z0 = svqrdmulh (z0, x0))
+
+/*
+** qrdmulh_w0_s8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     sqrdmulh        z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrdmulh_w0_s8_untied, svint8_t, int8_t,
+                z0 = svqrdmulh_n_s8 (z1, x0),
+                z0 = svqrdmulh (z1, x0))
+
+/*
+** qrdmulh_11_s8_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     sqrdmulh        z0\.b, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_11_s8_tied1, svint8_t,
+               z0 = svqrdmulh_n_s8 (z0, 11),
+               z0 = svqrdmulh (z0, 11))
+
+/*
+** qrdmulh_11_s8_untied:
+**     mov     (z[0-9]+\.b), #11
+**     sqrdmulh        z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qrdmulh_11_s8_untied, svint8_t,
+               z0 = svqrdmulh_n_s8 (z1, 11),
+               z0 = svqrdmulh (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_s16.c
new file mode 100644 (file)
index 0000000..f3b8f54
--- /dev/null
@@ -0,0 +1,397 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshl_s16_m_tied1:
+**     sqrshl  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s16_m_tied1, svint16_t, svint16_t,
+            z0 = svqrshl_s16_m (p0, z0, z4),
+            z0 = svqrshl_m (p0, z0, z4))
+
+/*
+** qrshl_s16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqrshl  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_s16_m_tied2, svint16_t, svint16_t,
+                z0_res = svqrshl_s16_m (p0, z4, z0),
+                z0_res = svqrshl_m (p0, z4, z0))
+
+/*
+** qrshl_s16_m_untied:
+**     movprfx z0, z1
+**     sqrshl  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s16_m_untied, svint16_t, svint16_t,
+            z0 = svqrshl_s16_m (p0, z1, z4),
+            z0 = svqrshl_m (p0, z1, z4))
+
+/*
+** qrshl_w0_s16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqrshl  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_s16_m_tied1, svint16_t, int16_t,
+                z0 = svqrshl_n_s16_m (p0, z0, x0),
+                z0 = svqrshl_m (p0, z0, x0))
+
+/*
+** qrshl_w0_s16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     sqrshl  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_s16_m_untied, svint16_t, int16_t,
+                z0 = svqrshl_n_s16_m (p0, z1, x0),
+                z0 = svqrshl_m (p0, z1, x0))
+
+/*
+** qrshl_m16_s16_m:
+**     srshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m16_s16_m, svint16_t,
+               z0 = svqrshl_n_s16_m (p0, z0, -16),
+               z0 = svqrshl_m (p0, z0, -16))
+
+/*
+** qrshl_m2_s16_m:
+**     srshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_s16_m, svint16_t,
+               z0 = svqrshl_n_s16_m (p0, z0, -2),
+               z0 = svqrshl_m (p0, z0, -2))
+
+/*
+** qrshl_m1_s16_m_tied1:
+**     srshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s16_m_tied1, svint16_t,
+               z0 = svqrshl_n_s16_m (p0, z0, -1),
+               z0 = svqrshl_m (p0, z0, -1))
+
+/*
+** qrshl_m1_s16_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s16_m_untied, svint16_t,
+               z0 = svqrshl_n_s16_m (p0, z1, -1),
+               z0 = svqrshl_m (p0, z1, -1))
+
+/*
+** qrshl_1_s16_m_tied1:
+**     sqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s16_m_tied1, svint16_t,
+               z0 = svqrshl_n_s16_m (p0, z0, 1),
+               z0 = svqrshl_m (p0, z0, 1))
+
+/*
+** qrshl_1_s16_m_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s16_m_untied, svint16_t,
+               z0 = svqrshl_n_s16_m (p0, z1, 1),
+               z0 = svqrshl_m (p0, z1, 1))
+
+/*
+** qrshl_2_s16_m:
+**     sqshl   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_s16_m, svint16_t,
+               z0 = svqrshl_n_s16_m (p0, z0, 2),
+               z0 = svqrshl_m (p0, z0, 2))
+
+/*
+** qrshl_15_s16_m:
+**     sqshl   z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_15_s16_m, svint16_t,
+               z0 = svqrshl_n_s16_m (p0, z0, 15),
+               z0 = svqrshl_m (p0, z0, 15))
+
+/*
+** qrshl_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqrshl  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s16_z_tied1, svint16_t, svint16_t,
+            z0 = svqrshl_s16_z (p0, z0, z4),
+            z0 = svqrshl_z (p0, z0, z4))
+
+/*
+** qrshl_s16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqrshlr z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_s16_z_tied2, svint16_t, svint16_t,
+                z0_res = svqrshl_s16_z (p0, z4, z0),
+                z0_res = svqrshl_z (p0, z4, z0))
+
+/*
+** qrshl_s16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqrshl  z0\.h, p0/m, z0\.h, z4\.h
+** |
+**     movprfx z0\.h, p0/z, z4\.h
+**     sqrshlr z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s16_z_untied, svint16_t, svint16_t,
+            z0 = svqrshl_s16_z (p0, z1, z4),
+            z0 = svqrshl_z (p0, z1, z4))
+
+/*
+** qrshl_w0_s16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqrshl  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_s16_z_tied1, svint16_t, int16_t,
+                z0 = svqrshl_n_s16_z (p0, z0, x0),
+                z0 = svqrshl_z (p0, z0, x0))
+
+/*
+** qrshl_w0_s16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqrshl  z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     sqrshlr z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_s16_z_untied, svint16_t, int16_t,
+                z0 = svqrshl_n_s16_z (p0, z1, x0),
+                z0 = svqrshl_z (p0, z1, x0))
+
+/*
+** qrshl_m16_s16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     srshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m16_s16_z, svint16_t,
+               z0 = svqrshl_n_s16_z (p0, z0, -16),
+               z0 = svqrshl_z (p0, z0, -16))
+
+/*
+** qrshl_m2_s16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     srshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_s16_z, svint16_t,
+               z0 = svqrshl_n_s16_z (p0, z0, -2),
+               z0 = svqrshl_z (p0, z0, -2))
+
+/*
+** qrshl_m1_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     srshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s16_z_tied1, svint16_t,
+               z0 = svqrshl_n_s16_z (p0, z0, -1),
+               z0 = svqrshl_z (p0, z0, -1))
+
+/*
+** qrshl_m1_s16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     srshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s16_z_untied, svint16_t,
+               z0 = svqrshl_n_s16_z (p0, z1, -1),
+               z0 = svqrshl_z (p0, z1, -1))
+
+/*
+** qrshl_1_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s16_z_tied1, svint16_t,
+               z0 = svqrshl_n_s16_z (p0, z0, 1),
+               z0 = svqrshl_z (p0, z0, 1))
+
+/*
+** qrshl_1_s16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s16_z_untied, svint16_t,
+               z0 = svqrshl_n_s16_z (p0, z1, 1),
+               z0 = svqrshl_z (p0, z1, 1))
+
+/*
+** qrshl_2_s16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqshl   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_s16_z, svint16_t,
+               z0 = svqrshl_n_s16_z (p0, z0, 2),
+               z0 = svqrshl_z (p0, z0, 2))
+
+/*
+** qrshl_15_s16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqshl   z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_15_s16_z, svint16_t,
+               z0 = svqrshl_n_s16_z (p0, z0, 15),
+               z0 = svqrshl_z (p0, z0, 15))
+
+/*
+** qrshl_s16_x_tied1:
+**     sqrshl  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s16_x_tied1, svint16_t, svint16_t,
+            z0 = svqrshl_s16_x (p0, z0, z4),
+            z0 = svqrshl_x (p0, z0, z4))
+
+/*
+** qrshl_s16_x_tied2:
+**     sqrshlr z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_s16_x_tied2, svint16_t, svint16_t,
+                z0_res = svqrshl_s16_x (p0, z4, z0),
+                z0_res = svqrshl_x (p0, z4, z0))
+
+/*
+** qrshl_s16_x_untied:
+** (
+**     movprfx z0, z1
+**     sqrshl  z0\.h, p0/m, z0\.h, z4\.h
+** |
+**     movprfx z0, z4
+**     sqrshlr z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s16_x_untied, svint16_t, svint16_t,
+            z0 = svqrshl_s16_x (p0, z1, z4),
+            z0 = svqrshl_x (p0, z1, z4))
+
+/*
+** qrshl_w0_s16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqrshl  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_s16_x_tied1, svint16_t, int16_t,
+                z0 = svqrshl_n_s16_x (p0, z0, x0),
+                z0 = svqrshl_x (p0, z0, x0))
+
+/*
+** qrshl_w0_s16_x_untied:
+**     mov     z0\.h, w0
+**     sqrshlr z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_s16_x_untied, svint16_t, int16_t,
+                z0 = svqrshl_n_s16_x (p0, z1, x0),
+                z0 = svqrshl_x (p0, z1, x0))
+
+/*
+** qrshl_m16_s16_x:
+**     srshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m16_s16_x, svint16_t,
+               z0 = svqrshl_n_s16_x (p0, z0, -16),
+               z0 = svqrshl_x (p0, z0, -16))
+
+/*
+** qrshl_m2_s16_x:
+**     srshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_s16_x, svint16_t,
+               z0 = svqrshl_n_s16_x (p0, z0, -2),
+               z0 = svqrshl_x (p0, z0, -2))
+
+/*
+** qrshl_m1_s16_x_tied1:
+**     srshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s16_x_tied1, svint16_t,
+               z0 = svqrshl_n_s16_x (p0, z0, -1),
+               z0 = svqrshl_x (p0, z0, -1))
+
+/*
+** qrshl_m1_s16_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s16_x_untied, svint16_t,
+               z0 = svqrshl_n_s16_x (p0, z1, -1),
+               z0 = svqrshl_x (p0, z1, -1))
+
+/*
+** qrshl_1_s16_x_tied1:
+**     sqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s16_x_tied1, svint16_t,
+               z0 = svqrshl_n_s16_x (p0, z0, 1),
+               z0 = svqrshl_x (p0, z0, 1))
+
+/*
+** qrshl_1_s16_x_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s16_x_untied, svint16_t,
+               z0 = svqrshl_n_s16_x (p0, z1, 1),
+               z0 = svqrshl_x (p0, z1, 1))
+
+/*
+** qrshl_2_s16_x:
+**     sqshl   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_s16_x, svint16_t,
+               z0 = svqrshl_n_s16_x (p0, z0, 2),
+               z0 = svqrshl_x (p0, z0, 2))
+
+/*
+** qrshl_15_s16_x:
+**     sqshl   z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_15_s16_x, svint16_t,
+               z0 = svqrshl_n_s16_x (p0, z0, 15),
+               z0 = svqrshl_x (p0, z0, 15))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_s32.c
new file mode 100644 (file)
index 0000000..4d44765
--- /dev/null
@@ -0,0 +1,397 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshl_s32_m_tied1:
+**     sqrshl  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s32_m_tied1, svint32_t, svint32_t,
+            z0 = svqrshl_s32_m (p0, z0, z4),
+            z0 = svqrshl_m (p0, z0, z4))
+
+/*
+** qrshl_s32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqrshl  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_s32_m_tied2, svint32_t, svint32_t,
+                z0_res = svqrshl_s32_m (p0, z4, z0),
+                z0_res = svqrshl_m (p0, z4, z0))
+
+/*
+** qrshl_s32_m_untied:
+**     movprfx z0, z1
+**     sqrshl  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s32_m_untied, svint32_t, svint32_t,
+            z0 = svqrshl_s32_m (p0, z1, z4),
+            z0 = svqrshl_m (p0, z1, z4))
+
+/*
+** qrshl_w0_s32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqrshl  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_s32_m_tied1, svint32_t, int32_t,
+                z0 = svqrshl_n_s32_m (p0, z0, x0),
+                z0 = svqrshl_m (p0, z0, x0))
+
+/*
+** qrshl_w0_s32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     sqrshl  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_s32_m_untied, svint32_t, int32_t,
+                z0 = svqrshl_n_s32_m (p0, z1, x0),
+                z0 = svqrshl_m (p0, z1, x0))
+
+/*
+** qrshl_m32_s32_m:
+**     srshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m32_s32_m, svint32_t,
+               z0 = svqrshl_n_s32_m (p0, z0, -32),
+               z0 = svqrshl_m (p0, z0, -32))
+
+/*
+** qrshl_m2_s32_m:
+**     srshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_s32_m, svint32_t,
+               z0 = svqrshl_n_s32_m (p0, z0, -2),
+               z0 = svqrshl_m (p0, z0, -2))
+
+/*
+** qrshl_m1_s32_m_tied1:
+**     srshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s32_m_tied1, svint32_t,
+               z0 = svqrshl_n_s32_m (p0, z0, -1),
+               z0 = svqrshl_m (p0, z0, -1))
+
+/*
+** qrshl_m1_s32_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s32_m_untied, svint32_t,
+               z0 = svqrshl_n_s32_m (p0, z1, -1),
+               z0 = svqrshl_m (p0, z1, -1))
+
+/*
+** qrshl_1_s32_m_tied1:
+**     sqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s32_m_tied1, svint32_t,
+               z0 = svqrshl_n_s32_m (p0, z0, 1),
+               z0 = svqrshl_m (p0, z0, 1))
+
+/*
+** qrshl_1_s32_m_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s32_m_untied, svint32_t,
+               z0 = svqrshl_n_s32_m (p0, z1, 1),
+               z0 = svqrshl_m (p0, z1, 1))
+
+/*
+** qrshl_2_s32_m:
+**     sqshl   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_s32_m, svint32_t,
+               z0 = svqrshl_n_s32_m (p0, z0, 2),
+               z0 = svqrshl_m (p0, z0, 2))
+
+/*
+** qrshl_31_s32_m:
+**     sqshl   z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_31_s32_m, svint32_t,
+               z0 = svqrshl_n_s32_m (p0, z0, 31),
+               z0 = svqrshl_m (p0, z0, 31))
+
+/*
+** qrshl_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqrshl  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s32_z_tied1, svint32_t, svint32_t,
+            z0 = svqrshl_s32_z (p0, z0, z4),
+            z0 = svqrshl_z (p0, z0, z4))
+
+/*
+** qrshl_s32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqrshlr z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_s32_z_tied2, svint32_t, svint32_t,
+                z0_res = svqrshl_s32_z (p0, z4, z0),
+                z0_res = svqrshl_z (p0, z4, z0))
+
+/*
+** qrshl_s32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqrshl  z0\.s, p0/m, z0\.s, z4\.s
+** |
+**     movprfx z0\.s, p0/z, z4\.s
+**     sqrshlr z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s32_z_untied, svint32_t, svint32_t,
+            z0 = svqrshl_s32_z (p0, z1, z4),
+            z0 = svqrshl_z (p0, z1, z4))
+
+/*
+** qrshl_w0_s32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqrshl  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_s32_z_tied1, svint32_t, int32_t,
+                z0 = svqrshl_n_s32_z (p0, z0, x0),
+                z0 = svqrshl_z (p0, z0, x0))
+
+/*
+** qrshl_w0_s32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqrshl  z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     sqrshlr z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_s32_z_untied, svint32_t, int32_t,
+                z0 = svqrshl_n_s32_z (p0, z1, x0),
+                z0 = svqrshl_z (p0, z1, x0))
+
+/*
+** qrshl_m32_s32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     srshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m32_s32_z, svint32_t,
+               z0 = svqrshl_n_s32_z (p0, z0, -32),
+               z0 = svqrshl_z (p0, z0, -32))
+
+/*
+** qrshl_m2_s32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     srshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_s32_z, svint32_t,
+               z0 = svqrshl_n_s32_z (p0, z0, -2),
+               z0 = svqrshl_z (p0, z0, -2))
+
+/*
+** qrshl_m1_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     srshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s32_z_tied1, svint32_t,
+               z0 = svqrshl_n_s32_z (p0, z0, -1),
+               z0 = svqrshl_z (p0, z0, -1))
+
+/*
+** qrshl_m1_s32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     srshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s32_z_untied, svint32_t,
+               z0 = svqrshl_n_s32_z (p0, z1, -1),
+               z0 = svqrshl_z (p0, z1, -1))
+
+/*
+** qrshl_1_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s32_z_tied1, svint32_t,
+               z0 = svqrshl_n_s32_z (p0, z0, 1),
+               z0 = svqrshl_z (p0, z0, 1))
+
+/*
+** qrshl_1_s32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s32_z_untied, svint32_t,
+               z0 = svqrshl_n_s32_z (p0, z1, 1),
+               z0 = svqrshl_z (p0, z1, 1))
+
+/*
+** qrshl_2_s32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqshl   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_s32_z, svint32_t,
+               z0 = svqrshl_n_s32_z (p0, z0, 2),
+               z0 = svqrshl_z (p0, z0, 2))
+
+/*
+** qrshl_31_s32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqshl   z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_31_s32_z, svint32_t,
+               z0 = svqrshl_n_s32_z (p0, z0, 31),
+               z0 = svqrshl_z (p0, z0, 31))
+
+/*
+** qrshl_s32_x_tied1:
+**     sqrshl  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s32_x_tied1, svint32_t, svint32_t,
+            z0 = svqrshl_s32_x (p0, z0, z4),
+            z0 = svqrshl_x (p0, z0, z4))
+
+/*
+** qrshl_s32_x_tied2:
+**     sqrshlr z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_s32_x_tied2, svint32_t, svint32_t,
+                z0_res = svqrshl_s32_x (p0, z4, z0),
+                z0_res = svqrshl_x (p0, z4, z0))
+
+/*
+** qrshl_s32_x_untied:
+** (
+**     movprfx z0, z1
+**     sqrshl  z0\.s, p0/m, z0\.s, z4\.s
+** |
+**     movprfx z0, z4
+**     sqrshlr z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s32_x_untied, svint32_t, svint32_t,
+            z0 = svqrshl_s32_x (p0, z1, z4),
+            z0 = svqrshl_x (p0, z1, z4))
+
+/*
+** qrshl_w0_s32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqrshl  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_s32_x_tied1, svint32_t, int32_t,
+                z0 = svqrshl_n_s32_x (p0, z0, x0),
+                z0 = svqrshl_x (p0, z0, x0))
+
+/*
+** qrshl_w0_s32_x_untied:
+**     mov     z0\.s, w0
+**     sqrshlr z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_s32_x_untied, svint32_t, int32_t,
+                z0 = svqrshl_n_s32_x (p0, z1, x0),
+                z0 = svqrshl_x (p0, z1, x0))
+
+/*
+** qrshl_m32_s32_x:
+**     srshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m32_s32_x, svint32_t,
+               z0 = svqrshl_n_s32_x (p0, z0, -32),
+               z0 = svqrshl_x (p0, z0, -32))
+
+/*
+** qrshl_m2_s32_x:
+**     srshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_s32_x, svint32_t,
+               z0 = svqrshl_n_s32_x (p0, z0, -2),
+               z0 = svqrshl_x (p0, z0, -2))
+
+/*
+** qrshl_m1_s32_x_tied1:
+**     srshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s32_x_tied1, svint32_t,
+               z0 = svqrshl_n_s32_x (p0, z0, -1),
+               z0 = svqrshl_x (p0, z0, -1))
+
+/*
+** qrshl_m1_s32_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s32_x_untied, svint32_t,
+               z0 = svqrshl_n_s32_x (p0, z1, -1),
+               z0 = svqrshl_x (p0, z1, -1))
+
+/*
+** qrshl_1_s32_x_tied1:
+**     sqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s32_x_tied1, svint32_t,
+               z0 = svqrshl_n_s32_x (p0, z0, 1),
+               z0 = svqrshl_x (p0, z0, 1))
+
+/*
+** qrshl_1_s32_x_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s32_x_untied, svint32_t,
+               z0 = svqrshl_n_s32_x (p0, z1, 1),
+               z0 = svqrshl_x (p0, z1, 1))
+
+/*
+** qrshl_2_s32_x:
+**     sqshl   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_s32_x, svint32_t,
+               z0 = svqrshl_n_s32_x (p0, z0, 2),
+               z0 = svqrshl_x (p0, z0, 2))
+
+/*
+** qrshl_31_s32_x:
+**     sqshl   z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_31_s32_x, svint32_t,
+               z0 = svqrshl_n_s32_x (p0, z0, 31),
+               z0 = svqrshl_x (p0, z0, 31))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_s64.c
new file mode 100644 (file)
index 0000000..7a9cf5f
--- /dev/null
@@ -0,0 +1,397 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshl_s64_m_tied1:
+**     sqrshl  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s64_m_tied1, svint64_t, svint64_t,
+            z0 = svqrshl_s64_m (p0, z0, z4),
+            z0 = svqrshl_m (p0, z0, z4))
+
+/*
+** qrshl_s64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z4
+**     sqrshl  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_s64_m_tied2, svint64_t, svint64_t,
+                z0_res = svqrshl_s64_m (p0, z4, z0),
+                z0_res = svqrshl_m (p0, z4, z0))
+
+/*
+** qrshl_s64_m_untied:
+**     movprfx z0, z1
+**     sqrshl  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s64_m_untied, svint64_t, svint64_t,
+            z0 = svqrshl_s64_m (p0, z1, z4),
+            z0 = svqrshl_m (p0, z1, z4))
+
+/*
+** qrshl_x0_s64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     sqrshl  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_x0_s64_m_tied1, svint64_t, int64_t,
+                z0 = svqrshl_n_s64_m (p0, z0, x0),
+                z0 = svqrshl_m (p0, z0, x0))
+
+/*
+** qrshl_x0_s64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     sqrshl  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_x0_s64_m_untied, svint64_t, int64_t,
+                z0 = svqrshl_n_s64_m (p0, z1, x0),
+                z0 = svqrshl_m (p0, z1, x0))
+
+/*
+** qrshl_m64_s64_m:
+**     srshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m64_s64_m, svint64_t,
+               z0 = svqrshl_n_s64_m (p0, z0, -64),
+               z0 = svqrshl_m (p0, z0, -64))
+
+/*
+** qrshl_m2_s64_m:
+**     srshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_s64_m, svint64_t,
+               z0 = svqrshl_n_s64_m (p0, z0, -2),
+               z0 = svqrshl_m (p0, z0, -2))
+
+/*
+** qrshl_m1_s64_m_tied1:
+**     srshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s64_m_tied1, svint64_t,
+               z0 = svqrshl_n_s64_m (p0, z0, -1),
+               z0 = svqrshl_m (p0, z0, -1))
+
+/*
+** qrshl_m1_s64_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s64_m_untied, svint64_t,
+               z0 = svqrshl_n_s64_m (p0, z1, -1),
+               z0 = svqrshl_m (p0, z1, -1))
+
+/*
+** qrshl_1_s64_m_tied1:
+**     sqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s64_m_tied1, svint64_t,
+               z0 = svqrshl_n_s64_m (p0, z0, 1),
+               z0 = svqrshl_m (p0, z0, 1))
+
+/*
+** qrshl_1_s64_m_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s64_m_untied, svint64_t,
+               z0 = svqrshl_n_s64_m (p0, z1, 1),
+               z0 = svqrshl_m (p0, z1, 1))
+
+/*
+** qrshl_2_s64_m:
+**     sqshl   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_s64_m, svint64_t,
+               z0 = svqrshl_n_s64_m (p0, z0, 2),
+               z0 = svqrshl_m (p0, z0, 2))
+
+/*
+** qrshl_63_s64_m:
+**     sqshl   z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_63_s64_m, svint64_t,
+               z0 = svqrshl_n_s64_m (p0, z0, 63),
+               z0 = svqrshl_m (p0, z0, 63))
+
+/*
+** qrshl_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqrshl  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s64_z_tied1, svint64_t, svint64_t,
+            z0 = svqrshl_s64_z (p0, z0, z4),
+            z0 = svqrshl_z (p0, z0, z4))
+
+/*
+** qrshl_s64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqrshlr z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_s64_z_tied2, svint64_t, svint64_t,
+                z0_res = svqrshl_s64_z (p0, z4, z0),
+                z0_res = svqrshl_z (p0, z4, z0))
+
+/*
+** qrshl_s64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqrshl  z0\.d, p0/m, z0\.d, z4\.d
+** |
+**     movprfx z0\.d, p0/z, z4\.d
+**     sqrshlr z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s64_z_untied, svint64_t, svint64_t,
+            z0 = svqrshl_s64_z (p0, z1, z4),
+            z0 = svqrshl_z (p0, z1, z4))
+
+/*
+** qrshl_x0_s64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqrshl  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_x0_s64_z_tied1, svint64_t, int64_t,
+                z0 = svqrshl_n_s64_z (p0, z0, x0),
+                z0 = svqrshl_z (p0, z0, x0))
+
+/*
+** qrshl_x0_s64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqrshl  z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     sqrshlr z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_x0_s64_z_untied, svint64_t, int64_t,
+                z0 = svqrshl_n_s64_z (p0, z1, x0),
+                z0 = svqrshl_z (p0, z1, x0))
+
+/*
+** qrshl_m64_s64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     srshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m64_s64_z, svint64_t,
+               z0 = svqrshl_n_s64_z (p0, z0, -64),
+               z0 = svqrshl_z (p0, z0, -64))
+
+/*
+** qrshl_m2_s64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     srshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_s64_z, svint64_t,
+               z0 = svqrshl_n_s64_z (p0, z0, -2),
+               z0 = svqrshl_z (p0, z0, -2))
+
+/*
+** qrshl_m1_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     srshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s64_z_tied1, svint64_t,
+               z0 = svqrshl_n_s64_z (p0, z0, -1),
+               z0 = svqrshl_z (p0, z0, -1))
+
+/*
+** qrshl_m1_s64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     srshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s64_z_untied, svint64_t,
+               z0 = svqrshl_n_s64_z (p0, z1, -1),
+               z0 = svqrshl_z (p0, z1, -1))
+
+/*
+** qrshl_1_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s64_z_tied1, svint64_t,
+               z0 = svqrshl_n_s64_z (p0, z0, 1),
+               z0 = svqrshl_z (p0, z0, 1))
+
+/*
+** qrshl_1_s64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s64_z_untied, svint64_t,
+               z0 = svqrshl_n_s64_z (p0, z1, 1),
+               z0 = svqrshl_z (p0, z1, 1))
+
+/*
+** qrshl_2_s64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqshl   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_s64_z, svint64_t,
+               z0 = svqrshl_n_s64_z (p0, z0, 2),
+               z0 = svqrshl_z (p0, z0, 2))
+
+/*
+** qrshl_63_s64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqshl   z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_63_s64_z, svint64_t,
+               z0 = svqrshl_n_s64_z (p0, z0, 63),
+               z0 = svqrshl_z (p0, z0, 63))
+
+/*
+** qrshl_s64_x_tied1:
+**     sqrshl  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s64_x_tied1, svint64_t, svint64_t,
+            z0 = svqrshl_s64_x (p0, z0, z4),
+            z0 = svqrshl_x (p0, z0, z4))
+
+/*
+** qrshl_s64_x_tied2:
+**     sqrshlr z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_s64_x_tied2, svint64_t, svint64_t,
+                z0_res = svqrshl_s64_x (p0, z4, z0),
+                z0_res = svqrshl_x (p0, z4, z0))
+
+/*
+** qrshl_s64_x_untied:
+** (
+**     movprfx z0, z1
+**     sqrshl  z0\.d, p0/m, z0\.d, z4\.d
+** |
+**     movprfx z0, z4
+**     sqrshlr z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s64_x_untied, svint64_t, svint64_t,
+            z0 = svqrshl_s64_x (p0, z1, z4),
+            z0 = svqrshl_x (p0, z1, z4))
+
+/*
+** qrshl_x0_s64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     sqrshl  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_x0_s64_x_tied1, svint64_t, int64_t,
+                z0 = svqrshl_n_s64_x (p0, z0, x0),
+                z0 = svqrshl_x (p0, z0, x0))
+
+/*
+** qrshl_x0_s64_x_untied:
+**     mov     z0\.d, x0
+**     sqrshlr z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_x0_s64_x_untied, svint64_t, int64_t,
+                z0 = svqrshl_n_s64_x (p0, z1, x0),
+                z0 = svqrshl_x (p0, z1, x0))
+
+/*
+** qrshl_m64_s64_x:
+**     srshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m64_s64_x, svint64_t,
+               z0 = svqrshl_n_s64_x (p0, z0, -64),
+               z0 = svqrshl_x (p0, z0, -64))
+
+/*
+** qrshl_m2_s64_x:
+**     srshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_s64_x, svint64_t,
+               z0 = svqrshl_n_s64_x (p0, z0, -2),
+               z0 = svqrshl_x (p0, z0, -2))
+
+/*
+** qrshl_m1_s64_x_tied1:
+**     srshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s64_x_tied1, svint64_t,
+               z0 = svqrshl_n_s64_x (p0, z0, -1),
+               z0 = svqrshl_x (p0, z0, -1))
+
+/*
+** qrshl_m1_s64_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s64_x_untied, svint64_t,
+               z0 = svqrshl_n_s64_x (p0, z1, -1),
+               z0 = svqrshl_x (p0, z1, -1))
+
+/*
+** qrshl_1_s64_x_tied1:
+**     sqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s64_x_tied1, svint64_t,
+               z0 = svqrshl_n_s64_x (p0, z0, 1),
+               z0 = svqrshl_x (p0, z0, 1))
+
+/*
+** qrshl_1_s64_x_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s64_x_untied, svint64_t,
+               z0 = svqrshl_n_s64_x (p0, z1, 1),
+               z0 = svqrshl_x (p0, z1, 1))
+
+/*
+** qrshl_2_s64_x:
+**     sqshl   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_s64_x, svint64_t,
+               z0 = svqrshl_n_s64_x (p0, z0, 2),
+               z0 = svqrshl_x (p0, z0, 2))
+
+/*
+** qrshl_63_s64_x:
+**     sqshl   z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_63_s64_x, svint64_t,
+               z0 = svqrshl_n_s64_x (p0, z0, 63),
+               z0 = svqrshl_x (p0, z0, 63))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_s8.c
new file mode 100644 (file)
index 0000000..8d1e3a7
--- /dev/null
@@ -0,0 +1,397 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshl_s8_m_tied1:
+**     sqrshl  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s8_m_tied1, svint8_t, svint8_t,
+            z0 = svqrshl_s8_m (p0, z0, z4),
+            z0 = svqrshl_m (p0, z0, z4))
+
+/*
+** qrshl_s8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqrshl  z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_s8_m_tied2, svint8_t, svint8_t,
+                z0_res = svqrshl_s8_m (p0, z4, z0),
+                z0_res = svqrshl_m (p0, z4, z0))
+
+/*
+** qrshl_s8_m_untied:
+**     movprfx z0, z1
+**     sqrshl  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s8_m_untied, svint8_t, svint8_t,
+            z0 = svqrshl_s8_m (p0, z1, z4),
+            z0 = svqrshl_m (p0, z1, z4))
+
+/*
+** qrshl_w0_s8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqrshl  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_s8_m_tied1, svint8_t, int8_t,
+                z0 = svqrshl_n_s8_m (p0, z0, x0),
+                z0 = svqrshl_m (p0, z0, x0))
+
+/*
+** qrshl_w0_s8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     sqrshl  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_s8_m_untied, svint8_t, int8_t,
+                z0 = svqrshl_n_s8_m (p0, z1, x0),
+                z0 = svqrshl_m (p0, z1, x0))
+
+/*
+** qrshl_m8_s8_m:
+**     srshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m8_s8_m, svint8_t,
+               z0 = svqrshl_n_s8_m (p0, z0, -8),
+               z0 = svqrshl_m (p0, z0, -8))
+
+/*
+** qrshl_m2_s8_m:
+**     srshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_s8_m, svint8_t,
+               z0 = svqrshl_n_s8_m (p0, z0, -2),
+               z0 = svqrshl_m (p0, z0, -2))
+
+/*
+** qrshl_m1_s8_m_tied1:
+**     srshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s8_m_tied1, svint8_t,
+               z0 = svqrshl_n_s8_m (p0, z0, -1),
+               z0 = svqrshl_m (p0, z0, -1))
+
+/*
+** qrshl_m1_s8_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s8_m_untied, svint8_t,
+               z0 = svqrshl_n_s8_m (p0, z1, -1),
+               z0 = svqrshl_m (p0, z1, -1))
+
+/*
+** qrshl_1_s8_m_tied1:
+**     sqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s8_m_tied1, svint8_t,
+               z0 = svqrshl_n_s8_m (p0, z0, 1),
+               z0 = svqrshl_m (p0, z0, 1))
+
+/*
+** qrshl_1_s8_m_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s8_m_untied, svint8_t,
+               z0 = svqrshl_n_s8_m (p0, z1, 1),
+               z0 = svqrshl_m (p0, z1, 1))
+
+/*
+** qrshl_2_s8_m:
+**     sqshl   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_s8_m, svint8_t,
+               z0 = svqrshl_n_s8_m (p0, z0, 2),
+               z0 = svqrshl_m (p0, z0, 2))
+
+/*
+** qrshl_7_s8_m:
+**     sqshl   z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_7_s8_m, svint8_t,
+               z0 = svqrshl_n_s8_m (p0, z0, 7),
+               z0 = svqrshl_m (p0, z0, 7))
+
+/*
+** qrshl_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqrshl  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s8_z_tied1, svint8_t, svint8_t,
+            z0 = svqrshl_s8_z (p0, z0, z4),
+            z0 = svqrshl_z (p0, z0, z4))
+
+/*
+** qrshl_s8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqrshlr z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_s8_z_tied2, svint8_t, svint8_t,
+                z0_res = svqrshl_s8_z (p0, z4, z0),
+                z0_res = svqrshl_z (p0, z4, z0))
+
+/*
+** qrshl_s8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqrshl  z0\.b, p0/m, z0\.b, z4\.b
+** |
+**     movprfx z0\.b, p0/z, z4\.b
+**     sqrshlr z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s8_z_untied, svint8_t, svint8_t,
+            z0 = svqrshl_s8_z (p0, z1, z4),
+            z0 = svqrshl_z (p0, z1, z4))
+
+/*
+** qrshl_w0_s8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqrshl  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_s8_z_tied1, svint8_t, int8_t,
+                z0 = svqrshl_n_s8_z (p0, z0, x0),
+                z0 = svqrshl_z (p0, z0, x0))
+
+/*
+** qrshl_w0_s8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqrshl  z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     sqrshlr z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_s8_z_untied, svint8_t, int8_t,
+                z0 = svqrshl_n_s8_z (p0, z1, x0),
+                z0 = svqrshl_z (p0, z1, x0))
+
+/*
+** qrshl_m8_s8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     srshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m8_s8_z, svint8_t,
+               z0 = svqrshl_n_s8_z (p0, z0, -8),
+               z0 = svqrshl_z (p0, z0, -8))
+
+/*
+** qrshl_m2_s8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     srshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_s8_z, svint8_t,
+               z0 = svqrshl_n_s8_z (p0, z0, -2),
+               z0 = svqrshl_z (p0, z0, -2))
+
+/*
+** qrshl_m1_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     srshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s8_z_tied1, svint8_t,
+               z0 = svqrshl_n_s8_z (p0, z0, -1),
+               z0 = svqrshl_z (p0, z0, -1))
+
+/*
+** qrshl_m1_s8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     srshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s8_z_untied, svint8_t,
+               z0 = svqrshl_n_s8_z (p0, z1, -1),
+               z0 = svqrshl_z (p0, z1, -1))
+
+/*
+** qrshl_1_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s8_z_tied1, svint8_t,
+               z0 = svqrshl_n_s8_z (p0, z0, 1),
+               z0 = svqrshl_z (p0, z0, 1))
+
+/*
+** qrshl_1_s8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s8_z_untied, svint8_t,
+               z0 = svqrshl_n_s8_z (p0, z1, 1),
+               z0 = svqrshl_z (p0, z1, 1))
+
+/*
+** qrshl_2_s8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqshl   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_s8_z, svint8_t,
+               z0 = svqrshl_n_s8_z (p0, z0, 2),
+               z0 = svqrshl_z (p0, z0, 2))
+
+/*
+** qrshl_7_s8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqshl   z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_7_s8_z, svint8_t,
+               z0 = svqrshl_n_s8_z (p0, z0, 7),
+               z0 = svqrshl_z (p0, z0, 7))
+
+/*
+** qrshl_s8_x_tied1:
+**     sqrshl  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s8_x_tied1, svint8_t, svint8_t,
+            z0 = svqrshl_s8_x (p0, z0, z4),
+            z0 = svqrshl_x (p0, z0, z4))
+
+/*
+** qrshl_s8_x_tied2:
+**     sqrshlr z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_s8_x_tied2, svint8_t, svint8_t,
+                z0_res = svqrshl_s8_x (p0, z4, z0),
+                z0_res = svqrshl_x (p0, z4, z0))
+
+/*
+** qrshl_s8_x_untied:
+** (
+**     movprfx z0, z1
+**     sqrshl  z0\.b, p0/m, z0\.b, z4\.b
+** |
+**     movprfx z0, z4
+**     sqrshlr z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshl_s8_x_untied, svint8_t, svint8_t,
+            z0 = svqrshl_s8_x (p0, z1, z4),
+            z0 = svqrshl_x (p0, z1, z4))
+
+/*
+** qrshl_w0_s8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqrshl  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_s8_x_tied1, svint8_t, int8_t,
+                z0 = svqrshl_n_s8_x (p0, z0, x0),
+                z0 = svqrshl_x (p0, z0, x0))
+
+/*
+** qrshl_w0_s8_x_untied:
+**     mov     z0\.b, w0
+**     sqrshlr z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_s8_x_untied, svint8_t, int8_t,
+                z0 = svqrshl_n_s8_x (p0, z1, x0),
+                z0 = svqrshl_x (p0, z1, x0))
+
+/*
+** qrshl_m8_s8_x:
+**     srshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m8_s8_x, svint8_t,
+               z0 = svqrshl_n_s8_x (p0, z0, -8),
+               z0 = svqrshl_x (p0, z0, -8))
+
+/*
+** qrshl_m2_s8_x:
+**     srshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_s8_x, svint8_t,
+               z0 = svqrshl_n_s8_x (p0, z0, -2),
+               z0 = svqrshl_x (p0, z0, -2))
+
+/*
+** qrshl_m1_s8_x_tied1:
+**     srshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s8_x_tied1, svint8_t,
+               z0 = svqrshl_n_s8_x (p0, z0, -1),
+               z0 = svqrshl_x (p0, z0, -1))
+
+/*
+** qrshl_m1_s8_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_s8_x_untied, svint8_t,
+               z0 = svqrshl_n_s8_x (p0, z1, -1),
+               z0 = svqrshl_x (p0, z1, -1))
+
+/*
+** qrshl_1_s8_x_tied1:
+**     sqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s8_x_tied1, svint8_t,
+               z0 = svqrshl_n_s8_x (p0, z0, 1),
+               z0 = svqrshl_x (p0, z0, 1))
+
+/*
+** qrshl_1_s8_x_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_s8_x_untied, svint8_t,
+               z0 = svqrshl_n_s8_x (p0, z1, 1),
+               z0 = svqrshl_x (p0, z1, 1))
+
+/*
+** qrshl_2_s8_x:
+**     sqshl   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_s8_x, svint8_t,
+               z0 = svqrshl_n_s8_x (p0, z0, 2),
+               z0 = svqrshl_x (p0, z0, 2))
+
+/*
+** qrshl_7_s8_x:
+**     sqshl   z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_7_s8_x, svint8_t,
+               z0 = svqrshl_n_s8_x (p0, z0, 7),
+               z0 = svqrshl_x (p0, z0, 7))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_u16.c
new file mode 100644 (file)
index 0000000..205f49f
--- /dev/null
@@ -0,0 +1,397 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshl_u16_m_tied1:
+**     uqrshl  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u16_m_tied1, svuint16_t, svint16_t,
+            z0 = svqrshl_u16_m (p0, z0, z4),
+            z0 = svqrshl_m (p0, z0, z4))
+
+/*
+** qrshl_u16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uqrshl  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_u16_m_tied2, svuint16_t, svint16_t,
+                z0_res = svqrshl_u16_m (p0, z4, z0),
+                z0_res = svqrshl_m (p0, z4, z0))
+
+/*
+** qrshl_u16_m_untied:
+**     movprfx z0, z1
+**     uqrshl  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u16_m_untied, svuint16_t, svint16_t,
+            z0 = svqrshl_u16_m (p0, z1, z4),
+            z0 = svqrshl_m (p0, z1, z4))
+
+/*
+** qrshl_w0_u16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uqrshl  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_u16_m_tied1, svuint16_t, int16_t,
+                z0 = svqrshl_n_u16_m (p0, z0, x0),
+                z0 = svqrshl_m (p0, z0, x0))
+
+/*
+** qrshl_w0_u16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     uqrshl  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_u16_m_untied, svuint16_t, int16_t,
+                z0 = svqrshl_n_u16_m (p0, z1, x0),
+                z0 = svqrshl_m (p0, z1, x0))
+
+/*
+** qrshl_m16_u16_m:
+**     urshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m16_u16_m, svuint16_t,
+               z0 = svqrshl_n_u16_m (p0, z0, -16),
+               z0 = svqrshl_m (p0, z0, -16))
+
+/*
+** qrshl_m2_u16_m:
+**     urshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_u16_m, svuint16_t,
+               z0 = svqrshl_n_u16_m (p0, z0, -2),
+               z0 = svqrshl_m (p0, z0, -2))
+
+/*
+** qrshl_m1_u16_m_tied1:
+**     urshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u16_m_tied1, svuint16_t,
+               z0 = svqrshl_n_u16_m (p0, z0, -1),
+               z0 = svqrshl_m (p0, z0, -1))
+
+/*
+** qrshl_m1_u16_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u16_m_untied, svuint16_t,
+               z0 = svqrshl_n_u16_m (p0, z1, -1),
+               z0 = svqrshl_m (p0, z1, -1))
+
+/*
+** qrshl_1_u16_m_tied1:
+**     uqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u16_m_tied1, svuint16_t,
+               z0 = svqrshl_n_u16_m (p0, z0, 1),
+               z0 = svqrshl_m (p0, z0, 1))
+
+/*
+** qrshl_1_u16_m_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u16_m_untied, svuint16_t,
+               z0 = svqrshl_n_u16_m (p0, z1, 1),
+               z0 = svqrshl_m (p0, z1, 1))
+
+/*
+** qrshl_2_u16_m:
+**     uqshl   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_u16_m, svuint16_t,
+               z0 = svqrshl_n_u16_m (p0, z0, 2),
+               z0 = svqrshl_m (p0, z0, 2))
+
+/*
+** qrshl_15_u16_m:
+**     uqshl   z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_15_u16_m, svuint16_t,
+               z0 = svqrshl_n_u16_m (p0, z0, 15),
+               z0 = svqrshl_m (p0, z0, 15))
+
+/*
+** qrshl_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqrshl  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u16_z_tied1, svuint16_t, svint16_t,
+            z0 = svqrshl_u16_z (p0, z0, z4),
+            z0 = svqrshl_z (p0, z0, z4))
+
+/*
+** qrshl_u16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqrshlr z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_u16_z_tied2, svuint16_t, svint16_t,
+                z0_res = svqrshl_u16_z (p0, z4, z0),
+                z0_res = svqrshl_z (p0, z4, z0))
+
+/*
+** qrshl_u16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uqrshl  z0\.h, p0/m, z0\.h, z4\.h
+** |
+**     movprfx z0\.h, p0/z, z4\.h
+**     uqrshlr z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u16_z_untied, svuint16_t, svint16_t,
+            z0 = svqrshl_u16_z (p0, z1, z4),
+            z0 = svqrshl_z (p0, z1, z4))
+
+/*
+** qrshl_w0_u16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqrshl  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_u16_z_tied1, svuint16_t, int16_t,
+                z0 = svqrshl_n_u16_z (p0, z0, x0),
+                z0 = svqrshl_z (p0, z0, x0))
+
+/*
+** qrshl_w0_u16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uqrshl  z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     uqrshlr z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_u16_z_untied, svuint16_t, int16_t,
+                z0 = svqrshl_n_u16_z (p0, z1, x0),
+                z0 = svqrshl_z (p0, z1, x0))
+
+/*
+** qrshl_m16_u16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     urshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m16_u16_z, svuint16_t,
+               z0 = svqrshl_n_u16_z (p0, z0, -16),
+               z0 = svqrshl_z (p0, z0, -16))
+
+/*
+** qrshl_m2_u16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     urshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_u16_z, svuint16_t,
+               z0 = svqrshl_n_u16_z (p0, z0, -2),
+               z0 = svqrshl_z (p0, z0, -2))
+
+/*
+** qrshl_m1_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     urshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u16_z_tied1, svuint16_t,
+               z0 = svqrshl_n_u16_z (p0, z0, -1),
+               z0 = svqrshl_z (p0, z0, -1))
+
+/*
+** qrshl_m1_u16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     urshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u16_z_untied, svuint16_t,
+               z0 = svqrshl_n_u16_z (p0, z1, -1),
+               z0 = svqrshl_z (p0, z1, -1))
+
+/*
+** qrshl_1_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u16_z_tied1, svuint16_t,
+               z0 = svqrshl_n_u16_z (p0, z0, 1),
+               z0 = svqrshl_z (p0, z0, 1))
+
+/*
+** qrshl_1_u16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     uqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u16_z_untied, svuint16_t,
+               z0 = svqrshl_n_u16_z (p0, z1, 1),
+               z0 = svqrshl_z (p0, z1, 1))
+
+/*
+** qrshl_2_u16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqshl   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_u16_z, svuint16_t,
+               z0 = svqrshl_n_u16_z (p0, z0, 2),
+               z0 = svqrshl_z (p0, z0, 2))
+
+/*
+** qrshl_15_u16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqshl   z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_15_u16_z, svuint16_t,
+               z0 = svqrshl_n_u16_z (p0, z0, 15),
+               z0 = svqrshl_z (p0, z0, 15))
+
+/*
+** qrshl_u16_x_tied1:
+**     uqrshl  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u16_x_tied1, svuint16_t, svint16_t,
+            z0 = svqrshl_u16_x (p0, z0, z4),
+            z0 = svqrshl_x (p0, z0, z4))
+
+/*
+** qrshl_u16_x_tied2:
+**     uqrshlr z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_u16_x_tied2, svuint16_t, svint16_t,
+                z0_res = svqrshl_u16_x (p0, z4, z0),
+                z0_res = svqrshl_x (p0, z4, z0))
+
+/*
+** qrshl_u16_x_untied:
+** (
+**     movprfx z0, z1
+**     uqrshl  z0\.h, p0/m, z0\.h, z4\.h
+** |
+**     movprfx z0, z4
+**     uqrshlr z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u16_x_untied, svuint16_t, svint16_t,
+            z0 = svqrshl_u16_x (p0, z1, z4),
+            z0 = svqrshl_x (p0, z1, z4))
+
+/*
+** qrshl_w0_u16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uqrshl  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_u16_x_tied1, svuint16_t, int16_t,
+                z0 = svqrshl_n_u16_x (p0, z0, x0),
+                z0 = svqrshl_x (p0, z0, x0))
+
+/*
+** qrshl_w0_u16_x_untied:
+**     mov     z0\.h, w0
+**     uqrshlr z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_u16_x_untied, svuint16_t, int16_t,
+                z0 = svqrshl_n_u16_x (p0, z1, x0),
+                z0 = svqrshl_x (p0, z1, x0))
+
+/*
+** qrshl_m16_u16_x:
+**     urshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m16_u16_x, svuint16_t,
+               z0 = svqrshl_n_u16_x (p0, z0, -16),
+               z0 = svqrshl_x (p0, z0, -16))
+
+/*
+** qrshl_m2_u16_x:
+**     urshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_u16_x, svuint16_t,
+               z0 = svqrshl_n_u16_x (p0, z0, -2),
+               z0 = svqrshl_x (p0, z0, -2))
+
+/*
+** qrshl_m1_u16_x_tied1:
+**     urshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u16_x_tied1, svuint16_t,
+               z0 = svqrshl_n_u16_x (p0, z0, -1),
+               z0 = svqrshl_x (p0, z0, -1))
+
+/*
+** qrshl_m1_u16_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u16_x_untied, svuint16_t,
+               z0 = svqrshl_n_u16_x (p0, z1, -1),
+               z0 = svqrshl_x (p0, z1, -1))
+
+/*
+** qrshl_1_u16_x_tied1:
+**     uqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u16_x_tied1, svuint16_t,
+               z0 = svqrshl_n_u16_x (p0, z0, 1),
+               z0 = svqrshl_x (p0, z0, 1))
+
+/*
+** qrshl_1_u16_x_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u16_x_untied, svuint16_t,
+               z0 = svqrshl_n_u16_x (p0, z1, 1),
+               z0 = svqrshl_x (p0, z1, 1))
+
+/*
+** qrshl_2_u16_x:
+**     uqshl   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_u16_x, svuint16_t,
+               z0 = svqrshl_n_u16_x (p0, z0, 2),
+               z0 = svqrshl_x (p0, z0, 2))
+
+/*
+** qrshl_15_u16_x:
+**     uqshl   z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_15_u16_x, svuint16_t,
+               z0 = svqrshl_n_u16_x (p0, z0, 15),
+               z0 = svqrshl_x (p0, z0, 15))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_u32.c
new file mode 100644 (file)
index 0000000..aecc18b
--- /dev/null
@@ -0,0 +1,397 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshl_u32_m_tied1:
+**     uqrshl  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u32_m_tied1, svuint32_t, svint32_t,
+            z0 = svqrshl_u32_m (p0, z0, z4),
+            z0 = svqrshl_m (p0, z0, z4))
+
+/*
+** qrshl_u32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uqrshl  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_u32_m_tied2, svuint32_t, svint32_t,
+                z0_res = svqrshl_u32_m (p0, z4, z0),
+                z0_res = svqrshl_m (p0, z4, z0))
+
+/*
+** qrshl_u32_m_untied:
+**     movprfx z0, z1
+**     uqrshl  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u32_m_untied, svuint32_t, svint32_t,
+            z0 = svqrshl_u32_m (p0, z1, z4),
+            z0 = svqrshl_m (p0, z1, z4))
+
+/*
+** qrshl_w0_u32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uqrshl  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_u32_m_tied1, svuint32_t, int32_t,
+                z0 = svqrshl_n_u32_m (p0, z0, x0),
+                z0 = svqrshl_m (p0, z0, x0))
+
+/*
+** qrshl_w0_u32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     uqrshl  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_u32_m_untied, svuint32_t, int32_t,
+                z0 = svqrshl_n_u32_m (p0, z1, x0),
+                z0 = svqrshl_m (p0, z1, x0))
+
+/*
+** qrshl_m32_u32_m:
+**     urshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m32_u32_m, svuint32_t,
+               z0 = svqrshl_n_u32_m (p0, z0, -32),
+               z0 = svqrshl_m (p0, z0, -32))
+
+/*
+** qrshl_m2_u32_m:
+**     urshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_u32_m, svuint32_t,
+               z0 = svqrshl_n_u32_m (p0, z0, -2),
+               z0 = svqrshl_m (p0, z0, -2))
+
+/*
+** qrshl_m1_u32_m_tied1:
+**     urshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u32_m_tied1, svuint32_t,
+               z0 = svqrshl_n_u32_m (p0, z0, -1),
+               z0 = svqrshl_m (p0, z0, -1))
+
+/*
+** qrshl_m1_u32_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u32_m_untied, svuint32_t,
+               z0 = svqrshl_n_u32_m (p0, z1, -1),
+               z0 = svqrshl_m (p0, z1, -1))
+
+/*
+** qrshl_1_u32_m_tied1:
+**     uqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u32_m_tied1, svuint32_t,
+               z0 = svqrshl_n_u32_m (p0, z0, 1),
+               z0 = svqrshl_m (p0, z0, 1))
+
+/*
+** qrshl_1_u32_m_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u32_m_untied, svuint32_t,
+               z0 = svqrshl_n_u32_m (p0, z1, 1),
+               z0 = svqrshl_m (p0, z1, 1))
+
+/*
+** qrshl_2_u32_m:
+**     uqshl   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_u32_m, svuint32_t,
+               z0 = svqrshl_n_u32_m (p0, z0, 2),
+               z0 = svqrshl_m (p0, z0, 2))
+
+/*
+** qrshl_31_u32_m:
+**     uqshl   z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_31_u32_m, svuint32_t,
+               z0 = svqrshl_n_u32_m (p0, z0, 31),
+               z0 = svqrshl_m (p0, z0, 31))
+
+/*
+** qrshl_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqrshl  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u32_z_tied1, svuint32_t, svint32_t,
+            z0 = svqrshl_u32_z (p0, z0, z4),
+            z0 = svqrshl_z (p0, z0, z4))
+
+/*
+** qrshl_u32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqrshlr z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_u32_z_tied2, svuint32_t, svint32_t,
+                z0_res = svqrshl_u32_z (p0, z4, z0),
+                z0_res = svqrshl_z (p0, z4, z0))
+
+/*
+** qrshl_u32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uqrshl  z0\.s, p0/m, z0\.s, z4\.s
+** |
+**     movprfx z0\.s, p0/z, z4\.s
+**     uqrshlr z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u32_z_untied, svuint32_t, svint32_t,
+            z0 = svqrshl_u32_z (p0, z1, z4),
+            z0 = svqrshl_z (p0, z1, z4))
+
+/*
+** qrshl_w0_u32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqrshl  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_u32_z_tied1, svuint32_t, int32_t,
+                z0 = svqrshl_n_u32_z (p0, z0, x0),
+                z0 = svqrshl_z (p0, z0, x0))
+
+/*
+** qrshl_w0_u32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uqrshl  z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     uqrshlr z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_u32_z_untied, svuint32_t, int32_t,
+                z0 = svqrshl_n_u32_z (p0, z1, x0),
+                z0 = svqrshl_z (p0, z1, x0))
+
+/*
+** qrshl_m32_u32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     urshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m32_u32_z, svuint32_t,
+               z0 = svqrshl_n_u32_z (p0, z0, -32),
+               z0 = svqrshl_z (p0, z0, -32))
+
+/*
+** qrshl_m2_u32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     urshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_u32_z, svuint32_t,
+               z0 = svqrshl_n_u32_z (p0, z0, -2),
+               z0 = svqrshl_z (p0, z0, -2))
+
+/*
+** qrshl_m1_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     urshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u32_z_tied1, svuint32_t,
+               z0 = svqrshl_n_u32_z (p0, z0, -1),
+               z0 = svqrshl_z (p0, z0, -1))
+
+/*
+** qrshl_m1_u32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     urshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u32_z_untied, svuint32_t,
+               z0 = svqrshl_n_u32_z (p0, z1, -1),
+               z0 = svqrshl_z (p0, z1, -1))
+
+/*
+** qrshl_1_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u32_z_tied1, svuint32_t,
+               z0 = svqrshl_n_u32_z (p0, z0, 1),
+               z0 = svqrshl_z (p0, z0, 1))
+
+/*
+** qrshl_1_u32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     uqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u32_z_untied, svuint32_t,
+               z0 = svqrshl_n_u32_z (p0, z1, 1),
+               z0 = svqrshl_z (p0, z1, 1))
+
+/*
+** qrshl_2_u32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqshl   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_u32_z, svuint32_t,
+               z0 = svqrshl_n_u32_z (p0, z0, 2),
+               z0 = svqrshl_z (p0, z0, 2))
+
+/*
+** qrshl_31_u32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqshl   z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_31_u32_z, svuint32_t,
+               z0 = svqrshl_n_u32_z (p0, z0, 31),
+               z0 = svqrshl_z (p0, z0, 31))
+
+/*
+** qrshl_u32_x_tied1:
+**     uqrshl  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u32_x_tied1, svuint32_t, svint32_t,
+            z0 = svqrshl_u32_x (p0, z0, z4),
+            z0 = svqrshl_x (p0, z0, z4))
+
+/*
+** qrshl_u32_x_tied2:
+**     uqrshlr z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_u32_x_tied2, svuint32_t, svint32_t,
+                z0_res = svqrshl_u32_x (p0, z4, z0),
+                z0_res = svqrshl_x (p0, z4, z0))
+
+/*
+** qrshl_u32_x_untied:
+** (
+**     movprfx z0, z1
+**     uqrshl  z0\.s, p0/m, z0\.s, z4\.s
+** |
+**     movprfx z0, z4
+**     uqrshlr z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u32_x_untied, svuint32_t, svint32_t,
+            z0 = svqrshl_u32_x (p0, z1, z4),
+            z0 = svqrshl_x (p0, z1, z4))
+
+/*
+** qrshl_w0_u32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uqrshl  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_u32_x_tied1, svuint32_t, int32_t,
+                z0 = svqrshl_n_u32_x (p0, z0, x0),
+                z0 = svqrshl_x (p0, z0, x0))
+
+/*
+** qrshl_w0_u32_x_untied:
+**     mov     z0\.s, w0
+**     uqrshlr z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_u32_x_untied, svuint32_t, int32_t,
+                z0 = svqrshl_n_u32_x (p0, z1, x0),
+                z0 = svqrshl_x (p0, z1, x0))
+
+/*
+** qrshl_m32_u32_x:
+**     urshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m32_u32_x, svuint32_t,
+               z0 = svqrshl_n_u32_x (p0, z0, -32),
+               z0 = svqrshl_x (p0, z0, -32))
+
+/*
+** qrshl_m2_u32_x:
+**     urshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_u32_x, svuint32_t,
+               z0 = svqrshl_n_u32_x (p0, z0, -2),
+               z0 = svqrshl_x (p0, z0, -2))
+
+/*
+** qrshl_m1_u32_x_tied1:
+**     urshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u32_x_tied1, svuint32_t,
+               z0 = svqrshl_n_u32_x (p0, z0, -1),
+               z0 = svqrshl_x (p0, z0, -1))
+
+/*
+** qrshl_m1_u32_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u32_x_untied, svuint32_t,
+               z0 = svqrshl_n_u32_x (p0, z1, -1),
+               z0 = svqrshl_x (p0, z1, -1))
+
+/*
+** qrshl_1_u32_x_tied1:
+**     uqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u32_x_tied1, svuint32_t,
+               z0 = svqrshl_n_u32_x (p0, z0, 1),
+               z0 = svqrshl_x (p0, z0, 1))
+
+/*
+** qrshl_1_u32_x_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u32_x_untied, svuint32_t,
+               z0 = svqrshl_n_u32_x (p0, z1, 1),
+               z0 = svqrshl_x (p0, z1, 1))
+
+/*
+** qrshl_2_u32_x:
+**     uqshl   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_u32_x, svuint32_t,
+               z0 = svqrshl_n_u32_x (p0, z0, 2),
+               z0 = svqrshl_x (p0, z0, 2))
+
+/*
+** qrshl_31_u32_x:
+**     uqshl   z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_31_u32_x, svuint32_t,
+               z0 = svqrshl_n_u32_x (p0, z0, 31),
+               z0 = svqrshl_x (p0, z0, 31))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_u64.c
new file mode 100644 (file)
index 0000000..8ffba92
--- /dev/null
@@ -0,0 +1,397 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshl_u64_m_tied1:
+**     uqrshl  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u64_m_tied1, svuint64_t, svint64_t,
+            z0 = svqrshl_u64_m (p0, z0, z4),
+            z0 = svqrshl_m (p0, z0, z4))
+
+/*
+** qrshl_u64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z4
+**     uqrshl  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_u64_m_tied2, svuint64_t, svint64_t,
+                z0_res = svqrshl_u64_m (p0, z4, z0),
+                z0_res = svqrshl_m (p0, z4, z0))
+
+/*
+** qrshl_u64_m_untied:
+**     movprfx z0, z1
+**     uqrshl  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u64_m_untied, svuint64_t, svint64_t,
+            z0 = svqrshl_u64_m (p0, z1, z4),
+            z0 = svqrshl_m (p0, z1, z4))
+
+/*
+** qrshl_x0_u64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     uqrshl  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_x0_u64_m_tied1, svuint64_t, int64_t,
+                z0 = svqrshl_n_u64_m (p0, z0, x0),
+                z0 = svqrshl_m (p0, z0, x0))
+
+/*
+** qrshl_x0_u64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     uqrshl  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_x0_u64_m_untied, svuint64_t, int64_t,
+                z0 = svqrshl_n_u64_m (p0, z1, x0),
+                z0 = svqrshl_m (p0, z1, x0))
+
+/*
+** qrshl_m64_u64_m:
+**     urshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m64_u64_m, svuint64_t,
+               z0 = svqrshl_n_u64_m (p0, z0, -64),
+               z0 = svqrshl_m (p0, z0, -64))
+
+/*
+** qrshl_m2_u64_m:
+**     urshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_u64_m, svuint64_t,
+               z0 = svqrshl_n_u64_m (p0, z0, -2),
+               z0 = svqrshl_m (p0, z0, -2))
+
+/*
+** qrshl_m1_u64_m_tied1:
+**     urshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u64_m_tied1, svuint64_t,
+               z0 = svqrshl_n_u64_m (p0, z0, -1),
+               z0 = svqrshl_m (p0, z0, -1))
+
+/*
+** qrshl_m1_u64_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u64_m_untied, svuint64_t,
+               z0 = svqrshl_n_u64_m (p0, z1, -1),
+               z0 = svqrshl_m (p0, z1, -1))
+
+/*
+** qrshl_1_u64_m_tied1:
+**     uqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u64_m_tied1, svuint64_t,
+               z0 = svqrshl_n_u64_m (p0, z0, 1),
+               z0 = svqrshl_m (p0, z0, 1))
+
+/*
+** qrshl_1_u64_m_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u64_m_untied, svuint64_t,
+               z0 = svqrshl_n_u64_m (p0, z1, 1),
+               z0 = svqrshl_m (p0, z1, 1))
+
+/*
+** qrshl_2_u64_m:
+**     uqshl   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_u64_m, svuint64_t,
+               z0 = svqrshl_n_u64_m (p0, z0, 2),
+               z0 = svqrshl_m (p0, z0, 2))
+
+/*
+** qrshl_63_u64_m:
+**     uqshl   z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_63_u64_m, svuint64_t,
+               z0 = svqrshl_n_u64_m (p0, z0, 63),
+               z0 = svqrshl_m (p0, z0, 63))
+
+/*
+** qrshl_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqrshl  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u64_z_tied1, svuint64_t, svint64_t,
+            z0 = svqrshl_u64_z (p0, z0, z4),
+            z0 = svqrshl_z (p0, z0, z4))
+
+/*
+** qrshl_u64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqrshlr z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_u64_z_tied2, svuint64_t, svint64_t,
+                z0_res = svqrshl_u64_z (p0, z4, z0),
+                z0_res = svqrshl_z (p0, z4, z0))
+
+/*
+** qrshl_u64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uqrshl  z0\.d, p0/m, z0\.d, z4\.d
+** |
+**     movprfx z0\.d, p0/z, z4\.d
+**     uqrshlr z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u64_z_untied, svuint64_t, svint64_t,
+            z0 = svqrshl_u64_z (p0, z1, z4),
+            z0 = svqrshl_z (p0, z1, z4))
+
+/*
+** qrshl_x0_u64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqrshl  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_x0_u64_z_tied1, svuint64_t, int64_t,
+                z0 = svqrshl_n_u64_z (p0, z0, x0),
+                z0 = svqrshl_z (p0, z0, x0))
+
+/*
+** qrshl_x0_u64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uqrshl  z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     uqrshlr z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_x0_u64_z_untied, svuint64_t, int64_t,
+                z0 = svqrshl_n_u64_z (p0, z1, x0),
+                z0 = svqrshl_z (p0, z1, x0))
+
+/*
+** qrshl_m64_u64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     urshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m64_u64_z, svuint64_t,
+               z0 = svqrshl_n_u64_z (p0, z0, -64),
+               z0 = svqrshl_z (p0, z0, -64))
+
+/*
+** qrshl_m2_u64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     urshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_u64_z, svuint64_t,
+               z0 = svqrshl_n_u64_z (p0, z0, -2),
+               z0 = svqrshl_z (p0, z0, -2))
+
+/*
+** qrshl_m1_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     urshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u64_z_tied1, svuint64_t,
+               z0 = svqrshl_n_u64_z (p0, z0, -1),
+               z0 = svqrshl_z (p0, z0, -1))
+
+/*
+** qrshl_m1_u64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     urshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u64_z_untied, svuint64_t,
+               z0 = svqrshl_n_u64_z (p0, z1, -1),
+               z0 = svqrshl_z (p0, z1, -1))
+
+/*
+** qrshl_1_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u64_z_tied1, svuint64_t,
+               z0 = svqrshl_n_u64_z (p0, z0, 1),
+               z0 = svqrshl_z (p0, z0, 1))
+
+/*
+** qrshl_1_u64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     uqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u64_z_untied, svuint64_t,
+               z0 = svqrshl_n_u64_z (p0, z1, 1),
+               z0 = svqrshl_z (p0, z1, 1))
+
+/*
+** qrshl_2_u64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqshl   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_u64_z, svuint64_t,
+               z0 = svqrshl_n_u64_z (p0, z0, 2),
+               z0 = svqrshl_z (p0, z0, 2))
+
+/*
+** qrshl_63_u64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqshl   z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_63_u64_z, svuint64_t,
+               z0 = svqrshl_n_u64_z (p0, z0, 63),
+               z0 = svqrshl_z (p0, z0, 63))
+
+/*
+** qrshl_u64_x_tied1:
+**     uqrshl  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u64_x_tied1, svuint64_t, svint64_t,
+            z0 = svqrshl_u64_x (p0, z0, z4),
+            z0 = svqrshl_x (p0, z0, z4))
+
+/*
+** qrshl_u64_x_tied2:
+**     uqrshlr z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_u64_x_tied2, svuint64_t, svint64_t,
+                z0_res = svqrshl_u64_x (p0, z4, z0),
+                z0_res = svqrshl_x (p0, z4, z0))
+
+/*
+** qrshl_u64_x_untied:
+** (
+**     movprfx z0, z1
+**     uqrshl  z0\.d, p0/m, z0\.d, z4\.d
+** |
+**     movprfx z0, z4
+**     uqrshlr z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u64_x_untied, svuint64_t, svint64_t,
+            z0 = svqrshl_u64_x (p0, z1, z4),
+            z0 = svqrshl_x (p0, z1, z4))
+
+/*
+** qrshl_x0_u64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     uqrshl  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_x0_u64_x_tied1, svuint64_t, int64_t,
+                z0 = svqrshl_n_u64_x (p0, z0, x0),
+                z0 = svqrshl_x (p0, z0, x0))
+
+/*
+** qrshl_x0_u64_x_untied:
+**     mov     z0\.d, x0
+**     uqrshlr z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_x0_u64_x_untied, svuint64_t, int64_t,
+                z0 = svqrshl_n_u64_x (p0, z1, x0),
+                z0 = svqrshl_x (p0, z1, x0))
+
+/*
+** qrshl_m64_u64_x:
+**     urshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m64_u64_x, svuint64_t,
+               z0 = svqrshl_n_u64_x (p0, z0, -64),
+               z0 = svqrshl_x (p0, z0, -64))
+
+/*
+** qrshl_m2_u64_x:
+**     urshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_u64_x, svuint64_t,
+               z0 = svqrshl_n_u64_x (p0, z0, -2),
+               z0 = svqrshl_x (p0, z0, -2))
+
+/*
+** qrshl_m1_u64_x_tied1:
+**     urshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u64_x_tied1, svuint64_t,
+               z0 = svqrshl_n_u64_x (p0, z0, -1),
+               z0 = svqrshl_x (p0, z0, -1))
+
+/*
+** qrshl_m1_u64_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u64_x_untied, svuint64_t,
+               z0 = svqrshl_n_u64_x (p0, z1, -1),
+               z0 = svqrshl_x (p0, z1, -1))
+
+/*
+** qrshl_1_u64_x_tied1:
+**     uqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u64_x_tied1, svuint64_t,
+               z0 = svqrshl_n_u64_x (p0, z0, 1),
+               z0 = svqrshl_x (p0, z0, 1))
+
+/*
+** qrshl_1_u64_x_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u64_x_untied, svuint64_t,
+               z0 = svqrshl_n_u64_x (p0, z1, 1),
+               z0 = svqrshl_x (p0, z1, 1))
+
+/*
+** qrshl_2_u64_x:
+**     uqshl   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_u64_x, svuint64_t,
+               z0 = svqrshl_n_u64_x (p0, z0, 2),
+               z0 = svqrshl_x (p0, z0, 2))
+
+/*
+** qrshl_63_u64_x:
+**     uqshl   z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_63_u64_x, svuint64_t,
+               z0 = svqrshl_n_u64_x (p0, z0, 63),
+               z0 = svqrshl_x (p0, z0, 63))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshl_u8.c
new file mode 100644 (file)
index 0000000..4ed0237
--- /dev/null
@@ -0,0 +1,397 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshl_u8_m_tied1:
+**     uqrshl  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u8_m_tied1, svuint8_t, svint8_t,
+            z0 = svqrshl_u8_m (p0, z0, z4),
+            z0 = svqrshl_m (p0, z0, z4))
+
+/*
+** qrshl_u8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uqrshl  z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_u8_m_tied2, svuint8_t, svint8_t,
+                z0_res = svqrshl_u8_m (p0, z4, z0),
+                z0_res = svqrshl_m (p0, z4, z0))
+
+/*
+** qrshl_u8_m_untied:
+**     movprfx z0, z1
+**     uqrshl  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u8_m_untied, svuint8_t, svint8_t,
+            z0 = svqrshl_u8_m (p0, z1, z4),
+            z0 = svqrshl_m (p0, z1, z4))
+
+/*
+** qrshl_w0_u8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uqrshl  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_u8_m_tied1, svuint8_t, int8_t,
+                z0 = svqrshl_n_u8_m (p0, z0, x0),
+                z0 = svqrshl_m (p0, z0, x0))
+
+/*
+** qrshl_w0_u8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     uqrshl  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_u8_m_untied, svuint8_t, int8_t,
+                z0 = svqrshl_n_u8_m (p0, z1, x0),
+                z0 = svqrshl_m (p0, z1, x0))
+
+/*
+** qrshl_m8_u8_m:
+**     urshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m8_u8_m, svuint8_t,
+               z0 = svqrshl_n_u8_m (p0, z0, -8),
+               z0 = svqrshl_m (p0, z0, -8))
+
+/*
+** qrshl_m2_u8_m:
+**     urshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_u8_m, svuint8_t,
+               z0 = svqrshl_n_u8_m (p0, z0, -2),
+               z0 = svqrshl_m (p0, z0, -2))
+
+/*
+** qrshl_m1_u8_m_tied1:
+**     urshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u8_m_tied1, svuint8_t,
+               z0 = svqrshl_n_u8_m (p0, z0, -1),
+               z0 = svqrshl_m (p0, z0, -1))
+
+/*
+** qrshl_m1_u8_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u8_m_untied, svuint8_t,
+               z0 = svqrshl_n_u8_m (p0, z1, -1),
+               z0 = svqrshl_m (p0, z1, -1))
+
+/*
+** qrshl_1_u8_m_tied1:
+**     uqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u8_m_tied1, svuint8_t,
+               z0 = svqrshl_n_u8_m (p0, z0, 1),
+               z0 = svqrshl_m (p0, z0, 1))
+
+/*
+** qrshl_1_u8_m_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u8_m_untied, svuint8_t,
+               z0 = svqrshl_n_u8_m (p0, z1, 1),
+               z0 = svqrshl_m (p0, z1, 1))
+
+/*
+** qrshl_2_u8_m:
+**     uqshl   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_u8_m, svuint8_t,
+               z0 = svqrshl_n_u8_m (p0, z0, 2),
+               z0 = svqrshl_m (p0, z0, 2))
+
+/*
+** qrshl_7_u8_m:
+**     uqshl   z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_7_u8_m, svuint8_t,
+               z0 = svqrshl_n_u8_m (p0, z0, 7),
+               z0 = svqrshl_m (p0, z0, 7))
+
+/*
+** qrshl_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqrshl  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u8_z_tied1, svuint8_t, svint8_t,
+            z0 = svqrshl_u8_z (p0, z0, z4),
+            z0 = svqrshl_z (p0, z0, z4))
+
+/*
+** qrshl_u8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqrshlr z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_u8_z_tied2, svuint8_t, svint8_t,
+                z0_res = svqrshl_u8_z (p0, z4, z0),
+                z0_res = svqrshl_z (p0, z4, z0))
+
+/*
+** qrshl_u8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uqrshl  z0\.b, p0/m, z0\.b, z4\.b
+** |
+**     movprfx z0\.b, p0/z, z4\.b
+**     uqrshlr z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u8_z_untied, svuint8_t, svint8_t,
+            z0 = svqrshl_u8_z (p0, z1, z4),
+            z0 = svqrshl_z (p0, z1, z4))
+
+/*
+** qrshl_w0_u8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqrshl  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_u8_z_tied1, svuint8_t, int8_t,
+                z0 = svqrshl_n_u8_z (p0, z0, x0),
+                z0 = svqrshl_z (p0, z0, x0))
+
+/*
+** qrshl_w0_u8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uqrshl  z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     uqrshlr z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_u8_z_untied, svuint8_t, int8_t,
+                z0 = svqrshl_n_u8_z (p0, z1, x0),
+                z0 = svqrshl_z (p0, z1, x0))
+
+/*
+** qrshl_m8_u8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     urshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m8_u8_z, svuint8_t,
+               z0 = svqrshl_n_u8_z (p0, z0, -8),
+               z0 = svqrshl_z (p0, z0, -8))
+
+/*
+** qrshl_m2_u8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     urshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_u8_z, svuint8_t,
+               z0 = svqrshl_n_u8_z (p0, z0, -2),
+               z0 = svqrshl_z (p0, z0, -2))
+
+/*
+** qrshl_m1_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     urshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u8_z_tied1, svuint8_t,
+               z0 = svqrshl_n_u8_z (p0, z0, -1),
+               z0 = svqrshl_z (p0, z0, -1))
+
+/*
+** qrshl_m1_u8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     urshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u8_z_untied, svuint8_t,
+               z0 = svqrshl_n_u8_z (p0, z1, -1),
+               z0 = svqrshl_z (p0, z1, -1))
+
+/*
+** qrshl_1_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u8_z_tied1, svuint8_t,
+               z0 = svqrshl_n_u8_z (p0, z0, 1),
+               z0 = svqrshl_z (p0, z0, 1))
+
+/*
+** qrshl_1_u8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     uqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u8_z_untied, svuint8_t,
+               z0 = svqrshl_n_u8_z (p0, z1, 1),
+               z0 = svqrshl_z (p0, z1, 1))
+
+/*
+** qrshl_2_u8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqshl   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_u8_z, svuint8_t,
+               z0 = svqrshl_n_u8_z (p0, z0, 2),
+               z0 = svqrshl_z (p0, z0, 2))
+
+/*
+** qrshl_7_u8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqshl   z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_7_u8_z, svuint8_t,
+               z0 = svqrshl_n_u8_z (p0, z0, 7),
+               z0 = svqrshl_z (p0, z0, 7))
+
+/*
+** qrshl_u8_x_tied1:
+**     uqrshl  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u8_x_tied1, svuint8_t, svint8_t,
+            z0 = svqrshl_u8_x (p0, z0, z4),
+            z0 = svqrshl_x (p0, z0, z4))
+
+/*
+** qrshl_u8_x_tied2:
+**     uqrshlr z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qrshl_u8_x_tied2, svuint8_t, svint8_t,
+                z0_res = svqrshl_u8_x (p0, z4, z0),
+                z0_res = svqrshl_x (p0, z4, z0))
+
+/*
+** qrshl_u8_x_untied:
+** (
+**     movprfx z0, z1
+**     uqrshl  z0\.b, p0/m, z0\.b, z4\.b
+** |
+**     movprfx z0, z4
+**     uqrshlr z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshl_u8_x_untied, svuint8_t, svint8_t,
+            z0 = svqrshl_u8_x (p0, z1, z4),
+            z0 = svqrshl_x (p0, z1, z4))
+
+/*
+** qrshl_w0_u8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uqrshl  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_u8_x_tied1, svuint8_t, int8_t,
+                z0 = svqrshl_n_u8_x (p0, z0, x0),
+                z0 = svqrshl_x (p0, z0, x0))
+
+/*
+** qrshl_w0_u8_x_untied:
+**     mov     z0\.b, w0
+**     uqrshlr z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_ZX (qrshl_w0_u8_x_untied, svuint8_t, int8_t,
+                z0 = svqrshl_n_u8_x (p0, z1, x0),
+                z0 = svqrshl_x (p0, z1, x0))
+
+/*
+** qrshl_m8_u8_x:
+**     urshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m8_u8_x, svuint8_t,
+               z0 = svqrshl_n_u8_x (p0, z0, -8),
+               z0 = svqrshl_x (p0, z0, -8))
+
+/*
+** qrshl_m2_u8_x:
+**     urshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m2_u8_x, svuint8_t,
+               z0 = svqrshl_n_u8_x (p0, z0, -2),
+               z0 = svqrshl_x (p0, z0, -2))
+
+/*
+** qrshl_m1_u8_x_tied1:
+**     urshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u8_x_tied1, svuint8_t,
+               z0 = svqrshl_n_u8_x (p0, z0, -1),
+               z0 = svqrshl_x (p0, z0, -1))
+
+/*
+** qrshl_m1_u8_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_m1_u8_x_untied, svuint8_t,
+               z0 = svqrshl_n_u8_x (p0, z1, -1),
+               z0 = svqrshl_x (p0, z1, -1))
+
+/*
+** qrshl_1_u8_x_tied1:
+**     uqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u8_x_tied1, svuint8_t,
+               z0 = svqrshl_n_u8_x (p0, z0, 1),
+               z0 = svqrshl_x (p0, z0, 1))
+
+/*
+** qrshl_1_u8_x_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_1_u8_x_untied, svuint8_t,
+               z0 = svqrshl_n_u8_x (p0, z1, 1),
+               z0 = svqrshl_x (p0, z1, 1))
+
+/*
+** qrshl_2_u8_x:
+**     uqshl   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_2_u8_x, svuint8_t,
+               z0 = svqrshl_n_u8_x (p0, z0, 2),
+               z0 = svqrshl_x (p0, z0, 2))
+
+/*
+** qrshl_7_u8_x:
+**     uqshl   z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (qrshl_7_u8_x, svuint8_t,
+               z0 = svqrshl_n_u8_x (p0, z0, 7),
+               z0 = svqrshl_x (p0, z0, 7))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnb_s16.c
new file mode 100644 (file)
index 0000000..6f244ce
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshrnb_1_s16:
+**     sqrshrnb        z0\.b, z0\.h, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_1_s16, svint8_t, svint16_t,
+                   z0_res = svqrshrnb_n_s16 (z0, 1),
+                   z0_res = svqrshrnb (z0, 1))
+
+/*
+** qrshrnb_2_s16:
+**     sqrshrnb        z0\.b, z0\.h, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_2_s16, svint8_t, svint16_t,
+                   z0_res = svqrshrnb_n_s16 (z0, 2),
+                   z0_res = svqrshrnb (z0, 2))
+
+/*
+** qrshrnb_8_s16_tied1:
+**     sqrshrnb        z0\.b, z0\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_8_s16_tied1, svint8_t, svint16_t,
+                   z0_res = svqrshrnb_n_s16 (z0, 8),
+                   z0_res = svqrshrnb (z0, 8))
+
+/*
+** qrshrnb_8_s16_untied:
+**     sqrshrnb        z0\.b, z1\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_8_s16_untied, svint8_t, svint16_t,
+                   z0_res = svqrshrnb_n_s16 (z1, 8),
+                   z0_res = svqrshrnb (z1, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnb_s32.c
new file mode 100644 (file)
index 0000000..cd222f0
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshrnb_1_s32:
+**     sqrshrnb        z0\.h, z0\.s, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_1_s32, svint16_t, svint32_t,
+                   z0_res = svqrshrnb_n_s32 (z0, 1),
+                   z0_res = svqrshrnb (z0, 1))
+
+/*
+** qrshrnb_2_s32:
+**     sqrshrnb        z0\.h, z0\.s, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_2_s32, svint16_t, svint32_t,
+                   z0_res = svqrshrnb_n_s32 (z0, 2),
+                   z0_res = svqrshrnb (z0, 2))
+
+/*
+** qrshrnb_16_s32_tied1:
+**     sqrshrnb        z0\.h, z0\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_16_s32_tied1, svint16_t, svint32_t,
+                   z0_res = svqrshrnb_n_s32 (z0, 16),
+                   z0_res = svqrshrnb (z0, 16))
+
+/*
+** qrshrnb_16_s32_untied:
+**     sqrshrnb        z0\.h, z1\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_16_s32_untied, svint16_t, svint32_t,
+                   z0_res = svqrshrnb_n_s32 (z1, 16),
+                   z0_res = svqrshrnb (z1, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnb_s64.c
new file mode 100644 (file)
index 0000000..d4e208a
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshrnb_1_s64:
+**     sqrshrnb        z0\.s, z0\.d, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_1_s64, svint32_t, svint64_t,
+                   z0_res = svqrshrnb_n_s64 (z0, 1),
+                   z0_res = svqrshrnb (z0, 1))
+
+/*
+** qrshrnb_2_s64:
+**     sqrshrnb        z0\.s, z0\.d, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_2_s64, svint32_t, svint64_t,
+                   z0_res = svqrshrnb_n_s64 (z0, 2),
+                   z0_res = svqrshrnb (z0, 2))
+
+/*
+** qrshrnb_32_s64_tied1:
+**     sqrshrnb        z0\.s, z0\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_32_s64_tied1, svint32_t, svint64_t,
+                   z0_res = svqrshrnb_n_s64 (z0, 32),
+                   z0_res = svqrshrnb (z0, 32))
+
+/*
+** qrshrnb_32_s64_untied:
+**     sqrshrnb        z0\.s, z1\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_32_s64_untied, svint32_t, svint64_t,
+                   z0_res = svqrshrnb_n_s64 (z1, 32),
+                   z0_res = svqrshrnb (z1, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnb_u16.c
new file mode 100644 (file)
index 0000000..ee7d35d
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshrnb_1_u16:
+**     uqrshrnb        z0\.b, z0\.h, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_1_u16, svuint8_t, svuint16_t,
+                   z0_res = svqrshrnb_n_u16 (z0, 1),
+                   z0_res = svqrshrnb (z0, 1))
+
+/*
+** qrshrnb_2_u16:
+**     uqrshrnb        z0\.b, z0\.h, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_2_u16, svuint8_t, svuint16_t,
+                   z0_res = svqrshrnb_n_u16 (z0, 2),
+                   z0_res = svqrshrnb (z0, 2))
+
+/*
+** qrshrnb_8_u16_tied1:
+**     uqrshrnb        z0\.b, z0\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_8_u16_tied1, svuint8_t, svuint16_t,
+                   z0_res = svqrshrnb_n_u16 (z0, 8),
+                   z0_res = svqrshrnb (z0, 8))
+
+/*
+** qrshrnb_8_u16_untied:
+**     uqrshrnb        z0\.b, z1\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_8_u16_untied, svuint8_t, svuint16_t,
+                   z0_res = svqrshrnb_n_u16 (z1, 8),
+                   z0_res = svqrshrnb (z1, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnb_u32.c
new file mode 100644 (file)
index 0000000..6f180c3
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshrnb_1_u32:
+**     uqrshrnb        z0\.h, z0\.s, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_1_u32, svuint16_t, svuint32_t,
+                   z0_res = svqrshrnb_n_u32 (z0, 1),
+                   z0_res = svqrshrnb (z0, 1))
+
+/*
+** qrshrnb_2_u32:
+**     uqrshrnb        z0\.h, z0\.s, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_2_u32, svuint16_t, svuint32_t,
+                   z0_res = svqrshrnb_n_u32 (z0, 2),
+                   z0_res = svqrshrnb (z0, 2))
+
+/*
+** qrshrnb_16_u32_tied1:
+**     uqrshrnb        z0\.h, z0\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_16_u32_tied1, svuint16_t, svuint32_t,
+                   z0_res = svqrshrnb_n_u32 (z0, 16),
+                   z0_res = svqrshrnb (z0, 16))
+
+/*
+** qrshrnb_16_u32_untied:
+**     uqrshrnb        z0\.h, z1\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_16_u32_untied, svuint16_t, svuint32_t,
+                   z0_res = svqrshrnb_n_u32 (z1, 16),
+                   z0_res = svqrshrnb (z1, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnb_u64.c
new file mode 100644 (file)
index 0000000..8d17c10
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshrnb_1_u64:
+**     uqrshrnb        z0\.s, z0\.d, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_1_u64, svuint32_t, svuint64_t,
+                   z0_res = svqrshrnb_n_u64 (z0, 1),
+                   z0_res = svqrshrnb (z0, 1))
+
+/*
+** qrshrnb_2_u64:
+**     uqrshrnb        z0\.s, z0\.d, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_2_u64, svuint32_t, svuint64_t,
+                   z0_res = svqrshrnb_n_u64 (z0, 2),
+                   z0_res = svqrshrnb (z0, 2))
+
+/*
+** qrshrnb_32_u64_tied1:
+**     uqrshrnb        z0\.s, z0\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_32_u64_tied1, svuint32_t, svuint64_t,
+                   z0_res = svqrshrnb_n_u64 (z0, 32),
+                   z0_res = svqrshrnb (z0, 32))
+
+/*
+** qrshrnb_32_u64_untied:
+**     uqrshrnb        z0\.s, z1\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrnb_32_u64_untied, svuint32_t, svuint64_t,
+                   z0_res = svqrshrnb_n_u64 (z1, 32),
+                   z0_res = svqrshrnb (z1, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnt_s16.c
new file mode 100644 (file)
index 0000000..b5a72e9
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshrnt_1_s16:
+**     sqrshrnt        z0\.b, z4\.h, #1
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_1_s16, svint8_t, svint16_t,
+            z0 = svqrshrnt_n_s16 (z0, z4, 1),
+            z0 = svqrshrnt (z0, z4, 1))
+
+/*
+** qrshrnt_2_s16:
+**     sqrshrnt        z0\.b, z4\.h, #2
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_2_s16, svint8_t, svint16_t,
+            z0 = svqrshrnt_n_s16 (z0, z4, 2),
+            z0 = svqrshrnt (z0, z4, 2))
+
+/*
+** qrshrnt_8_s16_tied1:
+**     sqrshrnt        z0\.b, z4\.h, #8
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_8_s16_tied1, svint8_t, svint16_t,
+            z0 = svqrshrnt_n_s16 (z0, z4, 8),
+            z0 = svqrshrnt (z0, z4, 8))
+
+/*
+** qrshrnt_8_s16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     sqrshrnt        z0\.b, z4\.h, #8
+** |
+**     sqrshrnt        z1\.b, z4\.h, #8
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_8_s16_untied, svint8_t, svint16_t,
+            z0 = svqrshrnt_n_s16 (z1, z4, 8),
+            z0 = svqrshrnt (z1, z4, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnt_s32.c
new file mode 100644 (file)
index 0000000..bebdbc5
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshrnt_1_s32:
+**     sqrshrnt        z0\.h, z4\.s, #1
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_1_s32, svint16_t, svint32_t,
+            z0 = svqrshrnt_n_s32 (z0, z4, 1),
+            z0 = svqrshrnt (z0, z4, 1))
+
+/*
+** qrshrnt_2_s32:
+**     sqrshrnt        z0\.h, z4\.s, #2
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_2_s32, svint16_t, svint32_t,
+            z0 = svqrshrnt_n_s32 (z0, z4, 2),
+            z0 = svqrshrnt (z0, z4, 2))
+
+/*
+** qrshrnt_16_s32_tied1:
+**     sqrshrnt        z0\.h, z4\.s, #16
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_16_s32_tied1, svint16_t, svint32_t,
+            z0 = svqrshrnt_n_s32 (z0, z4, 16),
+            z0 = svqrshrnt (z0, z4, 16))
+
+/*
+** qrshrnt_16_s32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     sqrshrnt        z0\.h, z4\.s, #16
+** |
+**     sqrshrnt        z1\.h, z4\.s, #16
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_16_s32_untied, svint16_t, svint32_t,
+            z0 = svqrshrnt_n_s32 (z1, z4, 16),
+            z0 = svqrshrnt (z1, z4, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnt_s64.c
new file mode 100644 (file)
index 0000000..b177b72
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshrnt_1_s64:
+**     sqrshrnt        z0\.s, z4\.d, #1
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_1_s64, svint32_t, svint64_t,
+            z0 = svqrshrnt_n_s64 (z0, z4, 1),
+            z0 = svqrshrnt (z0, z4, 1))
+
+/*
+** qrshrnt_2_s64:
+**     sqrshrnt        z0\.s, z4\.d, #2
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_2_s64, svint32_t, svint64_t,
+            z0 = svqrshrnt_n_s64 (z0, z4, 2),
+            z0 = svqrshrnt (z0, z4, 2))
+
+/*
+** qrshrnt_32_s64_tied1:
+**     sqrshrnt        z0\.s, z4\.d, #32
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_32_s64_tied1, svint32_t, svint64_t,
+            z0 = svqrshrnt_n_s64 (z0, z4, 32),
+            z0 = svqrshrnt (z0, z4, 32))
+
+/*
+** qrshrnt_32_s64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     sqrshrnt        z0\.s, z4\.d, #32
+** |
+**     sqrshrnt        z1\.s, z4\.d, #32
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_32_s64_untied, svint32_t, svint64_t,
+            z0 = svqrshrnt_n_s64 (z1, z4, 32),
+            z0 = svqrshrnt (z1, z4, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnt_u16.c
new file mode 100644 (file)
index 0000000..2b616be
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshrnt_1_u16:
+**     uqrshrnt        z0\.b, z4\.h, #1
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_1_u16, svuint8_t, svuint16_t,
+            z0 = svqrshrnt_n_u16 (z0, z4, 1),
+            z0 = svqrshrnt (z0, z4, 1))
+
+/*
+** qrshrnt_2_u16:
+**     uqrshrnt        z0\.b, z4\.h, #2
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_2_u16, svuint8_t, svuint16_t,
+            z0 = svqrshrnt_n_u16 (z0, z4, 2),
+            z0 = svqrshrnt (z0, z4, 2))
+
+/*
+** qrshrnt_8_u16_tied1:
+**     uqrshrnt        z0\.b, z4\.h, #8
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_8_u16_tied1, svuint8_t, svuint16_t,
+            z0 = svqrshrnt_n_u16 (z0, z4, 8),
+            z0 = svqrshrnt (z0, z4, 8))
+
+/*
+** qrshrnt_8_u16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     uqrshrnt        z0\.b, z4\.h, #8
+** |
+**     uqrshrnt        z1\.b, z4\.h, #8
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_8_u16_untied, svuint8_t, svuint16_t,
+            z0 = svqrshrnt_n_u16 (z1, z4, 8),
+            z0 = svqrshrnt (z1, z4, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnt_u32.c
new file mode 100644 (file)
index 0000000..59c5ed3
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshrnt_1_u32:
+**     uqrshrnt        z0\.h, z4\.s, #1
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_1_u32, svuint16_t, svuint32_t,
+            z0 = svqrshrnt_n_u32 (z0, z4, 1),
+            z0 = svqrshrnt (z0, z4, 1))
+
+/*
+** qrshrnt_2_u32:
+**     uqrshrnt        z0\.h, z4\.s, #2
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_2_u32, svuint16_t, svuint32_t,
+            z0 = svqrshrnt_n_u32 (z0, z4, 2),
+            z0 = svqrshrnt (z0, z4, 2))
+
+/*
+** qrshrnt_16_u32_tied1:
+**     uqrshrnt        z0\.h, z4\.s, #16
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_16_u32_tied1, svuint16_t, svuint32_t,
+            z0 = svqrshrnt_n_u32 (z0, z4, 16),
+            z0 = svqrshrnt (z0, z4, 16))
+
+/*
+** qrshrnt_16_u32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     uqrshrnt        z0\.h, z4\.s, #16
+** |
+**     uqrshrnt        z1\.h, z4\.s, #16
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_16_u32_untied, svuint16_t, svuint32_t,
+            z0 = svqrshrnt_n_u32 (z1, z4, 16),
+            z0 = svqrshrnt (z1, z4, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrnt_u64.c
new file mode 100644 (file)
index 0000000..148f3bb
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshrnt_1_u64:
+**     uqrshrnt        z0\.s, z4\.d, #1
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_1_u64, svuint32_t, svuint64_t,
+            z0 = svqrshrnt_n_u64 (z0, z4, 1),
+            z0 = svqrshrnt (z0, z4, 1))
+
+/*
+** qrshrnt_2_u64:
+**     uqrshrnt        z0\.s, z4\.d, #2
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_2_u64, svuint32_t, svuint64_t,
+            z0 = svqrshrnt_n_u64 (z0, z4, 2),
+            z0 = svqrshrnt (z0, z4, 2))
+
+/*
+** qrshrnt_32_u64_tied1:
+**     uqrshrnt        z0\.s, z4\.d, #32
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_32_u64_tied1, svuint32_t, svuint64_t,
+            z0 = svqrshrnt_n_u64 (z0, z4, 32),
+            z0 = svqrshrnt (z0, z4, 32))
+
+/*
+** qrshrnt_32_u64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     uqrshrnt        z0\.s, z4\.d, #32
+** |
+**     uqrshrnt        z1\.s, z4\.d, #32
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshrnt_32_u64_untied, svuint32_t, svuint64_t,
+            z0 = svqrshrnt_n_u64 (z1, z4, 32),
+            z0 = svqrshrnt (z1, z4, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrunb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrunb_s16.c
new file mode 100644 (file)
index 0000000..f19f319
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshrunb_1_s16:
+**     sqrshrunb       z0\.b, z0\.h, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrunb_1_s16, svuint8_t, svint16_t,
+                   z0_res = svqrshrunb_n_s16 (z0, 1),
+                   z0_res = svqrshrunb (z0, 1))
+
+/*
+** qrshrunb_2_s16:
+**     sqrshrunb       z0\.b, z0\.h, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrunb_2_s16, svuint8_t, svint16_t,
+                   z0_res = svqrshrunb_n_s16 (z0, 2),
+                   z0_res = svqrshrunb (z0, 2))
+
+/*
+** qrshrunb_8_s16_tied1:
+**     sqrshrunb       z0\.b, z0\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrunb_8_s16_tied1, svuint8_t, svint16_t,
+                   z0_res = svqrshrunb_n_s16 (z0, 8),
+                   z0_res = svqrshrunb (z0, 8))
+
+/*
+** qrshrunb_8_s16_untied:
+**     sqrshrunb       z0\.b, z1\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrunb_8_s16_untied, svuint8_t, svint16_t,
+                   z0_res = svqrshrunb_n_s16 (z1, 8),
+                   z0_res = svqrshrunb (z1, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrunb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrunb_s32.c
new file mode 100644 (file)
index 0000000..904af7a
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshrunb_1_s32:
+**     sqrshrunb       z0\.h, z0\.s, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrunb_1_s32, svuint16_t, svint32_t,
+                   z0_res = svqrshrunb_n_s32 (z0, 1),
+                   z0_res = svqrshrunb (z0, 1))
+
+/*
+** qrshrunb_2_s32:
+**     sqrshrunb       z0\.h, z0\.s, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrunb_2_s32, svuint16_t, svint32_t,
+                   z0_res = svqrshrunb_n_s32 (z0, 2),
+                   z0_res = svqrshrunb (z0, 2))
+
+/*
+** qrshrunb_16_s32_tied1:
+**     sqrshrunb       z0\.h, z0\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrunb_16_s32_tied1, svuint16_t, svint32_t,
+                   z0_res = svqrshrunb_n_s32 (z0, 16),
+                   z0_res = svqrshrunb (z0, 16))
+
+/*
+** qrshrunb_16_s32_untied:
+**     sqrshrunb       z0\.h, z1\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrunb_16_s32_untied, svuint16_t, svint32_t,
+                   z0_res = svqrshrunb_n_s32 (z1, 16),
+                   z0_res = svqrshrunb (z1, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrunb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrunb_s64.c
new file mode 100644 (file)
index 0000000..7aa31b3
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshrunb_1_s64:
+**     sqrshrunb       z0\.s, z0\.d, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrunb_1_s64, svuint32_t, svint64_t,
+                   z0_res = svqrshrunb_n_s64 (z0, 1),
+                   z0_res = svqrshrunb (z0, 1))
+
+/*
+** qrshrunb_2_s64:
+**     sqrshrunb       z0\.s, z0\.d, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrunb_2_s64, svuint32_t, svint64_t,
+                   z0_res = svqrshrunb_n_s64 (z0, 2),
+                   z0_res = svqrshrunb (z0, 2))
+
+/*
+** qrshrunb_32_s64_tied1:
+**     sqrshrunb       z0\.s, z0\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrunb_32_s64_tied1, svuint32_t, svint64_t,
+                   z0_res = svqrshrunb_n_s64 (z0, 32),
+                   z0_res = svqrshrunb (z0, 32))
+
+/*
+** qrshrunb_32_s64_untied:
+**     sqrshrunb       z0\.s, z1\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qrshrunb_32_s64_untied, svuint32_t, svint64_t,
+                   z0_res = svqrshrunb_n_s64 (z1, 32),
+                   z0_res = svqrshrunb (z1, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrunt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrunt_s16.c
new file mode 100644 (file)
index 0000000..6cd2a1a
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshrunt_1_s16:
+**     sqrshrunt       z0\.b, z4\.h, #1
+**     ret
+*/
+TEST_DUAL_Z (qrshrunt_1_s16, svuint8_t, svint16_t,
+            z0 = svqrshrunt_n_s16 (z0, z4, 1),
+            z0 = svqrshrunt (z0, z4, 1))
+
+/*
+** qrshrunt_2_s16:
+**     sqrshrunt       z0\.b, z4\.h, #2
+**     ret
+*/
+TEST_DUAL_Z (qrshrunt_2_s16, svuint8_t, svint16_t,
+            z0 = svqrshrunt_n_s16 (z0, z4, 2),
+            z0 = svqrshrunt (z0, z4, 2))
+
+/*
+** qrshrunt_8_s16_tied1:
+**     sqrshrunt       z0\.b, z4\.h, #8
+**     ret
+*/
+TEST_DUAL_Z (qrshrunt_8_s16_tied1, svuint8_t, svint16_t,
+            z0 = svqrshrunt_n_s16 (z0, z4, 8),
+            z0 = svqrshrunt (z0, z4, 8))
+
+/*
+** qrshrunt_8_s16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     sqrshrunt       z0\.b, z4\.h, #8
+** |
+**     sqrshrunt       z1\.b, z4\.h, #8
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshrunt_8_s16_untied, svuint8_t, svint16_t,
+            z0 = svqrshrunt_n_s16 (z1, z4, 8),
+            z0 = svqrshrunt (z1, z4, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrunt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrunt_s32.c
new file mode 100644 (file)
index 0000000..62c4f78
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshrunt_1_s32:
+**     sqrshrunt       z0\.h, z4\.s, #1
+**     ret
+*/
+TEST_DUAL_Z (qrshrunt_1_s32, svuint16_t, svint32_t,
+            z0 = svqrshrunt_n_s32 (z0, z4, 1),
+            z0 = svqrshrunt (z0, z4, 1))
+
+/*
+** qrshrunt_2_s32:
+**     sqrshrunt       z0\.h, z4\.s, #2
+**     ret
+*/
+TEST_DUAL_Z (qrshrunt_2_s32, svuint16_t, svint32_t,
+            z0 = svqrshrunt_n_s32 (z0, z4, 2),
+            z0 = svqrshrunt (z0, z4, 2))
+
+/*
+** qrshrunt_16_s32_tied1:
+**     sqrshrunt       z0\.h, z4\.s, #16
+**     ret
+*/
+TEST_DUAL_Z (qrshrunt_16_s32_tied1, svuint16_t, svint32_t,
+            z0 = svqrshrunt_n_s32 (z0, z4, 16),
+            z0 = svqrshrunt (z0, z4, 16))
+
+/*
+** qrshrunt_16_s32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     sqrshrunt       z0\.h, z4\.s, #16
+** |
+**     sqrshrunt       z1\.h, z4\.s, #16
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshrunt_16_s32_untied, svuint16_t, svint32_t,
+            z0 = svqrshrunt_n_s32 (z1, z4, 16),
+            z0 = svqrshrunt (z1, z4, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrunt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qrshrunt_s64.c
new file mode 100644 (file)
index 0000000..92021bd
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qrshrunt_1_s64:
+**     sqrshrunt       z0\.s, z4\.d, #1
+**     ret
+*/
+TEST_DUAL_Z (qrshrunt_1_s64, svuint32_t, svint64_t,
+            z0 = svqrshrunt_n_s64 (z0, z4, 1),
+            z0 = svqrshrunt (z0, z4, 1))
+
+/*
+** qrshrunt_2_s64:
+**     sqrshrunt       z0\.s, z4\.d, #2
+**     ret
+*/
+TEST_DUAL_Z (qrshrunt_2_s64, svuint32_t, svint64_t,
+            z0 = svqrshrunt_n_s64 (z0, z4, 2),
+            z0 = svqrshrunt (z0, z4, 2))
+
+/*
+** qrshrunt_32_s64_tied1:
+**     sqrshrunt       z0\.s, z4\.d, #32
+**     ret
+*/
+TEST_DUAL_Z (qrshrunt_32_s64_tied1, svuint32_t, svint64_t,
+            z0 = svqrshrunt_n_s64 (z0, z4, 32),
+            z0 = svqrshrunt (z0, z4, 32))
+
+/*
+** qrshrunt_32_s64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     sqrshrunt       z0\.s, z4\.d, #32
+** |
+**     sqrshrunt       z1\.s, z4\.d, #32
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qrshrunt_32_s64_untied, svuint32_t, svint64_t,
+            z0 = svqrshrunt_n_s64 (z1, z4, 32),
+            z0 = svqrshrunt (z1, z4, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_s16.c
new file mode 100644 (file)
index 0000000..ca1d762
--- /dev/null
@@ -0,0 +1,396 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshl_s16_m_tied1:
+**     sqshl   z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qshl_s16_m_tied1, svint16_t, svint16_t,
+            z0 = svqshl_s16_m (p0, z0, z4),
+            z0 = svqshl_m (p0, z0, z4))
+
+/*
+** qshl_s16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqshl   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_s16_m_tied2, svint16_t, svint16_t,
+                z0_res = svqshl_s16_m (p0, z4, z0),
+                z0_res = svqshl_m (p0, z4, z0))
+
+/*
+** qshl_s16_m_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qshl_s16_m_untied, svint16_t, svint16_t,
+            z0 = svqshl_s16_m (p0, z1, z4),
+            z0 = svqshl_m (p0, z1, z4))
+
+/*
+** qshl_w0_s16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqshl   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_s16_m_tied1, svint16_t, int16_t,
+                z0 = svqshl_n_s16_m (p0, z0, x0),
+                z0 = svqshl_m (p0, z0, x0))
+
+/*
+** qshl_w0_s16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     sqshl   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_s16_m_untied, svint16_t, int16_t,
+                z0 = svqshl_n_s16_m (p0, z1, x0),
+                z0 = svqshl_m (p0, z1, x0))
+
+/*
+** qshl_m16_s16_m:
+**     asr     z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m16_s16_m, svint16_t,
+               z0 = svqshl_n_s16_m (p0, z0, -16),
+               z0 = svqshl_m (p0, z0, -16))
+
+/*
+** qshl_m2_s16_m:
+**     asr     z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_s16_m, svint16_t,
+               z0 = svqshl_n_s16_m (p0, z0, -2),
+               z0 = svqshl_m (p0, z0, -2))
+
+/*
+** qshl_m1_s16_m_tied1:
+**     asr     z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s16_m_tied1, svint16_t,
+               z0 = svqshl_n_s16_m (p0, z0, -1),
+               z0 = svqshl_m (p0, z0, -1))
+
+/*
+** qshl_m1_s16_m_untied:
+**     movprfx z0, z1
+**     asr     z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s16_m_untied, svint16_t,
+               z0 = svqshl_n_s16_m (p0, z1, -1),
+               z0 = svqshl_m (p0, z1, -1))
+
+/*
+** qshl_1_s16_m_tied1:
+**     sqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s16_m_tied1, svint16_t,
+               z0 = svqshl_n_s16_m (p0, z0, 1),
+               z0 = svqshl_m (p0, z0, 1))
+
+/*
+** qshl_1_s16_m_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s16_m_untied, svint16_t,
+               z0 = svqshl_n_s16_m (p0, z1, 1),
+               z0 = svqshl_m (p0, z1, 1))
+
+/*
+** qshl_2_s16_m:
+**     sqshl   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_s16_m, svint16_t,
+               z0 = svqshl_n_s16_m (p0, z0, 2),
+               z0 = svqshl_m (p0, z0, 2))
+
+/*
+** qshl_15_s16_m:
+**     sqshl   z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_15_s16_m, svint16_t,
+               z0 = svqshl_n_s16_m (p0, z0, 15),
+               z0 = svqshl_m (p0, z0, 15))
+
+/*
+** qshl_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqshl   z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qshl_s16_z_tied1, svint16_t, svint16_t,
+            z0 = svqshl_s16_z (p0, z0, z4),
+            z0 = svqshl_z (p0, z0, z4))
+
+/*
+** qshl_s16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqshlr  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_s16_z_tied2, svint16_t, svint16_t,
+                z0_res = svqshl_s16_z (p0, z4, z0),
+                z0_res = svqshl_z (p0, z4, z0))
+
+/*
+** qshl_s16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqshl   z0\.h, p0/m, z0\.h, z4\.h
+** |
+**     movprfx z0\.h, p0/z, z4\.h
+**     sqshlr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshl_s16_z_untied, svint16_t, svint16_t,
+            z0 = svqshl_s16_z (p0, z1, z4),
+            z0 = svqshl_z (p0, z1, z4))
+
+/*
+** qshl_w0_s16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqshl   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_s16_z_tied1, svint16_t, int16_t,
+                z0 = svqshl_n_s16_z (p0, z0, x0),
+                z0 = svqshl_z (p0, z0, x0))
+
+/*
+** qshl_w0_s16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqshl   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     sqshlr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_s16_z_untied, svint16_t, int16_t,
+                z0 = svqshl_n_s16_z (p0, z1, x0),
+                z0 = svqshl_z (p0, z1, x0))
+
+/*
+** qshl_m16_s16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     asr     z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m16_s16_z, svint16_t,
+               z0 = svqshl_n_s16_z (p0, z0, -16),
+               z0 = svqshl_z (p0, z0, -16))
+
+/*
+** qshl_m2_s16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     asr     z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_s16_z, svint16_t,
+               z0 = svqshl_n_s16_z (p0, z0, -2),
+               z0 = svqshl_z (p0, z0, -2))
+
+/*
+** qshl_m1_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     asr     z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s16_z_tied1, svint16_t,
+               z0 = svqshl_n_s16_z (p0, z0, -1),
+               z0 = svqshl_z (p0, z0, -1))
+
+/*
+** qshl_m1_s16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     asr     z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s16_z_untied, svint16_t,
+               z0 = svqshl_n_s16_z (p0, z1, -1),
+               z0 = svqshl_z (p0, z1, -1))
+
+/*
+** qshl_1_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s16_z_tied1, svint16_t,
+               z0 = svqshl_n_s16_z (p0, z0, 1),
+               z0 = svqshl_z (p0, z0, 1))
+
+/*
+** qshl_1_s16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s16_z_untied, svint16_t,
+               z0 = svqshl_n_s16_z (p0, z1, 1),
+               z0 = svqshl_z (p0, z1, 1))
+
+/*
+** qshl_2_s16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqshl   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_s16_z, svint16_t,
+               z0 = svqshl_n_s16_z (p0, z0, 2),
+               z0 = svqshl_z (p0, z0, 2))
+
+/*
+** qshl_15_s16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqshl   z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_15_s16_z, svint16_t,
+               z0 = svqshl_n_s16_z (p0, z0, 15),
+               z0 = svqshl_z (p0, z0, 15))
+
+/*
+** qshl_s16_x_tied1:
+**     sqshl   z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qshl_s16_x_tied1, svint16_t, svint16_t,
+            z0 = svqshl_s16_x (p0, z0, z4),
+            z0 = svqshl_x (p0, z0, z4))
+
+/*
+** qshl_s16_x_tied2:
+**     sqshlr  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_s16_x_tied2, svint16_t, svint16_t,
+                z0_res = svqshl_s16_x (p0, z4, z0),
+                z0_res = svqshl_x (p0, z4, z0))
+
+/*
+** qshl_s16_x_untied:
+** (
+**     movprfx z0, z1
+**     sqshl   z0\.h, p0/m, z0\.h, z4\.h
+** |
+**     movprfx z0, z4
+**     sqshlr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshl_s16_x_untied, svint16_t, svint16_t,
+            z0 = svqshl_s16_x (p0, z1, z4),
+            z0 = svqshl_x (p0, z1, z4))
+
+/*
+** qshl_w0_s16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqshl   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_s16_x_tied1, svint16_t, int16_t,
+                z0 = svqshl_n_s16_x (p0, z0, x0),
+                z0 = svqshl_x (p0, z0, x0))
+
+/*
+** qshl_w0_s16_x_untied:
+**     mov     z0\.h, w0
+**     sqshlr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_s16_x_untied, svint16_t, int16_t,
+                z0 = svqshl_n_s16_x (p0, z1, x0),
+                z0 = svqshl_x (p0, z1, x0))
+
+/*
+** qshl_m16_s16_x:
+**     asr     z0\.h, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m16_s16_x, svint16_t,
+               z0 = svqshl_n_s16_x (p0, z0, -16),
+               z0 = svqshl_x (p0, z0, -16))
+
+/*
+** qshl_m2_s16_x:
+**     asr     z0\.h, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_s16_x, svint16_t,
+               z0 = svqshl_n_s16_x (p0, z0, -2),
+               z0 = svqshl_x (p0, z0, -2))
+
+/*
+** qshl_m1_s16_x_tied1:
+**     asr     z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s16_x_tied1, svint16_t,
+               z0 = svqshl_n_s16_x (p0, z0, -1),
+               z0 = svqshl_x (p0, z0, -1))
+
+/*
+** qshl_m1_s16_x_untied:
+**     asr     z0\.h, z1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s16_x_untied, svint16_t,
+               z0 = svqshl_n_s16_x (p0, z1, -1),
+               z0 = svqshl_x (p0, z1, -1))
+
+/*
+** qshl_1_s16_x_tied1:
+**     sqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s16_x_tied1, svint16_t,
+               z0 = svqshl_n_s16_x (p0, z0, 1),
+               z0 = svqshl_x (p0, z0, 1))
+
+/*
+** qshl_1_s16_x_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s16_x_untied, svint16_t,
+               z0 = svqshl_n_s16_x (p0, z1, 1),
+               z0 = svqshl_x (p0, z1, 1))
+
+/*
+** qshl_2_s16_x:
+**     sqshl   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_s16_x, svint16_t,
+               z0 = svqshl_n_s16_x (p0, z0, 2),
+               z0 = svqshl_x (p0, z0, 2))
+
+/*
+** qshl_15_s16_x:
+**     sqshl   z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_15_s16_x, svint16_t,
+               z0 = svqshl_n_s16_x (p0, z0, 15),
+               z0 = svqshl_x (p0, z0, 15))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_s32.c
new file mode 100644 (file)
index 0000000..09255ec
--- /dev/null
@@ -0,0 +1,396 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshl_s32_m_tied1:
+**     sqshl   z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qshl_s32_m_tied1, svint32_t, svint32_t,
+            z0 = svqshl_s32_m (p0, z0, z4),
+            z0 = svqshl_m (p0, z0, z4))
+
+/*
+** qshl_s32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqshl   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_s32_m_tied2, svint32_t, svint32_t,
+                z0_res = svqshl_s32_m (p0, z4, z0),
+                z0_res = svqshl_m (p0, z4, z0))
+
+/*
+** qshl_s32_m_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qshl_s32_m_untied, svint32_t, svint32_t,
+            z0 = svqshl_s32_m (p0, z1, z4),
+            z0 = svqshl_m (p0, z1, z4))
+
+/*
+** qshl_w0_s32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqshl   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_s32_m_tied1, svint32_t, int32_t,
+                z0 = svqshl_n_s32_m (p0, z0, x0),
+                z0 = svqshl_m (p0, z0, x0))
+
+/*
+** qshl_w0_s32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     sqshl   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_s32_m_untied, svint32_t, int32_t,
+                z0 = svqshl_n_s32_m (p0, z1, x0),
+                z0 = svqshl_m (p0, z1, x0))
+
+/*
+** qshl_m32_s32_m:
+**     asr     z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m32_s32_m, svint32_t,
+               z0 = svqshl_n_s32_m (p0, z0, -32),
+               z0 = svqshl_m (p0, z0, -32))
+
+/*
+** qshl_m2_s32_m:
+**     asr     z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_s32_m, svint32_t,
+               z0 = svqshl_n_s32_m (p0, z0, -2),
+               z0 = svqshl_m (p0, z0, -2))
+
+/*
+** qshl_m1_s32_m_tied1:
+**     asr     z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s32_m_tied1, svint32_t,
+               z0 = svqshl_n_s32_m (p0, z0, -1),
+               z0 = svqshl_m (p0, z0, -1))
+
+/*
+** qshl_m1_s32_m_untied:
+**     movprfx z0, z1
+**     asr     z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s32_m_untied, svint32_t,
+               z0 = svqshl_n_s32_m (p0, z1, -1),
+               z0 = svqshl_m (p0, z1, -1))
+
+/*
+** qshl_1_s32_m_tied1:
+**     sqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s32_m_tied1, svint32_t,
+               z0 = svqshl_n_s32_m (p0, z0, 1),
+               z0 = svqshl_m (p0, z0, 1))
+
+/*
+** qshl_1_s32_m_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s32_m_untied, svint32_t,
+               z0 = svqshl_n_s32_m (p0, z1, 1),
+               z0 = svqshl_m (p0, z1, 1))
+
+/*
+** qshl_2_s32_m:
+**     sqshl   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_s32_m, svint32_t,
+               z0 = svqshl_n_s32_m (p0, z0, 2),
+               z0 = svqshl_m (p0, z0, 2))
+
+/*
+** qshl_31_s32_m:
+**     sqshl   z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_31_s32_m, svint32_t,
+               z0 = svqshl_n_s32_m (p0, z0, 31),
+               z0 = svqshl_m (p0, z0, 31))
+
+/*
+** qshl_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqshl   z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qshl_s32_z_tied1, svint32_t, svint32_t,
+            z0 = svqshl_s32_z (p0, z0, z4),
+            z0 = svqshl_z (p0, z0, z4))
+
+/*
+** qshl_s32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqshlr  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_s32_z_tied2, svint32_t, svint32_t,
+                z0_res = svqshl_s32_z (p0, z4, z0),
+                z0_res = svqshl_z (p0, z4, z0))
+
+/*
+** qshl_s32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqshl   z0\.s, p0/m, z0\.s, z4\.s
+** |
+**     movprfx z0\.s, p0/z, z4\.s
+**     sqshlr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshl_s32_z_untied, svint32_t, svint32_t,
+            z0 = svqshl_s32_z (p0, z1, z4),
+            z0 = svqshl_z (p0, z1, z4))
+
+/*
+** qshl_w0_s32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqshl   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_s32_z_tied1, svint32_t, int32_t,
+                z0 = svqshl_n_s32_z (p0, z0, x0),
+                z0 = svqshl_z (p0, z0, x0))
+
+/*
+** qshl_w0_s32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqshl   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     sqshlr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_s32_z_untied, svint32_t, int32_t,
+                z0 = svqshl_n_s32_z (p0, z1, x0),
+                z0 = svqshl_z (p0, z1, x0))
+
+/*
+** qshl_m32_s32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     asr     z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m32_s32_z, svint32_t,
+               z0 = svqshl_n_s32_z (p0, z0, -32),
+               z0 = svqshl_z (p0, z0, -32))
+
+/*
+** qshl_m2_s32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     asr     z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_s32_z, svint32_t,
+               z0 = svqshl_n_s32_z (p0, z0, -2),
+               z0 = svqshl_z (p0, z0, -2))
+
+/*
+** qshl_m1_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     asr     z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s32_z_tied1, svint32_t,
+               z0 = svqshl_n_s32_z (p0, z0, -1),
+               z0 = svqshl_z (p0, z0, -1))
+
+/*
+** qshl_m1_s32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     asr     z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s32_z_untied, svint32_t,
+               z0 = svqshl_n_s32_z (p0, z1, -1),
+               z0 = svqshl_z (p0, z1, -1))
+
+/*
+** qshl_1_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s32_z_tied1, svint32_t,
+               z0 = svqshl_n_s32_z (p0, z0, 1),
+               z0 = svqshl_z (p0, z0, 1))
+
+/*
+** qshl_1_s32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s32_z_untied, svint32_t,
+               z0 = svqshl_n_s32_z (p0, z1, 1),
+               z0 = svqshl_z (p0, z1, 1))
+
+/*
+** qshl_2_s32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqshl   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_s32_z, svint32_t,
+               z0 = svqshl_n_s32_z (p0, z0, 2),
+               z0 = svqshl_z (p0, z0, 2))
+
+/*
+** qshl_31_s32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqshl   z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_31_s32_z, svint32_t,
+               z0 = svqshl_n_s32_z (p0, z0, 31),
+               z0 = svqshl_z (p0, z0, 31))
+
+/*
+** qshl_s32_x_tied1:
+**     sqshl   z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qshl_s32_x_tied1, svint32_t, svint32_t,
+            z0 = svqshl_s32_x (p0, z0, z4),
+            z0 = svqshl_x (p0, z0, z4))
+
+/*
+** qshl_s32_x_tied2:
+**     sqshlr  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_s32_x_tied2, svint32_t, svint32_t,
+                z0_res = svqshl_s32_x (p0, z4, z0),
+                z0_res = svqshl_x (p0, z4, z0))
+
+/*
+** qshl_s32_x_untied:
+** (
+**     movprfx z0, z1
+**     sqshl   z0\.s, p0/m, z0\.s, z4\.s
+** |
+**     movprfx z0, z4
+**     sqshlr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshl_s32_x_untied, svint32_t, svint32_t,
+            z0 = svqshl_s32_x (p0, z1, z4),
+            z0 = svqshl_x (p0, z1, z4))
+
+/*
+** qshl_w0_s32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqshl   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_s32_x_tied1, svint32_t, int32_t,
+                z0 = svqshl_n_s32_x (p0, z0, x0),
+                z0 = svqshl_x (p0, z0, x0))
+
+/*
+** qshl_w0_s32_x_untied:
+**     mov     z0\.s, w0
+**     sqshlr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_s32_x_untied, svint32_t, int32_t,
+                z0 = svqshl_n_s32_x (p0, z1, x0),
+                z0 = svqshl_x (p0, z1, x0))
+
+/*
+** qshl_m32_s32_x:
+**     asr     z0\.s, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m32_s32_x, svint32_t,
+               z0 = svqshl_n_s32_x (p0, z0, -32),
+               z0 = svqshl_x (p0, z0, -32))
+
+/*
+** qshl_m2_s32_x:
+**     asr     z0\.s, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_s32_x, svint32_t,
+               z0 = svqshl_n_s32_x (p0, z0, -2),
+               z0 = svqshl_x (p0, z0, -2))
+
+/*
+** qshl_m1_s32_x_tied1:
+**     asr     z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s32_x_tied1, svint32_t,
+               z0 = svqshl_n_s32_x (p0, z0, -1),
+               z0 = svqshl_x (p0, z0, -1))
+
+/*
+** qshl_m1_s32_x_untied:
+**     asr     z0\.s, z1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s32_x_untied, svint32_t,
+               z0 = svqshl_n_s32_x (p0, z1, -1),
+               z0 = svqshl_x (p0, z1, -1))
+
+/*
+** qshl_1_s32_x_tied1:
+**     sqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s32_x_tied1, svint32_t,
+               z0 = svqshl_n_s32_x (p0, z0, 1),
+               z0 = svqshl_x (p0, z0, 1))
+
+/*
+** qshl_1_s32_x_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s32_x_untied, svint32_t,
+               z0 = svqshl_n_s32_x (p0, z1, 1),
+               z0 = svqshl_x (p0, z1, 1))
+
+/*
+** qshl_2_s32_x:
+**     sqshl   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_s32_x, svint32_t,
+               z0 = svqshl_n_s32_x (p0, z0, 2),
+               z0 = svqshl_x (p0, z0, 2))
+
+/*
+** qshl_31_s32_x:
+**     sqshl   z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_31_s32_x, svint32_t,
+               z0 = svqshl_n_s32_x (p0, z0, 31),
+               z0 = svqshl_x (p0, z0, 31))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_s64.c
new file mode 100644 (file)
index 0000000..b2e0dcf
--- /dev/null
@@ -0,0 +1,396 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshl_s64_m_tied1:
+**     sqshl   z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qshl_s64_m_tied1, svint64_t, svint64_t,
+            z0 = svqshl_s64_m (p0, z0, z4),
+            z0 = svqshl_m (p0, z0, z4))
+
+/*
+** qshl_s64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z4
+**     sqshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_s64_m_tied2, svint64_t, svint64_t,
+                z0_res = svqshl_s64_m (p0, z4, z0),
+                z0_res = svqshl_m (p0, z4, z0))
+
+/*
+** qshl_s64_m_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qshl_s64_m_untied, svint64_t, svint64_t,
+            z0 = svqshl_s64_m (p0, z1, z4),
+            z0 = svqshl_m (p0, z1, z4))
+
+/*
+** qshl_x0_s64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     sqshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_x0_s64_m_tied1, svint64_t, int64_t,
+                z0 = svqshl_n_s64_m (p0, z0, x0),
+                z0 = svqshl_m (p0, z0, x0))
+
+/*
+** qshl_x0_s64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     sqshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_x0_s64_m_untied, svint64_t, int64_t,
+                z0 = svqshl_n_s64_m (p0, z1, x0),
+                z0 = svqshl_m (p0, z1, x0))
+
+/*
+** qshl_m64_s64_m:
+**     asr     z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m64_s64_m, svint64_t,
+               z0 = svqshl_n_s64_m (p0, z0, -64),
+               z0 = svqshl_m (p0, z0, -64))
+
+/*
+** qshl_m2_s64_m:
+**     asr     z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_s64_m, svint64_t,
+               z0 = svqshl_n_s64_m (p0, z0, -2),
+               z0 = svqshl_m (p0, z0, -2))
+
+/*
+** qshl_m1_s64_m_tied1:
+**     asr     z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s64_m_tied1, svint64_t,
+               z0 = svqshl_n_s64_m (p0, z0, -1),
+               z0 = svqshl_m (p0, z0, -1))
+
+/*
+** qshl_m1_s64_m_untied:
+**     movprfx z0, z1
+**     asr     z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s64_m_untied, svint64_t,
+               z0 = svqshl_n_s64_m (p0, z1, -1),
+               z0 = svqshl_m (p0, z1, -1))
+
+/*
+** qshl_1_s64_m_tied1:
+**     sqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s64_m_tied1, svint64_t,
+               z0 = svqshl_n_s64_m (p0, z0, 1),
+               z0 = svqshl_m (p0, z0, 1))
+
+/*
+** qshl_1_s64_m_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s64_m_untied, svint64_t,
+               z0 = svqshl_n_s64_m (p0, z1, 1),
+               z0 = svqshl_m (p0, z1, 1))
+
+/*
+** qshl_2_s64_m:
+**     sqshl   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_s64_m, svint64_t,
+               z0 = svqshl_n_s64_m (p0, z0, 2),
+               z0 = svqshl_m (p0, z0, 2))
+
+/*
+** qshl_63_s64_m:
+**     sqshl   z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_63_s64_m, svint64_t,
+               z0 = svqshl_n_s64_m (p0, z0, 63),
+               z0 = svqshl_m (p0, z0, 63))
+
+/*
+** qshl_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqshl   z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qshl_s64_z_tied1, svint64_t, svint64_t,
+            z0 = svqshl_s64_z (p0, z0, z4),
+            z0 = svqshl_z (p0, z0, z4))
+
+/*
+** qshl_s64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqshlr  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_s64_z_tied2, svint64_t, svint64_t,
+                z0_res = svqshl_s64_z (p0, z4, z0),
+                z0_res = svqshl_z (p0, z4, z0))
+
+/*
+** qshl_s64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqshl   z0\.d, p0/m, z0\.d, z4\.d
+** |
+**     movprfx z0\.d, p0/z, z4\.d
+**     sqshlr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshl_s64_z_untied, svint64_t, svint64_t,
+            z0 = svqshl_s64_z (p0, z1, z4),
+            z0 = svqshl_z (p0, z1, z4))
+
+/*
+** qshl_x0_s64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_x0_s64_z_tied1, svint64_t, int64_t,
+                z0 = svqshl_n_s64_z (p0, z0, x0),
+                z0 = svqshl_z (p0, z0, x0))
+
+/*
+** qshl_x0_s64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqshl   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     sqshlr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_x0_s64_z_untied, svint64_t, int64_t,
+                z0 = svqshl_n_s64_z (p0, z1, x0),
+                z0 = svqshl_z (p0, z1, x0))
+
+/*
+** qshl_m64_s64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     asr     z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m64_s64_z, svint64_t,
+               z0 = svqshl_n_s64_z (p0, z0, -64),
+               z0 = svqshl_z (p0, z0, -64))
+
+/*
+** qshl_m2_s64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     asr     z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_s64_z, svint64_t,
+               z0 = svqshl_n_s64_z (p0, z0, -2),
+               z0 = svqshl_z (p0, z0, -2))
+
+/*
+** qshl_m1_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     asr     z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s64_z_tied1, svint64_t,
+               z0 = svqshl_n_s64_z (p0, z0, -1),
+               z0 = svqshl_z (p0, z0, -1))
+
+/*
+** qshl_m1_s64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     asr     z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s64_z_untied, svint64_t,
+               z0 = svqshl_n_s64_z (p0, z1, -1),
+               z0 = svqshl_z (p0, z1, -1))
+
+/*
+** qshl_1_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s64_z_tied1, svint64_t,
+               z0 = svqshl_n_s64_z (p0, z0, 1),
+               z0 = svqshl_z (p0, z0, 1))
+
+/*
+** qshl_1_s64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s64_z_untied, svint64_t,
+               z0 = svqshl_n_s64_z (p0, z1, 1),
+               z0 = svqshl_z (p0, z1, 1))
+
+/*
+** qshl_2_s64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqshl   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_s64_z, svint64_t,
+               z0 = svqshl_n_s64_z (p0, z0, 2),
+               z0 = svqshl_z (p0, z0, 2))
+
+/*
+** qshl_63_s64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqshl   z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_63_s64_z, svint64_t,
+               z0 = svqshl_n_s64_z (p0, z0, 63),
+               z0 = svqshl_z (p0, z0, 63))
+
+/*
+** qshl_s64_x_tied1:
+**     sqshl   z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qshl_s64_x_tied1, svint64_t, svint64_t,
+            z0 = svqshl_s64_x (p0, z0, z4),
+            z0 = svqshl_x (p0, z0, z4))
+
+/*
+** qshl_s64_x_tied2:
+**     sqshlr  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_s64_x_tied2, svint64_t, svint64_t,
+                z0_res = svqshl_s64_x (p0, z4, z0),
+                z0_res = svqshl_x (p0, z4, z0))
+
+/*
+** qshl_s64_x_untied:
+** (
+**     movprfx z0, z1
+**     sqshl   z0\.d, p0/m, z0\.d, z4\.d
+** |
+**     movprfx z0, z4
+**     sqshlr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshl_s64_x_untied, svint64_t, svint64_t,
+            z0 = svqshl_s64_x (p0, z1, z4),
+            z0 = svqshl_x (p0, z1, z4))
+
+/*
+** qshl_x0_s64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     sqshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_x0_s64_x_tied1, svint64_t, int64_t,
+                z0 = svqshl_n_s64_x (p0, z0, x0),
+                z0 = svqshl_x (p0, z0, x0))
+
+/*
+** qshl_x0_s64_x_untied:
+**     mov     z0\.d, x0
+**     sqshlr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_x0_s64_x_untied, svint64_t, int64_t,
+                z0 = svqshl_n_s64_x (p0, z1, x0),
+                z0 = svqshl_x (p0, z1, x0))
+
+/*
+** qshl_m64_s64_x:
+**     asr     z0\.d, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m64_s64_x, svint64_t,
+               z0 = svqshl_n_s64_x (p0, z0, -64),
+               z0 = svqshl_x (p0, z0, -64))
+
+/*
+** qshl_m2_s64_x:
+**     asr     z0\.d, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_s64_x, svint64_t,
+               z0 = svqshl_n_s64_x (p0, z0, -2),
+               z0 = svqshl_x (p0, z0, -2))
+
+/*
+** qshl_m1_s64_x_tied1:
+**     asr     z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s64_x_tied1, svint64_t,
+               z0 = svqshl_n_s64_x (p0, z0, -1),
+               z0 = svqshl_x (p0, z0, -1))
+
+/*
+** qshl_m1_s64_x_untied:
+**     asr     z0\.d, z1\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s64_x_untied, svint64_t,
+               z0 = svqshl_n_s64_x (p0, z1, -1),
+               z0 = svqshl_x (p0, z1, -1))
+
+/*
+** qshl_1_s64_x_tied1:
+**     sqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s64_x_tied1, svint64_t,
+               z0 = svqshl_n_s64_x (p0, z0, 1),
+               z0 = svqshl_x (p0, z0, 1))
+
+/*
+** qshl_1_s64_x_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s64_x_untied, svint64_t,
+               z0 = svqshl_n_s64_x (p0, z1, 1),
+               z0 = svqshl_x (p0, z1, 1))
+
+/*
+** qshl_2_s64_x:
+**     sqshl   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_s64_x, svint64_t,
+               z0 = svqshl_n_s64_x (p0, z0, 2),
+               z0 = svqshl_x (p0, z0, 2))
+
+/*
+** qshl_63_s64_x:
+**     sqshl   z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_63_s64_x, svint64_t,
+               z0 = svqshl_n_s64_x (p0, z0, 63),
+               z0 = svqshl_x (p0, z0, 63))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_s8.c
new file mode 100644 (file)
index 0000000..28979d8
--- /dev/null
@@ -0,0 +1,396 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshl_s8_m_tied1:
+**     sqshl   z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (qshl_s8_m_tied1, svint8_t, svint8_t,
+            z0 = svqshl_s8_m (p0, z0, z4),
+            z0 = svqshl_m (p0, z0, z4))
+
+/*
+** qshl_s8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     sqshl   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_s8_m_tied2, svint8_t, svint8_t,
+                z0_res = svqshl_s8_m (p0, z4, z0),
+                z0_res = svqshl_m (p0, z4, z0))
+
+/*
+** qshl_s8_m_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (qshl_s8_m_untied, svint8_t, svint8_t,
+            z0 = svqshl_s8_m (p0, z1, z4),
+            z0 = svqshl_m (p0, z1, z4))
+
+/*
+** qshl_w0_s8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqshl   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_s8_m_tied1, svint8_t, int8_t,
+                z0 = svqshl_n_s8_m (p0, z0, x0),
+                z0 = svqshl_m (p0, z0, x0))
+
+/*
+** qshl_w0_s8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     sqshl   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_s8_m_untied, svint8_t, int8_t,
+                z0 = svqshl_n_s8_m (p0, z1, x0),
+                z0 = svqshl_m (p0, z1, x0))
+
+/*
+** qshl_m8_s8_m:
+**     asr     z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m8_s8_m, svint8_t,
+               z0 = svqshl_n_s8_m (p0, z0, -8),
+               z0 = svqshl_m (p0, z0, -8))
+
+/*
+** qshl_m2_s8_m:
+**     asr     z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_s8_m, svint8_t,
+               z0 = svqshl_n_s8_m (p0, z0, -2),
+               z0 = svqshl_m (p0, z0, -2))
+
+/*
+** qshl_m1_s8_m_tied1:
+**     asr     z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s8_m_tied1, svint8_t,
+               z0 = svqshl_n_s8_m (p0, z0, -1),
+               z0 = svqshl_m (p0, z0, -1))
+
+/*
+** qshl_m1_s8_m_untied:
+**     movprfx z0, z1
+**     asr     z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s8_m_untied, svint8_t,
+               z0 = svqshl_n_s8_m (p0, z1, -1),
+               z0 = svqshl_m (p0, z1, -1))
+
+/*
+** qshl_1_s8_m_tied1:
+**     sqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s8_m_tied1, svint8_t,
+               z0 = svqshl_n_s8_m (p0, z0, 1),
+               z0 = svqshl_m (p0, z0, 1))
+
+/*
+** qshl_1_s8_m_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s8_m_untied, svint8_t,
+               z0 = svqshl_n_s8_m (p0, z1, 1),
+               z0 = svqshl_m (p0, z1, 1))
+
+/*
+** qshl_2_s8_m:
+**     sqshl   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_s8_m, svint8_t,
+               z0 = svqshl_n_s8_m (p0, z0, 2),
+               z0 = svqshl_m (p0, z0, 2))
+
+/*
+** qshl_7_s8_m:
+**     sqshl   z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_7_s8_m, svint8_t,
+               z0 = svqshl_n_s8_m (p0, z0, 7),
+               z0 = svqshl_m (p0, z0, 7))
+
+/*
+** qshl_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqshl   z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (qshl_s8_z_tied1, svint8_t, svint8_t,
+            z0 = svqshl_s8_z (p0, z0, z4),
+            z0 = svqshl_z (p0, z0, z4))
+
+/*
+** qshl_s8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqshlr  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_s8_z_tied2, svint8_t, svint8_t,
+                z0_res = svqshl_s8_z (p0, z4, z0),
+                z0_res = svqshl_z (p0, z4, z0))
+
+/*
+** qshl_s8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqshl   z0\.b, p0/m, z0\.b, z4\.b
+** |
+**     movprfx z0\.b, p0/z, z4\.b
+**     sqshlr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshl_s8_z_untied, svint8_t, svint8_t,
+            z0 = svqshl_s8_z (p0, z1, z4),
+            z0 = svqshl_z (p0, z1, z4))
+
+/*
+** qshl_w0_s8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqshl   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_s8_z_tied1, svint8_t, int8_t,
+                z0 = svqshl_n_s8_z (p0, z0, x0),
+                z0 = svqshl_z (p0, z0, x0))
+
+/*
+** qshl_w0_s8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqshl   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     sqshlr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_s8_z_untied, svint8_t, int8_t,
+                z0 = svqshl_n_s8_z (p0, z1, x0),
+                z0 = svqshl_z (p0, z1, x0))
+
+/*
+** qshl_m8_s8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     asr     z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m8_s8_z, svint8_t,
+               z0 = svqshl_n_s8_z (p0, z0, -8),
+               z0 = svqshl_z (p0, z0, -8))
+
+/*
+** qshl_m2_s8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     asr     z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_s8_z, svint8_t,
+               z0 = svqshl_n_s8_z (p0, z0, -2),
+               z0 = svqshl_z (p0, z0, -2))
+
+/*
+** qshl_m1_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     asr     z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s8_z_tied1, svint8_t,
+               z0 = svqshl_n_s8_z (p0, z0, -1),
+               z0 = svqshl_z (p0, z0, -1))
+
+/*
+** qshl_m1_s8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     asr     z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s8_z_untied, svint8_t,
+               z0 = svqshl_n_s8_z (p0, z1, -1),
+               z0 = svqshl_z (p0, z1, -1))
+
+/*
+** qshl_1_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s8_z_tied1, svint8_t,
+               z0 = svqshl_n_s8_z (p0, z0, 1),
+               z0 = svqshl_z (p0, z0, 1))
+
+/*
+** qshl_1_s8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s8_z_untied, svint8_t,
+               z0 = svqshl_n_s8_z (p0, z1, 1),
+               z0 = svqshl_z (p0, z1, 1))
+
+/*
+** qshl_2_s8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqshl   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_s8_z, svint8_t,
+               z0 = svqshl_n_s8_z (p0, z0, 2),
+               z0 = svqshl_z (p0, z0, 2))
+
+/*
+** qshl_7_s8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqshl   z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_7_s8_z, svint8_t,
+               z0 = svqshl_n_s8_z (p0, z0, 7),
+               z0 = svqshl_z (p0, z0, 7))
+
+/*
+** qshl_s8_x_tied1:
+**     sqshl   z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (qshl_s8_x_tied1, svint8_t, svint8_t,
+            z0 = svqshl_s8_x (p0, z0, z4),
+            z0 = svqshl_x (p0, z0, z4))
+
+/*
+** qshl_s8_x_tied2:
+**     sqshlr  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_s8_x_tied2, svint8_t, svint8_t,
+                z0_res = svqshl_s8_x (p0, z4, z0),
+                z0_res = svqshl_x (p0, z4, z0))
+
+/*
+** qshl_s8_x_untied:
+** (
+**     movprfx z0, z1
+**     sqshl   z0\.b, p0/m, z0\.b, z4\.b
+** |
+**     movprfx z0, z4
+**     sqshlr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshl_s8_x_untied, svint8_t, svint8_t,
+            z0 = svqshl_s8_x (p0, z1, z4),
+            z0 = svqshl_x (p0, z1, z4))
+
+/*
+** qshl_w0_s8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqshl   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_s8_x_tied1, svint8_t, int8_t,
+                z0 = svqshl_n_s8_x (p0, z0, x0),
+                z0 = svqshl_x (p0, z0, x0))
+
+/*
+** qshl_w0_s8_x_untied:
+**     mov     z0\.b, w0
+**     sqshlr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_s8_x_untied, svint8_t, int8_t,
+                z0 = svqshl_n_s8_x (p0, z1, x0),
+                z0 = svqshl_x (p0, z1, x0))
+
+/*
+** qshl_m8_s8_x:
+**     asr     z0\.b, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m8_s8_x, svint8_t,
+               z0 = svqshl_n_s8_x (p0, z0, -8),
+               z0 = svqshl_x (p0, z0, -8))
+
+/*
+** qshl_m2_s8_x:
+**     asr     z0\.b, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_s8_x, svint8_t,
+               z0 = svqshl_n_s8_x (p0, z0, -2),
+               z0 = svqshl_x (p0, z0, -2))
+
+/*
+** qshl_m1_s8_x_tied1:
+**     asr     z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s8_x_tied1, svint8_t,
+               z0 = svqshl_n_s8_x (p0, z0, -1),
+               z0 = svqshl_x (p0, z0, -1))
+
+/*
+** qshl_m1_s8_x_untied:
+**     asr     z0\.b, z1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_s8_x_untied, svint8_t,
+               z0 = svqshl_n_s8_x (p0, z1, -1),
+               z0 = svqshl_x (p0, z1, -1))
+
+/*
+** qshl_1_s8_x_tied1:
+**     sqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s8_x_tied1, svint8_t,
+               z0 = svqshl_n_s8_x (p0, z0, 1),
+               z0 = svqshl_x (p0, z0, 1))
+
+/*
+** qshl_1_s8_x_untied:
+**     movprfx z0, z1
+**     sqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_s8_x_untied, svint8_t,
+               z0 = svqshl_n_s8_x (p0, z1, 1),
+               z0 = svqshl_x (p0, z1, 1))
+
+/*
+** qshl_2_s8_x:
+**     sqshl   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_s8_x, svint8_t,
+               z0 = svqshl_n_s8_x (p0, z0, 2),
+               z0 = svqshl_x (p0, z0, 2))
+
+/*
+** qshl_7_s8_x:
+**     sqshl   z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_7_s8_x, svint8_t,
+               z0 = svqshl_n_s8_x (p0, z0, 7),
+               z0 = svqshl_x (p0, z0, 7))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_u16.c
new file mode 100644 (file)
index 0000000..93049e2
--- /dev/null
@@ -0,0 +1,396 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshl_u16_m_tied1:
+**     uqshl   z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qshl_u16_m_tied1, svuint16_t, svint16_t,
+            z0 = svqshl_u16_m (p0, z0, z4),
+            z0 = svqshl_m (p0, z0, z4))
+
+/*
+** qshl_u16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uqshl   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_u16_m_tied2, svuint16_t, svint16_t,
+                z0_res = svqshl_u16_m (p0, z4, z0),
+                z0_res = svqshl_m (p0, z4, z0))
+
+/*
+** qshl_u16_m_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qshl_u16_m_untied, svuint16_t, svint16_t,
+            z0 = svqshl_u16_m (p0, z1, z4),
+            z0 = svqshl_m (p0, z1, z4))
+
+/*
+** qshl_w0_u16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uqshl   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_u16_m_tied1, svuint16_t, int16_t,
+                z0 = svqshl_n_u16_m (p0, z0, x0),
+                z0 = svqshl_m (p0, z0, x0))
+
+/*
+** qshl_w0_u16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     uqshl   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_u16_m_untied, svuint16_t, int16_t,
+                z0 = svqshl_n_u16_m (p0, z1, x0),
+                z0 = svqshl_m (p0, z1, x0))
+
+/*
+** qshl_m16_u16_m:
+**     lsr     z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m16_u16_m, svuint16_t,
+               z0 = svqshl_n_u16_m (p0, z0, -16),
+               z0 = svqshl_m (p0, z0, -16))
+
+/*
+** qshl_m2_u16_m:
+**     lsr     z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_u16_m, svuint16_t,
+               z0 = svqshl_n_u16_m (p0, z0, -2),
+               z0 = svqshl_m (p0, z0, -2))
+
+/*
+** qshl_m1_u16_m_tied1:
+**     lsr     z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u16_m_tied1, svuint16_t,
+               z0 = svqshl_n_u16_m (p0, z0, -1),
+               z0 = svqshl_m (p0, z0, -1))
+
+/*
+** qshl_m1_u16_m_untied:
+**     movprfx z0, z1
+**     lsr     z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u16_m_untied, svuint16_t,
+               z0 = svqshl_n_u16_m (p0, z1, -1),
+               z0 = svqshl_m (p0, z1, -1))
+
+/*
+** qshl_1_u16_m_tied1:
+**     uqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u16_m_tied1, svuint16_t,
+               z0 = svqshl_n_u16_m (p0, z0, 1),
+               z0 = svqshl_m (p0, z0, 1))
+
+/*
+** qshl_1_u16_m_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u16_m_untied, svuint16_t,
+               z0 = svqshl_n_u16_m (p0, z1, 1),
+               z0 = svqshl_m (p0, z1, 1))
+
+/*
+** qshl_2_u16_m:
+**     uqshl   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_u16_m, svuint16_t,
+               z0 = svqshl_n_u16_m (p0, z0, 2),
+               z0 = svqshl_m (p0, z0, 2))
+
+/*
+** qshl_15_u16_m:
+**     uqshl   z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_15_u16_m, svuint16_t,
+               z0 = svqshl_n_u16_m (p0, z0, 15),
+               z0 = svqshl_m (p0, z0, 15))
+
+/*
+** qshl_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqshl   z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qshl_u16_z_tied1, svuint16_t, svint16_t,
+            z0 = svqshl_u16_z (p0, z0, z4),
+            z0 = svqshl_z (p0, z0, z4))
+
+/*
+** qshl_u16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqshlr  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_u16_z_tied2, svuint16_t, svint16_t,
+                z0_res = svqshl_u16_z (p0, z4, z0),
+                z0_res = svqshl_z (p0, z4, z0))
+
+/*
+** qshl_u16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uqshl   z0\.h, p0/m, z0\.h, z4\.h
+** |
+**     movprfx z0\.h, p0/z, z4\.h
+**     uqshlr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshl_u16_z_untied, svuint16_t, svint16_t,
+            z0 = svqshl_u16_z (p0, z1, z4),
+            z0 = svqshl_z (p0, z1, z4))
+
+/*
+** qshl_w0_u16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqshl   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_u16_z_tied1, svuint16_t, int16_t,
+                z0 = svqshl_n_u16_z (p0, z0, x0),
+                z0 = svqshl_z (p0, z0, x0))
+
+/*
+** qshl_w0_u16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uqshl   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     uqshlr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_u16_z_untied, svuint16_t, int16_t,
+                z0 = svqshl_n_u16_z (p0, z1, x0),
+                z0 = svqshl_z (p0, z1, x0))
+
+/*
+** qshl_m16_u16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     lsr     z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m16_u16_z, svuint16_t,
+               z0 = svqshl_n_u16_z (p0, z0, -16),
+               z0 = svqshl_z (p0, z0, -16))
+
+/*
+** qshl_m2_u16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     lsr     z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_u16_z, svuint16_t,
+               z0 = svqshl_n_u16_z (p0, z0, -2),
+               z0 = svqshl_z (p0, z0, -2))
+
+/*
+** qshl_m1_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     lsr     z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u16_z_tied1, svuint16_t,
+               z0 = svqshl_n_u16_z (p0, z0, -1),
+               z0 = svqshl_z (p0, z0, -1))
+
+/*
+** qshl_m1_u16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     lsr     z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u16_z_untied, svuint16_t,
+               z0 = svqshl_n_u16_z (p0, z1, -1),
+               z0 = svqshl_z (p0, z1, -1))
+
+/*
+** qshl_1_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u16_z_tied1, svuint16_t,
+               z0 = svqshl_n_u16_z (p0, z0, 1),
+               z0 = svqshl_z (p0, z0, 1))
+
+/*
+** qshl_1_u16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     uqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u16_z_untied, svuint16_t,
+               z0 = svqshl_n_u16_z (p0, z1, 1),
+               z0 = svqshl_z (p0, z1, 1))
+
+/*
+** qshl_2_u16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqshl   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_u16_z, svuint16_t,
+               z0 = svqshl_n_u16_z (p0, z0, 2),
+               z0 = svqshl_z (p0, z0, 2))
+
+/*
+** qshl_15_u16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqshl   z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_15_u16_z, svuint16_t,
+               z0 = svqshl_n_u16_z (p0, z0, 15),
+               z0 = svqshl_z (p0, z0, 15))
+
+/*
+** qshl_u16_x_tied1:
+**     uqshl   z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qshl_u16_x_tied1, svuint16_t, svint16_t,
+            z0 = svqshl_u16_x (p0, z0, z4),
+            z0 = svqshl_x (p0, z0, z4))
+
+/*
+** qshl_u16_x_tied2:
+**     uqshlr  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_u16_x_tied2, svuint16_t, svint16_t,
+                z0_res = svqshl_u16_x (p0, z4, z0),
+                z0_res = svqshl_x (p0, z4, z0))
+
+/*
+** qshl_u16_x_untied:
+** (
+**     movprfx z0, z1
+**     uqshl   z0\.h, p0/m, z0\.h, z4\.h
+** |
+**     movprfx z0, z4
+**     uqshlr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshl_u16_x_untied, svuint16_t, svint16_t,
+            z0 = svqshl_u16_x (p0, z1, z4),
+            z0 = svqshl_x (p0, z1, z4))
+
+/*
+** qshl_w0_u16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uqshl   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_u16_x_tied1, svuint16_t, int16_t,
+                z0 = svqshl_n_u16_x (p0, z0, x0),
+                z0 = svqshl_x (p0, z0, x0))
+
+/*
+** qshl_w0_u16_x_untied:
+**     mov     z0\.h, w0
+**     uqshlr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_u16_x_untied, svuint16_t, int16_t,
+                z0 = svqshl_n_u16_x (p0, z1, x0),
+                z0 = svqshl_x (p0, z1, x0))
+
+/*
+** qshl_m16_u16_x:
+**     lsr     z0\.h, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m16_u16_x, svuint16_t,
+               z0 = svqshl_n_u16_x (p0, z0, -16),
+               z0 = svqshl_x (p0, z0, -16))
+
+/*
+** qshl_m2_u16_x:
+**     lsr     z0\.h, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_u16_x, svuint16_t,
+               z0 = svqshl_n_u16_x (p0, z0, -2),
+               z0 = svqshl_x (p0, z0, -2))
+
+/*
+** qshl_m1_u16_x_tied1:
+**     lsr     z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u16_x_tied1, svuint16_t,
+               z0 = svqshl_n_u16_x (p0, z0, -1),
+               z0 = svqshl_x (p0, z0, -1))
+
+/*
+** qshl_m1_u16_x_untied:
+**     lsr     z0\.h, z1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u16_x_untied, svuint16_t,
+               z0 = svqshl_n_u16_x (p0, z1, -1),
+               z0 = svqshl_x (p0, z1, -1))
+
+/*
+** qshl_1_u16_x_tied1:
+**     uqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u16_x_tied1, svuint16_t,
+               z0 = svqshl_n_u16_x (p0, z0, 1),
+               z0 = svqshl_x (p0, z0, 1))
+
+/*
+** qshl_1_u16_x_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u16_x_untied, svuint16_t,
+               z0 = svqshl_n_u16_x (p0, z1, 1),
+               z0 = svqshl_x (p0, z1, 1))
+
+/*
+** qshl_2_u16_x:
+**     uqshl   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_u16_x, svuint16_t,
+               z0 = svqshl_n_u16_x (p0, z0, 2),
+               z0 = svqshl_x (p0, z0, 2))
+
+/*
+** qshl_15_u16_x:
+**     uqshl   z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_15_u16_x, svuint16_t,
+               z0 = svqshl_n_u16_x (p0, z0, 15),
+               z0 = svqshl_x (p0, z0, 15))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_u32.c
new file mode 100644 (file)
index 0000000..497a335
--- /dev/null
@@ -0,0 +1,396 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshl_u32_m_tied1:
+**     uqshl   z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qshl_u32_m_tied1, svuint32_t, svint32_t,
+            z0 = svqshl_u32_m (p0, z0, z4),
+            z0 = svqshl_m (p0, z0, z4))
+
+/*
+** qshl_u32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uqshl   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_u32_m_tied2, svuint32_t, svint32_t,
+                z0_res = svqshl_u32_m (p0, z4, z0),
+                z0_res = svqshl_m (p0, z4, z0))
+
+/*
+** qshl_u32_m_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qshl_u32_m_untied, svuint32_t, svint32_t,
+            z0 = svqshl_u32_m (p0, z1, z4),
+            z0 = svqshl_m (p0, z1, z4))
+
+/*
+** qshl_w0_u32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uqshl   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_u32_m_tied1, svuint32_t, int32_t,
+                z0 = svqshl_n_u32_m (p0, z0, x0),
+                z0 = svqshl_m (p0, z0, x0))
+
+/*
+** qshl_w0_u32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     uqshl   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_u32_m_untied, svuint32_t, int32_t,
+                z0 = svqshl_n_u32_m (p0, z1, x0),
+                z0 = svqshl_m (p0, z1, x0))
+
+/*
+** qshl_m32_u32_m:
+**     lsr     z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m32_u32_m, svuint32_t,
+               z0 = svqshl_n_u32_m (p0, z0, -32),
+               z0 = svqshl_m (p0, z0, -32))
+
+/*
+** qshl_m2_u32_m:
+**     lsr     z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_u32_m, svuint32_t,
+               z0 = svqshl_n_u32_m (p0, z0, -2),
+               z0 = svqshl_m (p0, z0, -2))
+
+/*
+** qshl_m1_u32_m_tied1:
+**     lsr     z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u32_m_tied1, svuint32_t,
+               z0 = svqshl_n_u32_m (p0, z0, -1),
+               z0 = svqshl_m (p0, z0, -1))
+
+/*
+** qshl_m1_u32_m_untied:
+**     movprfx z0, z1
+**     lsr     z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u32_m_untied, svuint32_t,
+               z0 = svqshl_n_u32_m (p0, z1, -1),
+               z0 = svqshl_m (p0, z1, -1))
+
+/*
+** qshl_1_u32_m_tied1:
+**     uqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u32_m_tied1, svuint32_t,
+               z0 = svqshl_n_u32_m (p0, z0, 1),
+               z0 = svqshl_m (p0, z0, 1))
+
+/*
+** qshl_1_u32_m_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u32_m_untied, svuint32_t,
+               z0 = svqshl_n_u32_m (p0, z1, 1),
+               z0 = svqshl_m (p0, z1, 1))
+
+/*
+** qshl_2_u32_m:
+**     uqshl   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_u32_m, svuint32_t,
+               z0 = svqshl_n_u32_m (p0, z0, 2),
+               z0 = svqshl_m (p0, z0, 2))
+
+/*
+** qshl_31_u32_m:
+**     uqshl   z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_31_u32_m, svuint32_t,
+               z0 = svqshl_n_u32_m (p0, z0, 31),
+               z0 = svqshl_m (p0, z0, 31))
+
+/*
+** qshl_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqshl   z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qshl_u32_z_tied1, svuint32_t, svint32_t,
+            z0 = svqshl_u32_z (p0, z0, z4),
+            z0 = svqshl_z (p0, z0, z4))
+
+/*
+** qshl_u32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqshlr  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_u32_z_tied2, svuint32_t, svint32_t,
+                z0_res = svqshl_u32_z (p0, z4, z0),
+                z0_res = svqshl_z (p0, z4, z0))
+
+/*
+** qshl_u32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uqshl   z0\.s, p0/m, z0\.s, z4\.s
+** |
+**     movprfx z0\.s, p0/z, z4\.s
+**     uqshlr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshl_u32_z_untied, svuint32_t, svint32_t,
+            z0 = svqshl_u32_z (p0, z1, z4),
+            z0 = svqshl_z (p0, z1, z4))
+
+/*
+** qshl_w0_u32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqshl   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_u32_z_tied1, svuint32_t, int32_t,
+                z0 = svqshl_n_u32_z (p0, z0, x0),
+                z0 = svqshl_z (p0, z0, x0))
+
+/*
+** qshl_w0_u32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uqshl   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     uqshlr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_u32_z_untied, svuint32_t, int32_t,
+                z0 = svqshl_n_u32_z (p0, z1, x0),
+                z0 = svqshl_z (p0, z1, x0))
+
+/*
+** qshl_m32_u32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     lsr     z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m32_u32_z, svuint32_t,
+               z0 = svqshl_n_u32_z (p0, z0, -32),
+               z0 = svqshl_z (p0, z0, -32))
+
+/*
+** qshl_m2_u32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     lsr     z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_u32_z, svuint32_t,
+               z0 = svqshl_n_u32_z (p0, z0, -2),
+               z0 = svqshl_z (p0, z0, -2))
+
+/*
+** qshl_m1_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     lsr     z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u32_z_tied1, svuint32_t,
+               z0 = svqshl_n_u32_z (p0, z0, -1),
+               z0 = svqshl_z (p0, z0, -1))
+
+/*
+** qshl_m1_u32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     lsr     z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u32_z_untied, svuint32_t,
+               z0 = svqshl_n_u32_z (p0, z1, -1),
+               z0 = svqshl_z (p0, z1, -1))
+
+/*
+** qshl_1_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u32_z_tied1, svuint32_t,
+               z0 = svqshl_n_u32_z (p0, z0, 1),
+               z0 = svqshl_z (p0, z0, 1))
+
+/*
+** qshl_1_u32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     uqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u32_z_untied, svuint32_t,
+               z0 = svqshl_n_u32_z (p0, z1, 1),
+               z0 = svqshl_z (p0, z1, 1))
+
+/*
+** qshl_2_u32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqshl   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_u32_z, svuint32_t,
+               z0 = svqshl_n_u32_z (p0, z0, 2),
+               z0 = svqshl_z (p0, z0, 2))
+
+/*
+** qshl_31_u32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqshl   z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_31_u32_z, svuint32_t,
+               z0 = svqshl_n_u32_z (p0, z0, 31),
+               z0 = svqshl_z (p0, z0, 31))
+
+/*
+** qshl_u32_x_tied1:
+**     uqshl   z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qshl_u32_x_tied1, svuint32_t, svint32_t,
+            z0 = svqshl_u32_x (p0, z0, z4),
+            z0 = svqshl_x (p0, z0, z4))
+
+/*
+** qshl_u32_x_tied2:
+**     uqshlr  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_u32_x_tied2, svuint32_t, svint32_t,
+                z0_res = svqshl_u32_x (p0, z4, z0),
+                z0_res = svqshl_x (p0, z4, z0))
+
+/*
+** qshl_u32_x_untied:
+** (
+**     movprfx z0, z1
+**     uqshl   z0\.s, p0/m, z0\.s, z4\.s
+** |
+**     movprfx z0, z4
+**     uqshlr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshl_u32_x_untied, svuint32_t, svint32_t,
+            z0 = svqshl_u32_x (p0, z1, z4),
+            z0 = svqshl_x (p0, z1, z4))
+
+/*
+** qshl_w0_u32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uqshl   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_u32_x_tied1, svuint32_t, int32_t,
+                z0 = svqshl_n_u32_x (p0, z0, x0),
+                z0 = svqshl_x (p0, z0, x0))
+
+/*
+** qshl_w0_u32_x_untied:
+**     mov     z0\.s, w0
+**     uqshlr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_u32_x_untied, svuint32_t, int32_t,
+                z0 = svqshl_n_u32_x (p0, z1, x0),
+                z0 = svqshl_x (p0, z1, x0))
+
+/*
+** qshl_m32_u32_x:
+**     lsr     z0\.s, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m32_u32_x, svuint32_t,
+               z0 = svqshl_n_u32_x (p0, z0, -32),
+               z0 = svqshl_x (p0, z0, -32))
+
+/*
+** qshl_m2_u32_x:
+**     lsr     z0\.s, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_u32_x, svuint32_t,
+               z0 = svqshl_n_u32_x (p0, z0, -2),
+               z0 = svqshl_x (p0, z0, -2))
+
+/*
+** qshl_m1_u32_x_tied1:
+**     lsr     z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u32_x_tied1, svuint32_t,
+               z0 = svqshl_n_u32_x (p0, z0, -1),
+               z0 = svqshl_x (p0, z0, -1))
+
+/*
+** qshl_m1_u32_x_untied:
+**     lsr     z0\.s, z1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u32_x_untied, svuint32_t,
+               z0 = svqshl_n_u32_x (p0, z1, -1),
+               z0 = svqshl_x (p0, z1, -1))
+
+/*
+** qshl_1_u32_x_tied1:
+**     uqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u32_x_tied1, svuint32_t,
+               z0 = svqshl_n_u32_x (p0, z0, 1),
+               z0 = svqshl_x (p0, z0, 1))
+
+/*
+** qshl_1_u32_x_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u32_x_untied, svuint32_t,
+               z0 = svqshl_n_u32_x (p0, z1, 1),
+               z0 = svqshl_x (p0, z1, 1))
+
+/*
+** qshl_2_u32_x:
+**     uqshl   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_u32_x, svuint32_t,
+               z0 = svqshl_n_u32_x (p0, z0, 2),
+               z0 = svqshl_x (p0, z0, 2))
+
+/*
+** qshl_31_u32_x:
+**     uqshl   z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_31_u32_x, svuint32_t,
+               z0 = svqshl_n_u32_x (p0, z0, 31),
+               z0 = svqshl_x (p0, z0, 31))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_u64.c
new file mode 100644 (file)
index 0000000..5cc5052
--- /dev/null
@@ -0,0 +1,396 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshl_u64_m_tied1:
+**     uqshl   z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qshl_u64_m_tied1, svuint64_t, svint64_t,
+            z0 = svqshl_u64_m (p0, z0, z4),
+            z0 = svqshl_m (p0, z0, z4))
+
+/*
+** qshl_u64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z4
+**     uqshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_u64_m_tied2, svuint64_t, svint64_t,
+                z0_res = svqshl_u64_m (p0, z4, z0),
+                z0_res = svqshl_m (p0, z4, z0))
+
+/*
+** qshl_u64_m_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qshl_u64_m_untied, svuint64_t, svint64_t,
+            z0 = svqshl_u64_m (p0, z1, z4),
+            z0 = svqshl_m (p0, z1, z4))
+
+/*
+** qshl_x0_u64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     uqshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_x0_u64_m_tied1, svuint64_t, int64_t,
+                z0 = svqshl_n_u64_m (p0, z0, x0),
+                z0 = svqshl_m (p0, z0, x0))
+
+/*
+** qshl_x0_u64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     uqshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_x0_u64_m_untied, svuint64_t, int64_t,
+                z0 = svqshl_n_u64_m (p0, z1, x0),
+                z0 = svqshl_m (p0, z1, x0))
+
+/*
+** qshl_m64_u64_m:
+**     lsr     z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m64_u64_m, svuint64_t,
+               z0 = svqshl_n_u64_m (p0, z0, -64),
+               z0 = svqshl_m (p0, z0, -64))
+
+/*
+** qshl_m2_u64_m:
+**     lsr     z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_u64_m, svuint64_t,
+               z0 = svqshl_n_u64_m (p0, z0, -2),
+               z0 = svqshl_m (p0, z0, -2))
+
+/*
+** qshl_m1_u64_m_tied1:
+**     lsr     z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u64_m_tied1, svuint64_t,
+               z0 = svqshl_n_u64_m (p0, z0, -1),
+               z0 = svqshl_m (p0, z0, -1))
+
+/*
+** qshl_m1_u64_m_untied:
+**     movprfx z0, z1
+**     lsr     z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u64_m_untied, svuint64_t,
+               z0 = svqshl_n_u64_m (p0, z1, -1),
+               z0 = svqshl_m (p0, z1, -1))
+
+/*
+** qshl_1_u64_m_tied1:
+**     uqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u64_m_tied1, svuint64_t,
+               z0 = svqshl_n_u64_m (p0, z0, 1),
+               z0 = svqshl_m (p0, z0, 1))
+
+/*
+** qshl_1_u64_m_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u64_m_untied, svuint64_t,
+               z0 = svqshl_n_u64_m (p0, z1, 1),
+               z0 = svqshl_m (p0, z1, 1))
+
+/*
+** qshl_2_u64_m:
+**     uqshl   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_u64_m, svuint64_t,
+               z0 = svqshl_n_u64_m (p0, z0, 2),
+               z0 = svqshl_m (p0, z0, 2))
+
+/*
+** qshl_63_u64_m:
+**     uqshl   z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_63_u64_m, svuint64_t,
+               z0 = svqshl_n_u64_m (p0, z0, 63),
+               z0 = svqshl_m (p0, z0, 63))
+
+/*
+** qshl_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqshl   z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qshl_u64_z_tied1, svuint64_t, svint64_t,
+            z0 = svqshl_u64_z (p0, z0, z4),
+            z0 = svqshl_z (p0, z0, z4))
+
+/*
+** qshl_u64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqshlr  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_u64_z_tied2, svuint64_t, svint64_t,
+                z0_res = svqshl_u64_z (p0, z4, z0),
+                z0_res = svqshl_z (p0, z4, z0))
+
+/*
+** qshl_u64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uqshl   z0\.d, p0/m, z0\.d, z4\.d
+** |
+**     movprfx z0\.d, p0/z, z4\.d
+**     uqshlr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshl_u64_z_untied, svuint64_t, svint64_t,
+            z0 = svqshl_u64_z (p0, z1, z4),
+            z0 = svqshl_z (p0, z1, z4))
+
+/*
+** qshl_x0_u64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_x0_u64_z_tied1, svuint64_t, int64_t,
+                z0 = svqshl_n_u64_z (p0, z0, x0),
+                z0 = svqshl_z (p0, z0, x0))
+
+/*
+** qshl_x0_u64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uqshl   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     uqshlr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_x0_u64_z_untied, svuint64_t, int64_t,
+                z0 = svqshl_n_u64_z (p0, z1, x0),
+                z0 = svqshl_z (p0, z1, x0))
+
+/*
+** qshl_m64_u64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     lsr     z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m64_u64_z, svuint64_t,
+               z0 = svqshl_n_u64_z (p0, z0, -64),
+               z0 = svqshl_z (p0, z0, -64))
+
+/*
+** qshl_m2_u64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     lsr     z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_u64_z, svuint64_t,
+               z0 = svqshl_n_u64_z (p0, z0, -2),
+               z0 = svqshl_z (p0, z0, -2))
+
+/*
+** qshl_m1_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     lsr     z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u64_z_tied1, svuint64_t,
+               z0 = svqshl_n_u64_z (p0, z0, -1),
+               z0 = svqshl_z (p0, z0, -1))
+
+/*
+** qshl_m1_u64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     lsr     z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u64_z_untied, svuint64_t,
+               z0 = svqshl_n_u64_z (p0, z1, -1),
+               z0 = svqshl_z (p0, z1, -1))
+
+/*
+** qshl_1_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u64_z_tied1, svuint64_t,
+               z0 = svqshl_n_u64_z (p0, z0, 1),
+               z0 = svqshl_z (p0, z0, 1))
+
+/*
+** qshl_1_u64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     uqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u64_z_untied, svuint64_t,
+               z0 = svqshl_n_u64_z (p0, z1, 1),
+               z0 = svqshl_z (p0, z1, 1))
+
+/*
+** qshl_2_u64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqshl   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_u64_z, svuint64_t,
+               z0 = svqshl_n_u64_z (p0, z0, 2),
+               z0 = svqshl_z (p0, z0, 2))
+
+/*
+** qshl_63_u64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqshl   z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_63_u64_z, svuint64_t,
+               z0 = svqshl_n_u64_z (p0, z0, 63),
+               z0 = svqshl_z (p0, z0, 63))
+
+/*
+** qshl_u64_x_tied1:
+**     uqshl   z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qshl_u64_x_tied1, svuint64_t, svint64_t,
+            z0 = svqshl_u64_x (p0, z0, z4),
+            z0 = svqshl_x (p0, z0, z4))
+
+/*
+** qshl_u64_x_tied2:
+**     uqshlr  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_u64_x_tied2, svuint64_t, svint64_t,
+                z0_res = svqshl_u64_x (p0, z4, z0),
+                z0_res = svqshl_x (p0, z4, z0))
+
+/*
+** qshl_u64_x_untied:
+** (
+**     movprfx z0, z1
+**     uqshl   z0\.d, p0/m, z0\.d, z4\.d
+** |
+**     movprfx z0, z4
+**     uqshlr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshl_u64_x_untied, svuint64_t, svint64_t,
+            z0 = svqshl_u64_x (p0, z1, z4),
+            z0 = svqshl_x (p0, z1, z4))
+
+/*
+** qshl_x0_u64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     uqshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_x0_u64_x_tied1, svuint64_t, int64_t,
+                z0 = svqshl_n_u64_x (p0, z0, x0),
+                z0 = svqshl_x (p0, z0, x0))
+
+/*
+** qshl_x0_u64_x_untied:
+**     mov     z0\.d, x0
+**     uqshlr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_x0_u64_x_untied, svuint64_t, int64_t,
+                z0 = svqshl_n_u64_x (p0, z1, x0),
+                z0 = svqshl_x (p0, z1, x0))
+
+/*
+** qshl_m64_u64_x:
+**     lsr     z0\.d, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m64_u64_x, svuint64_t,
+               z0 = svqshl_n_u64_x (p0, z0, -64),
+               z0 = svqshl_x (p0, z0, -64))
+
+/*
+** qshl_m2_u64_x:
+**     lsr     z0\.d, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_u64_x, svuint64_t,
+               z0 = svqshl_n_u64_x (p0, z0, -2),
+               z0 = svqshl_x (p0, z0, -2))
+
+/*
+** qshl_m1_u64_x_tied1:
+**     lsr     z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u64_x_tied1, svuint64_t,
+               z0 = svqshl_n_u64_x (p0, z0, -1),
+               z0 = svqshl_x (p0, z0, -1))
+
+/*
+** qshl_m1_u64_x_untied:
+**     lsr     z0\.d, z1\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u64_x_untied, svuint64_t,
+               z0 = svqshl_n_u64_x (p0, z1, -1),
+               z0 = svqshl_x (p0, z1, -1))
+
+/*
+** qshl_1_u64_x_tied1:
+**     uqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u64_x_tied1, svuint64_t,
+               z0 = svqshl_n_u64_x (p0, z0, 1),
+               z0 = svqshl_x (p0, z0, 1))
+
+/*
+** qshl_1_u64_x_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u64_x_untied, svuint64_t,
+               z0 = svqshl_n_u64_x (p0, z1, 1),
+               z0 = svqshl_x (p0, z1, 1))
+
+/*
+** qshl_2_u64_x:
+**     uqshl   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_u64_x, svuint64_t,
+               z0 = svqshl_n_u64_x (p0, z0, 2),
+               z0 = svqshl_x (p0, z0, 2))
+
+/*
+** qshl_63_u64_x:
+**     uqshl   z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_63_u64_x, svuint64_t,
+               z0 = svqshl_n_u64_x (p0, z0, 63),
+               z0 = svqshl_x (p0, z0, 63))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshl_u8.c
new file mode 100644 (file)
index 0000000..b561122
--- /dev/null
@@ -0,0 +1,396 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshl_u8_m_tied1:
+**     uqshl   z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (qshl_u8_m_tied1, svuint8_t, svint8_t,
+            z0 = svqshl_u8_m (p0, z0, z4),
+            z0 = svqshl_m (p0, z0, z4))
+
+/*
+** qshl_u8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     uqshl   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_u8_m_tied2, svuint8_t, svint8_t,
+                z0_res = svqshl_u8_m (p0, z4, z0),
+                z0_res = svqshl_m (p0, z4, z0))
+
+/*
+** qshl_u8_m_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (qshl_u8_m_untied, svuint8_t, svint8_t,
+            z0 = svqshl_u8_m (p0, z1, z4),
+            z0 = svqshl_m (p0, z1, z4))
+
+/*
+** qshl_w0_u8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uqshl   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_u8_m_tied1, svuint8_t, int8_t,
+                z0 = svqshl_n_u8_m (p0, z0, x0),
+                z0 = svqshl_m (p0, z0, x0))
+
+/*
+** qshl_w0_u8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     uqshl   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_u8_m_untied, svuint8_t, int8_t,
+                z0 = svqshl_n_u8_m (p0, z1, x0),
+                z0 = svqshl_m (p0, z1, x0))
+
+/*
+** qshl_m8_u8_m:
+**     lsr     z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m8_u8_m, svuint8_t,
+               z0 = svqshl_n_u8_m (p0, z0, -8),
+               z0 = svqshl_m (p0, z0, -8))
+
+/*
+** qshl_m2_u8_m:
+**     lsr     z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_u8_m, svuint8_t,
+               z0 = svqshl_n_u8_m (p0, z0, -2),
+               z0 = svqshl_m (p0, z0, -2))
+
+/*
+** qshl_m1_u8_m_tied1:
+**     lsr     z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u8_m_tied1, svuint8_t,
+               z0 = svqshl_n_u8_m (p0, z0, -1),
+               z0 = svqshl_m (p0, z0, -1))
+
+/*
+** qshl_m1_u8_m_untied:
+**     movprfx z0, z1
+**     lsr     z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u8_m_untied, svuint8_t,
+               z0 = svqshl_n_u8_m (p0, z1, -1),
+               z0 = svqshl_m (p0, z1, -1))
+
+/*
+** qshl_1_u8_m_tied1:
+**     uqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u8_m_tied1, svuint8_t,
+               z0 = svqshl_n_u8_m (p0, z0, 1),
+               z0 = svqshl_m (p0, z0, 1))
+
+/*
+** qshl_1_u8_m_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u8_m_untied, svuint8_t,
+               z0 = svqshl_n_u8_m (p0, z1, 1),
+               z0 = svqshl_m (p0, z1, 1))
+
+/*
+** qshl_2_u8_m:
+**     uqshl   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_u8_m, svuint8_t,
+               z0 = svqshl_n_u8_m (p0, z0, 2),
+               z0 = svqshl_m (p0, z0, 2))
+
+/*
+** qshl_7_u8_m:
+**     uqshl   z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_7_u8_m, svuint8_t,
+               z0 = svqshl_n_u8_m (p0, z0, 7),
+               z0 = svqshl_m (p0, z0, 7))
+
+/*
+** qshl_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqshl   z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (qshl_u8_z_tied1, svuint8_t, svint8_t,
+            z0 = svqshl_u8_z (p0, z0, z4),
+            z0 = svqshl_z (p0, z0, z4))
+
+/*
+** qshl_u8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqshlr  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_u8_z_tied2, svuint8_t, svint8_t,
+                z0_res = svqshl_u8_z (p0, z4, z0),
+                z0_res = svqshl_z (p0, z4, z0))
+
+/*
+** qshl_u8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uqshl   z0\.b, p0/m, z0\.b, z4\.b
+** |
+**     movprfx z0\.b, p0/z, z4\.b
+**     uqshlr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshl_u8_z_untied, svuint8_t, svint8_t,
+            z0 = svqshl_u8_z (p0, z1, z4),
+            z0 = svqshl_z (p0, z1, z4))
+
+/*
+** qshl_w0_u8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqshl   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_u8_z_tied1, svuint8_t, int8_t,
+                z0 = svqshl_n_u8_z (p0, z0, x0),
+                z0 = svqshl_z (p0, z0, x0))
+
+/*
+** qshl_w0_u8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uqshl   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     uqshlr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_u8_z_untied, svuint8_t, int8_t,
+                z0 = svqshl_n_u8_z (p0, z1, x0),
+                z0 = svqshl_z (p0, z1, x0))
+
+/*
+** qshl_m8_u8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     lsr     z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m8_u8_z, svuint8_t,
+               z0 = svqshl_n_u8_z (p0, z0, -8),
+               z0 = svqshl_z (p0, z0, -8))
+
+/*
+** qshl_m2_u8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     lsr     z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_u8_z, svuint8_t,
+               z0 = svqshl_n_u8_z (p0, z0, -2),
+               z0 = svqshl_z (p0, z0, -2))
+
+/*
+** qshl_m1_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     lsr     z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u8_z_tied1, svuint8_t,
+               z0 = svqshl_n_u8_z (p0, z0, -1),
+               z0 = svqshl_z (p0, z0, -1))
+
+/*
+** qshl_m1_u8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     lsr     z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u8_z_untied, svuint8_t,
+               z0 = svqshl_n_u8_z (p0, z1, -1),
+               z0 = svqshl_z (p0, z1, -1))
+
+/*
+** qshl_1_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u8_z_tied1, svuint8_t,
+               z0 = svqshl_n_u8_z (p0, z0, 1),
+               z0 = svqshl_z (p0, z0, 1))
+
+/*
+** qshl_1_u8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     uqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u8_z_untied, svuint8_t,
+               z0 = svqshl_n_u8_z (p0, z1, 1),
+               z0 = svqshl_z (p0, z1, 1))
+
+/*
+** qshl_2_u8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqshl   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_u8_z, svuint8_t,
+               z0 = svqshl_n_u8_z (p0, z0, 2),
+               z0 = svqshl_z (p0, z0, 2))
+
+/*
+** qshl_7_u8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqshl   z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_7_u8_z, svuint8_t,
+               z0 = svqshl_n_u8_z (p0, z0, 7),
+               z0 = svqshl_z (p0, z0, 7))
+
+/*
+** qshl_u8_x_tied1:
+**     uqshl   z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (qshl_u8_x_tied1, svuint8_t, svint8_t,
+            z0 = svqshl_u8_x (p0, z0, z4),
+            z0 = svqshl_x (p0, z0, z4))
+
+/*
+** qshl_u8_x_tied2:
+**     uqshlr  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (qshl_u8_x_tied2, svuint8_t, svint8_t,
+                z0_res = svqshl_u8_x (p0, z4, z0),
+                z0_res = svqshl_x (p0, z4, z0))
+
+/*
+** qshl_u8_x_untied:
+** (
+**     movprfx z0, z1
+**     uqshl   z0\.b, p0/m, z0\.b, z4\.b
+** |
+**     movprfx z0, z4
+**     uqshlr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshl_u8_x_untied, svuint8_t, svint8_t,
+            z0 = svqshl_u8_x (p0, z1, z4),
+            z0 = svqshl_x (p0, z1, z4))
+
+/*
+** qshl_w0_u8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uqshl   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_u8_x_tied1, svuint8_t, int8_t,
+                z0 = svqshl_n_u8_x (p0, z0, x0),
+                z0 = svqshl_x (p0, z0, x0))
+
+/*
+** qshl_w0_u8_x_untied:
+**     mov     z0\.b, w0
+**     uqshlr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_ZX (qshl_w0_u8_x_untied, svuint8_t, int8_t,
+                z0 = svqshl_n_u8_x (p0, z1, x0),
+                z0 = svqshl_x (p0, z1, x0))
+
+/*
+** qshl_m8_u8_x:
+**     lsr     z0\.b, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m8_u8_x, svuint8_t,
+               z0 = svqshl_n_u8_x (p0, z0, -8),
+               z0 = svqshl_x (p0, z0, -8))
+
+/*
+** qshl_m2_u8_x:
+**     lsr     z0\.b, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m2_u8_x, svuint8_t,
+               z0 = svqshl_n_u8_x (p0, z0, -2),
+               z0 = svqshl_x (p0, z0, -2))
+
+/*
+** qshl_m1_u8_x_tied1:
+**     lsr     z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u8_x_tied1, svuint8_t,
+               z0 = svqshl_n_u8_x (p0, z0, -1),
+               z0 = svqshl_x (p0, z0, -1))
+
+/*
+** qshl_m1_u8_x_untied:
+**     lsr     z0\.b, z1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_m1_u8_x_untied, svuint8_t,
+               z0 = svqshl_n_u8_x (p0, z1, -1),
+               z0 = svqshl_x (p0, z1, -1))
+
+/*
+** qshl_1_u8_x_tied1:
+**     uqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u8_x_tied1, svuint8_t,
+               z0 = svqshl_n_u8_x (p0, z0, 1),
+               z0 = svqshl_x (p0, z0, 1))
+
+/*
+** qshl_1_u8_x_untied:
+**     movprfx z0, z1
+**     uqshl   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_1_u8_x_untied, svuint8_t,
+               z0 = svqshl_n_u8_x (p0, z1, 1),
+               z0 = svqshl_x (p0, z1, 1))
+
+/*
+** qshl_2_u8_x:
+**     uqshl   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_2_u8_x, svuint8_t,
+               z0 = svqshl_n_u8_x (p0, z0, 2),
+               z0 = svqshl_x (p0, z0, 2))
+
+/*
+** qshl_7_u8_x:
+**     uqshl   z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (qshl_7_u8_x, svuint8_t,
+               z0 = svqshl_n_u8_x (p0, z0, 7),
+               z0 = svqshl_x (p0, z0, 7))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshlu_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshlu_s16.c
new file mode 100644 (file)
index 0000000..4b5e87b
--- /dev/null
@@ -0,0 +1,177 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshlu_0_s16_m_tied1:
+**     sqshlu  z0\.h, p0/m, z0\.h, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s16_m_tied1, svuint16_t, svint16_t,
+                z0_res = svqshlu_n_s16_m (p0, z0, 0),
+                z0_res = svqshlu_m (p0, z0, 0))
+
+/*
+** qshlu_0_s16_m_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.h, p0/m, z0\.h, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s16_m_untied, svuint16_t, svint16_t,
+                z0_res = svqshlu_n_s16_m (p0, z1, 0),
+                z0_res = svqshlu_m (p0, z1, 0))
+
+/*
+** qshlu_1_s16_m_tied1:
+**     sqshlu  z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s16_m_tied1, svuint16_t, svint16_t,
+                z0_res = svqshlu_n_s16_m (p0, z0, 1),
+                z0_res = svqshlu_m (p0, z0, 1))
+
+/*
+** qshlu_1_s16_m_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s16_m_untied, svuint16_t, svint16_t,
+                z0_res = svqshlu_n_s16_m (p0, z1, 1),
+                z0_res = svqshlu_m (p0, z1, 1))
+
+/*
+** qshlu_15_s16_m_tied1:
+**     sqshlu  z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_15_s16_m_tied1, svuint16_t, svint16_t,
+                z0_res = svqshlu_n_s16_m (p0, z0, 15),
+                z0_res = svqshlu_m (p0, z0, 15))
+
+/*
+** qshlu_15_s16_m_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_15_s16_m_untied, svuint16_t, svint16_t,
+                z0_res = svqshlu_n_s16_m (p0, z1, 15),
+                z0_res = svqshlu_m (p0, z1, 15))
+
+/*
+** qshlu_0_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqshlu  z0\.h, p0/m, z0\.h, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s16_z_tied1, svuint16_t, svint16_t,
+                z0_res = svqshlu_n_s16_z (p0, z0, 0),
+                z0_res = svqshlu_z (p0, z0, 0))
+
+/*
+** qshlu_0_s16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqshlu  z0\.h, p0/m, z0\.h, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s16_z_untied, svuint16_t, svint16_t,
+                z0_res = svqshlu_n_s16_z (p0, z1, 0),
+                z0_res = svqshlu_z (p0, z1, 0))
+
+/*
+** qshlu_1_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqshlu  z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s16_z_tied1, svuint16_t, svint16_t,
+                z0_res = svqshlu_n_s16_z (p0, z0, 1),
+                z0_res = svqshlu_z (p0, z0, 1))
+
+/*
+** qshlu_1_s16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqshlu  z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s16_z_untied, svuint16_t, svint16_t,
+                z0_res = svqshlu_n_s16_z (p0, z1, 1),
+                z0_res = svqshlu_z (p0, z1, 1))
+
+/*
+** qshlu_15_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqshlu  z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_15_s16_z_tied1, svuint16_t, svint16_t,
+                z0_res = svqshlu_n_s16_z (p0, z0, 15),
+                z0_res = svqshlu_z (p0, z0, 15))
+
+/*
+** qshlu_15_s16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqshlu  z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_15_s16_z_untied, svuint16_t, svint16_t,
+                z0_res = svqshlu_n_s16_z (p0, z1, 15),
+                z0_res = svqshlu_z (p0, z1, 15))
+
+/*
+** qshlu_0_s16_x_tied1:
+**     sqshlu  z0\.h, p0/m, z0\.h, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s16_x_tied1, svuint16_t, svint16_t,
+                z0_res = svqshlu_n_s16_x (p0, z0, 0),
+                z0_res = svqshlu_x (p0, z0, 0))
+
+/*
+** qshlu_0_s16_x_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.h, p0/m, z0\.h, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s16_x_untied, svuint16_t, svint16_t,
+                z0_res = svqshlu_n_s16_x (p0, z1, 0),
+                z0_res = svqshlu_x (p0, z1, 0))
+
+/*
+** qshlu_1_s16_x_tied1:
+**     sqshlu  z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s16_x_tied1, svuint16_t, svint16_t,
+                z0_res = svqshlu_n_s16_x (p0, z0, 1),
+                z0_res = svqshlu_x (p0, z0, 1))
+
+/*
+** qshlu_1_s16_x_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s16_x_untied, svuint16_t, svint16_t,
+                z0_res = svqshlu_n_s16_x (p0, z1, 1),
+                z0_res = svqshlu_x (p0, z1, 1))
+
+/*
+** qshlu_15_s16_x_tied1:
+**     sqshlu  z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_15_s16_x_tied1, svuint16_t, svint16_t,
+                z0_res = svqshlu_n_s16_x (p0, z0, 15),
+                z0_res = svqshlu_x (p0, z0, 15))
+
+/*
+** qshlu_15_s16_x_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_15_s16_x_untied, svuint16_t, svint16_t,
+                z0_res = svqshlu_n_s16_x (p0, z1, 15),
+                z0_res = svqshlu_x (p0, z1, 15))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshlu_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshlu_s32.c
new file mode 100644 (file)
index 0000000..03128ee
--- /dev/null
@@ -0,0 +1,177 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshlu_0_s32_m_tied1:
+**     sqshlu  z0\.s, p0/m, z0\.s, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s32_m_tied1, svuint32_t, svint32_t,
+                z0_res = svqshlu_n_s32_m (p0, z0, 0),
+                z0_res = svqshlu_m (p0, z0, 0))
+
+/*
+** qshlu_0_s32_m_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.s, p0/m, z0\.s, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s32_m_untied, svuint32_t, svint32_t,
+                z0_res = svqshlu_n_s32_m (p0, z1, 0),
+                z0_res = svqshlu_m (p0, z1, 0))
+
+/*
+** qshlu_1_s32_m_tied1:
+**     sqshlu  z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s32_m_tied1, svuint32_t, svint32_t,
+                z0_res = svqshlu_n_s32_m (p0, z0, 1),
+                z0_res = svqshlu_m (p0, z0, 1))
+
+/*
+** qshlu_1_s32_m_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s32_m_untied, svuint32_t, svint32_t,
+                z0_res = svqshlu_n_s32_m (p0, z1, 1),
+                z0_res = svqshlu_m (p0, z1, 1))
+
+/*
+** qshlu_31_s32_m_tied1:
+**     sqshlu  z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_31_s32_m_tied1, svuint32_t, svint32_t,
+                z0_res = svqshlu_n_s32_m (p0, z0, 31),
+                z0_res = svqshlu_m (p0, z0, 31))
+
+/*
+** qshlu_31_s32_m_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_31_s32_m_untied, svuint32_t, svint32_t,
+                z0_res = svqshlu_n_s32_m (p0, z1, 31),
+                z0_res = svqshlu_m (p0, z1, 31))
+
+/*
+** qshlu_0_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqshlu  z0\.s, p0/m, z0\.s, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s32_z_tied1, svuint32_t, svint32_t,
+                z0_res = svqshlu_n_s32_z (p0, z0, 0),
+                z0_res = svqshlu_z (p0, z0, 0))
+
+/*
+** qshlu_0_s32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqshlu  z0\.s, p0/m, z0\.s, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s32_z_untied, svuint32_t, svint32_t,
+                z0_res = svqshlu_n_s32_z (p0, z1, 0),
+                z0_res = svqshlu_z (p0, z1, 0))
+
+/*
+** qshlu_1_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqshlu  z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s32_z_tied1, svuint32_t, svint32_t,
+                z0_res = svqshlu_n_s32_z (p0, z0, 1),
+                z0_res = svqshlu_z (p0, z0, 1))
+
+/*
+** qshlu_1_s32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqshlu  z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s32_z_untied, svuint32_t, svint32_t,
+                z0_res = svqshlu_n_s32_z (p0, z1, 1),
+                z0_res = svqshlu_z (p0, z1, 1))
+
+/*
+** qshlu_31_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqshlu  z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_31_s32_z_tied1, svuint32_t, svint32_t,
+                z0_res = svqshlu_n_s32_z (p0, z0, 31),
+                z0_res = svqshlu_z (p0, z0, 31))
+
+/*
+** qshlu_31_s32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqshlu  z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_31_s32_z_untied, svuint32_t, svint32_t,
+                z0_res = svqshlu_n_s32_z (p0, z1, 31),
+                z0_res = svqshlu_z (p0, z1, 31))
+
+/*
+** qshlu_0_s32_x_tied1:
+**     sqshlu  z0\.s, p0/m, z0\.s, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s32_x_tied1, svuint32_t, svint32_t,
+                z0_res = svqshlu_n_s32_x (p0, z0, 0),
+                z0_res = svqshlu_x (p0, z0, 0))
+
+/*
+** qshlu_0_s32_x_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.s, p0/m, z0\.s, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s32_x_untied, svuint32_t, svint32_t,
+                z0_res = svqshlu_n_s32_x (p0, z1, 0),
+                z0_res = svqshlu_x (p0, z1, 0))
+
+/*
+** qshlu_1_s32_x_tied1:
+**     sqshlu  z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s32_x_tied1, svuint32_t, svint32_t,
+                z0_res = svqshlu_n_s32_x (p0, z0, 1),
+                z0_res = svqshlu_x (p0, z0, 1))
+
+/*
+** qshlu_1_s32_x_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s32_x_untied, svuint32_t, svint32_t,
+                z0_res = svqshlu_n_s32_x (p0, z1, 1),
+                z0_res = svqshlu_x (p0, z1, 1))
+
+/*
+** qshlu_31_s32_x_tied1:
+**     sqshlu  z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_31_s32_x_tied1, svuint32_t, svint32_t,
+                z0_res = svqshlu_n_s32_x (p0, z0, 31),
+                z0_res = svqshlu_x (p0, z0, 31))
+
+/*
+** qshlu_31_s32_x_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_31_s32_x_untied, svuint32_t, svint32_t,
+                z0_res = svqshlu_n_s32_x (p0, z1, 31),
+                z0_res = svqshlu_x (p0, z1, 31))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshlu_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshlu_s64.c
new file mode 100644 (file)
index 0000000..a4e0077
--- /dev/null
@@ -0,0 +1,177 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshlu_0_s64_m_tied1:
+**     sqshlu  z0\.d, p0/m, z0\.d, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s64_m_tied1, svuint64_t, svint64_t,
+                z0_res = svqshlu_n_s64_m (p0, z0, 0),
+                z0_res = svqshlu_m (p0, z0, 0))
+
+/*
+** qshlu_0_s64_m_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.d, p0/m, z0\.d, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s64_m_untied, svuint64_t, svint64_t,
+                z0_res = svqshlu_n_s64_m (p0, z1, 0),
+                z0_res = svqshlu_m (p0, z1, 0))
+
+/*
+** qshlu_1_s64_m_tied1:
+**     sqshlu  z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s64_m_tied1, svuint64_t, svint64_t,
+                z0_res = svqshlu_n_s64_m (p0, z0, 1),
+                z0_res = svqshlu_m (p0, z0, 1))
+
+/*
+** qshlu_1_s64_m_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s64_m_untied, svuint64_t, svint64_t,
+                z0_res = svqshlu_n_s64_m (p0, z1, 1),
+                z0_res = svqshlu_m (p0, z1, 1))
+
+/*
+** qshlu_63_s64_m_tied1:
+**     sqshlu  z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_63_s64_m_tied1, svuint64_t, svint64_t,
+                z0_res = svqshlu_n_s64_m (p0, z0, 63),
+                z0_res = svqshlu_m (p0, z0, 63))
+
+/*
+** qshlu_63_s64_m_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_63_s64_m_untied, svuint64_t, svint64_t,
+                z0_res = svqshlu_n_s64_m (p0, z1, 63),
+                z0_res = svqshlu_m (p0, z1, 63))
+
+/*
+** qshlu_0_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqshlu  z0\.d, p0/m, z0\.d, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s64_z_tied1, svuint64_t, svint64_t,
+                z0_res = svqshlu_n_s64_z (p0, z0, 0),
+                z0_res = svqshlu_z (p0, z0, 0))
+
+/*
+** qshlu_0_s64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqshlu  z0\.d, p0/m, z0\.d, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s64_z_untied, svuint64_t, svint64_t,
+                z0_res = svqshlu_n_s64_z (p0, z1, 0),
+                z0_res = svqshlu_z (p0, z1, 0))
+
+/*
+** qshlu_1_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqshlu  z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s64_z_tied1, svuint64_t, svint64_t,
+                z0_res = svqshlu_n_s64_z (p0, z0, 1),
+                z0_res = svqshlu_z (p0, z0, 1))
+
+/*
+** qshlu_1_s64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqshlu  z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s64_z_untied, svuint64_t, svint64_t,
+                z0_res = svqshlu_n_s64_z (p0, z1, 1),
+                z0_res = svqshlu_z (p0, z1, 1))
+
+/*
+** qshlu_63_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqshlu  z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_63_s64_z_tied1, svuint64_t, svint64_t,
+                z0_res = svqshlu_n_s64_z (p0, z0, 63),
+                z0_res = svqshlu_z (p0, z0, 63))
+
+/*
+** qshlu_63_s64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqshlu  z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_63_s64_z_untied, svuint64_t, svint64_t,
+                z0_res = svqshlu_n_s64_z (p0, z1, 63),
+                z0_res = svqshlu_z (p0, z1, 63))
+
+/*
+** qshlu_0_s64_x_tied1:
+**     sqshlu  z0\.d, p0/m, z0\.d, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s64_x_tied1, svuint64_t, svint64_t,
+                z0_res = svqshlu_n_s64_x (p0, z0, 0),
+                z0_res = svqshlu_x (p0, z0, 0))
+
+/*
+** qshlu_0_s64_x_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.d, p0/m, z0\.d, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s64_x_untied, svuint64_t, svint64_t,
+                z0_res = svqshlu_n_s64_x (p0, z1, 0),
+                z0_res = svqshlu_x (p0, z1, 0))
+
+/*
+** qshlu_1_s64_x_tied1:
+**     sqshlu  z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s64_x_tied1, svuint64_t, svint64_t,
+                z0_res = svqshlu_n_s64_x (p0, z0, 1),
+                z0_res = svqshlu_x (p0, z0, 1))
+
+/*
+** qshlu_1_s64_x_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s64_x_untied, svuint64_t, svint64_t,
+                z0_res = svqshlu_n_s64_x (p0, z1, 1),
+                z0_res = svqshlu_x (p0, z1, 1))
+
+/*
+** qshlu_63_s64_x_tied1:
+**     sqshlu  z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_63_s64_x_tied1, svuint64_t, svint64_t,
+                z0_res = svqshlu_n_s64_x (p0, z0, 63),
+                z0_res = svqshlu_x (p0, z0, 63))
+
+/*
+** qshlu_63_s64_x_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_63_s64_x_untied, svuint64_t, svint64_t,
+                z0_res = svqshlu_n_s64_x (p0, z1, 63),
+                z0_res = svqshlu_x (p0, z1, 63))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshlu_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshlu_s8.c
new file mode 100644 (file)
index 0000000..45b9f4f
--- /dev/null
@@ -0,0 +1,177 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshlu_0_s8_m_tied1:
+**     sqshlu  z0\.b, p0/m, z0\.b, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s8_m_tied1, svuint8_t, svint8_t,
+                z0_res = svqshlu_n_s8_m (p0, z0, 0),
+                z0_res = svqshlu_m (p0, z0, 0))
+
+/*
+** qshlu_0_s8_m_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.b, p0/m, z0\.b, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s8_m_untied, svuint8_t, svint8_t,
+                z0_res = svqshlu_n_s8_m (p0, z1, 0),
+                z0_res = svqshlu_m (p0, z1, 0))
+
+/*
+** qshlu_1_s8_m_tied1:
+**     sqshlu  z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s8_m_tied1, svuint8_t, svint8_t,
+                z0_res = svqshlu_n_s8_m (p0, z0, 1),
+                z0_res = svqshlu_m (p0, z0, 1))
+
+/*
+** qshlu_1_s8_m_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s8_m_untied, svuint8_t, svint8_t,
+                z0_res = svqshlu_n_s8_m (p0, z1, 1),
+                z0_res = svqshlu_m (p0, z1, 1))
+
+/*
+** qshlu_7_s8_m_tied1:
+**     sqshlu  z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_7_s8_m_tied1, svuint8_t, svint8_t,
+                z0_res = svqshlu_n_s8_m (p0, z0, 7),
+                z0_res = svqshlu_m (p0, z0, 7))
+
+/*
+** qshlu_7_s8_m_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_7_s8_m_untied, svuint8_t, svint8_t,
+                z0_res = svqshlu_n_s8_m (p0, z1, 7),
+                z0_res = svqshlu_m (p0, z1, 7))
+
+/*
+** qshlu_0_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqshlu  z0\.b, p0/m, z0\.b, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s8_z_tied1, svuint8_t, svint8_t,
+                z0_res = svqshlu_n_s8_z (p0, z0, 0),
+                z0_res = svqshlu_z (p0, z0, 0))
+
+/*
+** qshlu_0_s8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqshlu  z0\.b, p0/m, z0\.b, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s8_z_untied, svuint8_t, svint8_t,
+                z0_res = svqshlu_n_s8_z (p0, z1, 0),
+                z0_res = svqshlu_z (p0, z1, 0))
+
+/*
+** qshlu_1_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqshlu  z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s8_z_tied1, svuint8_t, svint8_t,
+                z0_res = svqshlu_n_s8_z (p0, z0, 1),
+                z0_res = svqshlu_z (p0, z0, 1))
+
+/*
+** qshlu_1_s8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqshlu  z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s8_z_untied, svuint8_t, svint8_t,
+                z0_res = svqshlu_n_s8_z (p0, z1, 1),
+                z0_res = svqshlu_z (p0, z1, 1))
+
+/*
+** qshlu_7_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqshlu  z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_7_s8_z_tied1, svuint8_t, svint8_t,
+                z0_res = svqshlu_n_s8_z (p0, z0, 7),
+                z0_res = svqshlu_z (p0, z0, 7))
+
+/*
+** qshlu_7_s8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqshlu  z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_7_s8_z_untied, svuint8_t, svint8_t,
+                z0_res = svqshlu_n_s8_z (p0, z1, 7),
+                z0_res = svqshlu_z (p0, z1, 7))
+
+/*
+** qshlu_0_s8_x_tied1:
+**     sqshlu  z0\.b, p0/m, z0\.b, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s8_x_tied1, svuint8_t, svint8_t,
+                z0_res = svqshlu_n_s8_x (p0, z0, 0),
+                z0_res = svqshlu_x (p0, z0, 0))
+
+/*
+** qshlu_0_s8_x_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.b, p0/m, z0\.b, #0
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_0_s8_x_untied, svuint8_t, svint8_t,
+                z0_res = svqshlu_n_s8_x (p0, z1, 0),
+                z0_res = svqshlu_x (p0, z1, 0))
+
+/*
+** qshlu_1_s8_x_tied1:
+**     sqshlu  z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s8_x_tied1, svuint8_t, svint8_t,
+                z0_res = svqshlu_n_s8_x (p0, z0, 1),
+                z0_res = svqshlu_x (p0, z0, 1))
+
+/*
+** qshlu_1_s8_x_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_1_s8_x_untied, svuint8_t, svint8_t,
+                z0_res = svqshlu_n_s8_x (p0, z1, 1),
+                z0_res = svqshlu_x (p0, z1, 1))
+
+/*
+** qshlu_7_s8_x_tied1:
+**     sqshlu  z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_7_s8_x_tied1, svuint8_t, svint8_t,
+                z0_res = svqshlu_n_s8_x (p0, z0, 7),
+                z0_res = svqshlu_x (p0, z0, 7))
+
+/*
+** qshlu_7_s8_x_untied:
+**     movprfx z0, z1
+**     sqshlu  z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_DUAL_Z_REV (qshlu_7_s8_x_untied, svuint8_t, svint8_t,
+                z0_res = svqshlu_n_s8_x (p0, z1, 7),
+                z0_res = svqshlu_x (p0, z1, 7))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnb_s16.c
new file mode 100644 (file)
index 0000000..db87571
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshrnb_1_s16:
+**     sqshrnb z0\.b, z0\.h, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_1_s16, svint8_t, svint16_t,
+                   z0_res = svqshrnb_n_s16 (z0, 1),
+                   z0_res = svqshrnb (z0, 1))
+
+/*
+** qshrnb_2_s16:
+**     sqshrnb z0\.b, z0\.h, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_2_s16, svint8_t, svint16_t,
+                   z0_res = svqshrnb_n_s16 (z0, 2),
+                   z0_res = svqshrnb (z0, 2))
+
+/*
+** qshrnb_8_s16_tied1:
+**     sqshrnb z0\.b, z0\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_8_s16_tied1, svint8_t, svint16_t,
+                   z0_res = svqshrnb_n_s16 (z0, 8),
+                   z0_res = svqshrnb (z0, 8))
+
+/*
+** qshrnb_8_s16_untied:
+**     sqshrnb z0\.b, z1\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_8_s16_untied, svint8_t, svint16_t,
+                   z0_res = svqshrnb_n_s16 (z1, 8),
+                   z0_res = svqshrnb (z1, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnb_s32.c
new file mode 100644 (file)
index 0000000..6d8c5b2
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshrnb_1_s32:
+**     sqshrnb z0\.h, z0\.s, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_1_s32, svint16_t, svint32_t,
+                   z0_res = svqshrnb_n_s32 (z0, 1),
+                   z0_res = svqshrnb (z0, 1))
+
+/*
+** qshrnb_2_s32:
+**     sqshrnb z0\.h, z0\.s, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_2_s32, svint16_t, svint32_t,
+                   z0_res = svqshrnb_n_s32 (z0, 2),
+                   z0_res = svqshrnb (z0, 2))
+
+/*
+** qshrnb_16_s32_tied1:
+**     sqshrnb z0\.h, z0\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_16_s32_tied1, svint16_t, svint32_t,
+                   z0_res = svqshrnb_n_s32 (z0, 16),
+                   z0_res = svqshrnb (z0, 16))
+
+/*
+** qshrnb_16_s32_untied:
+**     sqshrnb z0\.h, z1\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_16_s32_untied, svint16_t, svint32_t,
+                   z0_res = svqshrnb_n_s32 (z1, 16),
+                   z0_res = svqshrnb (z1, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnb_s64.c
new file mode 100644 (file)
index 0000000..3302614
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshrnb_1_s64:
+**     sqshrnb z0\.s, z0\.d, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_1_s64, svint32_t, svint64_t,
+                   z0_res = svqshrnb_n_s64 (z0, 1),
+                   z0_res = svqshrnb (z0, 1))
+
+/*
+** qshrnb_2_s64:
+**     sqshrnb z0\.s, z0\.d, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_2_s64, svint32_t, svint64_t,
+                   z0_res = svqshrnb_n_s64 (z0, 2),
+                   z0_res = svqshrnb (z0, 2))
+
+/*
+** qshrnb_32_s64_tied1:
+**     sqshrnb z0\.s, z0\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_32_s64_tied1, svint32_t, svint64_t,
+                   z0_res = svqshrnb_n_s64 (z0, 32),
+                   z0_res = svqshrnb (z0, 32))
+
+/*
+** qshrnb_32_s64_untied:
+**     sqshrnb z0\.s, z1\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_32_s64_untied, svint32_t, svint64_t,
+                   z0_res = svqshrnb_n_s64 (z1, 32),
+                   z0_res = svqshrnb (z1, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnb_u16.c
new file mode 100644 (file)
index 0000000..5060188
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshrnb_1_u16:
+**     uqshrnb z0\.b, z0\.h, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_1_u16, svuint8_t, svuint16_t,
+                   z0_res = svqshrnb_n_u16 (z0, 1),
+                   z0_res = svqshrnb (z0, 1))
+
+/*
+** qshrnb_2_u16:
+**     uqshrnb z0\.b, z0\.h, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_2_u16, svuint8_t, svuint16_t,
+                   z0_res = svqshrnb_n_u16 (z0, 2),
+                   z0_res = svqshrnb (z0, 2))
+
+/*
+** qshrnb_8_u16_tied1:
+**     uqshrnb z0\.b, z0\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_8_u16_tied1, svuint8_t, svuint16_t,
+                   z0_res = svqshrnb_n_u16 (z0, 8),
+                   z0_res = svqshrnb (z0, 8))
+
+/*
+** qshrnb_8_u16_untied:
+**     uqshrnb z0\.b, z1\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_8_u16_untied, svuint8_t, svuint16_t,
+                   z0_res = svqshrnb_n_u16 (z1, 8),
+                   z0_res = svqshrnb (z1, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnb_u32.c
new file mode 100644 (file)
index 0000000..b5b3416
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshrnb_1_u32:
+**     uqshrnb z0\.h, z0\.s, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_1_u32, svuint16_t, svuint32_t,
+                   z0_res = svqshrnb_n_u32 (z0, 1),
+                   z0_res = svqshrnb (z0, 1))
+
+/*
+** qshrnb_2_u32:
+**     uqshrnb z0\.h, z0\.s, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_2_u32, svuint16_t, svuint32_t,
+                   z0_res = svqshrnb_n_u32 (z0, 2),
+                   z0_res = svqshrnb (z0, 2))
+
+/*
+** qshrnb_16_u32_tied1:
+**     uqshrnb z0\.h, z0\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_16_u32_tied1, svuint16_t, svuint32_t,
+                   z0_res = svqshrnb_n_u32 (z0, 16),
+                   z0_res = svqshrnb (z0, 16))
+
+/*
+** qshrnb_16_u32_untied:
+**     uqshrnb z0\.h, z1\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_16_u32_untied, svuint16_t, svuint32_t,
+                   z0_res = svqshrnb_n_u32 (z1, 16),
+                   z0_res = svqshrnb (z1, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnb_u64.c
new file mode 100644 (file)
index 0000000..c412d0c
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshrnb_1_u64:
+**     uqshrnb z0\.s, z0\.d, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_1_u64, svuint32_t, svuint64_t,
+                   z0_res = svqshrnb_n_u64 (z0, 1),
+                   z0_res = svqshrnb (z0, 1))
+
+/*
+** qshrnb_2_u64:
+**     uqshrnb z0\.s, z0\.d, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_2_u64, svuint32_t, svuint64_t,
+                   z0_res = svqshrnb_n_u64 (z0, 2),
+                   z0_res = svqshrnb (z0, 2))
+
+/*
+** qshrnb_32_u64_tied1:
+**     uqshrnb z0\.s, z0\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_32_u64_tied1, svuint32_t, svuint64_t,
+                   z0_res = svqshrnb_n_u64 (z0, 32),
+                   z0_res = svqshrnb (z0, 32))
+
+/*
+** qshrnb_32_u64_untied:
+**     uqshrnb z0\.s, z1\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrnb_32_u64_untied, svuint32_t, svuint64_t,
+                   z0_res = svqshrnb_n_u64 (z1, 32),
+                   z0_res = svqshrnb (z1, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnt_s16.c
new file mode 100644 (file)
index 0000000..224bc03
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshrnt_1_s16:
+**     sqshrnt z0\.b, z4\.h, #1
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_1_s16, svint8_t, svint16_t,
+            z0 = svqshrnt_n_s16 (z0, z4, 1),
+            z0 = svqshrnt (z0, z4, 1))
+
+/*
+** qshrnt_2_s16:
+**     sqshrnt z0\.b, z4\.h, #2
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_2_s16, svint8_t, svint16_t,
+            z0 = svqshrnt_n_s16 (z0, z4, 2),
+            z0 = svqshrnt (z0, z4, 2))
+
+/*
+** qshrnt_8_s16_tied1:
+**     sqshrnt z0\.b, z4\.h, #8
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_8_s16_tied1, svint8_t, svint16_t,
+            z0 = svqshrnt_n_s16 (z0, z4, 8),
+            z0 = svqshrnt (z0, z4, 8))
+
+/*
+** qshrnt_8_s16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     sqshrnt z0\.b, z4\.h, #8
+** |
+**     sqshrnt z1\.b, z4\.h, #8
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_8_s16_untied, svint8_t, svint16_t,
+            z0 = svqshrnt_n_s16 (z1, z4, 8),
+            z0 = svqshrnt (z1, z4, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnt_s32.c
new file mode 100644 (file)
index 0000000..eaac8e4
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshrnt_1_s32:
+**     sqshrnt z0\.h, z4\.s, #1
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_1_s32, svint16_t, svint32_t,
+            z0 = svqshrnt_n_s32 (z0, z4, 1),
+            z0 = svqshrnt (z0, z4, 1))
+
+/*
+** qshrnt_2_s32:
+**     sqshrnt z0\.h, z4\.s, #2
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_2_s32, svint16_t, svint32_t,
+            z0 = svqshrnt_n_s32 (z0, z4, 2),
+            z0 = svqshrnt (z0, z4, 2))
+
+/*
+** qshrnt_16_s32_tied1:
+**     sqshrnt z0\.h, z4\.s, #16
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_16_s32_tied1, svint16_t, svint32_t,
+            z0 = svqshrnt_n_s32 (z0, z4, 16),
+            z0 = svqshrnt (z0, z4, 16))
+
+/*
+** qshrnt_16_s32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     sqshrnt z0\.h, z4\.s, #16
+** |
+**     sqshrnt z1\.h, z4\.s, #16
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_16_s32_untied, svint16_t, svint32_t,
+            z0 = svqshrnt_n_s32 (z1, z4, 16),
+            z0 = svqshrnt (z1, z4, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnt_s64.c
new file mode 100644 (file)
index 0000000..7d4e199
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshrnt_1_s64:
+**     sqshrnt z0\.s, z4\.d, #1
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_1_s64, svint32_t, svint64_t,
+            z0 = svqshrnt_n_s64 (z0, z4, 1),
+            z0 = svqshrnt (z0, z4, 1))
+
+/*
+** qshrnt_2_s64:
+**     sqshrnt z0\.s, z4\.d, #2
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_2_s64, svint32_t, svint64_t,
+            z0 = svqshrnt_n_s64 (z0, z4, 2),
+            z0 = svqshrnt (z0, z4, 2))
+
+/*
+** qshrnt_32_s64_tied1:
+**     sqshrnt z0\.s, z4\.d, #32
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_32_s64_tied1, svint32_t, svint64_t,
+            z0 = svqshrnt_n_s64 (z0, z4, 32),
+            z0 = svqshrnt (z0, z4, 32))
+
+/*
+** qshrnt_32_s64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     sqshrnt z0\.s, z4\.d, #32
+** |
+**     sqshrnt z1\.s, z4\.d, #32
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_32_s64_untied, svint32_t, svint64_t,
+            z0 = svqshrnt_n_s64 (z1, z4, 32),
+            z0 = svqshrnt (z1, z4, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnt_u16.c
new file mode 100644 (file)
index 0000000..f95d44a
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshrnt_1_u16:
+**     uqshrnt z0\.b, z4\.h, #1
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_1_u16, svuint8_t, svuint16_t,
+            z0 = svqshrnt_n_u16 (z0, z4, 1),
+            z0 = svqshrnt (z0, z4, 1))
+
+/*
+** qshrnt_2_u16:
+**     uqshrnt z0\.b, z4\.h, #2
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_2_u16, svuint8_t, svuint16_t,
+            z0 = svqshrnt_n_u16 (z0, z4, 2),
+            z0 = svqshrnt (z0, z4, 2))
+
+/*
+** qshrnt_8_u16_tied1:
+**     uqshrnt z0\.b, z4\.h, #8
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_8_u16_tied1, svuint8_t, svuint16_t,
+            z0 = svqshrnt_n_u16 (z0, z4, 8),
+            z0 = svqshrnt (z0, z4, 8))
+
+/*
+** qshrnt_8_u16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     uqshrnt z0\.b, z4\.h, #8
+** |
+**     uqshrnt z1\.b, z4\.h, #8
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_8_u16_untied, svuint8_t, svuint16_t,
+            z0 = svqshrnt_n_u16 (z1, z4, 8),
+            z0 = svqshrnt (z1, z4, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnt_u32.c
new file mode 100644 (file)
index 0000000..a28a028
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshrnt_1_u32:
+**     uqshrnt z0\.h, z4\.s, #1
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_1_u32, svuint16_t, svuint32_t,
+            z0 = svqshrnt_n_u32 (z0, z4, 1),
+            z0 = svqshrnt (z0, z4, 1))
+
+/*
+** qshrnt_2_u32:
+**     uqshrnt z0\.h, z4\.s, #2
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_2_u32, svuint16_t, svuint32_t,
+            z0 = svqshrnt_n_u32 (z0, z4, 2),
+            z0 = svqshrnt (z0, z4, 2))
+
+/*
+** qshrnt_16_u32_tied1:
+**     uqshrnt z0\.h, z4\.s, #16
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_16_u32_tied1, svuint16_t, svuint32_t,
+            z0 = svqshrnt_n_u32 (z0, z4, 16),
+            z0 = svqshrnt (z0, z4, 16))
+
+/*
+** qshrnt_16_u32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     uqshrnt z0\.h, z4\.s, #16
+** |
+**     uqshrnt z1\.h, z4\.s, #16
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_16_u32_untied, svuint16_t, svuint32_t,
+            z0 = svqshrnt_n_u32 (z1, z4, 16),
+            z0 = svqshrnt (z1, z4, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrnt_u64.c
new file mode 100644 (file)
index 0000000..c1a45cb
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshrnt_1_u64:
+**     uqshrnt z0\.s, z4\.d, #1
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_1_u64, svuint32_t, svuint64_t,
+            z0 = svqshrnt_n_u64 (z0, z4, 1),
+            z0 = svqshrnt (z0, z4, 1))
+
+/*
+** qshrnt_2_u64:
+**     uqshrnt z0\.s, z4\.d, #2
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_2_u64, svuint32_t, svuint64_t,
+            z0 = svqshrnt_n_u64 (z0, z4, 2),
+            z0 = svqshrnt (z0, z4, 2))
+
+/*
+** qshrnt_32_u64_tied1:
+**     uqshrnt z0\.s, z4\.d, #32
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_32_u64_tied1, svuint32_t, svuint64_t,
+            z0 = svqshrnt_n_u64 (z0, z4, 32),
+            z0 = svqshrnt (z0, z4, 32))
+
+/*
+** qshrnt_32_u64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     uqshrnt z0\.s, z4\.d, #32
+** |
+**     uqshrnt z1\.s, z4\.d, #32
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshrnt_32_u64_untied, svuint32_t, svuint64_t,
+            z0 = svqshrnt_n_u64 (z1, z4, 32),
+            z0 = svqshrnt (z1, z4, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrunb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrunb_s16.c
new file mode 100644 (file)
index 0000000..e23c61e
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshrunb_1_s16:
+**     sqshrunb        z0\.b, z0\.h, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrunb_1_s16, svuint8_t, svint16_t,
+                   z0_res = svqshrunb_n_s16 (z0, 1),
+                   z0_res = svqshrunb (z0, 1))
+
+/*
+** qshrunb_2_s16:
+**     sqshrunb        z0\.b, z0\.h, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrunb_2_s16, svuint8_t, svint16_t,
+                   z0_res = svqshrunb_n_s16 (z0, 2),
+                   z0_res = svqshrunb (z0, 2))
+
+/*
+** qshrunb_8_s16_tied1:
+**     sqshrunb        z0\.b, z0\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrunb_8_s16_tied1, svuint8_t, svint16_t,
+                   z0_res = svqshrunb_n_s16 (z0, 8),
+                   z0_res = svqshrunb (z0, 8))
+
+/*
+** qshrunb_8_s16_untied:
+**     sqshrunb        z0\.b, z1\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrunb_8_s16_untied, svuint8_t, svint16_t,
+                   z0_res = svqshrunb_n_s16 (z1, 8),
+                   z0_res = svqshrunb (z1, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrunb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrunb_s32.c
new file mode 100644 (file)
index 0000000..9652b4a
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshrunb_1_s32:
+**     sqshrunb        z0\.h, z0\.s, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrunb_1_s32, svuint16_t, svint32_t,
+                   z0_res = svqshrunb_n_s32 (z0, 1),
+                   z0_res = svqshrunb (z0, 1))
+
+/*
+** qshrunb_2_s32:
+**     sqshrunb        z0\.h, z0\.s, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrunb_2_s32, svuint16_t, svint32_t,
+                   z0_res = svqshrunb_n_s32 (z0, 2),
+                   z0_res = svqshrunb (z0, 2))
+
+/*
+** qshrunb_16_s32_tied1:
+**     sqshrunb        z0\.h, z0\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrunb_16_s32_tied1, svuint16_t, svint32_t,
+                   z0_res = svqshrunb_n_s32 (z0, 16),
+                   z0_res = svqshrunb (z0, 16))
+
+/*
+** qshrunb_16_s32_untied:
+**     sqshrunb        z0\.h, z1\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrunb_16_s32_untied, svuint16_t, svint32_t,
+                   z0_res = svqshrunb_n_s32 (z1, 16),
+                   z0_res = svqshrunb (z1, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrunb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrunb_s64.c
new file mode 100644 (file)
index 0000000..fcf4691
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshrunb_1_s64:
+**     sqshrunb        z0\.s, z0\.d, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrunb_1_s64, svuint32_t, svint64_t,
+                   z0_res = svqshrunb_n_s64 (z0, 1),
+                   z0_res = svqshrunb (z0, 1))
+
+/*
+** qshrunb_2_s64:
+**     sqshrunb        z0\.s, z0\.d, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrunb_2_s64, svuint32_t, svint64_t,
+                   z0_res = svqshrunb_n_s64 (z0, 2),
+                   z0_res = svqshrunb (z0, 2))
+
+/*
+** qshrunb_32_s64_tied1:
+**     sqshrunb        z0\.s, z0\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrunb_32_s64_tied1, svuint32_t, svint64_t,
+                   z0_res = svqshrunb_n_s64 (z0, 32),
+                   z0_res = svqshrunb (z0, 32))
+
+/*
+** qshrunb_32_s64_untied:
+**     sqshrunb        z0\.s, z1\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (qshrunb_32_s64_untied, svuint32_t, svint64_t,
+                   z0_res = svqshrunb_n_s64 (z1, 32),
+                   z0_res = svqshrunb (z1, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrunt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrunt_s16.c
new file mode 100644 (file)
index 0000000..ed4b8a6
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshrunt_1_s16:
+**     sqshrunt        z0\.b, z4\.h, #1
+**     ret
+*/
+TEST_DUAL_Z (qshrunt_1_s16, svuint8_t, svint16_t,
+            z0 = svqshrunt_n_s16 (z0, z4, 1),
+            z0 = svqshrunt (z0, z4, 1))
+
+/*
+** qshrunt_2_s16:
+**     sqshrunt        z0\.b, z4\.h, #2
+**     ret
+*/
+TEST_DUAL_Z (qshrunt_2_s16, svuint8_t, svint16_t,
+            z0 = svqshrunt_n_s16 (z0, z4, 2),
+            z0 = svqshrunt (z0, z4, 2))
+
+/*
+** qshrunt_8_s16_tied1:
+**     sqshrunt        z0\.b, z4\.h, #8
+**     ret
+*/
+TEST_DUAL_Z (qshrunt_8_s16_tied1, svuint8_t, svint16_t,
+            z0 = svqshrunt_n_s16 (z0, z4, 8),
+            z0 = svqshrunt (z0, z4, 8))
+
+/*
+** qshrunt_8_s16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     sqshrunt        z0\.b, z4\.h, #8
+** |
+**     sqshrunt        z1\.b, z4\.h, #8
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshrunt_8_s16_untied, svuint8_t, svint16_t,
+            z0 = svqshrunt_n_s16 (z1, z4, 8),
+            z0 = svqshrunt (z1, z4, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrunt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrunt_s32.c
new file mode 100644 (file)
index 0000000..67d3f99
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshrunt_1_s32:
+**     sqshrunt        z0\.h, z4\.s, #1
+**     ret
+*/
+TEST_DUAL_Z (qshrunt_1_s32, svuint16_t, svint32_t,
+            z0 = svqshrunt_n_s32 (z0, z4, 1),
+            z0 = svqshrunt (z0, z4, 1))
+
+/*
+** qshrunt_2_s32:
+**     sqshrunt        z0\.h, z4\.s, #2
+**     ret
+*/
+TEST_DUAL_Z (qshrunt_2_s32, svuint16_t, svint32_t,
+            z0 = svqshrunt_n_s32 (z0, z4, 2),
+            z0 = svqshrunt (z0, z4, 2))
+
+/*
+** qshrunt_16_s32_tied1:
+**     sqshrunt        z0\.h, z4\.s, #16
+**     ret
+*/
+TEST_DUAL_Z (qshrunt_16_s32_tied1, svuint16_t, svint32_t,
+            z0 = svqshrunt_n_s32 (z0, z4, 16),
+            z0 = svqshrunt (z0, z4, 16))
+
+/*
+** qshrunt_16_s32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     sqshrunt        z0\.h, z4\.s, #16
+** |
+**     sqshrunt        z1\.h, z4\.s, #16
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshrunt_16_s32_untied, svuint16_t, svint32_t,
+            z0 = svqshrunt_n_s32 (z1, z4, 16),
+            z0 = svqshrunt (z1, z4, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrunt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qshrunt_s64.c
new file mode 100644 (file)
index 0000000..cdae11e
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qshrunt_1_s64:
+**     sqshrunt        z0\.s, z4\.d, #1
+**     ret
+*/
+TEST_DUAL_Z (qshrunt_1_s64, svuint32_t, svint64_t,
+            z0 = svqshrunt_n_s64 (z0, z4, 1),
+            z0 = svqshrunt (z0, z4, 1))
+
+/*
+** qshrunt_2_s64:
+**     sqshrunt        z0\.s, z4\.d, #2
+**     ret
+*/
+TEST_DUAL_Z (qshrunt_2_s64, svuint32_t, svint64_t,
+            z0 = svqshrunt_n_s64 (z0, z4, 2),
+            z0 = svqshrunt (z0, z4, 2))
+
+/*
+** qshrunt_32_s64_tied1:
+**     sqshrunt        z0\.s, z4\.d, #32
+**     ret
+*/
+TEST_DUAL_Z (qshrunt_32_s64_tied1, svuint32_t, svint64_t,
+            z0 = svqshrunt_n_s64 (z0, z4, 32),
+            z0 = svqshrunt (z0, z4, 32))
+
+/*
+** qshrunt_32_s64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     sqshrunt        z0\.s, z4\.d, #32
+** |
+**     sqshrunt        z1\.s, z4\.d, #32
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qshrunt_32_s64_untied, svuint32_t, svint64_t,
+            z0 = svqshrunt_n_s64 (z1, z4, 32),
+            z0 = svqshrunt (z1, z4, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_s16.c
new file mode 100644 (file)
index 0000000..c102e58
--- /dev/null
@@ -0,0 +1,530 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qsub_s16_tied1:
+**     sqsub   z0\.h, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s16_tied1, svint16_t,
+               z0 = svqsub_s16 (z0, z1),
+               z0 = svqsub (z0, z1))
+
+/*
+** qsub_s16_tied2:
+**     sqsub   z0\.h, z1\.h, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s16_tied2, svint16_t,
+               z0 = svqsub_s16 (z1, z0),
+               z0 = svqsub (z1, z0))
+
+/*
+** qsub_s16_untied:
+**     sqsub   z0\.h, z1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s16_untied, svint16_t,
+               z0 = svqsub_s16 (z1, z2),
+               z0 = svqsub (z1, z2))
+
+/*
+** qsub_w0_s16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqsub   z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s16_tied1, svint16_t, int16_t,
+                z0 = svqsub_n_s16 (z0, x0),
+                z0 = svqsub (z0, x0))
+
+/*
+** qsub_w0_s16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     sqsub   z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s16_untied, svint16_t, int16_t,
+                z0 = svqsub_n_s16 (z1, x0),
+                z0 = svqsub (z1, x0))
+
+/*
+** qsub_1_s16_tied1:
+**     sqsub   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s16_tied1, svint16_t,
+               z0 = svqsub_n_s16 (z0, 1),
+               z0 = svqsub (z0, 1))
+
+/*
+** qsub_1_s16_untied:
+**     movprfx z0, z1
+**     sqsub   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s16_untied, svint16_t,
+               z0 = svqsub_n_s16 (z1, 1),
+               z0 = svqsub (z1, 1))
+
+/*
+** qsub_127_s16:
+**     sqsub   z0\.h, z0\.h, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_s16, svint16_t,
+               z0 = svqsub_n_s16 (z0, 127),
+               z0 = svqsub (z0, 127))
+
+/*
+** qsub_128_s16:
+**     sqsub   z0\.h, z0\.h, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_s16, svint16_t,
+               z0 = svqsub_n_s16 (z0, 128),
+               z0 = svqsub (z0, 128))
+
+/*
+** qsub_255_s16:
+**     sqsub   z0\.h, z0\.h, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_s16, svint16_t,
+               z0 = svqsub_n_s16 (z0, 255),
+               z0 = svqsub (z0, 255))
+
+/*
+** qsub_m1_s16:
+**     sqadd   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_s16, svint16_t,
+               z0 = svqsub_n_s16 (z0, -1),
+               z0 = svqsub (z0, -1))
+
+/*
+** qsub_m127_s16:
+**     sqadd   z0\.h, z0\.h, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_s16, svint16_t,
+               z0 = svqsub_n_s16 (z0, -127),
+               z0 = svqsub (z0, -127))
+
+/*
+** qsub_m128_s16:
+**     sqadd   z0\.h, z0\.h, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_s16, svint16_t,
+               z0 = svqsub_n_s16 (z0, -128),
+               z0 = svqsub (z0, -128))
+
+/*
+** qsub_s16_m_tied1:
+**     sqsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s16_m_tied1, svint16_t,
+               z0 = svqsub_s16_m (p0, z0, z1),
+               z0 = svqsub_m (p0, z0, z1))
+
+/*
+** qsub_s16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqsub   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s16_m_tied2, svint16_t,
+               z0 = svqsub_s16_m (p0, z1, z0),
+               z0 = svqsub_m (p0, z1, z0))
+
+/*
+** qsub_s16_m_untied:
+**     movprfx z0, z1
+**     sqsub   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s16_m_untied, svint16_t,
+               z0 = svqsub_s16_m (p0, z1, z2),
+               z0 = svqsub_m (p0, z1, z2))
+
+/*
+** qsub_w0_s16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s16_m_tied1, svint16_t, int16_t,
+                z0 = svqsub_n_s16_m (p0, z0, x0),
+                z0 = svqsub_m (p0, z0, x0))
+
+/*
+** qsub_w0_s16_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     sqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s16_m_untied, svint16_t, int16_t,
+                z0 = svqsub_n_s16_m (p0, z1, x0),
+                z0 = svqsub_m (p0, z1, x0))
+
+/*
+** qsub_1_s16_m_tied1:
+**     mov     (z[0-9]+\.h), #1
+**     sqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s16_m_tied1, svint16_t,
+               z0 = svqsub_n_s16_m (p0, z0, 1),
+               z0 = svqsub_m (p0, z0, 1))
+
+/*
+** qsub_1_s16_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.h), #1
+**     movprfx z0, z1
+**     sqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s16_m_untied, svint16_t,
+               z0 = svqsub_n_s16_m (p0, z1, 1),
+               z0 = svqsub_m (p0, z1, 1))
+
+/*
+** qsub_127_s16_m:
+**     mov     (z[0-9]+\.h), #127
+**     sqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_s16_m, svint16_t,
+               z0 = svqsub_n_s16_m (p0, z0, 127),
+               z0 = svqsub_m (p0, z0, 127))
+
+/*
+** qsub_128_s16_m:
+**     mov     (z[0-9]+\.h), #128
+**     sqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_s16_m, svint16_t,
+               z0 = svqsub_n_s16_m (p0, z0, 128),
+               z0 = svqsub_m (p0, z0, 128))
+
+/*
+** qsub_255_s16_m:
+**     mov     (z[0-9]+\.h), #255
+**     sqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_s16_m, svint16_t,
+               z0 = svqsub_n_s16_m (p0, z0, 255),
+               z0 = svqsub_m (p0, z0, 255))
+
+/*
+** qsub_m1_s16_m:
+**     mov     (z[0-9]+)\.b, #-1
+**     sqsub   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_s16_m, svint16_t,
+               z0 = svqsub_n_s16_m (p0, z0, -1),
+               z0 = svqsub_m (p0, z0, -1))
+
+/*
+** qsub_m127_s16_m:
+**     mov     (z[0-9]+\.h), #-127
+**     sqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_s16_m, svint16_t,
+               z0 = svqsub_n_s16_m (p0, z0, -127),
+               z0 = svqsub_m (p0, z0, -127))
+
+/*
+** qsub_m128_s16_m:
+**     mov     (z[0-9]+\.h), #-128
+**     sqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_s16_m, svint16_t,
+               z0 = svqsub_n_s16_m (p0, z0, -128),
+               z0 = svqsub_m (p0, z0, -128))
+
+/*
+** qsub_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s16_z_tied1, svint16_t,
+               z0 = svqsub_s16_z (p0, z0, z1),
+               z0 = svqsub_z (p0, z0, z1))
+
+/*
+** qsub_s16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s16_z_tied2, svint16_t,
+               z0 = svqsub_s16_z (p0, z1, z0),
+               z0 = svqsub_z (p0, z1, z0))
+
+/*
+** qsub_s16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqsub   z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0\.h, p0/z, z2\.h
+**     sqsubr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s16_z_untied, svint16_t,
+               z0 = svqsub_s16_z (p0, z1, z2),
+               z0 = svqsub_z (p0, z1, z2))
+
+/*
+** qsub_w0_s16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s16_z_tied1, svint16_t, int16_t,
+                z0 = svqsub_n_s16_z (p0, z0, x0),
+                z0 = svqsub_z (p0, z0, x0))
+
+/*
+** qsub_w0_s16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqsub   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     sqsubr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s16_z_untied, svint16_t, int16_t,
+                z0 = svqsub_n_s16_z (p0, z1, x0),
+                z0 = svqsub_z (p0, z1, x0))
+
+/*
+** qsub_1_s16_z_tied1:
+**     mov     (z[0-9]+\.h), #1
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s16_z_tied1, svint16_t,
+               z0 = svqsub_n_s16_z (p0, z0, 1),
+               z0 = svqsub_z (p0, z0, 1))
+
+/*
+** qsub_1_s16_z_untied:
+**     mov     (z[0-9]+\.h), #1
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqsub   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     sqsubr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s16_z_untied, svint16_t,
+               z0 = svqsub_n_s16_z (p0, z1, 1),
+               z0 = svqsub_z (p0, z1, 1))
+
+/*
+** qsub_127_s16_z:
+**     mov     (z[0-9]+\.h), #127
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_s16_z, svint16_t,
+               z0 = svqsub_n_s16_z (p0, z0, 127),
+               z0 = svqsub_z (p0, z0, 127))
+
+/*
+** qsub_128_s16_z:
+**     mov     (z[0-9]+\.h), #128
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_s16_z, svint16_t,
+               z0 = svqsub_n_s16_z (p0, z0, 128),
+               z0 = svqsub_z (p0, z0, 128))
+
+/*
+** qsub_255_s16_z:
+**     mov     (z[0-9]+\.h), #255
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_s16_z, svint16_t,
+               z0 = svqsub_n_s16_z (p0, z0, 255),
+               z0 = svqsub_z (p0, z0, 255))
+
+/*
+** qsub_m1_s16_z:
+**     mov     (z[0-9]+)\.b, #-1
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqsub   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_s16_z, svint16_t,
+               z0 = svqsub_n_s16_z (p0, z0, -1),
+               z0 = svqsub_z (p0, z0, -1))
+
+/*
+** qsub_m127_s16_z:
+**     mov     (z[0-9]+\.h), #-127
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_s16_z, svint16_t,
+               z0 = svqsub_n_s16_z (p0, z0, -127),
+               z0 = svqsub_z (p0, z0, -127))
+
+/*
+** qsub_m128_s16_z:
+**     mov     (z[0-9]+\.h), #-128
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_s16_z, svint16_t,
+               z0 = svqsub_n_s16_z (p0, z0, -128),
+               z0 = svqsub_z (p0, z0, -128))
+
+/*
+** qsub_s16_x_tied1:
+**     sqsub   z0\.h, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s16_x_tied1, svint16_t,
+               z0 = svqsub_s16_x (p0, z0, z1),
+               z0 = svqsub_x (p0, z0, z1))
+
+/*
+** qsub_s16_x_tied2:
+**     sqsub   z0\.h, z1\.h, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s16_x_tied2, svint16_t,
+               z0 = svqsub_s16_x (p0, z1, z0),
+               z0 = svqsub_x (p0, z1, z0))
+
+/*
+** qsub_s16_x_untied:
+**     sqsub   z0\.h, z1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s16_x_untied, svint16_t,
+               z0 = svqsub_s16_x (p0, z1, z2),
+               z0 = svqsub_x (p0, z1, z2))
+
+/*
+** qsub_w0_s16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqsub   z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s16_x_tied1, svint16_t, int16_t,
+                z0 = svqsub_n_s16_x (p0, z0, x0),
+                z0 = svqsub_x (p0, z0, x0))
+
+/*
+** qsub_w0_s16_x_untied:
+**     mov     (z[0-9]+\.h), w0
+**     sqsub   z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s16_x_untied, svint16_t, int16_t,
+                z0 = svqsub_n_s16_x (p0, z1, x0),
+                z0 = svqsub_x (p0, z1, x0))
+
+/*
+** qsub_1_s16_x_tied1:
+**     sqsub   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s16_x_tied1, svint16_t,
+               z0 = svqsub_n_s16_x (p0, z0, 1),
+               z0 = svqsub_x (p0, z0, 1))
+
+/*
+** qsub_1_s16_x_untied:
+**     movprfx z0, z1
+**     sqsub   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s16_x_untied, svint16_t,
+               z0 = svqsub_n_s16_x (p0, z1, 1),
+               z0 = svqsub_x (p0, z1, 1))
+
+/*
+** qsub_127_s16_x:
+**     sqsub   z0\.h, z0\.h, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_s16_x, svint16_t,
+               z0 = svqsub_n_s16_x (p0, z0, 127),
+               z0 = svqsub_x (p0, z0, 127))
+
+/*
+** qsub_128_s16_x:
+**     sqsub   z0\.h, z0\.h, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_s16_x, svint16_t,
+               z0 = svqsub_n_s16_x (p0, z0, 128),
+               z0 = svqsub_x (p0, z0, 128))
+
+/*
+** qsub_255_s16_x:
+**     sqsub   z0\.h, z0\.h, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_s16_x, svint16_t,
+               z0 = svqsub_n_s16_x (p0, z0, 255),
+               z0 = svqsub_x (p0, z0, 255))
+
+/*
+** qsub_m1_s16_x:
+**     sqadd   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_s16_x, svint16_t,
+               z0 = svqsub_n_s16_x (p0, z0, -1),
+               z0 = svqsub_x (p0, z0, -1))
+
+/*
+** qsub_m127_s16_x:
+**     sqadd   z0\.h, z0\.h, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_s16_x, svint16_t,
+               z0 = svqsub_n_s16_x (p0, z0, -127),
+               z0 = svqsub_x (p0, z0, -127))
+
+/*
+** qsub_m128_s16_x:
+**     sqadd   z0\.h, z0\.h, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_s16_x, svint16_t,
+               z0 = svqsub_n_s16_x (p0, z0, -128),
+               z0 = svqsub_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_s32.c
new file mode 100644 (file)
index 0000000..e703ce9
--- /dev/null
@@ -0,0 +1,530 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qsub_s32_tied1:
+**     sqsub   z0\.s, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s32_tied1, svint32_t,
+               z0 = svqsub_s32 (z0, z1),
+               z0 = svqsub (z0, z1))
+
+/*
+** qsub_s32_tied2:
+**     sqsub   z0\.s, z1\.s, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s32_tied2, svint32_t,
+               z0 = svqsub_s32 (z1, z0),
+               z0 = svqsub (z1, z0))
+
+/*
+** qsub_s32_untied:
+**     sqsub   z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s32_untied, svint32_t,
+               z0 = svqsub_s32 (z1, z2),
+               z0 = svqsub (z1, z2))
+
+/*
+** qsub_w0_s32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqsub   z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s32_tied1, svint32_t, int32_t,
+                z0 = svqsub_n_s32 (z0, x0),
+                z0 = svqsub (z0, x0))
+
+/*
+** qsub_w0_s32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     sqsub   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s32_untied, svint32_t, int32_t,
+                z0 = svqsub_n_s32 (z1, x0),
+                z0 = svqsub (z1, x0))
+
+/*
+** qsub_1_s32_tied1:
+**     sqsub   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s32_tied1, svint32_t,
+               z0 = svqsub_n_s32 (z0, 1),
+               z0 = svqsub (z0, 1))
+
+/*
+** qsub_1_s32_untied:
+**     movprfx z0, z1
+**     sqsub   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s32_untied, svint32_t,
+               z0 = svqsub_n_s32 (z1, 1),
+               z0 = svqsub (z1, 1))
+
+/*
+** qsub_127_s32:
+**     sqsub   z0\.s, z0\.s, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_s32, svint32_t,
+               z0 = svqsub_n_s32 (z0, 127),
+               z0 = svqsub (z0, 127))
+
+/*
+** qsub_128_s32:
+**     sqsub   z0\.s, z0\.s, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_s32, svint32_t,
+               z0 = svqsub_n_s32 (z0, 128),
+               z0 = svqsub (z0, 128))
+
+/*
+** qsub_255_s32:
+**     sqsub   z0\.s, z0\.s, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_s32, svint32_t,
+               z0 = svqsub_n_s32 (z0, 255),
+               z0 = svqsub (z0, 255))
+
+/*
+** qsub_m1_s32:
+**     sqadd   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_s32, svint32_t,
+               z0 = svqsub_n_s32 (z0, -1),
+               z0 = svqsub (z0, -1))
+
+/*
+** qsub_m127_s32:
+**     sqadd   z0\.s, z0\.s, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_s32, svint32_t,
+               z0 = svqsub_n_s32 (z0, -127),
+               z0 = svqsub (z0, -127))
+
+/*
+** qsub_m128_s32:
+**     sqadd   z0\.s, z0\.s, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_s32, svint32_t,
+               z0 = svqsub_n_s32 (z0, -128),
+               z0 = svqsub (z0, -128))
+
+/*
+** qsub_s32_m_tied1:
+**     sqsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s32_m_tied1, svint32_t,
+               z0 = svqsub_s32_m (p0, z0, z1),
+               z0 = svqsub_m (p0, z0, z1))
+
+/*
+** qsub_s32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqsub   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s32_m_tied2, svint32_t,
+               z0 = svqsub_s32_m (p0, z1, z0),
+               z0 = svqsub_m (p0, z1, z0))
+
+/*
+** qsub_s32_m_untied:
+**     movprfx z0, z1
+**     sqsub   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s32_m_untied, svint32_t,
+               z0 = svqsub_s32_m (p0, z1, z2),
+               z0 = svqsub_m (p0, z1, z2))
+
+/*
+** qsub_w0_s32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s32_m_tied1, svint32_t, int32_t,
+                z0 = svqsub_n_s32_m (p0, z0, x0),
+                z0 = svqsub_m (p0, z0, x0))
+
+/*
+** qsub_w0_s32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     sqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s32_m_untied, svint32_t, int32_t,
+                z0 = svqsub_n_s32_m (p0, z1, x0),
+                z0 = svqsub_m (p0, z1, x0))
+
+/*
+** qsub_1_s32_m_tied1:
+**     mov     (z[0-9]+\.s), #1
+**     sqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s32_m_tied1, svint32_t,
+               z0 = svqsub_n_s32_m (p0, z0, 1),
+               z0 = svqsub_m (p0, z0, 1))
+
+/*
+** qsub_1_s32_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.s), #1
+**     movprfx z0, z1
+**     sqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s32_m_untied, svint32_t,
+               z0 = svqsub_n_s32_m (p0, z1, 1),
+               z0 = svqsub_m (p0, z1, 1))
+
+/*
+** qsub_127_s32_m:
+**     mov     (z[0-9]+\.s), #127
+**     sqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_s32_m, svint32_t,
+               z0 = svqsub_n_s32_m (p0, z0, 127),
+               z0 = svqsub_m (p0, z0, 127))
+
+/*
+** qsub_128_s32_m:
+**     mov     (z[0-9]+\.s), #128
+**     sqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_s32_m, svint32_t,
+               z0 = svqsub_n_s32_m (p0, z0, 128),
+               z0 = svqsub_m (p0, z0, 128))
+
+/*
+** qsub_255_s32_m:
+**     mov     (z[0-9]+\.s), #255
+**     sqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_s32_m, svint32_t,
+               z0 = svqsub_n_s32_m (p0, z0, 255),
+               z0 = svqsub_m (p0, z0, 255))
+
+/*
+** qsub_m1_s32_m:
+**     mov     (z[0-9]+)\.b, #-1
+**     sqsub   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_s32_m, svint32_t,
+               z0 = svqsub_n_s32_m (p0, z0, -1),
+               z0 = svqsub_m (p0, z0, -1))
+
+/*
+** qsub_m127_s32_m:
+**     mov     (z[0-9]+\.s), #-127
+**     sqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_s32_m, svint32_t,
+               z0 = svqsub_n_s32_m (p0, z0, -127),
+               z0 = svqsub_m (p0, z0, -127))
+
+/*
+** qsub_m128_s32_m:
+**     mov     (z[0-9]+\.s), #-128
+**     sqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_s32_m, svint32_t,
+               z0 = svqsub_n_s32_m (p0, z0, -128),
+               z0 = svqsub_m (p0, z0, -128))
+
+/*
+** qsub_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s32_z_tied1, svint32_t,
+               z0 = svqsub_s32_z (p0, z0, z1),
+               z0 = svqsub_z (p0, z0, z1))
+
+/*
+** qsub_s32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s32_z_tied2, svint32_t,
+               z0 = svqsub_s32_z (p0, z1, z0),
+               z0 = svqsub_z (p0, z1, z0))
+
+/*
+** qsub_s32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqsub   z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0\.s, p0/z, z2\.s
+**     sqsubr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s32_z_untied, svint32_t,
+               z0 = svqsub_s32_z (p0, z1, z2),
+               z0 = svqsub_z (p0, z1, z2))
+
+/*
+** qsub_w0_s32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s32_z_tied1, svint32_t, int32_t,
+                z0 = svqsub_n_s32_z (p0, z0, x0),
+                z0 = svqsub_z (p0, z0, x0))
+
+/*
+** qsub_w0_s32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqsub   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     sqsubr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s32_z_untied, svint32_t, int32_t,
+                z0 = svqsub_n_s32_z (p0, z1, x0),
+                z0 = svqsub_z (p0, z1, x0))
+
+/*
+** qsub_1_s32_z_tied1:
+**     mov     (z[0-9]+\.s), #1
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s32_z_tied1, svint32_t,
+               z0 = svqsub_n_s32_z (p0, z0, 1),
+               z0 = svqsub_z (p0, z0, 1))
+
+/*
+** qsub_1_s32_z_untied:
+**     mov     (z[0-9]+\.s), #1
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqsub   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     sqsubr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s32_z_untied, svint32_t,
+               z0 = svqsub_n_s32_z (p0, z1, 1),
+               z0 = svqsub_z (p0, z1, 1))
+
+/*
+** qsub_127_s32_z:
+**     mov     (z[0-9]+\.s), #127
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_s32_z, svint32_t,
+               z0 = svqsub_n_s32_z (p0, z0, 127),
+               z0 = svqsub_z (p0, z0, 127))
+
+/*
+** qsub_128_s32_z:
+**     mov     (z[0-9]+\.s), #128
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_s32_z, svint32_t,
+               z0 = svqsub_n_s32_z (p0, z0, 128),
+               z0 = svqsub_z (p0, z0, 128))
+
+/*
+** qsub_255_s32_z:
+**     mov     (z[0-9]+\.s), #255
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_s32_z, svint32_t,
+               z0 = svqsub_n_s32_z (p0, z0, 255),
+               z0 = svqsub_z (p0, z0, 255))
+
+/*
+** qsub_m1_s32_z:
+**     mov     (z[0-9]+)\.b, #-1
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqsub   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_s32_z, svint32_t,
+               z0 = svqsub_n_s32_z (p0, z0, -1),
+               z0 = svqsub_z (p0, z0, -1))
+
+/*
+** qsub_m127_s32_z:
+**     mov     (z[0-9]+\.s), #-127
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_s32_z, svint32_t,
+               z0 = svqsub_n_s32_z (p0, z0, -127),
+               z0 = svqsub_z (p0, z0, -127))
+
+/*
+** qsub_m128_s32_z:
+**     mov     (z[0-9]+\.s), #-128
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_s32_z, svint32_t,
+               z0 = svqsub_n_s32_z (p0, z0, -128),
+               z0 = svqsub_z (p0, z0, -128))
+
+/*
+** qsub_s32_x_tied1:
+**     sqsub   z0\.s, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s32_x_tied1, svint32_t,
+               z0 = svqsub_s32_x (p0, z0, z1),
+               z0 = svqsub_x (p0, z0, z1))
+
+/*
+** qsub_s32_x_tied2:
+**     sqsub   z0\.s, z1\.s, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s32_x_tied2, svint32_t,
+               z0 = svqsub_s32_x (p0, z1, z0),
+               z0 = svqsub_x (p0, z1, z0))
+
+/*
+** qsub_s32_x_untied:
+**     sqsub   z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s32_x_untied, svint32_t,
+               z0 = svqsub_s32_x (p0, z1, z2),
+               z0 = svqsub_x (p0, z1, z2))
+
+/*
+** qsub_w0_s32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqsub   z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s32_x_tied1, svint32_t, int32_t,
+                z0 = svqsub_n_s32_x (p0, z0, x0),
+                z0 = svqsub_x (p0, z0, x0))
+
+/*
+** qsub_w0_s32_x_untied:
+**     mov     (z[0-9]+\.s), w0
+**     sqsub   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s32_x_untied, svint32_t, int32_t,
+                z0 = svqsub_n_s32_x (p0, z1, x0),
+                z0 = svqsub_x (p0, z1, x0))
+
+/*
+** qsub_1_s32_x_tied1:
+**     sqsub   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s32_x_tied1, svint32_t,
+               z0 = svqsub_n_s32_x (p0, z0, 1),
+               z0 = svqsub_x (p0, z0, 1))
+
+/*
+** qsub_1_s32_x_untied:
+**     movprfx z0, z1
+**     sqsub   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s32_x_untied, svint32_t,
+               z0 = svqsub_n_s32_x (p0, z1, 1),
+               z0 = svqsub_x (p0, z1, 1))
+
+/*
+** qsub_127_s32_x:
+**     sqsub   z0\.s, z0\.s, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_s32_x, svint32_t,
+               z0 = svqsub_n_s32_x (p0, z0, 127),
+               z0 = svqsub_x (p0, z0, 127))
+
+/*
+** qsub_128_s32_x:
+**     sqsub   z0\.s, z0\.s, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_s32_x, svint32_t,
+               z0 = svqsub_n_s32_x (p0, z0, 128),
+               z0 = svqsub_x (p0, z0, 128))
+
+/*
+** qsub_255_s32_x:
+**     sqsub   z0\.s, z0\.s, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_s32_x, svint32_t,
+               z0 = svqsub_n_s32_x (p0, z0, 255),
+               z0 = svqsub_x (p0, z0, 255))
+
+/*
+** qsub_m1_s32_x:
+**     sqadd   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_s32_x, svint32_t,
+               z0 = svqsub_n_s32_x (p0, z0, -1),
+               z0 = svqsub_x (p0, z0, -1))
+
+/*
+** qsub_m127_s32_x:
+**     sqadd   z0\.s, z0\.s, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_s32_x, svint32_t,
+               z0 = svqsub_n_s32_x (p0, z0, -127),
+               z0 = svqsub_x (p0, z0, -127))
+
+/*
+** qsub_m128_s32_x:
+**     sqadd   z0\.s, z0\.s, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_s32_x, svint32_t,
+               z0 = svqsub_n_s32_x (p0, z0, -128),
+               z0 = svqsub_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_s64.c
new file mode 100644 (file)
index 0000000..e901013
--- /dev/null
@@ -0,0 +1,530 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qsub_s64_tied1:
+**     sqsub   z0\.d, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s64_tied1, svint64_t,
+               z0 = svqsub_s64 (z0, z1),
+               z0 = svqsub (z0, z1))
+
+/*
+** qsub_s64_tied2:
+**     sqsub   z0\.d, z1\.d, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s64_tied2, svint64_t,
+               z0 = svqsub_s64 (z1, z0),
+               z0 = svqsub (z1, z0))
+
+/*
+** qsub_s64_untied:
+**     sqsub   z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s64_untied, svint64_t,
+               z0 = svqsub_s64 (z1, z2),
+               z0 = svqsub (z1, z2))
+
+/*
+** qsub_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     sqsub   z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_x0_s64_tied1, svint64_t, int64_t,
+                z0 = svqsub_n_s64 (z0, x0),
+                z0 = svqsub (z0, x0))
+
+/*
+** qsub_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     sqsub   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_x0_s64_untied, svint64_t, int64_t,
+                z0 = svqsub_n_s64 (z1, x0),
+                z0 = svqsub (z1, x0))
+
+/*
+** qsub_1_s64_tied1:
+**     sqsub   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s64_tied1, svint64_t,
+               z0 = svqsub_n_s64 (z0, 1),
+               z0 = svqsub (z0, 1))
+
+/*
+** qsub_1_s64_untied:
+**     movprfx z0, z1
+**     sqsub   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s64_untied, svint64_t,
+               z0 = svqsub_n_s64 (z1, 1),
+               z0 = svqsub (z1, 1))
+
+/*
+** qsub_127_s64:
+**     sqsub   z0\.d, z0\.d, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_s64, svint64_t,
+               z0 = svqsub_n_s64 (z0, 127),
+               z0 = svqsub (z0, 127))
+
+/*
+** qsub_128_s64:
+**     sqsub   z0\.d, z0\.d, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_s64, svint64_t,
+               z0 = svqsub_n_s64 (z0, 128),
+               z0 = svqsub (z0, 128))
+
+/*
+** qsub_255_s64:
+**     sqsub   z0\.d, z0\.d, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_s64, svint64_t,
+               z0 = svqsub_n_s64 (z0, 255),
+               z0 = svqsub (z0, 255))
+
+/*
+** qsub_m1_s64:
+**     sqadd   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_s64, svint64_t,
+               z0 = svqsub_n_s64 (z0, -1),
+               z0 = svqsub (z0, -1))
+
+/*
+** qsub_m127_s64:
+**     sqadd   z0\.d, z0\.d, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_s64, svint64_t,
+               z0 = svqsub_n_s64 (z0, -127),
+               z0 = svqsub (z0, -127))
+
+/*
+** qsub_m128_s64:
+**     sqadd   z0\.d, z0\.d, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_s64, svint64_t,
+               z0 = svqsub_n_s64 (z0, -128),
+               z0 = svqsub (z0, -128))
+
+/*
+** qsub_s64_m_tied1:
+**     sqsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s64_m_tied1, svint64_t,
+               z0 = svqsub_s64_m (p0, z0, z1),
+               z0 = svqsub_m (p0, z0, z1))
+
+/*
+** qsub_s64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s64_m_tied2, svint64_t,
+               z0 = svqsub_s64_m (p0, z1, z0),
+               z0 = svqsub_m (p0, z1, z0))
+
+/*
+** qsub_s64_m_untied:
+**     movprfx z0, z1
+**     sqsub   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s64_m_untied, svint64_t,
+               z0 = svqsub_s64_m (p0, z1, z2),
+               z0 = svqsub_m (p0, z1, z2))
+
+/*
+** qsub_x0_s64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     sqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_x0_s64_m_tied1, svint64_t, int64_t,
+                z0 = svqsub_n_s64_m (p0, z0, x0),
+                z0 = svqsub_m (p0, z0, x0))
+
+/*
+** qsub_x0_s64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     sqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_x0_s64_m_untied, svint64_t, int64_t,
+                z0 = svqsub_n_s64_m (p0, z1, x0),
+                z0 = svqsub_m (p0, z1, x0))
+
+/*
+** qsub_1_s64_m_tied1:
+**     mov     (z[0-9]+\.d), #1
+**     sqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s64_m_tied1, svint64_t,
+               z0 = svqsub_n_s64_m (p0, z0, 1),
+               z0 = svqsub_m (p0, z0, 1))
+
+/*
+** qsub_1_s64_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.d), #1
+**     movprfx z0, z1
+**     sqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s64_m_untied, svint64_t,
+               z0 = svqsub_n_s64_m (p0, z1, 1),
+               z0 = svqsub_m (p0, z1, 1))
+
+/*
+** qsub_127_s64_m:
+**     mov     (z[0-9]+\.d), #127
+**     sqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_s64_m, svint64_t,
+               z0 = svqsub_n_s64_m (p0, z0, 127),
+               z0 = svqsub_m (p0, z0, 127))
+
+/*
+** qsub_128_s64_m:
+**     mov     (z[0-9]+\.d), #128
+**     sqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_s64_m, svint64_t,
+               z0 = svqsub_n_s64_m (p0, z0, 128),
+               z0 = svqsub_m (p0, z0, 128))
+
+/*
+** qsub_255_s64_m:
+**     mov     (z[0-9]+\.d), #255
+**     sqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_s64_m, svint64_t,
+               z0 = svqsub_n_s64_m (p0, z0, 255),
+               z0 = svqsub_m (p0, z0, 255))
+
+/*
+** qsub_m1_s64_m:
+**     mov     (z[0-9]+)\.b, #-1
+**     sqsub   z0\.d, p0/m, z0\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_s64_m, svint64_t,
+               z0 = svqsub_n_s64_m (p0, z0, -1),
+               z0 = svqsub_m (p0, z0, -1))
+
+/*
+** qsub_m127_s64_m:
+**     mov     (z[0-9]+\.d), #-127
+**     sqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_s64_m, svint64_t,
+               z0 = svqsub_n_s64_m (p0, z0, -127),
+               z0 = svqsub_m (p0, z0, -127))
+
+/*
+** qsub_m128_s64_m:
+**     mov     (z[0-9]+\.d), #-128
+**     sqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_s64_m, svint64_t,
+               z0 = svqsub_n_s64_m (p0, z0, -128),
+               z0 = svqsub_m (p0, z0, -128))
+
+/*
+** qsub_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s64_z_tied1, svint64_t,
+               z0 = svqsub_s64_z (p0, z0, z1),
+               z0 = svqsub_z (p0, z0, z1))
+
+/*
+** qsub_s64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s64_z_tied2, svint64_t,
+               z0 = svqsub_s64_z (p0, z1, z0),
+               z0 = svqsub_z (p0, z1, z0))
+
+/*
+** qsub_s64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqsub   z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0\.d, p0/z, z2\.d
+**     sqsubr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s64_z_untied, svint64_t,
+               z0 = svqsub_s64_z (p0, z1, z2),
+               z0 = svqsub_z (p0, z1, z2))
+
+/*
+** qsub_x0_s64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_x0_s64_z_tied1, svint64_t, int64_t,
+                z0 = svqsub_n_s64_z (p0, z0, x0),
+                z0 = svqsub_z (p0, z0, x0))
+
+/*
+** qsub_x0_s64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqsub   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     sqsubr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_x0_s64_z_untied, svint64_t, int64_t,
+                z0 = svqsub_n_s64_z (p0, z1, x0),
+                z0 = svqsub_z (p0, z1, x0))
+
+/*
+** qsub_1_s64_z_tied1:
+**     mov     (z[0-9]+\.d), #1
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s64_z_tied1, svint64_t,
+               z0 = svqsub_n_s64_z (p0, z0, 1),
+               z0 = svqsub_z (p0, z0, 1))
+
+/*
+** qsub_1_s64_z_untied:
+**     mov     (z[0-9]+\.d), #1
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqsub   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     sqsubr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s64_z_untied, svint64_t,
+               z0 = svqsub_n_s64_z (p0, z1, 1),
+               z0 = svqsub_z (p0, z1, 1))
+
+/*
+** qsub_127_s64_z:
+**     mov     (z[0-9]+\.d), #127
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_s64_z, svint64_t,
+               z0 = svqsub_n_s64_z (p0, z0, 127),
+               z0 = svqsub_z (p0, z0, 127))
+
+/*
+** qsub_128_s64_z:
+**     mov     (z[0-9]+\.d), #128
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_s64_z, svint64_t,
+               z0 = svqsub_n_s64_z (p0, z0, 128),
+               z0 = svqsub_z (p0, z0, 128))
+
+/*
+** qsub_255_s64_z:
+**     mov     (z[0-9]+\.d), #255
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_s64_z, svint64_t,
+               z0 = svqsub_n_s64_z (p0, z0, 255),
+               z0 = svqsub_z (p0, z0, 255))
+
+/*
+** qsub_m1_s64_z:
+**     mov     (z[0-9]+)\.b, #-1
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqsub   z0\.d, p0/m, z0\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_s64_z, svint64_t,
+               z0 = svqsub_n_s64_z (p0, z0, -1),
+               z0 = svqsub_z (p0, z0, -1))
+
+/*
+** qsub_m127_s64_z:
+**     mov     (z[0-9]+\.d), #-127
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_s64_z, svint64_t,
+               z0 = svqsub_n_s64_z (p0, z0, -127),
+               z0 = svqsub_z (p0, z0, -127))
+
+/*
+** qsub_m128_s64_z:
+**     mov     (z[0-9]+\.d), #-128
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_s64_z, svint64_t,
+               z0 = svqsub_n_s64_z (p0, z0, -128),
+               z0 = svqsub_z (p0, z0, -128))
+
+/*
+** qsub_s64_x_tied1:
+**     sqsub   z0\.d, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s64_x_tied1, svint64_t,
+               z0 = svqsub_s64_x (p0, z0, z1),
+               z0 = svqsub_x (p0, z0, z1))
+
+/*
+** qsub_s64_x_tied2:
+**     sqsub   z0\.d, z1\.d, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s64_x_tied2, svint64_t,
+               z0 = svqsub_s64_x (p0, z1, z0),
+               z0 = svqsub_x (p0, z1, z0))
+
+/*
+** qsub_s64_x_untied:
+**     sqsub   z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s64_x_untied, svint64_t,
+               z0 = svqsub_s64_x (p0, z1, z2),
+               z0 = svqsub_x (p0, z1, z2))
+
+/*
+** qsub_x0_s64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     sqsub   z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_x0_s64_x_tied1, svint64_t, int64_t,
+                z0 = svqsub_n_s64_x (p0, z0, x0),
+                z0 = svqsub_x (p0, z0, x0))
+
+/*
+** qsub_x0_s64_x_untied:
+**     mov     (z[0-9]+\.d), x0
+**     sqsub   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_x0_s64_x_untied, svint64_t, int64_t,
+                z0 = svqsub_n_s64_x (p0, z1, x0),
+                z0 = svqsub_x (p0, z1, x0))
+
+/*
+** qsub_1_s64_x_tied1:
+**     sqsub   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s64_x_tied1, svint64_t,
+               z0 = svqsub_n_s64_x (p0, z0, 1),
+               z0 = svqsub_x (p0, z0, 1))
+
+/*
+** qsub_1_s64_x_untied:
+**     movprfx z0, z1
+**     sqsub   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s64_x_untied, svint64_t,
+               z0 = svqsub_n_s64_x (p0, z1, 1),
+               z0 = svqsub_x (p0, z1, 1))
+
+/*
+** qsub_127_s64_x:
+**     sqsub   z0\.d, z0\.d, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_s64_x, svint64_t,
+               z0 = svqsub_n_s64_x (p0, z0, 127),
+               z0 = svqsub_x (p0, z0, 127))
+
+/*
+** qsub_128_s64_x:
+**     sqsub   z0\.d, z0\.d, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_s64_x, svint64_t,
+               z0 = svqsub_n_s64_x (p0, z0, 128),
+               z0 = svqsub_x (p0, z0, 128))
+
+/*
+** qsub_255_s64_x:
+**     sqsub   z0\.d, z0\.d, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_s64_x, svint64_t,
+               z0 = svqsub_n_s64_x (p0, z0, 255),
+               z0 = svqsub_x (p0, z0, 255))
+
+/*
+** qsub_m1_s64_x:
+**     sqadd   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_s64_x, svint64_t,
+               z0 = svqsub_n_s64_x (p0, z0, -1),
+               z0 = svqsub_x (p0, z0, -1))
+
+/*
+** qsub_m127_s64_x:
+**     sqadd   z0\.d, z0\.d, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_s64_x, svint64_t,
+               z0 = svqsub_n_s64_x (p0, z0, -127),
+               z0 = svqsub_x (p0, z0, -127))
+
+/*
+** qsub_m128_s64_x:
+**     sqadd   z0\.d, z0\.d, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_s64_x, svint64_t,
+               z0 = svqsub_n_s64_x (p0, z0, -128),
+               z0 = svqsub_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_s8.c
new file mode 100644 (file)
index 0000000..067ee6e
--- /dev/null
@@ -0,0 +1,530 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qsub_s8_tied1:
+**     sqsub   z0\.b, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s8_tied1, svint8_t,
+               z0 = svqsub_s8 (z0, z1),
+               z0 = svqsub (z0, z1))
+
+/*
+** qsub_s8_tied2:
+**     sqsub   z0\.b, z1\.b, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s8_tied2, svint8_t,
+               z0 = svqsub_s8 (z1, z0),
+               z0 = svqsub (z1, z0))
+
+/*
+** qsub_s8_untied:
+**     sqsub   z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s8_untied, svint8_t,
+               z0 = svqsub_s8 (z1, z2),
+               z0 = svqsub (z1, z2))
+
+/*
+** qsub_w0_s8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqsub   z0\.b, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s8_tied1, svint8_t, int8_t,
+                z0 = svqsub_n_s8 (z0, x0),
+                z0 = svqsub (z0, x0))
+
+/*
+** qsub_w0_s8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     sqsub   z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s8_untied, svint8_t, int8_t,
+                z0 = svqsub_n_s8 (z1, x0),
+                z0 = svqsub (z1, x0))
+
+/*
+** qsub_1_s8_tied1:
+**     sqsub   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s8_tied1, svint8_t,
+               z0 = svqsub_n_s8 (z0, 1),
+               z0 = svqsub (z0, 1))
+
+/*
+** qsub_1_s8_untied:
+**     movprfx z0, z1
+**     sqsub   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s8_untied, svint8_t,
+               z0 = svqsub_n_s8 (z1, 1),
+               z0 = svqsub (z1, 1))
+
+/*
+** qsub_127_s8:
+**     sqsub   z0\.b, z0\.b, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_s8, svint8_t,
+               z0 = svqsub_n_s8 (z0, 127),
+               z0 = svqsub (z0, 127))
+
+/*
+** qsub_128_s8:
+**     sqadd   z0\.b, z0\.b, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_s8, svint8_t,
+               z0 = svqsub_n_s8 (z0, 128),
+               z0 = svqsub (z0, 128))
+
+/*
+** qsub_255_s8:
+**     sqadd   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_s8, svint8_t,
+               z0 = svqsub_n_s8 (z0, 255),
+               z0 = svqsub (z0, 255))
+
+/*
+** qsub_m1_s8:
+**     sqadd   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_s8, svint8_t,
+               z0 = svqsub_n_s8 (z0, -1),
+               z0 = svqsub (z0, -1))
+
+/*
+** qsub_m127_s8:
+**     sqadd   z0\.b, z0\.b, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_s8, svint8_t,
+               z0 = svqsub_n_s8 (z0, -127),
+               z0 = svqsub (z0, -127))
+
+/*
+** qsub_m128_s8:
+**     sqadd   z0\.b, z0\.b, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_s8, svint8_t,
+               z0 = svqsub_n_s8 (z0, -128),
+               z0 = svqsub (z0, -128))
+
+/*
+** qsub_s8_m_tied1:
+**     sqsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s8_m_tied1, svint8_t,
+               z0 = svqsub_s8_m (p0, z0, z1),
+               z0 = svqsub_m (p0, z0, z1))
+
+/*
+** qsub_s8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqsub   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s8_m_tied2, svint8_t,
+               z0 = svqsub_s8_m (p0, z1, z0),
+               z0 = svqsub_m (p0, z1, z0))
+
+/*
+** qsub_s8_m_untied:
+**     movprfx z0, z1
+**     sqsub   z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s8_m_untied, svint8_t,
+               z0 = svqsub_s8_m (p0, z1, z2),
+               z0 = svqsub_m (p0, z1, z2))
+
+/*
+** qsub_w0_s8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s8_m_tied1, svint8_t, int8_t,
+                z0 = svqsub_n_s8_m (p0, z0, x0),
+                z0 = svqsub_m (p0, z0, x0))
+
+/*
+** qsub_w0_s8_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s8_m_untied, svint8_t, int8_t,
+                z0 = svqsub_n_s8_m (p0, z1, x0),
+                z0 = svqsub_m (p0, z1, x0))
+
+/*
+** qsub_1_s8_m_tied1:
+**     mov     (z[0-9]+\.b), #1
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s8_m_tied1, svint8_t,
+               z0 = svqsub_n_s8_m (p0, z0, 1),
+               z0 = svqsub_m (p0, z0, 1))
+
+/*
+** qsub_1_s8_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.b), #1
+**     movprfx z0, z1
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s8_m_untied, svint8_t,
+               z0 = svqsub_n_s8_m (p0, z1, 1),
+               z0 = svqsub_m (p0, z1, 1))
+
+/*
+** qsub_127_s8_m:
+**     mov     (z[0-9]+\.b), #127
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_s8_m, svint8_t,
+               z0 = svqsub_n_s8_m (p0, z0, 127),
+               z0 = svqsub_m (p0, z0, 127))
+
+/*
+** qsub_128_s8_m:
+**     mov     (z[0-9]+\.b), #-128
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_s8_m, svint8_t,
+               z0 = svqsub_n_s8_m (p0, z0, 128),
+               z0 = svqsub_m (p0, z0, 128))
+
+/*
+** qsub_255_s8_m:
+**     mov     (z[0-9]+\.b), #-1
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_s8_m, svint8_t,
+               z0 = svqsub_n_s8_m (p0, z0, 255),
+               z0 = svqsub_m (p0, z0, 255))
+
+/*
+** qsub_m1_s8_m:
+**     mov     (z[0-9]+\.b), #-1
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_s8_m, svint8_t,
+               z0 = svqsub_n_s8_m (p0, z0, -1),
+               z0 = svqsub_m (p0, z0, -1))
+
+/*
+** qsub_m127_s8_m:
+**     mov     (z[0-9]+\.b), #-127
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_s8_m, svint8_t,
+               z0 = svqsub_n_s8_m (p0, z0, -127),
+               z0 = svqsub_m (p0, z0, -127))
+
+/*
+** qsub_m128_s8_m:
+**     mov     (z[0-9]+\.b), #-128
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_s8_m, svint8_t,
+               z0 = svqsub_n_s8_m (p0, z0, -128),
+               z0 = svqsub_m (p0, z0, -128))
+
+/*
+** qsub_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s8_z_tied1, svint8_t,
+               z0 = svqsub_s8_z (p0, z0, z1),
+               z0 = svqsub_z (p0, z0, z1))
+
+/*
+** qsub_s8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s8_z_tied2, svint8_t,
+               z0 = svqsub_s8_z (p0, z1, z0),
+               z0 = svqsub_z (p0, z1, z0))
+
+/*
+** qsub_s8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqsub   z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0\.b, p0/z, z2\.b
+**     sqsubr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s8_z_untied, svint8_t,
+               z0 = svqsub_s8_z (p0, z1, z2),
+               z0 = svqsub_z (p0, z1, z2))
+
+/*
+** qsub_w0_s8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s8_z_tied1, svint8_t, int8_t,
+                z0 = svqsub_n_s8_z (p0, z0, x0),
+                z0 = svqsub_z (p0, z0, x0))
+
+/*
+** qsub_w0_s8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     sqsubr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s8_z_untied, svint8_t, int8_t,
+                z0 = svqsub_n_s8_z (p0, z1, x0),
+                z0 = svqsub_z (p0, z1, x0))
+
+/*
+** qsub_1_s8_z_tied1:
+**     mov     (z[0-9]+\.b), #1
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s8_z_tied1, svint8_t,
+               z0 = svqsub_n_s8_z (p0, z0, 1),
+               z0 = svqsub_z (p0, z0, 1))
+
+/*
+** qsub_1_s8_z_untied:
+**     mov     (z[0-9]+\.b), #1
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     sqsubr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s8_z_untied, svint8_t,
+               z0 = svqsub_n_s8_z (p0, z1, 1),
+               z0 = svqsub_z (p0, z1, 1))
+
+/*
+** qsub_127_s8_z:
+**     mov     (z[0-9]+\.b), #127
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_s8_z, svint8_t,
+               z0 = svqsub_n_s8_z (p0, z0, 127),
+               z0 = svqsub_z (p0, z0, 127))
+
+/*
+** qsub_128_s8_z:
+**     mov     (z[0-9]+\.b), #-128
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_s8_z, svint8_t,
+               z0 = svqsub_n_s8_z (p0, z0, 128),
+               z0 = svqsub_z (p0, z0, 128))
+
+/*
+** qsub_255_s8_z:
+**     mov     (z[0-9]+\.b), #-1
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_s8_z, svint8_t,
+               z0 = svqsub_n_s8_z (p0, z0, 255),
+               z0 = svqsub_z (p0, z0, 255))
+
+/*
+** qsub_m1_s8_z:
+**     mov     (z[0-9]+\.b), #-1
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_s8_z, svint8_t,
+               z0 = svqsub_n_s8_z (p0, z0, -1),
+               z0 = svqsub_z (p0, z0, -1))
+
+/*
+** qsub_m127_s8_z:
+**     mov     (z[0-9]+\.b), #-127
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_s8_z, svint8_t,
+               z0 = svqsub_n_s8_z (p0, z0, -127),
+               z0 = svqsub_z (p0, z0, -127))
+
+/*
+** qsub_m128_s8_z:
+**     mov     (z[0-9]+\.b), #-128
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_s8_z, svint8_t,
+               z0 = svqsub_n_s8_z (p0, z0, -128),
+               z0 = svqsub_z (p0, z0, -128))
+
+/*
+** qsub_s8_x_tied1:
+**     sqsub   z0\.b, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s8_x_tied1, svint8_t,
+               z0 = svqsub_s8_x (p0, z0, z1),
+               z0 = svqsub_x (p0, z0, z1))
+
+/*
+** qsub_s8_x_tied2:
+**     sqsub   z0\.b, z1\.b, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s8_x_tied2, svint8_t,
+               z0 = svqsub_s8_x (p0, z1, z0),
+               z0 = svqsub_x (p0, z1, z0))
+
+/*
+** qsub_s8_x_untied:
+**     sqsub   z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_s8_x_untied, svint8_t,
+               z0 = svqsub_s8_x (p0, z1, z2),
+               z0 = svqsub_x (p0, z1, z2))
+
+/*
+** qsub_w0_s8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqsub   z0\.b, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s8_x_tied1, svint8_t, int8_t,
+                z0 = svqsub_n_s8_x (p0, z0, x0),
+                z0 = svqsub_x (p0, z0, x0))
+
+/*
+** qsub_w0_s8_x_untied:
+**     mov     (z[0-9]+\.b), w0
+**     sqsub   z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_s8_x_untied, svint8_t, int8_t,
+                z0 = svqsub_n_s8_x (p0, z1, x0),
+                z0 = svqsub_x (p0, z1, x0))
+
+/*
+** qsub_1_s8_x_tied1:
+**     sqsub   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s8_x_tied1, svint8_t,
+               z0 = svqsub_n_s8_x (p0, z0, 1),
+               z0 = svqsub_x (p0, z0, 1))
+
+/*
+** qsub_1_s8_x_untied:
+**     movprfx z0, z1
+**     sqsub   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_s8_x_untied, svint8_t,
+               z0 = svqsub_n_s8_x (p0, z1, 1),
+               z0 = svqsub_x (p0, z1, 1))
+
+/*
+** qsub_127_s8_x:
+**     sqsub   z0\.b, z0\.b, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_s8_x, svint8_t,
+               z0 = svqsub_n_s8_x (p0, z0, 127),
+               z0 = svqsub_x (p0, z0, 127))
+
+/*
+** qsub_128_s8_x:
+**     sqadd   z0\.b, z0\.b, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_s8_x, svint8_t,
+               z0 = svqsub_n_s8_x (p0, z0, 128),
+               z0 = svqsub_x (p0, z0, 128))
+
+/*
+** qsub_255_s8_x:
+**     sqadd   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_s8_x, svint8_t,
+               z0 = svqsub_n_s8_x (p0, z0, 255),
+               z0 = svqsub_x (p0, z0, 255))
+
+/*
+** qsub_m1_s8_x:
+**     sqadd   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_s8_x, svint8_t,
+               z0 = svqsub_n_s8_x (p0, z0, -1),
+               z0 = svqsub_x (p0, z0, -1))
+
+/*
+** qsub_m127_s8_x:
+**     sqadd   z0\.b, z0\.b, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_s8_x, svint8_t,
+               z0 = svqsub_n_s8_x (p0, z0, -127),
+               z0 = svqsub_x (p0, z0, -127))
+
+/*
+** qsub_m128_s8_x:
+**     sqadd   z0\.b, z0\.b, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_s8_x, svint8_t,
+               z0 = svqsub_n_s8_x (p0, z0, -128),
+               z0 = svqsub_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_u16.c
new file mode 100644 (file)
index 0000000..61be746
--- /dev/null
@@ -0,0 +1,536 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qsub_u16_tied1:
+**     uqsub   z0\.h, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u16_tied1, svuint16_t,
+               z0 = svqsub_u16 (z0, z1),
+               z0 = svqsub (z0, z1))
+
+/*
+** qsub_u16_tied2:
+**     uqsub   z0\.h, z1\.h, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u16_tied2, svuint16_t,
+               z0 = svqsub_u16 (z1, z0),
+               z0 = svqsub (z1, z0))
+
+/*
+** qsub_u16_untied:
+**     uqsub   z0\.h, z1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u16_untied, svuint16_t,
+               z0 = svqsub_u16 (z1, z2),
+               z0 = svqsub (z1, z2))
+
+/*
+** qsub_w0_u16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uqsub   z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u16_tied1, svuint16_t, uint16_t,
+                z0 = svqsub_n_u16 (z0, x0),
+                z0 = svqsub (z0, x0))
+
+/*
+** qsub_w0_u16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     uqsub   z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u16_untied, svuint16_t, uint16_t,
+                z0 = svqsub_n_u16 (z1, x0),
+                z0 = svqsub (z1, x0))
+
+/*
+** qsub_1_u16_tied1:
+**     uqsub   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u16_tied1, svuint16_t,
+               z0 = svqsub_n_u16 (z0, 1),
+               z0 = svqsub (z0, 1))
+
+/*
+** qsub_1_u16_untied:
+**     movprfx z0, z1
+**     uqsub   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u16_untied, svuint16_t,
+               z0 = svqsub_n_u16 (z1, 1),
+               z0 = svqsub (z1, 1))
+
+/*
+** qsub_127_u16:
+**     uqsub   z0\.h, z0\.h, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_u16, svuint16_t,
+               z0 = svqsub_n_u16 (z0, 127),
+               z0 = svqsub (z0, 127))
+
+/*
+** qsub_128_u16:
+**     uqsub   z0\.h, z0\.h, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_u16, svuint16_t,
+               z0 = svqsub_n_u16 (z0, 128),
+               z0 = svqsub (z0, 128))
+
+/*
+** qsub_255_u16:
+**     uqsub   z0\.h, z0\.h, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_u16, svuint16_t,
+               z0 = svqsub_n_u16 (z0, 255),
+               z0 = svqsub (z0, 255))
+
+/*
+** qsub_m1_u16:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqsub   z0\.h, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_u16, svuint16_t,
+               z0 = svqsub_n_u16 (z0, -1),
+               z0 = svqsub (z0, -1))
+
+/*
+** qsub_m127_u16:
+**     mov     (z[0-9]+\.h), #-127
+**     uqsub   z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_u16, svuint16_t,
+               z0 = svqsub_n_u16 (z0, -127),
+               z0 = svqsub (z0, -127))
+
+/*
+** qsub_m128_u16:
+**     mov     (z[0-9]+\.h), #-128
+**     uqsub   z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_u16, svuint16_t,
+               z0 = svqsub_n_u16 (z0, -128),
+               z0 = svqsub (z0, -128))
+
+/*
+** qsub_u16_m_tied1:
+**     uqsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u16_m_tied1, svuint16_t,
+               z0 = svqsub_u16_m (p0, z0, z1),
+               z0 = svqsub_m (p0, z0, z1))
+
+/*
+** qsub_u16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uqsub   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u16_m_tied2, svuint16_t,
+               z0 = svqsub_u16_m (p0, z1, z0),
+               z0 = svqsub_m (p0, z1, z0))
+
+/*
+** qsub_u16_m_untied:
+**     movprfx z0, z1
+**     uqsub   z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u16_m_untied, svuint16_t,
+               z0 = svqsub_u16_m (p0, z1, z2),
+               z0 = svqsub_m (p0, z1, z2))
+
+/*
+** qsub_w0_u16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u16_m_tied1, svuint16_t, uint16_t,
+                z0 = svqsub_n_u16_m (p0, z0, x0),
+                z0 = svqsub_m (p0, z0, x0))
+
+/*
+** qsub_w0_u16_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     uqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u16_m_untied, svuint16_t, uint16_t,
+                z0 = svqsub_n_u16_m (p0, z1, x0),
+                z0 = svqsub_m (p0, z1, x0))
+
+/*
+** qsub_1_u16_m_tied1:
+**     mov     (z[0-9]+\.h), #1
+**     uqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u16_m_tied1, svuint16_t,
+               z0 = svqsub_n_u16_m (p0, z0, 1),
+               z0 = svqsub_m (p0, z0, 1))
+
+/*
+** qsub_1_u16_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.h), #1
+**     movprfx z0, z1
+**     uqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u16_m_untied, svuint16_t,
+               z0 = svqsub_n_u16_m (p0, z1, 1),
+               z0 = svqsub_m (p0, z1, 1))
+
+/*
+** qsub_127_u16_m:
+**     mov     (z[0-9]+\.h), #127
+**     uqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_u16_m, svuint16_t,
+               z0 = svqsub_n_u16_m (p0, z0, 127),
+               z0 = svqsub_m (p0, z0, 127))
+
+/*
+** qsub_128_u16_m:
+**     mov     (z[0-9]+\.h), #128
+**     uqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_u16_m, svuint16_t,
+               z0 = svqsub_n_u16_m (p0, z0, 128),
+               z0 = svqsub_m (p0, z0, 128))
+
+/*
+** qsub_255_u16_m:
+**     mov     (z[0-9]+\.h), #255
+**     uqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_u16_m, svuint16_t,
+               z0 = svqsub_n_u16_m (p0, z0, 255),
+               z0 = svqsub_m (p0, z0, 255))
+
+/*
+** qsub_m1_u16_m:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqsub   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_u16_m, svuint16_t,
+               z0 = svqsub_n_u16_m (p0, z0, -1),
+               z0 = svqsub_m (p0, z0, -1))
+
+/*
+** qsub_m127_u16_m:
+**     mov     (z[0-9]+\.h), #-127
+**     uqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_u16_m, svuint16_t,
+               z0 = svqsub_n_u16_m (p0, z0, -127),
+               z0 = svqsub_m (p0, z0, -127))
+
+/*
+** qsub_m128_u16_m:
+**     mov     (z[0-9]+\.h), #-128
+**     uqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_u16_m, svuint16_t,
+               z0 = svqsub_n_u16_m (p0, z0, -128),
+               z0 = svqsub_m (p0, z0, -128))
+
+/*
+** qsub_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u16_z_tied1, svuint16_t,
+               z0 = svqsub_u16_z (p0, z0, z1),
+               z0 = svqsub_z (p0, z0, z1))
+
+/*
+** qsub_u16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u16_z_tied2, svuint16_t,
+               z0 = svqsub_u16_z (p0, z1, z0),
+               z0 = svqsub_z (p0, z1, z0))
+
+/*
+** qsub_u16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uqsub   z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0\.h, p0/z, z2\.h
+**     uqsubr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u16_z_untied, svuint16_t,
+               z0 = svqsub_u16_z (p0, z1, z2),
+               z0 = svqsub_z (p0, z1, z2))
+
+/*
+** qsub_w0_u16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u16_z_tied1, svuint16_t, uint16_t,
+                z0 = svqsub_n_u16_z (p0, z0, x0),
+                z0 = svqsub_z (p0, z0, x0))
+
+/*
+** qsub_w0_u16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uqsub   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     uqsubr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u16_z_untied, svuint16_t, uint16_t,
+                z0 = svqsub_n_u16_z (p0, z1, x0),
+                z0 = svqsub_z (p0, z1, x0))
+
+/*
+** qsub_1_u16_z_tied1:
+**     mov     (z[0-9]+\.h), #1
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u16_z_tied1, svuint16_t,
+               z0 = svqsub_n_u16_z (p0, z0, 1),
+               z0 = svqsub_z (p0, z0, 1))
+
+/*
+** qsub_1_u16_z_untied:
+**     mov     (z[0-9]+\.h), #1
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uqsub   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     uqsubr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u16_z_untied, svuint16_t,
+               z0 = svqsub_n_u16_z (p0, z1, 1),
+               z0 = svqsub_z (p0, z1, 1))
+
+/*
+** qsub_127_u16_z:
+**     mov     (z[0-9]+\.h), #127
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_u16_z, svuint16_t,
+               z0 = svqsub_n_u16_z (p0, z0, 127),
+               z0 = svqsub_z (p0, z0, 127))
+
+/*
+** qsub_128_u16_z:
+**     mov     (z[0-9]+\.h), #128
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_u16_z, svuint16_t,
+               z0 = svqsub_n_u16_z (p0, z0, 128),
+               z0 = svqsub_z (p0, z0, 128))
+
+/*
+** qsub_255_u16_z:
+**     mov     (z[0-9]+\.h), #255
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_u16_z, svuint16_t,
+               z0 = svqsub_n_u16_z (p0, z0, 255),
+               z0 = svqsub_z (p0, z0, 255))
+
+/*
+** qsub_m1_u16_z:
+**     mov     (z[0-9]+)\.b, #-1
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqsub   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_u16_z, svuint16_t,
+               z0 = svqsub_n_u16_z (p0, z0, -1),
+               z0 = svqsub_z (p0, z0, -1))
+
+/*
+** qsub_m127_u16_z:
+**     mov     (z[0-9]+\.h), #-127
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_u16_z, svuint16_t,
+               z0 = svqsub_n_u16_z (p0, z0, -127),
+               z0 = svqsub_z (p0, z0, -127))
+
+/*
+** qsub_m128_u16_z:
+**     mov     (z[0-9]+\.h), #-128
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqsub   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_u16_z, svuint16_t,
+               z0 = svqsub_n_u16_z (p0, z0, -128),
+               z0 = svqsub_z (p0, z0, -128))
+
+/*
+** qsub_u16_x_tied1:
+**     uqsub   z0\.h, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u16_x_tied1, svuint16_t,
+               z0 = svqsub_u16_x (p0, z0, z1),
+               z0 = svqsub_x (p0, z0, z1))
+
+/*
+** qsub_u16_x_tied2:
+**     uqsub   z0\.h, z1\.h, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u16_x_tied2, svuint16_t,
+               z0 = svqsub_u16_x (p0, z1, z0),
+               z0 = svqsub_x (p0, z1, z0))
+
+/*
+** qsub_u16_x_untied:
+**     uqsub   z0\.h, z1\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u16_x_untied, svuint16_t,
+               z0 = svqsub_u16_x (p0, z1, z2),
+               z0 = svqsub_x (p0, z1, z2))
+
+/*
+** qsub_w0_u16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uqsub   z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u16_x_tied1, svuint16_t, uint16_t,
+                z0 = svqsub_n_u16_x (p0, z0, x0),
+                z0 = svqsub_x (p0, z0, x0))
+
+/*
+** qsub_w0_u16_x_untied:
+**     mov     (z[0-9]+\.h), w0
+**     uqsub   z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u16_x_untied, svuint16_t, uint16_t,
+                z0 = svqsub_n_u16_x (p0, z1, x0),
+                z0 = svqsub_x (p0, z1, x0))
+
+/*
+** qsub_1_u16_x_tied1:
+**     uqsub   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u16_x_tied1, svuint16_t,
+               z0 = svqsub_n_u16_x (p0, z0, 1),
+               z0 = svqsub_x (p0, z0, 1))
+
+/*
+** qsub_1_u16_x_untied:
+**     movprfx z0, z1
+**     uqsub   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u16_x_untied, svuint16_t,
+               z0 = svqsub_n_u16_x (p0, z1, 1),
+               z0 = svqsub_x (p0, z1, 1))
+
+/*
+** qsub_127_u16_x:
+**     uqsub   z0\.h, z0\.h, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_u16_x, svuint16_t,
+               z0 = svqsub_n_u16_x (p0, z0, 127),
+               z0 = svqsub_x (p0, z0, 127))
+
+/*
+** qsub_128_u16_x:
+**     uqsub   z0\.h, z0\.h, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_u16_x, svuint16_t,
+               z0 = svqsub_n_u16_x (p0, z0, 128),
+               z0 = svqsub_x (p0, z0, 128))
+
+/*
+** qsub_255_u16_x:
+**     uqsub   z0\.h, z0\.h, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_u16_x, svuint16_t,
+               z0 = svqsub_n_u16_x (p0, z0, 255),
+               z0 = svqsub_x (p0, z0, 255))
+
+/*
+** qsub_m1_u16_x:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqsub   z0\.h, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_u16_x, svuint16_t,
+               z0 = svqsub_n_u16_x (p0, z0, -1),
+               z0 = svqsub_x (p0, z0, -1))
+
+/*
+** qsub_m127_u16_x:
+**     mov     (z[0-9]+\.h), #-127
+**     uqsub   z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_u16_x, svuint16_t,
+               z0 = svqsub_n_u16_x (p0, z0, -127),
+               z0 = svqsub_x (p0, z0, -127))
+
+/*
+** qsub_m128_u16_x:
+**     mov     (z[0-9]+\.h), #-128
+**     uqsub   z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_u16_x, svuint16_t,
+               z0 = svqsub_n_u16_x (p0, z0, -128),
+               z0 = svqsub_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_u32.c
new file mode 100644 (file)
index 0000000..d90dcad
--- /dev/null
@@ -0,0 +1,536 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qsub_u32_tied1:
+**     uqsub   z0\.s, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u32_tied1, svuint32_t,
+               z0 = svqsub_u32 (z0, z1),
+               z0 = svqsub (z0, z1))
+
+/*
+** qsub_u32_tied2:
+**     uqsub   z0\.s, z1\.s, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u32_tied2, svuint32_t,
+               z0 = svqsub_u32 (z1, z0),
+               z0 = svqsub (z1, z0))
+
+/*
+** qsub_u32_untied:
+**     uqsub   z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u32_untied, svuint32_t,
+               z0 = svqsub_u32 (z1, z2),
+               z0 = svqsub (z1, z2))
+
+/*
+** qsub_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uqsub   z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = svqsub_n_u32 (z0, x0),
+                z0 = svqsub (z0, x0))
+
+/*
+** qsub_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     uqsub   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = svqsub_n_u32 (z1, x0),
+                z0 = svqsub (z1, x0))
+
+/*
+** qsub_1_u32_tied1:
+**     uqsub   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u32_tied1, svuint32_t,
+               z0 = svqsub_n_u32 (z0, 1),
+               z0 = svqsub (z0, 1))
+
+/*
+** qsub_1_u32_untied:
+**     movprfx z0, z1
+**     uqsub   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u32_untied, svuint32_t,
+               z0 = svqsub_n_u32 (z1, 1),
+               z0 = svqsub (z1, 1))
+
+/*
+** qsub_127_u32:
+**     uqsub   z0\.s, z0\.s, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_u32, svuint32_t,
+               z0 = svqsub_n_u32 (z0, 127),
+               z0 = svqsub (z0, 127))
+
+/*
+** qsub_128_u32:
+**     uqsub   z0\.s, z0\.s, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_u32, svuint32_t,
+               z0 = svqsub_n_u32 (z0, 128),
+               z0 = svqsub (z0, 128))
+
+/*
+** qsub_255_u32:
+**     uqsub   z0\.s, z0\.s, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_u32, svuint32_t,
+               z0 = svqsub_n_u32 (z0, 255),
+               z0 = svqsub (z0, 255))
+
+/*
+** qsub_m1_u32:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqsub   z0\.s, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_u32, svuint32_t,
+               z0 = svqsub_n_u32 (z0, -1),
+               z0 = svqsub (z0, -1))
+
+/*
+** qsub_m127_u32:
+**     mov     (z[0-9]+\.s), #-127
+**     uqsub   z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_u32, svuint32_t,
+               z0 = svqsub_n_u32 (z0, -127),
+               z0 = svqsub (z0, -127))
+
+/*
+** qsub_m128_u32:
+**     mov     (z[0-9]+\.s), #-128
+**     uqsub   z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_u32, svuint32_t,
+               z0 = svqsub_n_u32 (z0, -128),
+               z0 = svqsub (z0, -128))
+
+/*
+** qsub_u32_m_tied1:
+**     uqsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u32_m_tied1, svuint32_t,
+               z0 = svqsub_u32_m (p0, z0, z1),
+               z0 = svqsub_m (p0, z0, z1))
+
+/*
+** qsub_u32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uqsub   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u32_m_tied2, svuint32_t,
+               z0 = svqsub_u32_m (p0, z1, z0),
+               z0 = svqsub_m (p0, z1, z0))
+
+/*
+** qsub_u32_m_untied:
+**     movprfx z0, z1
+**     uqsub   z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u32_m_untied, svuint32_t,
+               z0 = svqsub_u32_m (p0, z1, z2),
+               z0 = svqsub_m (p0, z1, z2))
+
+/*
+** qsub_w0_u32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u32_m_tied1, svuint32_t, uint32_t,
+                z0 = svqsub_n_u32_m (p0, z0, x0),
+                z0 = svqsub_m (p0, z0, x0))
+
+/*
+** qsub_w0_u32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     uqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u32_m_untied, svuint32_t, uint32_t,
+                z0 = svqsub_n_u32_m (p0, z1, x0),
+                z0 = svqsub_m (p0, z1, x0))
+
+/*
+** qsub_1_u32_m_tied1:
+**     mov     (z[0-9]+\.s), #1
+**     uqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u32_m_tied1, svuint32_t,
+               z0 = svqsub_n_u32_m (p0, z0, 1),
+               z0 = svqsub_m (p0, z0, 1))
+
+/*
+** qsub_1_u32_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.s), #1
+**     movprfx z0, z1
+**     uqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u32_m_untied, svuint32_t,
+               z0 = svqsub_n_u32_m (p0, z1, 1),
+               z0 = svqsub_m (p0, z1, 1))
+
+/*
+** qsub_127_u32_m:
+**     mov     (z[0-9]+\.s), #127
+**     uqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_u32_m, svuint32_t,
+               z0 = svqsub_n_u32_m (p0, z0, 127),
+               z0 = svqsub_m (p0, z0, 127))
+
+/*
+** qsub_128_u32_m:
+**     mov     (z[0-9]+\.s), #128
+**     uqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_u32_m, svuint32_t,
+               z0 = svqsub_n_u32_m (p0, z0, 128),
+               z0 = svqsub_m (p0, z0, 128))
+
+/*
+** qsub_255_u32_m:
+**     mov     (z[0-9]+\.s), #255
+**     uqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_u32_m, svuint32_t,
+               z0 = svqsub_n_u32_m (p0, z0, 255),
+               z0 = svqsub_m (p0, z0, 255))
+
+/*
+** qsub_m1_u32_m:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqsub   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_u32_m, svuint32_t,
+               z0 = svqsub_n_u32_m (p0, z0, -1),
+               z0 = svqsub_m (p0, z0, -1))
+
+/*
+** qsub_m127_u32_m:
+**     mov     (z[0-9]+\.s), #-127
+**     uqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_u32_m, svuint32_t,
+               z0 = svqsub_n_u32_m (p0, z0, -127),
+               z0 = svqsub_m (p0, z0, -127))
+
+/*
+** qsub_m128_u32_m:
+**     mov     (z[0-9]+\.s), #-128
+**     uqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_u32_m, svuint32_t,
+               z0 = svqsub_n_u32_m (p0, z0, -128),
+               z0 = svqsub_m (p0, z0, -128))
+
+/*
+** qsub_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u32_z_tied1, svuint32_t,
+               z0 = svqsub_u32_z (p0, z0, z1),
+               z0 = svqsub_z (p0, z0, z1))
+
+/*
+** qsub_u32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u32_z_tied2, svuint32_t,
+               z0 = svqsub_u32_z (p0, z1, z0),
+               z0 = svqsub_z (p0, z1, z0))
+
+/*
+** qsub_u32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uqsub   z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0\.s, p0/z, z2\.s
+**     uqsubr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u32_z_untied, svuint32_t,
+               z0 = svqsub_u32_z (p0, z1, z2),
+               z0 = svqsub_z (p0, z1, z2))
+
+/*
+** qsub_w0_u32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u32_z_tied1, svuint32_t, uint32_t,
+                z0 = svqsub_n_u32_z (p0, z0, x0),
+                z0 = svqsub_z (p0, z0, x0))
+
+/*
+** qsub_w0_u32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uqsub   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     uqsubr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u32_z_untied, svuint32_t, uint32_t,
+                z0 = svqsub_n_u32_z (p0, z1, x0),
+                z0 = svqsub_z (p0, z1, x0))
+
+/*
+** qsub_1_u32_z_tied1:
+**     mov     (z[0-9]+\.s), #1
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u32_z_tied1, svuint32_t,
+               z0 = svqsub_n_u32_z (p0, z0, 1),
+               z0 = svqsub_z (p0, z0, 1))
+
+/*
+** qsub_1_u32_z_untied:
+**     mov     (z[0-9]+\.s), #1
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uqsub   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     uqsubr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u32_z_untied, svuint32_t,
+               z0 = svqsub_n_u32_z (p0, z1, 1),
+               z0 = svqsub_z (p0, z1, 1))
+
+/*
+** qsub_127_u32_z:
+**     mov     (z[0-9]+\.s), #127
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_u32_z, svuint32_t,
+               z0 = svqsub_n_u32_z (p0, z0, 127),
+               z0 = svqsub_z (p0, z0, 127))
+
+/*
+** qsub_128_u32_z:
+**     mov     (z[0-9]+\.s), #128
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_u32_z, svuint32_t,
+               z0 = svqsub_n_u32_z (p0, z0, 128),
+               z0 = svqsub_z (p0, z0, 128))
+
+/*
+** qsub_255_u32_z:
+**     mov     (z[0-9]+\.s), #255
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_u32_z, svuint32_t,
+               z0 = svqsub_n_u32_z (p0, z0, 255),
+               z0 = svqsub_z (p0, z0, 255))
+
+/*
+** qsub_m1_u32_z:
+**     mov     (z[0-9]+)\.b, #-1
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqsub   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_u32_z, svuint32_t,
+               z0 = svqsub_n_u32_z (p0, z0, -1),
+               z0 = svqsub_z (p0, z0, -1))
+
+/*
+** qsub_m127_u32_z:
+**     mov     (z[0-9]+\.s), #-127
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_u32_z, svuint32_t,
+               z0 = svqsub_n_u32_z (p0, z0, -127),
+               z0 = svqsub_z (p0, z0, -127))
+
+/*
+** qsub_m128_u32_z:
+**     mov     (z[0-9]+\.s), #-128
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqsub   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_u32_z, svuint32_t,
+               z0 = svqsub_n_u32_z (p0, z0, -128),
+               z0 = svqsub_z (p0, z0, -128))
+
+/*
+** qsub_u32_x_tied1:
+**     uqsub   z0\.s, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u32_x_tied1, svuint32_t,
+               z0 = svqsub_u32_x (p0, z0, z1),
+               z0 = svqsub_x (p0, z0, z1))
+
+/*
+** qsub_u32_x_tied2:
+**     uqsub   z0\.s, z1\.s, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u32_x_tied2, svuint32_t,
+               z0 = svqsub_u32_x (p0, z1, z0),
+               z0 = svqsub_x (p0, z1, z0))
+
+/*
+** qsub_u32_x_untied:
+**     uqsub   z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u32_x_untied, svuint32_t,
+               z0 = svqsub_u32_x (p0, z1, z2),
+               z0 = svqsub_x (p0, z1, z2))
+
+/*
+** qsub_w0_u32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uqsub   z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u32_x_tied1, svuint32_t, uint32_t,
+                z0 = svqsub_n_u32_x (p0, z0, x0),
+                z0 = svqsub_x (p0, z0, x0))
+
+/*
+** qsub_w0_u32_x_untied:
+**     mov     (z[0-9]+\.s), w0
+**     uqsub   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u32_x_untied, svuint32_t, uint32_t,
+                z0 = svqsub_n_u32_x (p0, z1, x0),
+                z0 = svqsub_x (p0, z1, x0))
+
+/*
+** qsub_1_u32_x_tied1:
+**     uqsub   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u32_x_tied1, svuint32_t,
+               z0 = svqsub_n_u32_x (p0, z0, 1),
+               z0 = svqsub_x (p0, z0, 1))
+
+/*
+** qsub_1_u32_x_untied:
+**     movprfx z0, z1
+**     uqsub   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u32_x_untied, svuint32_t,
+               z0 = svqsub_n_u32_x (p0, z1, 1),
+               z0 = svqsub_x (p0, z1, 1))
+
+/*
+** qsub_127_u32_x:
+**     uqsub   z0\.s, z0\.s, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_u32_x, svuint32_t,
+               z0 = svqsub_n_u32_x (p0, z0, 127),
+               z0 = svqsub_x (p0, z0, 127))
+
+/*
+** qsub_128_u32_x:
+**     uqsub   z0\.s, z0\.s, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_u32_x, svuint32_t,
+               z0 = svqsub_n_u32_x (p0, z0, 128),
+               z0 = svqsub_x (p0, z0, 128))
+
+/*
+** qsub_255_u32_x:
+**     uqsub   z0\.s, z0\.s, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_u32_x, svuint32_t,
+               z0 = svqsub_n_u32_x (p0, z0, 255),
+               z0 = svqsub_x (p0, z0, 255))
+
+/*
+** qsub_m1_u32_x:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqsub   z0\.s, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_u32_x, svuint32_t,
+               z0 = svqsub_n_u32_x (p0, z0, -1),
+               z0 = svqsub_x (p0, z0, -1))
+
+/*
+** qsub_m127_u32_x:
+**     mov     (z[0-9]+\.s), #-127
+**     uqsub   z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_u32_x, svuint32_t,
+               z0 = svqsub_n_u32_x (p0, z0, -127),
+               z0 = svqsub_x (p0, z0, -127))
+
+/*
+** qsub_m128_u32_x:
+**     mov     (z[0-9]+\.s), #-128
+**     uqsub   z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_u32_x, svuint32_t,
+               z0 = svqsub_n_u32_x (p0, z0, -128),
+               z0 = svqsub_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_u64.c
new file mode 100644 (file)
index 0000000..b25c6a5
--- /dev/null
@@ -0,0 +1,536 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qsub_u64_tied1:
+**     uqsub   z0\.d, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u64_tied1, svuint64_t,
+               z0 = svqsub_u64 (z0, z1),
+               z0 = svqsub (z0, z1))
+
+/*
+** qsub_u64_tied2:
+**     uqsub   z0\.d, z1\.d, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u64_tied2, svuint64_t,
+               z0 = svqsub_u64 (z1, z0),
+               z0 = svqsub (z1, z0))
+
+/*
+** qsub_u64_untied:
+**     uqsub   z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u64_untied, svuint64_t,
+               z0 = svqsub_u64 (z1, z2),
+               z0 = svqsub (z1, z2))
+
+/*
+** qsub_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     uqsub   z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = svqsub_n_u64 (z0, x0),
+                z0 = svqsub (z0, x0))
+
+/*
+** qsub_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     uqsub   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = svqsub_n_u64 (z1, x0),
+                z0 = svqsub (z1, x0))
+
+/*
+** qsub_1_u64_tied1:
+**     uqsub   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u64_tied1, svuint64_t,
+               z0 = svqsub_n_u64 (z0, 1),
+               z0 = svqsub (z0, 1))
+
+/*
+** qsub_1_u64_untied:
+**     movprfx z0, z1
+**     uqsub   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u64_untied, svuint64_t,
+               z0 = svqsub_n_u64 (z1, 1),
+               z0 = svqsub (z1, 1))
+
+/*
+** qsub_127_u64:
+**     uqsub   z0\.d, z0\.d, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_u64, svuint64_t,
+               z0 = svqsub_n_u64 (z0, 127),
+               z0 = svqsub (z0, 127))
+
+/*
+** qsub_128_u64:
+**     uqsub   z0\.d, z0\.d, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_u64, svuint64_t,
+               z0 = svqsub_n_u64 (z0, 128),
+               z0 = svqsub (z0, 128))
+
+/*
+** qsub_255_u64:
+**     uqsub   z0\.d, z0\.d, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_u64, svuint64_t,
+               z0 = svqsub_n_u64 (z0, 255),
+               z0 = svqsub (z0, 255))
+
+/*
+** qsub_m1_u64:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqsub   z0\.d, z0\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_u64, svuint64_t,
+               z0 = svqsub_n_u64 (z0, -1),
+               z0 = svqsub (z0, -1))
+
+/*
+** qsub_m127_u64:
+**     mov     (z[0-9]+\.d), #-127
+**     uqsub   z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_u64, svuint64_t,
+               z0 = svqsub_n_u64 (z0, -127),
+               z0 = svqsub (z0, -127))
+
+/*
+** qsub_m128_u64:
+**     mov     (z[0-9]+\.d), #-128
+**     uqsub   z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_u64, svuint64_t,
+               z0 = svqsub_n_u64 (z0, -128),
+               z0 = svqsub (z0, -128))
+
+/*
+** qsub_u64_m_tied1:
+**     uqsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u64_m_tied1, svuint64_t,
+               z0 = svqsub_u64_m (p0, z0, z1),
+               z0 = svqsub_m (p0, z0, z1))
+
+/*
+** qsub_u64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     uqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u64_m_tied2, svuint64_t,
+               z0 = svqsub_u64_m (p0, z1, z0),
+               z0 = svqsub_m (p0, z1, z0))
+
+/*
+** qsub_u64_m_untied:
+**     movprfx z0, z1
+**     uqsub   z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u64_m_untied, svuint64_t,
+               z0 = svqsub_u64_m (p0, z1, z2),
+               z0 = svqsub_m (p0, z1, z2))
+
+/*
+** qsub_x0_u64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     uqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_x0_u64_m_tied1, svuint64_t, uint64_t,
+                z0 = svqsub_n_u64_m (p0, z0, x0),
+                z0 = svqsub_m (p0, z0, x0))
+
+/*
+** qsub_x0_u64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     uqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_x0_u64_m_untied, svuint64_t, uint64_t,
+                z0 = svqsub_n_u64_m (p0, z1, x0),
+                z0 = svqsub_m (p0, z1, x0))
+
+/*
+** qsub_1_u64_m_tied1:
+**     mov     (z[0-9]+\.d), #1
+**     uqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u64_m_tied1, svuint64_t,
+               z0 = svqsub_n_u64_m (p0, z0, 1),
+               z0 = svqsub_m (p0, z0, 1))
+
+/*
+** qsub_1_u64_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.d), #1
+**     movprfx z0, z1
+**     uqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u64_m_untied, svuint64_t,
+               z0 = svqsub_n_u64_m (p0, z1, 1),
+               z0 = svqsub_m (p0, z1, 1))
+
+/*
+** qsub_127_u64_m:
+**     mov     (z[0-9]+\.d), #127
+**     uqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_u64_m, svuint64_t,
+               z0 = svqsub_n_u64_m (p0, z0, 127),
+               z0 = svqsub_m (p0, z0, 127))
+
+/*
+** qsub_128_u64_m:
+**     mov     (z[0-9]+\.d), #128
+**     uqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_u64_m, svuint64_t,
+               z0 = svqsub_n_u64_m (p0, z0, 128),
+               z0 = svqsub_m (p0, z0, 128))
+
+/*
+** qsub_255_u64_m:
+**     mov     (z[0-9]+\.d), #255
+**     uqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_u64_m, svuint64_t,
+               z0 = svqsub_n_u64_m (p0, z0, 255),
+               z0 = svqsub_m (p0, z0, 255))
+
+/*
+** qsub_m1_u64_m:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqsub   z0\.d, p0/m, z0\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_u64_m, svuint64_t,
+               z0 = svqsub_n_u64_m (p0, z0, -1),
+               z0 = svqsub_m (p0, z0, -1))
+
+/*
+** qsub_m127_u64_m:
+**     mov     (z[0-9]+\.d), #-127
+**     uqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_u64_m, svuint64_t,
+               z0 = svqsub_n_u64_m (p0, z0, -127),
+               z0 = svqsub_m (p0, z0, -127))
+
+/*
+** qsub_m128_u64_m:
+**     mov     (z[0-9]+\.d), #-128
+**     uqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_u64_m, svuint64_t,
+               z0 = svqsub_n_u64_m (p0, z0, -128),
+               z0 = svqsub_m (p0, z0, -128))
+
+/*
+** qsub_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u64_z_tied1, svuint64_t,
+               z0 = svqsub_u64_z (p0, z0, z1),
+               z0 = svqsub_z (p0, z0, z1))
+
+/*
+** qsub_u64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u64_z_tied2, svuint64_t,
+               z0 = svqsub_u64_z (p0, z1, z0),
+               z0 = svqsub_z (p0, z1, z0))
+
+/*
+** qsub_u64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uqsub   z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0\.d, p0/z, z2\.d
+**     uqsubr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u64_z_untied, svuint64_t,
+               z0 = svqsub_u64_z (p0, z1, z2),
+               z0 = svqsub_z (p0, z1, z2))
+
+/*
+** qsub_x0_u64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_x0_u64_z_tied1, svuint64_t, uint64_t,
+                z0 = svqsub_n_u64_z (p0, z0, x0),
+                z0 = svqsub_z (p0, z0, x0))
+
+/*
+** qsub_x0_u64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uqsub   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     uqsubr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_x0_u64_z_untied, svuint64_t, uint64_t,
+                z0 = svqsub_n_u64_z (p0, z1, x0),
+                z0 = svqsub_z (p0, z1, x0))
+
+/*
+** qsub_1_u64_z_tied1:
+**     mov     (z[0-9]+\.d), #1
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u64_z_tied1, svuint64_t,
+               z0 = svqsub_n_u64_z (p0, z0, 1),
+               z0 = svqsub_z (p0, z0, 1))
+
+/*
+** qsub_1_u64_z_untied:
+**     mov     (z[0-9]+\.d), #1
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uqsub   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     uqsubr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u64_z_untied, svuint64_t,
+               z0 = svqsub_n_u64_z (p0, z1, 1),
+               z0 = svqsub_z (p0, z1, 1))
+
+/*
+** qsub_127_u64_z:
+**     mov     (z[0-9]+\.d), #127
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_u64_z, svuint64_t,
+               z0 = svqsub_n_u64_z (p0, z0, 127),
+               z0 = svqsub_z (p0, z0, 127))
+
+/*
+** qsub_128_u64_z:
+**     mov     (z[0-9]+\.d), #128
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_u64_z, svuint64_t,
+               z0 = svqsub_n_u64_z (p0, z0, 128),
+               z0 = svqsub_z (p0, z0, 128))
+
+/*
+** qsub_255_u64_z:
+**     mov     (z[0-9]+\.d), #255
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_u64_z, svuint64_t,
+               z0 = svqsub_n_u64_z (p0, z0, 255),
+               z0 = svqsub_z (p0, z0, 255))
+
+/*
+** qsub_m1_u64_z:
+**     mov     (z[0-9]+)\.b, #-1
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqsub   z0\.d, p0/m, z0\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_u64_z, svuint64_t,
+               z0 = svqsub_n_u64_z (p0, z0, -1),
+               z0 = svqsub_z (p0, z0, -1))
+
+/*
+** qsub_m127_u64_z:
+**     mov     (z[0-9]+\.d), #-127
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_u64_z, svuint64_t,
+               z0 = svqsub_n_u64_z (p0, z0, -127),
+               z0 = svqsub_z (p0, z0, -127))
+
+/*
+** qsub_m128_u64_z:
+**     mov     (z[0-9]+\.d), #-128
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqsub   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_u64_z, svuint64_t,
+               z0 = svqsub_n_u64_z (p0, z0, -128),
+               z0 = svqsub_z (p0, z0, -128))
+
+/*
+** qsub_u64_x_tied1:
+**     uqsub   z0\.d, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u64_x_tied1, svuint64_t,
+               z0 = svqsub_u64_x (p0, z0, z1),
+               z0 = svqsub_x (p0, z0, z1))
+
+/*
+** qsub_u64_x_tied2:
+**     uqsub   z0\.d, z1\.d, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u64_x_tied2, svuint64_t,
+               z0 = svqsub_u64_x (p0, z1, z0),
+               z0 = svqsub_x (p0, z1, z0))
+
+/*
+** qsub_u64_x_untied:
+**     uqsub   z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u64_x_untied, svuint64_t,
+               z0 = svqsub_u64_x (p0, z1, z2),
+               z0 = svqsub_x (p0, z1, z2))
+
+/*
+** qsub_x0_u64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     uqsub   z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_x0_u64_x_tied1, svuint64_t, uint64_t,
+                z0 = svqsub_n_u64_x (p0, z0, x0),
+                z0 = svqsub_x (p0, z0, x0))
+
+/*
+** qsub_x0_u64_x_untied:
+**     mov     (z[0-9]+\.d), x0
+**     uqsub   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_x0_u64_x_untied, svuint64_t, uint64_t,
+                z0 = svqsub_n_u64_x (p0, z1, x0),
+                z0 = svqsub_x (p0, z1, x0))
+
+/*
+** qsub_1_u64_x_tied1:
+**     uqsub   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u64_x_tied1, svuint64_t,
+               z0 = svqsub_n_u64_x (p0, z0, 1),
+               z0 = svqsub_x (p0, z0, 1))
+
+/*
+** qsub_1_u64_x_untied:
+**     movprfx z0, z1
+**     uqsub   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u64_x_untied, svuint64_t,
+               z0 = svqsub_n_u64_x (p0, z1, 1),
+               z0 = svqsub_x (p0, z1, 1))
+
+/*
+** qsub_127_u64_x:
+**     uqsub   z0\.d, z0\.d, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_u64_x, svuint64_t,
+               z0 = svqsub_n_u64_x (p0, z0, 127),
+               z0 = svqsub_x (p0, z0, 127))
+
+/*
+** qsub_128_u64_x:
+**     uqsub   z0\.d, z0\.d, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_u64_x, svuint64_t,
+               z0 = svqsub_n_u64_x (p0, z0, 128),
+               z0 = svqsub_x (p0, z0, 128))
+
+/*
+** qsub_255_u64_x:
+**     uqsub   z0\.d, z0\.d, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_u64_x, svuint64_t,
+               z0 = svqsub_n_u64_x (p0, z0, 255),
+               z0 = svqsub_x (p0, z0, 255))
+
+/*
+** qsub_m1_u64_x:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqsub   z0\.d, z0\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_u64_x, svuint64_t,
+               z0 = svqsub_n_u64_x (p0, z0, -1),
+               z0 = svqsub_x (p0, z0, -1))
+
+/*
+** qsub_m127_u64_x:
+**     mov     (z[0-9]+\.d), #-127
+**     uqsub   z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_u64_x, svuint64_t,
+               z0 = svqsub_n_u64_x (p0, z0, -127),
+               z0 = svqsub_x (p0, z0, -127))
+
+/*
+** qsub_m128_u64_x:
+**     mov     (z[0-9]+\.d), #-128
+**     uqsub   z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_u64_x, svuint64_t,
+               z0 = svqsub_n_u64_x (p0, z0, -128),
+               z0 = svqsub_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsub_u8.c
new file mode 100644 (file)
index 0000000..686b2b4
--- /dev/null
@@ -0,0 +1,530 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qsub_u8_tied1:
+**     uqsub   z0\.b, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u8_tied1, svuint8_t,
+               z0 = svqsub_u8 (z0, z1),
+               z0 = svqsub (z0, z1))
+
+/*
+** qsub_u8_tied2:
+**     uqsub   z0\.b, z1\.b, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u8_tied2, svuint8_t,
+               z0 = svqsub_u8 (z1, z0),
+               z0 = svqsub (z1, z0))
+
+/*
+** qsub_u8_untied:
+**     uqsub   z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u8_untied, svuint8_t,
+               z0 = svqsub_u8 (z1, z2),
+               z0 = svqsub (z1, z2))
+
+/*
+** qsub_w0_u8_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uqsub   z0\.b, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u8_tied1, svuint8_t, uint8_t,
+                z0 = svqsub_n_u8 (z0, x0),
+                z0 = svqsub (z0, x0))
+
+/*
+** qsub_w0_u8_untied:
+**     mov     (z[0-9]+\.b), w0
+**     uqsub   z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u8_untied, svuint8_t, uint8_t,
+                z0 = svqsub_n_u8 (z1, x0),
+                z0 = svqsub (z1, x0))
+
+/*
+** qsub_1_u8_tied1:
+**     uqsub   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u8_tied1, svuint8_t,
+               z0 = svqsub_n_u8 (z0, 1),
+               z0 = svqsub (z0, 1))
+
+/*
+** qsub_1_u8_untied:
+**     movprfx z0, z1
+**     uqsub   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u8_untied, svuint8_t,
+               z0 = svqsub_n_u8 (z1, 1),
+               z0 = svqsub (z1, 1))
+
+/*
+** qsub_127_u8:
+**     uqsub   z0\.b, z0\.b, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_u8, svuint8_t,
+               z0 = svqsub_n_u8 (z0, 127),
+               z0 = svqsub (z0, 127))
+
+/*
+** qsub_128_u8:
+**     uqsub   z0\.b, z0\.b, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_u8, svuint8_t,
+               z0 = svqsub_n_u8 (z0, 128),
+               z0 = svqsub (z0, 128))
+
+/*
+** qsub_255_u8:
+**     uqsub   z0\.b, z0\.b, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_u8, svuint8_t,
+               z0 = svqsub_n_u8 (z0, 255),
+               z0 = svqsub (z0, 255))
+
+/*
+** qsub_m1_u8:
+**     uqsub   z0\.b, z0\.b, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_u8, svuint8_t,
+               z0 = svqsub_n_u8 (z0, -1),
+               z0 = svqsub (z0, -1))
+
+/*
+** qsub_m127_u8:
+**     uqsub   z0\.b, z0\.b, #129
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_u8, svuint8_t,
+               z0 = svqsub_n_u8 (z0, -127),
+               z0 = svqsub (z0, -127))
+
+/*
+** qsub_m128_u8:
+**     uqsub   z0\.b, z0\.b, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_u8, svuint8_t,
+               z0 = svqsub_n_u8 (z0, -128),
+               z0 = svqsub (z0, -128))
+
+/*
+** qsub_u8_m_tied1:
+**     uqsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u8_m_tied1, svuint8_t,
+               z0 = svqsub_u8_m (p0, z0, z1),
+               z0 = svqsub_m (p0, z0, z1))
+
+/*
+** qsub_u8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uqsub   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u8_m_tied2, svuint8_t,
+               z0 = svqsub_u8_m (p0, z1, z0),
+               z0 = svqsub_m (p0, z1, z0))
+
+/*
+** qsub_u8_m_untied:
+**     movprfx z0, z1
+**     uqsub   z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u8_m_untied, svuint8_t,
+               z0 = svqsub_u8_m (p0, z1, z2),
+               z0 = svqsub_m (p0, z1, z2))
+
+/*
+** qsub_w0_u8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u8_m_tied1, svuint8_t, uint8_t,
+                z0 = svqsub_n_u8_m (p0, z0, x0),
+                z0 = svqsub_m (p0, z0, x0))
+
+/*
+** qsub_w0_u8_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u8_m_untied, svuint8_t, uint8_t,
+                z0 = svqsub_n_u8_m (p0, z1, x0),
+                z0 = svqsub_m (p0, z1, x0))
+
+/*
+** qsub_1_u8_m_tied1:
+**     mov     (z[0-9]+\.b), #1
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u8_m_tied1, svuint8_t,
+               z0 = svqsub_n_u8_m (p0, z0, 1),
+               z0 = svqsub_m (p0, z0, 1))
+
+/*
+** qsub_1_u8_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.b), #1
+**     movprfx z0, z1
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u8_m_untied, svuint8_t,
+               z0 = svqsub_n_u8_m (p0, z1, 1),
+               z0 = svqsub_m (p0, z1, 1))
+
+/*
+** qsub_127_u8_m:
+**     mov     (z[0-9]+\.b), #127
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_u8_m, svuint8_t,
+               z0 = svqsub_n_u8_m (p0, z0, 127),
+               z0 = svqsub_m (p0, z0, 127))
+
+/*
+** qsub_128_u8_m:
+**     mov     (z[0-9]+\.b), #-128
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_u8_m, svuint8_t,
+               z0 = svqsub_n_u8_m (p0, z0, 128),
+               z0 = svqsub_m (p0, z0, 128))
+
+/*
+** qsub_255_u8_m:
+**     mov     (z[0-9]+\.b), #-1
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_u8_m, svuint8_t,
+               z0 = svqsub_n_u8_m (p0, z0, 255),
+               z0 = svqsub_m (p0, z0, 255))
+
+/*
+** qsub_m1_u8_m:
+**     mov     (z[0-9]+\.b), #-1
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_u8_m, svuint8_t,
+               z0 = svqsub_n_u8_m (p0, z0, -1),
+               z0 = svqsub_m (p0, z0, -1))
+
+/*
+** qsub_m127_u8_m:
+**     mov     (z[0-9]+\.b), #-127
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_u8_m, svuint8_t,
+               z0 = svqsub_n_u8_m (p0, z0, -127),
+               z0 = svqsub_m (p0, z0, -127))
+
+/*
+** qsub_m128_u8_m:
+**     mov     (z[0-9]+\.b), #-128
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_u8_m, svuint8_t,
+               z0 = svqsub_n_u8_m (p0, z0, -128),
+               z0 = svqsub_m (p0, z0, -128))
+
+/*
+** qsub_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u8_z_tied1, svuint8_t,
+               z0 = svqsub_u8_z (p0, z0, z1),
+               z0 = svqsub_z (p0, z0, z1))
+
+/*
+** qsub_u8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u8_z_tied2, svuint8_t,
+               z0 = svqsub_u8_z (p0, z1, z0),
+               z0 = svqsub_z (p0, z1, z0))
+
+/*
+** qsub_u8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uqsub   z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0\.b, p0/z, z2\.b
+**     uqsubr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u8_z_untied, svuint8_t,
+               z0 = svqsub_u8_z (p0, z1, z2),
+               z0 = svqsub_z (p0, z1, z2))
+
+/*
+** qsub_w0_u8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u8_z_tied1, svuint8_t, uint8_t,
+                z0 = svqsub_n_u8_z (p0, z0, x0),
+                z0 = svqsub_z (p0, z0, x0))
+
+/*
+** qsub_w0_u8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     uqsubr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u8_z_untied, svuint8_t, uint8_t,
+                z0 = svqsub_n_u8_z (p0, z1, x0),
+                z0 = svqsub_z (p0, z1, x0))
+
+/*
+** qsub_1_u8_z_tied1:
+**     mov     (z[0-9]+\.b), #1
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u8_z_tied1, svuint8_t,
+               z0 = svqsub_n_u8_z (p0, z0, 1),
+               z0 = svqsub_z (p0, z0, 1))
+
+/*
+** qsub_1_u8_z_untied:
+**     mov     (z[0-9]+\.b), #1
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     uqsubr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u8_z_untied, svuint8_t,
+               z0 = svqsub_n_u8_z (p0, z1, 1),
+               z0 = svqsub_z (p0, z1, 1))
+
+/*
+** qsub_127_u8_z:
+**     mov     (z[0-9]+\.b), #127
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_u8_z, svuint8_t,
+               z0 = svqsub_n_u8_z (p0, z0, 127),
+               z0 = svqsub_z (p0, z0, 127))
+
+/*
+** qsub_128_u8_z:
+**     mov     (z[0-9]+\.b), #-128
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_u8_z, svuint8_t,
+               z0 = svqsub_n_u8_z (p0, z0, 128),
+               z0 = svqsub_z (p0, z0, 128))
+
+/*
+** qsub_255_u8_z:
+**     mov     (z[0-9]+\.b), #-1
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_u8_z, svuint8_t,
+               z0 = svqsub_n_u8_z (p0, z0, 255),
+               z0 = svqsub_z (p0, z0, 255))
+
+/*
+** qsub_m1_u8_z:
+**     mov     (z[0-9]+\.b), #-1
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_u8_z, svuint8_t,
+               z0 = svqsub_n_u8_z (p0, z0, -1),
+               z0 = svqsub_z (p0, z0, -1))
+
+/*
+** qsub_m127_u8_z:
+**     mov     (z[0-9]+\.b), #-127
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_u8_z, svuint8_t,
+               z0 = svqsub_n_u8_z (p0, z0, -127),
+               z0 = svqsub_z (p0, z0, -127))
+
+/*
+** qsub_m128_u8_z:
+**     mov     (z[0-9]+\.b), #-128
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqsub   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_u8_z, svuint8_t,
+               z0 = svqsub_n_u8_z (p0, z0, -128),
+               z0 = svqsub_z (p0, z0, -128))
+
+/*
+** qsub_u8_x_tied1:
+**     uqsub   z0\.b, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u8_x_tied1, svuint8_t,
+               z0 = svqsub_u8_x (p0, z0, z1),
+               z0 = svqsub_x (p0, z0, z1))
+
+/*
+** qsub_u8_x_tied2:
+**     uqsub   z0\.b, z1\.b, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u8_x_tied2, svuint8_t,
+               z0 = svqsub_u8_x (p0, z1, z0),
+               z0 = svqsub_x (p0, z1, z0))
+
+/*
+** qsub_u8_x_untied:
+**     uqsub   z0\.b, z1\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_u8_x_untied, svuint8_t,
+               z0 = svqsub_u8_x (p0, z1, z2),
+               z0 = svqsub_x (p0, z1, z2))
+
+/*
+** qsub_w0_u8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uqsub   z0\.b, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u8_x_tied1, svuint8_t, uint8_t,
+                z0 = svqsub_n_u8_x (p0, z0, x0),
+                z0 = svqsub_x (p0, z0, x0))
+
+/*
+** qsub_w0_u8_x_untied:
+**     mov     (z[0-9]+\.b), w0
+**     uqsub   z0\.b, z1\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsub_w0_u8_x_untied, svuint8_t, uint8_t,
+                z0 = svqsub_n_u8_x (p0, z1, x0),
+                z0 = svqsub_x (p0, z1, x0))
+
+/*
+** qsub_1_u8_x_tied1:
+**     uqsub   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u8_x_tied1, svuint8_t,
+               z0 = svqsub_n_u8_x (p0, z0, 1),
+               z0 = svqsub_x (p0, z0, 1))
+
+/*
+** qsub_1_u8_x_untied:
+**     movprfx z0, z1
+**     uqsub   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_1_u8_x_untied, svuint8_t,
+               z0 = svqsub_n_u8_x (p0, z1, 1),
+               z0 = svqsub_x (p0, z1, 1))
+
+/*
+** qsub_127_u8_x:
+**     uqsub   z0\.b, z0\.b, #127
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_127_u8_x, svuint8_t,
+               z0 = svqsub_n_u8_x (p0, z0, 127),
+               z0 = svqsub_x (p0, z0, 127))
+
+/*
+** qsub_128_u8_x:
+**     uqsub   z0\.b, z0\.b, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_128_u8_x, svuint8_t,
+               z0 = svqsub_n_u8_x (p0, z0, 128),
+               z0 = svqsub_x (p0, z0, 128))
+
+/*
+** qsub_255_u8_x:
+**     uqsub   z0\.b, z0\.b, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_255_u8_x, svuint8_t,
+               z0 = svqsub_n_u8_x (p0, z0, 255),
+               z0 = svqsub_x (p0, z0, 255))
+
+/*
+** qsub_m1_u8_x:
+**     uqsub   z0\.b, z0\.b, #255
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m1_u8_x, svuint8_t,
+               z0 = svqsub_n_u8_x (p0, z0, -1),
+               z0 = svqsub_x (p0, z0, -1))
+
+/*
+** qsub_m127_u8_x:
+**     uqsub   z0\.b, z0\.b, #129
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m127_u8_x, svuint8_t,
+               z0 = svqsub_n_u8_x (p0, z0, -127),
+               z0 = svqsub_x (p0, z0, -127))
+
+/*
+** qsub_m128_u8_x:
+**     uqsub   z0\.b, z0\.b, #128
+**     ret
+*/
+TEST_UNIFORM_Z (qsub_m128_u8_x, svuint8_t,
+               z0 = svqsub_n_u8_x (p0, z0, -128),
+               z0 = svqsub_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_s16.c
new file mode 100644 (file)
index 0000000..577310d
--- /dev/null
@@ -0,0 +1,331 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qsubr_s16_m_tied1:
+**     sqsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s16_m_tied1, svint16_t,
+               z0 = svqsubr_s16_m (p0, z0, z1),
+               z0 = svqsubr_m (p0, z0, z1))
+
+/*
+** qsubr_s16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqsubr  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s16_m_tied2, svint16_t,
+               z0 = svqsubr_s16_m (p0, z1, z0),
+               z0 = svqsubr_m (p0, z1, z0))
+
+/*
+** qsubr_s16_m_untied:
+**     movprfx z0, z1
+**     sqsubr  z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s16_m_untied, svint16_t,
+               z0 = svqsubr_s16_m (p0, z1, z2),
+               z0 = svqsubr_m (p0, z1, z2))
+
+/*
+** qsubr_w0_s16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_s16_m_tied1, svint16_t, int16_t,
+                z0 = svqsubr_n_s16_m (p0, z0, x0),
+                z0 = svqsubr_m (p0, z0, x0))
+
+/*
+** qsubr_w0_s16_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     sqsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_s16_m_untied, svint16_t, int16_t,
+                z0 = svqsubr_n_s16_m (p0, z1, x0),
+                z0 = svqsubr_m (p0, z1, x0))
+
+/*
+** qsubr_1_s16_m_tied1:
+**     mov     (z[0-9]+\.h), #1
+**     sqsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s16_m_tied1, svint16_t,
+               z0 = svqsubr_n_s16_m (p0, z0, 1),
+               z0 = svqsubr_m (p0, z0, 1))
+
+/*
+** qsubr_1_s16_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.h), #1
+**     movprfx z0, z1
+**     sqsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s16_m_untied, svint16_t,
+               z0 = svqsubr_n_s16_m (p0, z1, 1),
+               z0 = svqsubr_m (p0, z1, 1))
+
+/*
+** qsubr_m2_s16_m:
+**     mov     (z[0-9]+\.h), #-2
+**     sqsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m2_s16_m, svint16_t,
+               z0 = svqsubr_n_s16_m (p0, z0, -2),
+               z0 = svqsubr_m (p0, z0, -2))
+
+/*
+** qsubr_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s16_z_tied1, svint16_t,
+               z0 = svqsubr_s16_z (p0, z0, z1),
+               z0 = svqsubr_z (p0, z0, z1))
+
+/*
+** qsubr_s16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s16_z_tied2, svint16_t,
+               z0 = svqsubr_s16_z (p0, z1, z0),
+               z0 = svqsubr_z (p0, z1, z0))
+
+/*
+** qsubr_s16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqsubr  z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0\.h, p0/z, z2\.h
+**     sqsub   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s16_z_untied, svint16_t,
+               z0 = svqsubr_s16_z (p0, z1, z2),
+               z0 = svqsubr_z (p0, z1, z2))
+
+/*
+** qsubr_w0_s16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_s16_z_tied1, svint16_t, int16_t,
+                z0 = svqsubr_n_s16_z (p0, z0, x0),
+                z0 = svqsubr_z (p0, z0, x0))
+
+/*
+** qsubr_w0_s16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqsubr  z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     sqsub   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_s16_z_untied, svint16_t, int16_t,
+                z0 = svqsubr_n_s16_z (p0, z1, x0),
+                z0 = svqsubr_z (p0, z1, x0))
+
+/*
+** qsubr_1_s16_z_tied1:
+**     mov     (z[0-9]+\.h), #1
+**     movprfx z0\.h, p0/z, z0\.h
+**     sqsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s16_z_tied1, svint16_t,
+               z0 = svqsubr_n_s16_z (p0, z0, 1),
+               z0 = svqsubr_z (p0, z0, 1))
+
+/*
+** qsubr_1_s16_z_untied:
+**     mov     (z[0-9]+\.h), #1
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     sqsubr  z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     sqsub   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s16_z_untied, svint16_t,
+               z0 = svqsubr_n_s16_z (p0, z1, 1),
+               z0 = svqsubr_z (p0, z1, 1))
+
+/*
+** qsubr_s16_x_tied1:
+**     sqsub   z0\.h, z1\.h, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s16_x_tied1, svint16_t,
+               z0 = svqsubr_s16_x (p0, z0, z1),
+               z0 = svqsubr_x (p0, z0, z1))
+
+/*
+** qsubr_s16_x_tied2:
+**     sqsub   z0\.h, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s16_x_tied2, svint16_t,
+               z0 = svqsubr_s16_x (p0, z1, z0),
+               z0 = svqsubr_x (p0, z1, z0))
+
+/*
+** qsubr_s16_x_untied:
+**     sqsub   z0\.h, z2\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s16_x_untied, svint16_t,
+               z0 = svqsubr_s16_x (p0, z1, z2),
+               z0 = svqsubr_x (p0, z1, z2))
+
+/*
+** qsubr_w0_s16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     sqsub   z0\.h, \1, z0\.h
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_s16_x_tied1, svint16_t, int16_t,
+                z0 = svqsubr_n_s16_x (p0, z0, x0),
+                z0 = svqsubr_x (p0, z0, x0))
+
+/*
+** qsubr_w0_s16_x_untied:
+**     mov     (z[0-9]+\.h), w0
+**     sqsub   z0\.h, \1, z1\.h
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_s16_x_untied, svint16_t, int16_t,
+                z0 = svqsubr_n_s16_x (p0, z1, x0),
+                z0 = svqsubr_x (p0, z1, x0))
+
+/*
+** qsubr_1_s16_x_tied1:
+**     mov     (z[0-9]+\.h), #1
+**     sqsub   z0\.h, \1, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s16_x_tied1, svint16_t,
+               z0 = svqsubr_n_s16_x (p0, z0, 1),
+               z0 = svqsubr_x (p0, z0, 1))
+
+/*
+** qsubr_1_s16_x_untied:
+**     mov     (z[0-9]+\.h), #1
+**     sqsub   z0\.h, \1, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s16_x_untied, svint16_t,
+               z0 = svqsubr_n_s16_x (p0, z1, 1),
+               z0 = svqsubr_x (p0, z1, 1))
+
+/*
+** qsubr_127_s16_x:
+**     mov     (z[0-9]+\.h), #127
+**     sqsub   z0\.h, \1, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_127_s16_x, svint16_t,
+               z0 = svqsubr_n_s16_x (p0, z0, 127),
+               z0 = svqsubr_x (p0, z0, 127))
+
+/*
+** qsubr_128_s16_x:
+**     mov     (z[0-9]+\.h), #128
+**     sqsub   z0\.h, \1, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_128_s16_x, svint16_t,
+               z0 = svqsubr_n_s16_x (p0, z0, 128),
+               z0 = svqsubr_x (p0, z0, 128))
+
+/*
+** qsubr_255_s16_x:
+**     mov     (z[0-9]+\.h), #255
+**     sqsub   z0\.h, \1, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_255_s16_x, svint16_t,
+               z0 = svqsubr_n_s16_x (p0, z0, 255),
+               z0 = svqsubr_x (p0, z0, 255))
+
+/*
+** qsubr_256_s16_x:
+**     mov     (z[0-9]+\.h), #256
+**     sqsub   z0\.h, \1, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_256_s16_x, svint16_t,
+               z0 = svqsubr_n_s16_x (p0, z0, 256),
+               z0 = svqsubr_x (p0, z0, 256))
+
+/*
+** qsubr_257_s16_x:
+**     mov     (z[0-9]+)\.b, #1
+**     sqsub   z0\.h, \1\.h, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_257_s16_x, svint16_t,
+               z0 = svqsubr_n_s16_x (p0, z0, 257),
+               z0 = svqsubr_x (p0, z0, 257))
+
+/*
+** qsubr_512_s16_x:
+**     mov     (z[0-9]+\.h), #512
+**     sqsub   z0\.h, \1, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_512_s16_x, svint16_t,
+               z0 = svqsubr_n_s16_x (p0, z0, 512),
+               z0 = svqsubr_x (p0, z0, 512))
+
+/*
+** qsubr_65280_s16_x:
+**     mov     (z[0-9]+\.h), #-256
+**     sqsub   z0\.h, \1, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_65280_s16_x, svint16_t,
+               z0 = svqsubr_n_s16_x (p0, z0, 0xff00),
+               z0 = svqsubr_x (p0, z0, 0xff00))
+
+/*
+** qsubr_m1_s16_x_tied1:
+**     mov     (z[0-9]+)\.b, #-1
+**     sqsub   z0\.h, \1\.h, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m1_s16_x_tied1, svint16_t,
+               z0 = svqsubr_n_s16_x (p0, z0, -1),
+               z0 = svqsubr_x (p0, z0, -1))
+
+/*
+** qsubr_m1_s16_x_untied:
+**     mov     (z[0-9]+)\.b, #-1
+**     sqsub   z0\.h, \1\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m1_s16_x_untied, svint16_t,
+               z0 = svqsubr_n_s16_x (p0, z1, -1),
+               z0 = svqsubr_x (p0, z1, -1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_s32.c
new file mode 100644 (file)
index 0000000..f6a06c3
--- /dev/null
@@ -0,0 +1,351 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qsubr_s32_m_tied1:
+**     sqsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s32_m_tied1, svint32_t,
+               z0 = svqsubr_s32_m (p0, z0, z1),
+               z0 = svqsubr_m (p0, z0, z1))
+
+/*
+** qsubr_s32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqsubr  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s32_m_tied2, svint32_t,
+               z0 = svqsubr_s32_m (p0, z1, z0),
+               z0 = svqsubr_m (p0, z1, z0))
+
+/*
+** qsubr_s32_m_untied:
+**     movprfx z0, z1
+**     sqsubr  z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s32_m_untied, svint32_t,
+               z0 = svqsubr_s32_m (p0, z1, z2),
+               z0 = svqsubr_m (p0, z1, z2))
+
+/*
+** qsubr_w0_s32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_s32_m_tied1, svint32_t, int32_t,
+                z0 = svqsubr_n_s32_m (p0, z0, x0),
+                z0 = svqsubr_m (p0, z0, x0))
+
+/*
+** qsubr_w0_s32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     sqsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_s32_m_untied, svint32_t, int32_t,
+                z0 = svqsubr_n_s32_m (p0, z1, x0),
+                z0 = svqsubr_m (p0, z1, x0))
+
+/*
+** qsubr_1_s32_m_tied1:
+**     mov     (z[0-9]+\.s), #1
+**     sqsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s32_m_tied1, svint32_t,
+               z0 = svqsubr_n_s32_m (p0, z0, 1),
+               z0 = svqsubr_m (p0, z0, 1))
+
+/*
+** qsubr_1_s32_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.s), #1
+**     movprfx z0, z1
+**     sqsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s32_m_untied, svint32_t,
+               z0 = svqsubr_n_s32_m (p0, z1, 1),
+               z0 = svqsubr_m (p0, z1, 1))
+
+/*
+** qsubr_m2_s32_m:
+**     mov     (z[0-9]+\.s), #-2
+**     sqsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m2_s32_m, svint32_t,
+               z0 = svqsubr_n_s32_m (p0, z0, -2),
+               z0 = svqsubr_m (p0, z0, -2))
+
+/*
+** qsubr_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s32_z_tied1, svint32_t,
+               z0 = svqsubr_s32_z (p0, z0, z1),
+               z0 = svqsubr_z (p0, z0, z1))
+
+/*
+** qsubr_s32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s32_z_tied2, svint32_t,
+               z0 = svqsubr_s32_z (p0, z1, z0),
+               z0 = svqsubr_z (p0, z1, z0))
+
+/*
+** qsubr_s32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqsubr  z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0\.s, p0/z, z2\.s
+**     sqsub   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s32_z_untied, svint32_t,
+               z0 = svqsubr_s32_z (p0, z1, z2),
+               z0 = svqsubr_z (p0, z1, z2))
+
+/*
+** qsubr_w0_s32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_s32_z_tied1, svint32_t, int32_t,
+                z0 = svqsubr_n_s32_z (p0, z0, x0),
+                z0 = svqsubr_z (p0, z0, x0))
+
+/*
+** qsubr_w0_s32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqsubr  z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     sqsub   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_s32_z_untied, svint32_t, int32_t,
+                z0 = svqsubr_n_s32_z (p0, z1, x0),
+                z0 = svqsubr_z (p0, z1, x0))
+
+/*
+** qsubr_1_s32_z_tied1:
+**     mov     (z[0-9]+\.s), #1
+**     movprfx z0\.s, p0/z, z0\.s
+**     sqsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s32_z_tied1, svint32_t,
+               z0 = svqsubr_n_s32_z (p0, z0, 1),
+               z0 = svqsubr_z (p0, z0, 1))
+
+/*
+** qsubr_1_s32_z_untied:
+**     mov     (z[0-9]+\.s), #1
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     sqsubr  z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     sqsub   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s32_z_untied, svint32_t,
+               z0 = svqsubr_n_s32_z (p0, z1, 1),
+               z0 = svqsubr_z (p0, z1, 1))
+
+/*
+** qsubr_s32_x_tied1:
+**     sqsub   z0\.s, z1\.s, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s32_x_tied1, svint32_t,
+               z0 = svqsubr_s32_x (p0, z0, z1),
+               z0 = svqsubr_x (p0, z0, z1))
+
+/*
+** qsubr_s32_x_tied2:
+**     sqsub   z0\.s, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s32_x_tied2, svint32_t,
+               z0 = svqsubr_s32_x (p0, z1, z0),
+               z0 = svqsubr_x (p0, z1, z0))
+
+/*
+** qsubr_s32_x_untied:
+**     sqsub   z0\.s, z2\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s32_x_untied, svint32_t,
+               z0 = svqsubr_s32_x (p0, z1, z2),
+               z0 = svqsubr_x (p0, z1, z2))
+
+/*
+** qsubr_w0_s32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_s32_x_tied1, svint32_t, int32_t,
+                z0 = svqsubr_n_s32_x (p0, z0, x0),
+                z0 = svqsubr_x (p0, z0, x0))
+
+/*
+** qsubr_w0_s32_x_untied:
+**     mov     (z[0-9]+\.s), w0
+**     sqsub   z0\.s, \1, z1\.s
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_s32_x_untied, svint32_t, int32_t,
+                z0 = svqsubr_n_s32_x (p0, z1, x0),
+                z0 = svqsubr_x (p0, z1, x0))
+
+/*
+** qsubr_1_s32_x_tied1:
+**     mov     (z[0-9]+\.s), #1
+**     sqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s32_x_tied1, svint32_t,
+               z0 = svqsubr_n_s32_x (p0, z0, 1),
+               z0 = svqsubr_x (p0, z0, 1))
+
+/*
+** qsubr_1_s32_x_untied:
+**     mov     (z[0-9]+\.s), #1
+**     sqsub   z0\.s, \1, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s32_x_untied, svint32_t,
+               z0 = svqsubr_n_s32_x (p0, z1, 1),
+               z0 = svqsubr_x (p0, z1, 1))
+
+/*
+** qsubr_127_s32_x:
+**     mov     (z[0-9]+\.s), #127
+**     sqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_127_s32_x, svint32_t,
+               z0 = svqsubr_n_s32_x (p0, z0, 127),
+               z0 = svqsubr_x (p0, z0, 127))
+
+/*
+** qsubr_128_s32_x:
+**     mov     (z[0-9]+\.s), #128
+**     sqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_128_s32_x, svint32_t,
+               z0 = svqsubr_n_s32_x (p0, z0, 128),
+               z0 = svqsubr_x (p0, z0, 128))
+
+/*
+** qsubr_255_s32_x:
+**     mov     (z[0-9]+\.s), #255
+**     sqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_255_s32_x, svint32_t,
+               z0 = svqsubr_n_s32_x (p0, z0, 255),
+               z0 = svqsubr_x (p0, z0, 255))
+
+/*
+** qsubr_256_s32_x:
+**     mov     (z[0-9]+\.s), #256
+**     sqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_256_s32_x, svint32_t,
+               z0 = svqsubr_n_s32_x (p0, z0, 256),
+               z0 = svqsubr_x (p0, z0, 256))
+
+/*
+** qsubr_511_s32_x:
+**     mov     (z[0-9]+\.s), #511
+**     sqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_511_s32_x, svint32_t,
+               z0 = svqsubr_n_s32_x (p0, z0, 511),
+               z0 = svqsubr_x (p0, z0, 511))
+
+/*
+** qsubr_512_s32_x:
+**     mov     (z[0-9]+\.s), #512
+**     sqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_512_s32_x, svint32_t,
+               z0 = svqsubr_n_s32_x (p0, z0, 512),
+               z0 = svqsubr_x (p0, z0, 512))
+
+/*
+** qsubr_65280_s32_x:
+**     mov     (z[0-9]+\.s), #65280
+**     sqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_65280_s32_x, svint32_t,
+               z0 = svqsubr_n_s32_x (p0, z0, 0xff00),
+               z0 = svqsubr_x (p0, z0, 0xff00))
+
+/*
+** qsubr_65535_s32_x:
+**     mov     (z[0-9]+\.s), #65535
+**     sqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_65535_s32_x, svint32_t,
+               z0 = svqsubr_n_s32_x (p0, z0, 65535),
+               z0 = svqsubr_x (p0, z0, 65535))
+
+/*
+** qsubr_65536_s32_x:
+**     mov     (z[0-9]+\.s), #65536
+**     sqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_65536_s32_x, svint32_t,
+               z0 = svqsubr_n_s32_x (p0, z0, 65536),
+               z0 = svqsubr_x (p0, z0, 65536))
+
+/*
+** qsubr_m1_s32_x_tied1:
+**     mov     (z[0-9]+)\.b, #-1
+**     sqsub   z0\.s, \1\.s, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m1_s32_x_tied1, svint32_t,
+               z0 = svqsubr_n_s32_x (p0, z0, -1),
+               z0 = svqsubr_x (p0, z0, -1))
+
+/*
+** qsubr_m1_s32_x_untied:
+**     mov     (z[0-9]+)\.b, #-1
+**     sqsub   z0\.s, \1\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m1_s32_x_untied, svint32_t,
+               z0 = svqsubr_n_s32_x (p0, z1, -1),
+               z0 = svqsubr_x (p0, z1, -1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_s64.c
new file mode 100644 (file)
index 0000000..12b0635
--- /dev/null
@@ -0,0 +1,351 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qsubr_s64_m_tied1:
+**     sqsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s64_m_tied1, svint64_t,
+               z0 = svqsubr_s64_m (p0, z0, z1),
+               z0 = svqsubr_m (p0, z0, z1))
+
+/*
+** qsubr_s64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sqsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s64_m_tied2, svint64_t,
+               z0 = svqsubr_s64_m (p0, z1, z0),
+               z0 = svqsubr_m (p0, z1, z0))
+
+/*
+** qsubr_s64_m_untied:
+**     movprfx z0, z1
+**     sqsubr  z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s64_m_untied, svint64_t,
+               z0 = svqsubr_s64_m (p0, z1, z2),
+               z0 = svqsubr_m (p0, z1, z2))
+
+/*
+** qsubr_x0_s64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     sqsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_x0_s64_m_tied1, svint64_t, int64_t,
+                z0 = svqsubr_n_s64_m (p0, z0, x0),
+                z0 = svqsubr_m (p0, z0, x0))
+
+/*
+** qsubr_x0_s64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     sqsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_x0_s64_m_untied, svint64_t, int64_t,
+                z0 = svqsubr_n_s64_m (p0, z1, x0),
+                z0 = svqsubr_m (p0, z1, x0))
+
+/*
+** qsubr_1_s64_m_tied1:
+**     mov     (z[0-9]+\.d), #1
+**     sqsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s64_m_tied1, svint64_t,
+               z0 = svqsubr_n_s64_m (p0, z0, 1),
+               z0 = svqsubr_m (p0, z0, 1))
+
+/*
+** qsubr_1_s64_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.d), #1
+**     movprfx z0, z1
+**     sqsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s64_m_untied, svint64_t,
+               z0 = svqsubr_n_s64_m (p0, z1, 1),
+               z0 = svqsubr_m (p0, z1, 1))
+
+/*
+** qsubr_m2_s64_m:
+**     mov     (z[0-9]+\.d), #-2
+**     sqsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m2_s64_m, svint64_t,
+               z0 = svqsubr_n_s64_m (p0, z0, -2),
+               z0 = svqsubr_m (p0, z0, -2))
+
+/*
+** qsubr_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s64_z_tied1, svint64_t,
+               z0 = svqsubr_s64_z (p0, z0, z1),
+               z0 = svqsubr_z (p0, z0, z1))
+
+/*
+** qsubr_s64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s64_z_tied2, svint64_t,
+               z0 = svqsubr_s64_z (p0, z1, z0),
+               z0 = svqsubr_z (p0, z1, z0))
+
+/*
+** qsubr_s64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqsubr  z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0\.d, p0/z, z2\.d
+**     sqsub   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s64_z_untied, svint64_t,
+               z0 = svqsubr_s64_z (p0, z1, z2),
+               z0 = svqsubr_z (p0, z1, z2))
+
+/*
+** qsubr_x0_s64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_x0_s64_z_tied1, svint64_t, int64_t,
+                z0 = svqsubr_n_s64_z (p0, z0, x0),
+                z0 = svqsubr_z (p0, z0, x0))
+
+/*
+** qsubr_x0_s64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqsubr  z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     sqsub   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_x0_s64_z_untied, svint64_t, int64_t,
+                z0 = svqsubr_n_s64_z (p0, z1, x0),
+                z0 = svqsubr_z (p0, z1, x0))
+
+/*
+** qsubr_1_s64_z_tied1:
+**     mov     (z[0-9]+\.d), #1
+**     movprfx z0\.d, p0/z, z0\.d
+**     sqsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s64_z_tied1, svint64_t,
+               z0 = svqsubr_n_s64_z (p0, z0, 1),
+               z0 = svqsubr_z (p0, z0, 1))
+
+/*
+** qsubr_1_s64_z_untied:
+**     mov     (z[0-9]+\.d), #1
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     sqsubr  z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     sqsub   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s64_z_untied, svint64_t,
+               z0 = svqsubr_n_s64_z (p0, z1, 1),
+               z0 = svqsubr_z (p0, z1, 1))
+
+/*
+** qsubr_s64_x_tied1:
+**     sqsub   z0\.d, z1\.d, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s64_x_tied1, svint64_t,
+               z0 = svqsubr_s64_x (p0, z0, z1),
+               z0 = svqsubr_x (p0, z0, z1))
+
+/*
+** qsubr_s64_x_tied2:
+**     sqsub   z0\.d, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s64_x_tied2, svint64_t,
+               z0 = svqsubr_s64_x (p0, z1, z0),
+               z0 = svqsubr_x (p0, z1, z0))
+
+/*
+** qsubr_s64_x_untied:
+**     sqsub   z0\.d, z2\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s64_x_untied, svint64_t,
+               z0 = svqsubr_s64_x (p0, z1, z2),
+               z0 = svqsubr_x (p0, z1, z2))
+
+/*
+** qsubr_x0_s64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     sqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_x0_s64_x_tied1, svint64_t, int64_t,
+                z0 = svqsubr_n_s64_x (p0, z0, x0),
+                z0 = svqsubr_x (p0, z0, x0))
+
+/*
+** qsubr_x0_s64_x_untied:
+**     mov     (z[0-9]+\.d), x0
+**     sqsub   z0\.d, \1, z1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_x0_s64_x_untied, svint64_t, int64_t,
+                z0 = svqsubr_n_s64_x (p0, z1, x0),
+                z0 = svqsubr_x (p0, z1, x0))
+
+/*
+** qsubr_1_s64_x_tied1:
+**     mov     (z[0-9]+\.d), #1
+**     sqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s64_x_tied1, svint64_t,
+               z0 = svqsubr_n_s64_x (p0, z0, 1),
+               z0 = svqsubr_x (p0, z0, 1))
+
+/*
+** qsubr_1_s64_x_untied:
+**     mov     (z[0-9]+\.d), #1
+**     sqsub   z0\.d, \1, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s64_x_untied, svint64_t,
+               z0 = svqsubr_n_s64_x (p0, z1, 1),
+               z0 = svqsubr_x (p0, z1, 1))
+
+/*
+** qsubr_127_s64_x:
+**     mov     (z[0-9]+\.d), #127
+**     sqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_127_s64_x, svint64_t,
+               z0 = svqsubr_n_s64_x (p0, z0, 127),
+               z0 = svqsubr_x (p0, z0, 127))
+
+/*
+** qsubr_128_s64_x:
+**     mov     (z[0-9]+\.d), #128
+**     sqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_128_s64_x, svint64_t,
+               z0 = svqsubr_n_s64_x (p0, z0, 128),
+               z0 = svqsubr_x (p0, z0, 128))
+
+/*
+** qsubr_255_s64_x:
+**     mov     (z[0-9]+\.d), #255
+**     sqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_255_s64_x, svint64_t,
+               z0 = svqsubr_n_s64_x (p0, z0, 255),
+               z0 = svqsubr_x (p0, z0, 255))
+
+/*
+** qsubr_256_s64_x:
+**     mov     (z[0-9]+\.d), #256
+**     sqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_256_s64_x, svint64_t,
+               z0 = svqsubr_n_s64_x (p0, z0, 256),
+               z0 = svqsubr_x (p0, z0, 256))
+
+/*
+** qsubr_511_s64_x:
+**     mov     (z[0-9]+\.d), #511
+**     sqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_511_s64_x, svint64_t,
+               z0 = svqsubr_n_s64_x (p0, z0, 511),
+               z0 = svqsubr_x (p0, z0, 511))
+
+/*
+** qsubr_512_s64_x:
+**     mov     (z[0-9]+\.d), #512
+**     sqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_512_s64_x, svint64_t,
+               z0 = svqsubr_n_s64_x (p0, z0, 512),
+               z0 = svqsubr_x (p0, z0, 512))
+
+/*
+** qsubr_65280_s64_x:
+**     mov     (z[0-9]+\.d), #65280
+**     sqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_65280_s64_x, svint64_t,
+               z0 = svqsubr_n_s64_x (p0, z0, 0xff00),
+               z0 = svqsubr_x (p0, z0, 0xff00))
+
+/*
+** qsubr_65535_s64_x:
+**     mov     (z[0-9]+\.d), #65535
+**     sqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_65535_s64_x, svint64_t,
+               z0 = svqsubr_n_s64_x (p0, z0, 65535),
+               z0 = svqsubr_x (p0, z0, 65535))
+
+/*
+** qsubr_65536_s64_x:
+**     mov     (z[0-9]+\.d), #65536
+**     sqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_65536_s64_x, svint64_t,
+               z0 = svqsubr_n_s64_x (p0, z0, 65536),
+               z0 = svqsubr_x (p0, z0, 65536))
+
+/*
+** qsubr_m1_s64_x_tied1:
+**     mov     (z[0-9]+)\.b, #-1
+**     sqsub   z0\.d, \1\.d, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m1_s64_x_tied1, svint64_t,
+               z0 = svqsubr_n_s64_x (p0, z0, -1),
+               z0 = svqsubr_x (p0, z0, -1))
+
+/*
+** qsubr_m1_s64_x_untied:
+**     mov     (z[0-9]+)\.b, #-1
+**     sqsub   z0\.d, \1\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m1_s64_x_untied, svint64_t,
+               z0 = svqsubr_n_s64_x (p0, z1, -1),
+               z0 = svqsubr_x (p0, z1, -1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_s8.c
new file mode 100644 (file)
index 0000000..ce814a8
--- /dev/null
@@ -0,0 +1,301 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qsubr_s8_m_tied1:
+**     sqsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s8_m_tied1, svint8_t,
+               z0 = svqsubr_s8_m (p0, z0, z1),
+               z0 = svqsubr_m (p0, z0, z1))
+
+/*
+** qsubr_s8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sqsubr  z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s8_m_tied2, svint8_t,
+               z0 = svqsubr_s8_m (p0, z1, z0),
+               z0 = svqsubr_m (p0, z1, z0))
+
+/*
+** qsubr_s8_m_untied:
+**     movprfx z0, z1
+**     sqsubr  z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s8_m_untied, svint8_t,
+               z0 = svqsubr_s8_m (p0, z1, z2),
+               z0 = svqsubr_m (p0, z1, z2))
+
+/*
+** qsubr_w0_s8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_s8_m_tied1, svint8_t, int8_t,
+                z0 = svqsubr_n_s8_m (p0, z0, x0),
+                z0 = svqsubr_m (p0, z0, x0))
+
+/*
+** qsubr_w0_s8_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     sqsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_s8_m_untied, svint8_t, int8_t,
+                z0 = svqsubr_n_s8_m (p0, z1, x0),
+                z0 = svqsubr_m (p0, z1, x0))
+
+/*
+** qsubr_1_s8_m_tied1:
+**     mov     (z[0-9]+\.b), #1
+**     sqsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s8_m_tied1, svint8_t,
+               z0 = svqsubr_n_s8_m (p0, z0, 1),
+               z0 = svqsubr_m (p0, z0, 1))
+
+/*
+** qsubr_1_s8_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.b), #1
+**     movprfx z0, z1
+**     sqsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s8_m_untied, svint8_t,
+               z0 = svqsubr_n_s8_m (p0, z1, 1),
+               z0 = svqsubr_m (p0, z1, 1))
+
+/*
+** qsubr_m1_s8_m:
+**     mov     (z[0-9]+\.b), #-1
+**     sqsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m1_s8_m, svint8_t,
+               z0 = svqsubr_n_s8_m (p0, z0, -1),
+               z0 = svqsubr_m (p0, z0, -1))
+
+/*
+** qsubr_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s8_z_tied1, svint8_t,
+               z0 = svqsubr_s8_z (p0, z0, z1),
+               z0 = svqsubr_z (p0, z0, z1))
+
+/*
+** qsubr_s8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s8_z_tied2, svint8_t,
+               z0 = svqsubr_s8_z (p0, z1, z0),
+               z0 = svqsubr_z (p0, z1, z0))
+
+/*
+** qsubr_s8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqsubr  z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0\.b, p0/z, z2\.b
+**     sqsub   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s8_z_untied, svint8_t,
+               z0 = svqsubr_s8_z (p0, z1, z2),
+               z0 = svqsubr_z (p0, z1, z2))
+
+/*
+** qsubr_w0_s8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_s8_z_tied1, svint8_t, int8_t,
+                z0 = svqsubr_n_s8_z (p0, z0, x0),
+                z0 = svqsubr_z (p0, z0, x0))
+
+/*
+** qsubr_w0_s8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqsubr  z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     sqsub   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_s8_z_untied, svint8_t, int8_t,
+                z0 = svqsubr_n_s8_z (p0, z1, x0),
+                z0 = svqsubr_z (p0, z1, x0))
+
+/*
+** qsubr_1_s8_z_tied1:
+**     mov     (z[0-9]+\.b), #1
+**     movprfx z0\.b, p0/z, z0\.b
+**     sqsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s8_z_tied1, svint8_t,
+               z0 = svqsubr_n_s8_z (p0, z0, 1),
+               z0 = svqsubr_z (p0, z0, 1))
+
+/*
+** qsubr_1_s8_z_untied:
+**     mov     (z[0-9]+\.b), #1
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     sqsubr  z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     sqsub   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s8_z_untied, svint8_t,
+               z0 = svqsubr_n_s8_z (p0, z1, 1),
+               z0 = svqsubr_z (p0, z1, 1))
+
+/*
+** qsubr_s8_x_tied1:
+**     sqsub   z0\.b, z1\.b, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s8_x_tied1, svint8_t,
+               z0 = svqsubr_s8_x (p0, z0, z1),
+               z0 = svqsubr_x (p0, z0, z1))
+
+/*
+** qsubr_s8_x_tied2:
+**     sqsub   z0\.b, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s8_x_tied2, svint8_t,
+               z0 = svqsubr_s8_x (p0, z1, z0),
+               z0 = svqsubr_x (p0, z1, z0))
+
+/*
+** qsubr_s8_x_untied:
+**     sqsub   z0\.b, z2\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_s8_x_untied, svint8_t,
+               z0 = svqsubr_s8_x (p0, z1, z2),
+               z0 = svqsubr_x (p0, z1, z2))
+
+/*
+** qsubr_w0_s8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     sqsub   z0\.b, \1, z0\.b
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_s8_x_tied1, svint8_t, int8_t,
+                z0 = svqsubr_n_s8_x (p0, z0, x0),
+                z0 = svqsubr_x (p0, z0, x0))
+
+/*
+** qsubr_w0_s8_x_untied:
+**     mov     (z[0-9]+\.b), w0
+**     sqsub   z0\.b, \1, z1\.b
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_s8_x_untied, svint8_t, int8_t,
+                z0 = svqsubr_n_s8_x (p0, z1, x0),
+                z0 = svqsubr_x (p0, z1, x0))
+
+/*
+** qsubr_1_s8_x_tied1:
+**     mov     (z[0-9]+\.b), #1
+**     sqsub   z0\.b, \1, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s8_x_tied1, svint8_t,
+               z0 = svqsubr_n_s8_x (p0, z0, 1),
+               z0 = svqsubr_x (p0, z0, 1))
+
+/*
+** qsubr_1_s8_x_untied:
+**     mov     (z[0-9]+\.b), #1
+**     sqsub   z0\.b, \1, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_s8_x_untied, svint8_t,
+               z0 = svqsubr_n_s8_x (p0, z1, 1),
+               z0 = svqsubr_x (p0, z1, 1))
+
+/*
+** qsubr_127_s8_x:
+**     mov     (z[0-9]+\.b), #127
+**     sqsub   z0\.b, \1, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_127_s8_x, svint8_t,
+               z0 = svqsubr_n_s8_x (p0, z0, 127),
+               z0 = svqsubr_x (p0, z0, 127))
+
+/*
+** qsubr_128_s8_x:
+**     mov     (z[0-9]+\.b), #-128
+**     sqsub   z0\.b, \1, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_128_s8_x, svint8_t,
+               z0 = svqsubr_n_s8_x (p0, z0, 128),
+               z0 = svqsubr_x (p0, z0, 128))
+
+/*
+** qsubr_255_s8_x:
+**     mov     (z[0-9]+\.b), #-1
+**     sqsub   z0\.b, \1, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_255_s8_x, svint8_t,
+               z0 = svqsubr_n_s8_x (p0, z0, 255),
+               z0 = svqsubr_x (p0, z0, 255))
+
+/*
+** qsubr_m1_s8_x:
+**     mov     (z[0-9]+\.b), #-1
+**     sqsub   z0\.b, \1, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m1_s8_x, svint8_t,
+               z0 = svqsubr_n_s8_x (p0, z0, -1),
+               z0 = svqsubr_x (p0, z0, -1))
+
+/*
+** qsubr_m127_s8_x:
+**     mov     (z[0-9]+\.b), #-127
+**     sqsub   z0\.b, \1, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m127_s8_x, svint8_t,
+               z0 = svqsubr_n_s8_x (p0, z0, -127),
+               z0 = svqsubr_x (p0, z0, -127))
+
+/*
+** qsubr_m128_s8_x:
+**     mov     (z[0-9]+\.b), #-128
+**     sqsub   z0\.b, \1, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m128_s8_x, svint8_t,
+               z0 = svqsubr_n_s8_x (p0, z0, -128),
+               z0 = svqsubr_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_u16.c
new file mode 100644 (file)
index 0000000..f406bf2
--- /dev/null
@@ -0,0 +1,331 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qsubr_u16_m_tied1:
+**     uqsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u16_m_tied1, svuint16_t,
+               z0 = svqsubr_u16_m (p0, z0, z1),
+               z0 = svqsubr_m (p0, z0, z1))
+
+/*
+** qsubr_u16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uqsubr  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u16_m_tied2, svuint16_t,
+               z0 = svqsubr_u16_m (p0, z1, z0),
+               z0 = svqsubr_m (p0, z1, z0))
+
+/*
+** qsubr_u16_m_untied:
+**     movprfx z0, z1
+**     uqsubr  z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u16_m_untied, svuint16_t,
+               z0 = svqsubr_u16_m (p0, z1, z2),
+               z0 = svqsubr_m (p0, z1, z2))
+
+/*
+** qsubr_w0_u16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uqsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_u16_m_tied1, svuint16_t, uint16_t,
+                z0 = svqsubr_n_u16_m (p0, z0, x0),
+                z0 = svqsubr_m (p0, z0, x0))
+
+/*
+** qsubr_w0_u16_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     uqsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_u16_m_untied, svuint16_t, uint16_t,
+                z0 = svqsubr_n_u16_m (p0, z1, x0),
+                z0 = svqsubr_m (p0, z1, x0))
+
+/*
+** qsubr_1_u16_m_tied1:
+**     mov     (z[0-9]+\.h), #1
+**     uqsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u16_m_tied1, svuint16_t,
+               z0 = svqsubr_n_u16_m (p0, z0, 1),
+               z0 = svqsubr_m (p0, z0, 1))
+
+/*
+** qsubr_1_u16_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.h), #1
+**     movprfx z0, z1
+**     uqsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u16_m_untied, svuint16_t,
+               z0 = svqsubr_n_u16_m (p0, z1, 1),
+               z0 = svqsubr_m (p0, z1, 1))
+
+/*
+** qsubr_m2_u16_m:
+**     mov     (z[0-9]+\.h), #-2
+**     uqsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m2_u16_m, svuint16_t,
+               z0 = svqsubr_n_u16_m (p0, z0, -2),
+               z0 = svqsubr_m (p0, z0, -2))
+
+/*
+** qsubr_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqsubr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u16_z_tied1, svuint16_t,
+               z0 = svqsubr_u16_z (p0, z0, z1),
+               z0 = svqsubr_z (p0, z0, z1))
+
+/*
+** qsubr_u16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqsub   z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u16_z_tied2, svuint16_t,
+               z0 = svqsubr_u16_z (p0, z1, z0),
+               z0 = svqsubr_z (p0, z1, z0))
+
+/*
+** qsubr_u16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uqsubr  z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0\.h, p0/z, z2\.h
+**     uqsub   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u16_z_untied, svuint16_t,
+               z0 = svqsubr_u16_z (p0, z1, z2),
+               z0 = svqsubr_z (p0, z1, z2))
+
+/*
+** qsubr_w0_u16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_u16_z_tied1, svuint16_t, uint16_t,
+                z0 = svqsubr_n_u16_z (p0, z0, x0),
+                z0 = svqsubr_z (p0, z0, x0))
+
+/*
+** qsubr_w0_u16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uqsubr  z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     uqsub   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_u16_z_untied, svuint16_t, uint16_t,
+                z0 = svqsubr_n_u16_z (p0, z1, x0),
+                z0 = svqsubr_z (p0, z1, x0))
+
+/*
+** qsubr_1_u16_z_tied1:
+**     mov     (z[0-9]+\.h), #1
+**     movprfx z0\.h, p0/z, z0\.h
+**     uqsubr  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u16_z_tied1, svuint16_t,
+               z0 = svqsubr_n_u16_z (p0, z0, 1),
+               z0 = svqsubr_z (p0, z0, 1))
+
+/*
+** qsubr_1_u16_z_untied:
+**     mov     (z[0-9]+\.h), #1
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     uqsubr  z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     uqsub   z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u16_z_untied, svuint16_t,
+               z0 = svqsubr_n_u16_z (p0, z1, 1),
+               z0 = svqsubr_z (p0, z1, 1))
+
+/*
+** qsubr_u16_x_tied1:
+**     uqsub   z0\.h, z1\.h, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u16_x_tied1, svuint16_t,
+               z0 = svqsubr_u16_x (p0, z0, z1),
+               z0 = svqsubr_x (p0, z0, z1))
+
+/*
+** qsubr_u16_x_tied2:
+**     uqsub   z0\.h, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u16_x_tied2, svuint16_t,
+               z0 = svqsubr_u16_x (p0, z1, z0),
+               z0 = svqsubr_x (p0, z1, z0))
+
+/*
+** qsubr_u16_x_untied:
+**     uqsub   z0\.h, z2\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u16_x_untied, svuint16_t,
+               z0 = svqsubr_u16_x (p0, z1, z2),
+               z0 = svqsubr_x (p0, z1, z2))
+
+/*
+** qsubr_w0_u16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     uqsub   z0\.h, \1, z0\.h
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_u16_x_tied1, svuint16_t, uint16_t,
+                z0 = svqsubr_n_u16_x (p0, z0, x0),
+                z0 = svqsubr_x (p0, z0, x0))
+
+/*
+** qsubr_w0_u16_x_untied:
+**     mov     (z[0-9]+\.h), w0
+**     uqsub   z0\.h, \1, z1\.h
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_u16_x_untied, svuint16_t, uint16_t,
+                z0 = svqsubr_n_u16_x (p0, z1, x0),
+                z0 = svqsubr_x (p0, z1, x0))
+
+/*
+** qsubr_1_u16_x_tied1:
+**     mov     (z[0-9]+\.h), #1
+**     uqsub   z0\.h, \1, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u16_x_tied1, svuint16_t,
+               z0 = svqsubr_n_u16_x (p0, z0, 1),
+               z0 = svqsubr_x (p0, z0, 1))
+
+/*
+** qsubr_1_u16_x_untied:
+**     mov     (z[0-9]+\.h), #1
+**     uqsub   z0\.h, \1, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u16_x_untied, svuint16_t,
+               z0 = svqsubr_n_u16_x (p0, z1, 1),
+               z0 = svqsubr_x (p0, z1, 1))
+
+/*
+** qsubr_127_u16_x:
+**     mov     (z[0-9]+\.h), #127
+**     uqsub   z0\.h, \1, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_127_u16_x, svuint16_t,
+               z0 = svqsubr_n_u16_x (p0, z0, 127),
+               z0 = svqsubr_x (p0, z0, 127))
+
+/*
+** qsubr_128_u16_x:
+**     mov     (z[0-9]+\.h), #128
+**     uqsub   z0\.h, \1, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_128_u16_x, svuint16_t,
+               z0 = svqsubr_n_u16_x (p0, z0, 128),
+               z0 = svqsubr_x (p0, z0, 128))
+
+/*
+** qsubr_255_u16_x:
+**     mov     (z[0-9]+\.h), #255
+**     uqsub   z0\.h, \1, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_255_u16_x, svuint16_t,
+               z0 = svqsubr_n_u16_x (p0, z0, 255),
+               z0 = svqsubr_x (p0, z0, 255))
+
+/*
+** qsubr_256_u16_x:
+**     mov     (z[0-9]+\.h), #256
+**     uqsub   z0\.h, \1, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_256_u16_x, svuint16_t,
+               z0 = svqsubr_n_u16_x (p0, z0, 256),
+               z0 = svqsubr_x (p0, z0, 256))
+
+/*
+** qsubr_257_u16_x:
+**     mov     (z[0-9]+)\.b, #1
+**     uqsub   z0\.h, \1\.h, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_257_u16_x, svuint16_t,
+               z0 = svqsubr_n_u16_x (p0, z0, 257),
+               z0 = svqsubr_x (p0, z0, 257))
+
+/*
+** qsubr_512_u16_x:
+**     mov     (z[0-9]+\.h), #512
+**     uqsub   z0\.h, \1, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_512_u16_x, svuint16_t,
+               z0 = svqsubr_n_u16_x (p0, z0, 512),
+               z0 = svqsubr_x (p0, z0, 512))
+
+/*
+** qsubr_65280_u16_x:
+**     mov     (z[0-9]+\.h), #-256
+**     uqsub   z0\.h, \1, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_65280_u16_x, svuint16_t,
+               z0 = svqsubr_n_u16_x (p0, z0, 0xff00),
+               z0 = svqsubr_x (p0, z0, 0xff00))
+
+/*
+** qsubr_m1_u16_x_tied1:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqsub   z0\.h, \1\.h, z0\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m1_u16_x_tied1, svuint16_t,
+               z0 = svqsubr_n_u16_x (p0, z0, -1),
+               z0 = svqsubr_x (p0, z0, -1))
+
+/*
+** qsubr_m1_u16_x_untied:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqsub   z0\.h, \1\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m1_u16_x_untied, svuint16_t,
+               z0 = svqsubr_n_u16_x (p0, z1, -1),
+               z0 = svqsubr_x (p0, z1, -1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_u32.c
new file mode 100644 (file)
index 0000000..5c4bc9e
--- /dev/null
@@ -0,0 +1,351 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qsubr_u32_m_tied1:
+**     uqsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u32_m_tied1, svuint32_t,
+               z0 = svqsubr_u32_m (p0, z0, z1),
+               z0 = svqsubr_m (p0, z0, z1))
+
+/*
+** qsubr_u32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uqsubr  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u32_m_tied2, svuint32_t,
+               z0 = svqsubr_u32_m (p0, z1, z0),
+               z0 = svqsubr_m (p0, z1, z0))
+
+/*
+** qsubr_u32_m_untied:
+**     movprfx z0, z1
+**     uqsubr  z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u32_m_untied, svuint32_t,
+               z0 = svqsubr_u32_m (p0, z1, z2),
+               z0 = svqsubr_m (p0, z1, z2))
+
+/*
+** qsubr_w0_u32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uqsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_u32_m_tied1, svuint32_t, uint32_t,
+                z0 = svqsubr_n_u32_m (p0, z0, x0),
+                z0 = svqsubr_m (p0, z0, x0))
+
+/*
+** qsubr_w0_u32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     uqsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_u32_m_untied, svuint32_t, uint32_t,
+                z0 = svqsubr_n_u32_m (p0, z1, x0),
+                z0 = svqsubr_m (p0, z1, x0))
+
+/*
+** qsubr_1_u32_m_tied1:
+**     mov     (z[0-9]+\.s), #1
+**     uqsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u32_m_tied1, svuint32_t,
+               z0 = svqsubr_n_u32_m (p0, z0, 1),
+               z0 = svqsubr_m (p0, z0, 1))
+
+/*
+** qsubr_1_u32_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.s), #1
+**     movprfx z0, z1
+**     uqsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u32_m_untied, svuint32_t,
+               z0 = svqsubr_n_u32_m (p0, z1, 1),
+               z0 = svqsubr_m (p0, z1, 1))
+
+/*
+** qsubr_m2_u32_m:
+**     mov     (z[0-9]+\.s), #-2
+**     uqsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m2_u32_m, svuint32_t,
+               z0 = svqsubr_n_u32_m (p0, z0, -2),
+               z0 = svqsubr_m (p0, z0, -2))
+
+/*
+** qsubr_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqsubr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u32_z_tied1, svuint32_t,
+               z0 = svqsubr_u32_z (p0, z0, z1),
+               z0 = svqsubr_z (p0, z0, z1))
+
+/*
+** qsubr_u32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqsub   z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u32_z_tied2, svuint32_t,
+               z0 = svqsubr_u32_z (p0, z1, z0),
+               z0 = svqsubr_z (p0, z1, z0))
+
+/*
+** qsubr_u32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uqsubr  z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0\.s, p0/z, z2\.s
+**     uqsub   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u32_z_untied, svuint32_t,
+               z0 = svqsubr_u32_z (p0, z1, z2),
+               z0 = svqsubr_z (p0, z1, z2))
+
+/*
+** qsubr_w0_u32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_u32_z_tied1, svuint32_t, uint32_t,
+                z0 = svqsubr_n_u32_z (p0, z0, x0),
+                z0 = svqsubr_z (p0, z0, x0))
+
+/*
+** qsubr_w0_u32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uqsubr  z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     uqsub   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_u32_z_untied, svuint32_t, uint32_t,
+                z0 = svqsubr_n_u32_z (p0, z1, x0),
+                z0 = svqsubr_z (p0, z1, x0))
+
+/*
+** qsubr_1_u32_z_tied1:
+**     mov     (z[0-9]+\.s), #1
+**     movprfx z0\.s, p0/z, z0\.s
+**     uqsubr  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u32_z_tied1, svuint32_t,
+               z0 = svqsubr_n_u32_z (p0, z0, 1),
+               z0 = svqsubr_z (p0, z0, 1))
+
+/*
+** qsubr_1_u32_z_untied:
+**     mov     (z[0-9]+\.s), #1
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     uqsubr  z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     uqsub   z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u32_z_untied, svuint32_t,
+               z0 = svqsubr_n_u32_z (p0, z1, 1),
+               z0 = svqsubr_z (p0, z1, 1))
+
+/*
+** qsubr_u32_x_tied1:
+**     uqsub   z0\.s, z1\.s, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u32_x_tied1, svuint32_t,
+               z0 = svqsubr_u32_x (p0, z0, z1),
+               z0 = svqsubr_x (p0, z0, z1))
+
+/*
+** qsubr_u32_x_tied2:
+**     uqsub   z0\.s, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u32_x_tied2, svuint32_t,
+               z0 = svqsubr_u32_x (p0, z1, z0),
+               z0 = svqsubr_x (p0, z1, z0))
+
+/*
+** qsubr_u32_x_untied:
+**     uqsub   z0\.s, z2\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u32_x_untied, svuint32_t,
+               z0 = svqsubr_u32_x (p0, z1, z2),
+               z0 = svqsubr_x (p0, z1, z2))
+
+/*
+** qsubr_w0_u32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     uqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_u32_x_tied1, svuint32_t, uint32_t,
+                z0 = svqsubr_n_u32_x (p0, z0, x0),
+                z0 = svqsubr_x (p0, z0, x0))
+
+/*
+** qsubr_w0_u32_x_untied:
+**     mov     (z[0-9]+\.s), w0
+**     uqsub   z0\.s, \1, z1\.s
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_u32_x_untied, svuint32_t, uint32_t,
+                z0 = svqsubr_n_u32_x (p0, z1, x0),
+                z0 = svqsubr_x (p0, z1, x0))
+
+/*
+** qsubr_1_u32_x_tied1:
+**     mov     (z[0-9]+\.s), #1
+**     uqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u32_x_tied1, svuint32_t,
+               z0 = svqsubr_n_u32_x (p0, z0, 1),
+               z0 = svqsubr_x (p0, z0, 1))
+
+/*
+** qsubr_1_u32_x_untied:
+**     mov     (z[0-9]+\.s), #1
+**     uqsub   z0\.s, \1, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u32_x_untied, svuint32_t,
+               z0 = svqsubr_n_u32_x (p0, z1, 1),
+               z0 = svqsubr_x (p0, z1, 1))
+
+/*
+** qsubr_127_u32_x:
+**     mov     (z[0-9]+\.s), #127
+**     uqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_127_u32_x, svuint32_t,
+               z0 = svqsubr_n_u32_x (p0, z0, 127),
+               z0 = svqsubr_x (p0, z0, 127))
+
+/*
+** qsubr_128_u32_x:
+**     mov     (z[0-9]+\.s), #128
+**     uqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_128_u32_x, svuint32_t,
+               z0 = svqsubr_n_u32_x (p0, z0, 128),
+               z0 = svqsubr_x (p0, z0, 128))
+
+/*
+** qsubr_255_u32_x:
+**     mov     (z[0-9]+\.s), #255
+**     uqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_255_u32_x, svuint32_t,
+               z0 = svqsubr_n_u32_x (p0, z0, 255),
+               z0 = svqsubr_x (p0, z0, 255))
+
+/*
+** qsubr_256_u32_x:
+**     mov     (z[0-9]+\.s), #256
+**     uqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_256_u32_x, svuint32_t,
+               z0 = svqsubr_n_u32_x (p0, z0, 256),
+               z0 = svqsubr_x (p0, z0, 256))
+
+/*
+** qsubr_511_u32_x:
+**     mov     (z[0-9]+\.s), #511
+**     uqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_511_u32_x, svuint32_t,
+               z0 = svqsubr_n_u32_x (p0, z0, 511),
+               z0 = svqsubr_x (p0, z0, 511))
+
+/*
+** qsubr_512_u32_x:
+**     mov     (z[0-9]+\.s), #512
+**     uqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_512_u32_x, svuint32_t,
+               z0 = svqsubr_n_u32_x (p0, z0, 512),
+               z0 = svqsubr_x (p0, z0, 512))
+
+/*
+** qsubr_65280_u32_x:
+**     mov     (z[0-9]+\.s), #65280
+**     uqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_65280_u32_x, svuint32_t,
+               z0 = svqsubr_n_u32_x (p0, z0, 0xff00),
+               z0 = svqsubr_x (p0, z0, 0xff00))
+
+/*
+** qsubr_65535_u32_x:
+**     mov     (z[0-9]+\.s), #65535
+**     uqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_65535_u32_x, svuint32_t,
+               z0 = svqsubr_n_u32_x (p0, z0, 65535),
+               z0 = svqsubr_x (p0, z0, 65535))
+
+/*
+** qsubr_65536_u32_x:
+**     mov     (z[0-9]+\.s), #65536
+**     uqsub   z0\.s, \1, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_65536_u32_x, svuint32_t,
+               z0 = svqsubr_n_u32_x (p0, z0, 65536),
+               z0 = svqsubr_x (p0, z0, 65536))
+
+/*
+** qsubr_m1_u32_x_tied1:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqsub   z0\.s, \1\.s, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m1_u32_x_tied1, svuint32_t,
+               z0 = svqsubr_n_u32_x (p0, z0, -1),
+               z0 = svqsubr_x (p0, z0, -1))
+
+/*
+** qsubr_m1_u32_x_untied:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqsub   z0\.s, \1\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m1_u32_x_untied, svuint32_t,
+               z0 = svqsubr_n_u32_x (p0, z1, -1),
+               z0 = svqsubr_x (p0, z1, -1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_u64.c
new file mode 100644 (file)
index 0000000..d0d146e
--- /dev/null
@@ -0,0 +1,351 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qsubr_u64_m_tied1:
+**     uqsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u64_m_tied1, svuint64_t,
+               z0 = svqsubr_u64_m (p0, z0, z1),
+               z0 = svqsubr_m (p0, z0, z1))
+
+/*
+** qsubr_u64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     uqsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u64_m_tied2, svuint64_t,
+               z0 = svqsubr_u64_m (p0, z1, z0),
+               z0 = svqsubr_m (p0, z1, z0))
+
+/*
+** qsubr_u64_m_untied:
+**     movprfx z0, z1
+**     uqsubr  z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u64_m_untied, svuint64_t,
+               z0 = svqsubr_u64_m (p0, z1, z2),
+               z0 = svqsubr_m (p0, z1, z2))
+
+/*
+** qsubr_x0_u64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     uqsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_x0_u64_m_tied1, svuint64_t, uint64_t,
+                z0 = svqsubr_n_u64_m (p0, z0, x0),
+                z0 = svqsubr_m (p0, z0, x0))
+
+/*
+** qsubr_x0_u64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     uqsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_x0_u64_m_untied, svuint64_t, uint64_t,
+                z0 = svqsubr_n_u64_m (p0, z1, x0),
+                z0 = svqsubr_m (p0, z1, x0))
+
+/*
+** qsubr_1_u64_m_tied1:
+**     mov     (z[0-9]+\.d), #1
+**     uqsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u64_m_tied1, svuint64_t,
+               z0 = svqsubr_n_u64_m (p0, z0, 1),
+               z0 = svqsubr_m (p0, z0, 1))
+
+/*
+** qsubr_1_u64_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.d), #1
+**     movprfx z0, z1
+**     uqsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u64_m_untied, svuint64_t,
+               z0 = svqsubr_n_u64_m (p0, z1, 1),
+               z0 = svqsubr_m (p0, z1, 1))
+
+/*
+** qsubr_m2_u64_m:
+**     mov     (z[0-9]+\.d), #-2
+**     uqsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m2_u64_m, svuint64_t,
+               z0 = svqsubr_n_u64_m (p0, z0, -2),
+               z0 = svqsubr_m (p0, z0, -2))
+
+/*
+** qsubr_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqsubr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u64_z_tied1, svuint64_t,
+               z0 = svqsubr_u64_z (p0, z0, z1),
+               z0 = svqsubr_z (p0, z0, z1))
+
+/*
+** qsubr_u64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqsub   z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u64_z_tied2, svuint64_t,
+               z0 = svqsubr_u64_z (p0, z1, z0),
+               z0 = svqsubr_z (p0, z1, z0))
+
+/*
+** qsubr_u64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uqsubr  z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0\.d, p0/z, z2\.d
+**     uqsub   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u64_z_untied, svuint64_t,
+               z0 = svqsubr_u64_z (p0, z1, z2),
+               z0 = svqsubr_z (p0, z1, z2))
+
+/*
+** qsubr_x0_u64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_x0_u64_z_tied1, svuint64_t, uint64_t,
+                z0 = svqsubr_n_u64_z (p0, z0, x0),
+                z0 = svqsubr_z (p0, z0, x0))
+
+/*
+** qsubr_x0_u64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uqsubr  z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     uqsub   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_x0_u64_z_untied, svuint64_t, uint64_t,
+                z0 = svqsubr_n_u64_z (p0, z1, x0),
+                z0 = svqsubr_z (p0, z1, x0))
+
+/*
+** qsubr_1_u64_z_tied1:
+**     mov     (z[0-9]+\.d), #1
+**     movprfx z0\.d, p0/z, z0\.d
+**     uqsubr  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u64_z_tied1, svuint64_t,
+               z0 = svqsubr_n_u64_z (p0, z0, 1),
+               z0 = svqsubr_z (p0, z0, 1))
+
+/*
+** qsubr_1_u64_z_untied:
+**     mov     (z[0-9]+\.d), #1
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     uqsubr  z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     uqsub   z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u64_z_untied, svuint64_t,
+               z0 = svqsubr_n_u64_z (p0, z1, 1),
+               z0 = svqsubr_z (p0, z1, 1))
+
+/*
+** qsubr_u64_x_tied1:
+**     uqsub   z0\.d, z1\.d, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u64_x_tied1, svuint64_t,
+               z0 = svqsubr_u64_x (p0, z0, z1),
+               z0 = svqsubr_x (p0, z0, z1))
+
+/*
+** qsubr_u64_x_tied2:
+**     uqsub   z0\.d, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u64_x_tied2, svuint64_t,
+               z0 = svqsubr_u64_x (p0, z1, z0),
+               z0 = svqsubr_x (p0, z1, z0))
+
+/*
+** qsubr_u64_x_untied:
+**     uqsub   z0\.d, z2\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u64_x_untied, svuint64_t,
+               z0 = svqsubr_u64_x (p0, z1, z2),
+               z0 = svqsubr_x (p0, z1, z2))
+
+/*
+** qsubr_x0_u64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     uqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_x0_u64_x_tied1, svuint64_t, uint64_t,
+                z0 = svqsubr_n_u64_x (p0, z0, x0),
+                z0 = svqsubr_x (p0, z0, x0))
+
+/*
+** qsubr_x0_u64_x_untied:
+**     mov     (z[0-9]+\.d), x0
+**     uqsub   z0\.d, \1, z1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_x0_u64_x_untied, svuint64_t, uint64_t,
+                z0 = svqsubr_n_u64_x (p0, z1, x0),
+                z0 = svqsubr_x (p0, z1, x0))
+
+/*
+** qsubr_1_u64_x_tied1:
+**     mov     (z[0-9]+\.d), #1
+**     uqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u64_x_tied1, svuint64_t,
+               z0 = svqsubr_n_u64_x (p0, z0, 1),
+               z0 = svqsubr_x (p0, z0, 1))
+
+/*
+** qsubr_1_u64_x_untied:
+**     mov     (z[0-9]+\.d), #1
+**     uqsub   z0\.d, \1, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u64_x_untied, svuint64_t,
+               z0 = svqsubr_n_u64_x (p0, z1, 1),
+               z0 = svqsubr_x (p0, z1, 1))
+
+/*
+** qsubr_127_u64_x:
+**     mov     (z[0-9]+\.d), #127
+**     uqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_127_u64_x, svuint64_t,
+               z0 = svqsubr_n_u64_x (p0, z0, 127),
+               z0 = svqsubr_x (p0, z0, 127))
+
+/*
+** qsubr_128_u64_x:
+**     mov     (z[0-9]+\.d), #128
+**     uqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_128_u64_x, svuint64_t,
+               z0 = svqsubr_n_u64_x (p0, z0, 128),
+               z0 = svqsubr_x (p0, z0, 128))
+
+/*
+** qsubr_255_u64_x:
+**     mov     (z[0-9]+\.d), #255
+**     uqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_255_u64_x, svuint64_t,
+               z0 = svqsubr_n_u64_x (p0, z0, 255),
+               z0 = svqsubr_x (p0, z0, 255))
+
+/*
+** qsubr_256_u64_x:
+**     mov     (z[0-9]+\.d), #256
+**     uqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_256_u64_x, svuint64_t,
+               z0 = svqsubr_n_u64_x (p0, z0, 256),
+               z0 = svqsubr_x (p0, z0, 256))
+
+/*
+** qsubr_511_u64_x:
+**     mov     (z[0-9]+\.d), #511
+**     uqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_511_u64_x, svuint64_t,
+               z0 = svqsubr_n_u64_x (p0, z0, 511),
+               z0 = svqsubr_x (p0, z0, 511))
+
+/*
+** qsubr_512_u64_x:
+**     mov     (z[0-9]+\.d), #512
+**     uqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_512_u64_x, svuint64_t,
+               z0 = svqsubr_n_u64_x (p0, z0, 512),
+               z0 = svqsubr_x (p0, z0, 512))
+
+/*
+** qsubr_65280_u64_x:
+**     mov     (z[0-9]+\.d), #65280
+**     uqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_65280_u64_x, svuint64_t,
+               z0 = svqsubr_n_u64_x (p0, z0, 0xff00),
+               z0 = svqsubr_x (p0, z0, 0xff00))
+
+/*
+** qsubr_65535_u64_x:
+**     mov     (z[0-9]+\.d), #65535
+**     uqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_65535_u64_x, svuint64_t,
+               z0 = svqsubr_n_u64_x (p0, z0, 65535),
+               z0 = svqsubr_x (p0, z0, 65535))
+
+/*
+** qsubr_65536_u64_x:
+**     mov     (z[0-9]+\.d), #65536
+**     uqsub   z0\.d, \1, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_65536_u64_x, svuint64_t,
+               z0 = svqsubr_n_u64_x (p0, z0, 65536),
+               z0 = svqsubr_x (p0, z0, 65536))
+
+/*
+** qsubr_m1_u64_x_tied1:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqsub   z0\.d, \1\.d, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m1_u64_x_tied1, svuint64_t,
+               z0 = svqsubr_n_u64_x (p0, z0, -1),
+               z0 = svqsubr_x (p0, z0, -1))
+
+/*
+** qsubr_m1_u64_x_untied:
+**     mov     (z[0-9]+)\.b, #-1
+**     uqsub   z0\.d, \1\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m1_u64_x_untied, svuint64_t,
+               z0 = svqsubr_n_u64_x (p0, z1, -1),
+               z0 = svqsubr_x (p0, z1, -1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qsubr_u8.c
new file mode 100644 (file)
index 0000000..7b487fd
--- /dev/null
@@ -0,0 +1,301 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qsubr_u8_m_tied1:
+**     uqsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u8_m_tied1, svuint8_t,
+               z0 = svqsubr_u8_m (p0, z0, z1),
+               z0 = svqsubr_m (p0, z0, z1))
+
+/*
+** qsubr_u8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     uqsubr  z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u8_m_tied2, svuint8_t,
+               z0 = svqsubr_u8_m (p0, z1, z0),
+               z0 = svqsubr_m (p0, z1, z0))
+
+/*
+** qsubr_u8_m_untied:
+**     movprfx z0, z1
+**     uqsubr  z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u8_m_untied, svuint8_t,
+               z0 = svqsubr_u8_m (p0, z1, z2),
+               z0 = svqsubr_m (p0, z1, z2))
+
+/*
+** qsubr_w0_u8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uqsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_u8_m_tied1, svuint8_t, uint8_t,
+                z0 = svqsubr_n_u8_m (p0, z0, x0),
+                z0 = svqsubr_m (p0, z0, x0))
+
+/*
+** qsubr_w0_u8_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     uqsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_u8_m_untied, svuint8_t, uint8_t,
+                z0 = svqsubr_n_u8_m (p0, z1, x0),
+                z0 = svqsubr_m (p0, z1, x0))
+
+/*
+** qsubr_1_u8_m_tied1:
+**     mov     (z[0-9]+\.b), #1
+**     uqsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u8_m_tied1, svuint8_t,
+               z0 = svqsubr_n_u8_m (p0, z0, 1),
+               z0 = svqsubr_m (p0, z0, 1))
+
+/*
+** qsubr_1_u8_m_untied: { xfail *-*-* }
+**     mov     (z[0-9]+\.b), #1
+**     movprfx z0, z1
+**     uqsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u8_m_untied, svuint8_t,
+               z0 = svqsubr_n_u8_m (p0, z1, 1),
+               z0 = svqsubr_m (p0, z1, 1))
+
+/*
+** qsubr_m1_u8_m:
+**     mov     (z[0-9]+\.b), #-1
+**     uqsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m1_u8_m, svuint8_t,
+               z0 = svqsubr_n_u8_m (p0, z0, -1),
+               z0 = svqsubr_m (p0, z0, -1))
+
+/*
+** qsubr_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqsubr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u8_z_tied1, svuint8_t,
+               z0 = svqsubr_u8_z (p0, z0, z1),
+               z0 = svqsubr_z (p0, z0, z1))
+
+/*
+** qsubr_u8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqsub   z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u8_z_tied2, svuint8_t,
+               z0 = svqsubr_u8_z (p0, z1, z0),
+               z0 = svqsubr_z (p0, z1, z0))
+
+/*
+** qsubr_u8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uqsubr  z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0\.b, p0/z, z2\.b
+**     uqsub   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u8_z_untied, svuint8_t,
+               z0 = svqsubr_u8_z (p0, z1, z2),
+               z0 = svqsubr_z (p0, z1, z2))
+
+/*
+** qsubr_w0_u8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_u8_z_tied1, svuint8_t, uint8_t,
+                z0 = svqsubr_n_u8_z (p0, z0, x0),
+                z0 = svqsubr_z (p0, z0, x0))
+
+/*
+** qsubr_w0_u8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uqsubr  z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     uqsub   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_u8_z_untied, svuint8_t, uint8_t,
+                z0 = svqsubr_n_u8_z (p0, z1, x0),
+                z0 = svqsubr_z (p0, z1, x0))
+
+/*
+** qsubr_1_u8_z_tied1:
+**     mov     (z[0-9]+\.b), #1
+**     movprfx z0\.b, p0/z, z0\.b
+**     uqsubr  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u8_z_tied1, svuint8_t,
+               z0 = svqsubr_n_u8_z (p0, z0, 1),
+               z0 = svqsubr_z (p0, z0, 1))
+
+/*
+** qsubr_1_u8_z_untied:
+**     mov     (z[0-9]+\.b), #1
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     uqsubr  z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     uqsub   z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u8_z_untied, svuint8_t,
+               z0 = svqsubr_n_u8_z (p0, z1, 1),
+               z0 = svqsubr_z (p0, z1, 1))
+
+/*
+** qsubr_u8_x_tied1:
+**     uqsub   z0\.b, z1\.b, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u8_x_tied1, svuint8_t,
+               z0 = svqsubr_u8_x (p0, z0, z1),
+               z0 = svqsubr_x (p0, z0, z1))
+
+/*
+** qsubr_u8_x_tied2:
+**     uqsub   z0\.b, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u8_x_tied2, svuint8_t,
+               z0 = svqsubr_u8_x (p0, z1, z0),
+               z0 = svqsubr_x (p0, z1, z0))
+
+/*
+** qsubr_u8_x_untied:
+**     uqsub   z0\.b, z2\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_u8_x_untied, svuint8_t,
+               z0 = svqsubr_u8_x (p0, z1, z2),
+               z0 = svqsubr_x (p0, z1, z2))
+
+/*
+** qsubr_w0_u8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     uqsub   z0\.b, \1, z0\.b
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_u8_x_tied1, svuint8_t, uint8_t,
+                z0 = svqsubr_n_u8_x (p0, z0, x0),
+                z0 = svqsubr_x (p0, z0, x0))
+
+/*
+** qsubr_w0_u8_x_untied:
+**     mov     (z[0-9]+\.b), w0
+**     uqsub   z0\.b, \1, z1\.b
+**     ret
+*/
+TEST_UNIFORM_ZX (qsubr_w0_u8_x_untied, svuint8_t, uint8_t,
+                z0 = svqsubr_n_u8_x (p0, z1, x0),
+                z0 = svqsubr_x (p0, z1, x0))
+
+/*
+** qsubr_1_u8_x_tied1:
+**     mov     (z[0-9]+\.b), #1
+**     uqsub   z0\.b, \1, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u8_x_tied1, svuint8_t,
+               z0 = svqsubr_n_u8_x (p0, z0, 1),
+               z0 = svqsubr_x (p0, z0, 1))
+
+/*
+** qsubr_1_u8_x_untied:
+**     mov     (z[0-9]+\.b), #1
+**     uqsub   z0\.b, \1, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_1_u8_x_untied, svuint8_t,
+               z0 = svqsubr_n_u8_x (p0, z1, 1),
+               z0 = svqsubr_x (p0, z1, 1))
+
+/*
+** qsubr_127_u8_x:
+**     mov     (z[0-9]+\.b), #127
+**     uqsub   z0\.b, \1, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_127_u8_x, svuint8_t,
+               z0 = svqsubr_n_u8_x (p0, z0, 127),
+               z0 = svqsubr_x (p0, z0, 127))
+
+/*
+** qsubr_128_u8_x:
+**     mov     (z[0-9]+\.b), #-128
+**     uqsub   z0\.b, \1, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_128_u8_x, svuint8_t,
+               z0 = svqsubr_n_u8_x (p0, z0, 128),
+               z0 = svqsubr_x (p0, z0, 128))
+
+/*
+** qsubr_255_u8_x:
+**     mov     (z[0-9]+\.b), #-1
+**     uqsub   z0\.b, \1, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_255_u8_x, svuint8_t,
+               z0 = svqsubr_n_u8_x (p0, z0, 255),
+               z0 = svqsubr_x (p0, z0, 255))
+
+/*
+** qsubr_m1_u8_x:
+**     mov     (z[0-9]+\.b), #-1
+**     uqsub   z0\.b, \1, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m1_u8_x, svuint8_t,
+               z0 = svqsubr_n_u8_x (p0, z0, -1),
+               z0 = svqsubr_x (p0, z0, -1))
+
+/*
+** qsubr_m127_u8_x:
+**     mov     (z[0-9]+\.b), #-127
+**     uqsub   z0\.b, \1, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m127_u8_x, svuint8_t,
+               z0 = svqsubr_n_u8_x (p0, z0, -127),
+               z0 = svqsubr_x (p0, z0, -127))
+
+/*
+** qsubr_m128_u8_x:
+**     mov     (z[0-9]+\.b), #-128
+**     uqsub   z0\.b, \1, z0\.b
+**     ret
+*/
+TEST_UNIFORM_Z (qsubr_m128_u8_x, svuint8_t,
+               z0 = svqsubr_n_u8_x (p0, z0, -128),
+               z0 = svqsubr_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnb_s16.c
new file mode 100644 (file)
index 0000000..269c3c1
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qxtnb_s16:
+**     sqxtnb  z0\.b, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qxtnb_s16, svint8_t, svint16_t,
+            z0 = svqxtnb_s16 (z4),
+            z0 = svqxtnb (z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnb_s32.c
new file mode 100644 (file)
index 0000000..d698893
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qxtnb_s32:
+**     sqxtnb  z0\.h, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qxtnb_s32, svint16_t, svint32_t,
+            z0 = svqxtnb_s32 (z4),
+            z0 = svqxtnb (z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnb_s64.c
new file mode 100644 (file)
index 0000000..5eed221
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qxtnb_s64:
+**     sqxtnb  z0\.s, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qxtnb_s64, svint32_t, svint64_t,
+            z0 = svqxtnb_s64 (z4),
+            z0 = svqxtnb (z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnb_u16.c
new file mode 100644 (file)
index 0000000..dd3792a
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qxtnb_u16:
+**     uqxtnb  z0\.b, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qxtnb_u16, svuint8_t, svuint16_t,
+            z0 = svqxtnb_u16 (z4),
+            z0 = svqxtnb (z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnb_u32.c
new file mode 100644 (file)
index 0000000..7f19ead
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qxtnb_u32:
+**     uqxtnb  z0\.h, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qxtnb_u32, svuint16_t, svuint32_t,
+            z0 = svqxtnb_u32 (z4),
+            z0 = svqxtnb (z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnb_u64.c
new file mode 100644 (file)
index 0000000..d21a985
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qxtnb_u64:
+**     uqxtnb  z0\.s, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qxtnb_u64, svuint32_t, svuint64_t,
+            z0 = svqxtnb_u64 (z4),
+            z0 = svqxtnb (z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnt_s16.c
new file mode 100644 (file)
index 0000000..323c37e
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qxtnt_s16_tied1:
+**     sqxtnt  z0\.b, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qxtnt_s16_tied1, svint8_t, svint16_t,
+            z0 = svqxtnt_s16 (z0, z4),
+            z0 = svqxtnt (z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (qxtnt_s16_tied2, svint8_t, svint16_t,
+                z0_res = svqxtnt_s16 (z4, z0),
+                z0_res = svqxtnt (z4, z0))
+
+/*
+** qxtnt_s16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     sqxtnt  z0\.b, z4\.h
+** |
+**     sqxtnt  z1\.b, z4\.h
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qxtnt_s16_untied, svint8_t, svint16_t,
+            z0 = svqxtnt_s16 (z1, z4),
+            z0 = svqxtnt (z1, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnt_s32.c
new file mode 100644 (file)
index 0000000..62169b6
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qxtnt_s32_tied1:
+**     sqxtnt  z0\.h, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qxtnt_s32_tied1, svint16_t, svint32_t,
+            z0 = svqxtnt_s32 (z0, z4),
+            z0 = svqxtnt (z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (qxtnt_s32_tied2, svint16_t, svint32_t,
+                z0_res = svqxtnt_s32 (z4, z0),
+                z0_res = svqxtnt (z4, z0))
+
+/*
+** qxtnt_s32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     sqxtnt  z0\.h, z4\.s
+** |
+**     sqxtnt  z1\.h, z4\.s
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qxtnt_s32_untied, svint16_t, svint32_t,
+            z0 = svqxtnt_s32 (z1, z4),
+            z0 = svqxtnt (z1, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnt_s64.c
new file mode 100644 (file)
index 0000000..4a3faeb
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qxtnt_s64_tied1:
+**     sqxtnt  z0\.s, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qxtnt_s64_tied1, svint32_t, svint64_t,
+            z0 = svqxtnt_s64 (z0, z4),
+            z0 = svqxtnt (z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (qxtnt_s64_tied2, svint32_t, svint64_t,
+                z0_res = svqxtnt_s64 (z4, z0),
+                z0_res = svqxtnt (z4, z0))
+
+/*
+** qxtnt_s64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     sqxtnt  z0\.s, z4\.d
+** |
+**     sqxtnt  z1\.s, z4\.d
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qxtnt_s64_untied, svint32_t, svint64_t,
+            z0 = svqxtnt_s64 (z1, z4),
+            z0 = svqxtnt (z1, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnt_u16.c
new file mode 100644 (file)
index 0000000..b5a3047
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qxtnt_u16_tied1:
+**     uqxtnt  z0\.b, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qxtnt_u16_tied1, svuint8_t, svuint16_t,
+            z0 = svqxtnt_u16 (z0, z4),
+            z0 = svqxtnt (z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (qxtnt_u16_tied2, svuint8_t, svuint16_t,
+                z0_res = svqxtnt_u16 (z4, z0),
+                z0_res = svqxtnt (z4, z0))
+
+/*
+** qxtnt_u16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     uqxtnt  z0\.b, z4\.h
+** |
+**     uqxtnt  z1\.b, z4\.h
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qxtnt_u16_untied, svuint8_t, svuint16_t,
+            z0 = svqxtnt_u16 (z1, z4),
+            z0 = svqxtnt (z1, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnt_u32.c
new file mode 100644 (file)
index 0000000..691b254
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qxtnt_u32_tied1:
+**     uqxtnt  z0\.h, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qxtnt_u32_tied1, svuint16_t, svuint32_t,
+            z0 = svqxtnt_u32 (z0, z4),
+            z0 = svqxtnt (z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (qxtnt_u32_tied2, svuint16_t, svuint32_t,
+                z0_res = svqxtnt_u32 (z4, z0),
+                z0_res = svqxtnt (z4, z0))
+
+/*
+** qxtnt_u32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     uqxtnt  z0\.h, z4\.s
+** |
+**     uqxtnt  z1\.h, z4\.s
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qxtnt_u32_untied, svuint16_t, svuint32_t,
+            z0 = svqxtnt_u32 (z1, z4),
+            z0 = svqxtnt (z1, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtnt_u64.c
new file mode 100644 (file)
index 0000000..9b8ce1a
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qxtnt_u64_tied1:
+**     uqxtnt  z0\.s, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qxtnt_u64_tied1, svuint32_t, svuint64_t,
+            z0 = svqxtnt_u64 (z0, z4),
+            z0 = svqxtnt (z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (qxtnt_u64_tied2, svuint32_t, svuint64_t,
+                z0_res = svqxtnt_u64 (z4, z0),
+                z0_res = svqxtnt (z4, z0))
+
+/*
+** qxtnt_u64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     uqxtnt  z0\.s, z4\.d
+** |
+**     uqxtnt  z1\.s, z4\.d
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qxtnt_u64_untied, svuint32_t, svuint64_t,
+            z0 = svqxtnt_u64 (z1, z4),
+            z0 = svqxtnt (z1, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtunb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtunb_s16.c
new file mode 100644 (file)
index 0000000..405facc
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qxtunb_s16:
+**     sqxtunb z0\.b, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qxtunb_s16, svuint8_t, svint16_t,
+            z0 = svqxtunb_s16 (z4),
+            z0 = svqxtunb (z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtunb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtunb_s32.c
new file mode 100644 (file)
index 0000000..874d183
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qxtunb_s32:
+**     sqxtunb z0\.h, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qxtunb_s32, svuint16_t, svint32_t,
+            z0 = svqxtunb_s32 (z4),
+            z0 = svqxtunb (z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtunb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtunb_s64.c
new file mode 100644 (file)
index 0000000..0dd77f2
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qxtunb_s64:
+**     sqxtunb z0\.s, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qxtunb_s64, svuint32_t, svint64_t,
+            z0 = svqxtunb_s64 (z4),
+            z0 = svqxtunb (z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtunt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtunt_s16.c
new file mode 100644 (file)
index 0000000..2476435
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qxtunt_s16_tied1:
+**     sqxtunt z0\.b, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (qxtunt_s16_tied1, svuint8_t, svint16_t,
+            z0 = svqxtunt_s16 (z0, z4),
+            z0 = svqxtunt (z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (qxtunt_s16_tied2, svuint8_t, svint16_t,
+                z0_res = svqxtunt_s16 (z4, z0),
+                z0_res = svqxtunt (z4, z0))
+
+/*
+** qxtunt_s16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     sqxtunt z0\.b, z4\.h
+** |
+**     sqxtunt z1\.b, z4\.h
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qxtunt_s16_untied, svuint8_t, svint16_t,
+            z0 = svqxtunt_s16 (z1, z4),
+            z0 = svqxtunt (z1, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtunt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtunt_s32.c
new file mode 100644 (file)
index 0000000..65c3af3
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qxtunt_s32_tied1:
+**     sqxtunt z0\.h, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (qxtunt_s32_tied1, svuint16_t, svint32_t,
+            z0 = svqxtunt_s32 (z0, z4),
+            z0 = svqxtunt (z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (qxtunt_s32_tied2, svuint16_t, svint32_t,
+                z0_res = svqxtunt_s32 (z4, z0),
+                z0_res = svqxtunt (z4, z0))
+
+/*
+** qxtunt_s32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     sqxtunt z0\.h, z4\.s
+** |
+**     sqxtunt z1\.h, z4\.s
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qxtunt_s32_untied, svuint16_t, svint32_t,
+            z0 = svqxtunt_s32 (z1, z4),
+            z0 = svqxtunt (z1, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtunt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/qxtunt_s64.c
new file mode 100644 (file)
index 0000000..77fc3a0
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** qxtunt_s64_tied1:
+**     sqxtunt z0\.s, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (qxtunt_s64_tied1, svuint32_t, svint64_t,
+            z0 = svqxtunt_s64 (z0, z4),
+            z0 = svqxtunt (z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (qxtunt_s64_tied2, svuint32_t, svint64_t,
+                z0_res = svqxtunt_s64 (z4, z0),
+                z0_res = svqxtunt (z4, z0))
+
+/*
+** qxtunt_s64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     sqxtunt z0\.s, z4\.d
+** |
+**     sqxtunt z1\.s, z4\.d
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (qxtunt_s64_untied, svuint32_t, svint64_t,
+            z0 = svqxtunt_s64 (z1, z4),
+            z0 = svqxtunt (z1, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnb_s16.c
new file mode 100644 (file)
index 0000000..e7e9219
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** raddhnb_s16_tied1:
+**     raddhnb z0\.b, (z0\.h, z1\.h|z1\.h, z0\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_s16_tied1, svint8_t, svint16_t,
+                   z0_res = svraddhnb_s16 (z0, z1),
+                   z0_res = svraddhnb (z0, z1))
+
+/*
+** raddhnb_s16_tied2:
+**     raddhnb z0\.b, (z0\.h, z1\.h|z1\.h, z0\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_s16_tied2, svint8_t, svint16_t,
+                   z0_res = svraddhnb_s16 (z1, z0),
+                   z0_res = svraddhnb (z1, z0))
+
+/*
+** raddhnb_s16_untied:
+**     raddhnb z0\.b, (z1\.h, z2\.h|z2\.h, z1\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_s16_untied, svint8_t, svint16_t,
+                   z0_res = svraddhnb_s16 (z1, z2),
+                   z0_res = svraddhnb (z1, z2))
+
+/*
+** raddhnb_w0_s16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     raddhnb z0\.b, (z0\.h, \1|\1, z0\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (raddhnb_w0_s16_tied1, svint8_t, svint16_t, int16_t,
+                    z0_res = svraddhnb_n_s16 (z0, x0),
+                    z0_res = svraddhnb (z0, x0))
+
+/*
+** raddhnb_w0_s16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     raddhnb z0\.b, (z1\.h, \1|\1, z1\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (raddhnb_w0_s16_untied, svint8_t, svint16_t, int16_t,
+                    z0_res = svraddhnb_n_s16 (z1, x0),
+                    z0_res = svraddhnb (z1, x0))
+
+/*
+** raddhnb_11_s16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     raddhnb z0\.b, (z0\.h, \1|\1, z0\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_11_s16_tied1, svint8_t, svint16_t,
+                   z0_res = svraddhnb_n_s16 (z0, 11),
+                   z0_res = svraddhnb (z0, 11))
+
+/*
+** raddhnb_11_s16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     raddhnb z0\.b, (z1\.h, \1|\1, z1\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_11_s16_untied, svint8_t, svint16_t,
+                   z0_res = svraddhnb_n_s16 (z1, 11),
+                   z0_res = svraddhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnb_s32.c
new file mode 100644 (file)
index 0000000..d31284f
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** raddhnb_s32_tied1:
+**     raddhnb z0\.h, (z0\.s, z1\.s|z1\.s, z0\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_s32_tied1, svint16_t, svint32_t,
+                   z0_res = svraddhnb_s32 (z0, z1),
+                   z0_res = svraddhnb (z0, z1))
+
+/*
+** raddhnb_s32_tied2:
+**     raddhnb z0\.h, (z0\.s, z1\.s|z1\.s, z0\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_s32_tied2, svint16_t, svint32_t,
+                   z0_res = svraddhnb_s32 (z1, z0),
+                   z0_res = svraddhnb (z1, z0))
+
+/*
+** raddhnb_s32_untied:
+**     raddhnb z0\.h, (z1\.s, z2\.s|z2\.s, z1\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_s32_untied, svint16_t, svint32_t,
+                   z0_res = svraddhnb_s32 (z1, z2),
+                   z0_res = svraddhnb (z1, z2))
+
+/*
+** raddhnb_w0_s32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     raddhnb z0\.h, (z0\.s, \1|\1, z0\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (raddhnb_w0_s32_tied1, svint16_t, svint32_t, int32_t,
+                    z0_res = svraddhnb_n_s32 (z0, x0),
+                    z0_res = svraddhnb (z0, x0))
+
+/*
+** raddhnb_w0_s32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     raddhnb z0\.h, (z1\.s, \1|\1, z1\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (raddhnb_w0_s32_untied, svint16_t, svint32_t, int32_t,
+                    z0_res = svraddhnb_n_s32 (z1, x0),
+                    z0_res = svraddhnb (z1, x0))
+
+/*
+** raddhnb_11_s32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     raddhnb z0\.h, (z0\.s, \1|\1, z0\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_11_s32_tied1, svint16_t, svint32_t,
+                   z0_res = svraddhnb_n_s32 (z0, 11),
+                   z0_res = svraddhnb (z0, 11))
+
+/*
+** raddhnb_11_s32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     raddhnb z0\.h, (z1\.s, \1|\1, z1\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_11_s32_untied, svint16_t, svint32_t,
+                   z0_res = svraddhnb_n_s32 (z1, 11),
+                   z0_res = svraddhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnb_s64.c
new file mode 100644 (file)
index 0000000..47edc8c
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** raddhnb_s64_tied1:
+**     raddhnb z0\.s, (z0\.d, z1\.d|z1\.d, z0\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_s64_tied1, svint32_t, svint64_t,
+                   z0_res = svraddhnb_s64 (z0, z1),
+                   z0_res = svraddhnb (z0, z1))
+
+/*
+** raddhnb_s64_tied2:
+**     raddhnb z0\.s, (z0\.d, z1\.d|z1\.d, z0\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_s64_tied2, svint32_t, svint64_t,
+                   z0_res = svraddhnb_s64 (z1, z0),
+                   z0_res = svraddhnb (z1, z0))
+
+/*
+** raddhnb_s64_untied:
+**     raddhnb z0\.s, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_s64_untied, svint32_t, svint64_t,
+                   z0_res = svraddhnb_s64 (z1, z2),
+                   z0_res = svraddhnb (z1, z2))
+
+/*
+** raddhnb_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     raddhnb z0\.s, (z0\.d, \1|\1, z0\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (raddhnb_x0_s64_tied1, svint32_t, svint64_t, int64_t,
+                    z0_res = svraddhnb_n_s64 (z0, x0),
+                    z0_res = svraddhnb (z0, x0))
+
+/*
+** raddhnb_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     raddhnb z0\.s, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (raddhnb_x0_s64_untied, svint32_t, svint64_t, int64_t,
+                    z0_res = svraddhnb_n_s64 (z1, x0),
+                    z0_res = svraddhnb (z1, x0))
+
+/*
+** raddhnb_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     raddhnb z0\.s, (z0\.d, \1|\1, z0\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_11_s64_tied1, svint32_t, svint64_t,
+                   z0_res = svraddhnb_n_s64 (z0, 11),
+                   z0_res = svraddhnb (z0, 11))
+
+/*
+** raddhnb_11_s64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     raddhnb z0\.s, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_11_s64_untied, svint32_t, svint64_t,
+                   z0_res = svraddhnb_n_s64 (z1, 11),
+                   z0_res = svraddhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnb_u16.c
new file mode 100644 (file)
index 0000000..c468598
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** raddhnb_u16_tied1:
+**     raddhnb z0\.b, (z0\.h, z1\.h|z1\.h, z0\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_u16_tied1, svuint8_t, svuint16_t,
+                   z0_res = svraddhnb_u16 (z0, z1),
+                   z0_res = svraddhnb (z0, z1))
+
+/*
+** raddhnb_u16_tied2:
+**     raddhnb z0\.b, (z0\.h, z1\.h|z1\.h, z0\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_u16_tied2, svuint8_t, svuint16_t,
+                   z0_res = svraddhnb_u16 (z1, z0),
+                   z0_res = svraddhnb (z1, z0))
+
+/*
+** raddhnb_u16_untied:
+**     raddhnb z0\.b, (z1\.h, z2\.h|z2\.h, z1\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_u16_untied, svuint8_t, svuint16_t,
+                   z0_res = svraddhnb_u16 (z1, z2),
+                   z0_res = svraddhnb (z1, z2))
+
+/*
+** raddhnb_w0_u16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     raddhnb z0\.b, (z0\.h, \1|\1, z0\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (raddhnb_w0_u16_tied1, svuint8_t, svuint16_t, uint16_t,
+                    z0_res = svraddhnb_n_u16 (z0, x0),
+                    z0_res = svraddhnb (z0, x0))
+
+/*
+** raddhnb_w0_u16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     raddhnb z0\.b, (z1\.h, \1|\1, z1\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (raddhnb_w0_u16_untied, svuint8_t, svuint16_t, uint16_t,
+                    z0_res = svraddhnb_n_u16 (z1, x0),
+                    z0_res = svraddhnb (z1, x0))
+
+/*
+** raddhnb_11_u16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     raddhnb z0\.b, (z0\.h, \1|\1, z0\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_11_u16_tied1, svuint8_t, svuint16_t,
+                   z0_res = svraddhnb_n_u16 (z0, 11),
+                   z0_res = svraddhnb (z0, 11))
+
+/*
+** raddhnb_11_u16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     raddhnb z0\.b, (z1\.h, \1|\1, z1\.h)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_11_u16_untied, svuint8_t, svuint16_t,
+                   z0_res = svraddhnb_n_u16 (z1, 11),
+                   z0_res = svraddhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnb_u32.c
new file mode 100644 (file)
index 0000000..968e886
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** raddhnb_u32_tied1:
+**     raddhnb z0\.h, (z0\.s, z1\.s|z1\.s, z0\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_u32_tied1, svuint16_t, svuint32_t,
+                   z0_res = svraddhnb_u32 (z0, z1),
+                   z0_res = svraddhnb (z0, z1))
+
+/*
+** raddhnb_u32_tied2:
+**     raddhnb z0\.h, (z0\.s, z1\.s|z1\.s, z0\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_u32_tied2, svuint16_t, svuint32_t,
+                   z0_res = svraddhnb_u32 (z1, z0),
+                   z0_res = svraddhnb (z1, z0))
+
+/*
+** raddhnb_u32_untied:
+**     raddhnb z0\.h, (z1\.s, z2\.s|z2\.s, z1\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_u32_untied, svuint16_t, svuint32_t,
+                   z0_res = svraddhnb_u32 (z1, z2),
+                   z0_res = svraddhnb (z1, z2))
+
+/*
+** raddhnb_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     raddhnb z0\.h, (z0\.s, \1|\1, z0\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (raddhnb_w0_u32_tied1, svuint16_t, svuint32_t, uint32_t,
+                    z0_res = svraddhnb_n_u32 (z0, x0),
+                    z0_res = svraddhnb (z0, x0))
+
+/*
+** raddhnb_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     raddhnb z0\.h, (z1\.s, \1|\1, z1\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (raddhnb_w0_u32_untied, svuint16_t, svuint32_t, uint32_t,
+                    z0_res = svraddhnb_n_u32 (z1, x0),
+                    z0_res = svraddhnb (z1, x0))
+
+/*
+** raddhnb_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     raddhnb z0\.h, (z0\.s, \1|\1, z0\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_11_u32_tied1, svuint16_t, svuint32_t,
+                   z0_res = svraddhnb_n_u32 (z0, 11),
+                   z0_res = svraddhnb (z0, 11))
+
+/*
+** raddhnb_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     raddhnb z0\.h, (z1\.s, \1|\1, z1\.s)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_11_u32_untied, svuint16_t, svuint32_t,
+                   z0_res = svraddhnb_n_u32 (z1, 11),
+                   z0_res = svraddhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnb_u64.c
new file mode 100644 (file)
index 0000000..5bf6d22
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** raddhnb_u64_tied1:
+**     raddhnb z0\.s, (z0\.d, z1\.d|z1\.d, z0\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_u64_tied1, svuint32_t, svuint64_t,
+                   z0_res = svraddhnb_u64 (z0, z1),
+                   z0_res = svraddhnb (z0, z1))
+
+/*
+** raddhnb_u64_tied2:
+**     raddhnb z0\.s, (z0\.d, z1\.d|z1\.d, z0\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_u64_tied2, svuint32_t, svuint64_t,
+                   z0_res = svraddhnb_u64 (z1, z0),
+                   z0_res = svraddhnb (z1, z0))
+
+/*
+** raddhnb_u64_untied:
+**     raddhnb z0\.s, (z1\.d, z2\.d|z2\.d, z1\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_u64_untied, svuint32_t, svuint64_t,
+                   z0_res = svraddhnb_u64 (z1, z2),
+                   z0_res = svraddhnb (z1, z2))
+
+/*
+** raddhnb_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     raddhnb z0\.s, (z0\.d, \1|\1, z0\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (raddhnb_x0_u64_tied1, svuint32_t, svuint64_t, uint64_t,
+                    z0_res = svraddhnb_n_u64 (z0, x0),
+                    z0_res = svraddhnb (z0, x0))
+
+/*
+** raddhnb_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     raddhnb z0\.s, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (raddhnb_x0_u64_untied, svuint32_t, svuint64_t, uint64_t,
+                    z0_res = svraddhnb_n_u64 (z1, x0),
+                    z0_res = svraddhnb (z1, x0))
+
+/*
+** raddhnb_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     raddhnb z0\.s, (z0\.d, \1|\1, z0\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_11_u64_tied1, svuint32_t, svuint64_t,
+                   z0_res = svraddhnb_n_u64 (z0, 11),
+                   z0_res = svraddhnb (z0, 11))
+
+/*
+** raddhnb_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     raddhnb z0\.s, (z1\.d, \1|\1, z1\.d)
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (raddhnb_11_u64_untied, svuint32_t, svuint64_t,
+                   z0_res = svraddhnb_n_u64 (z1, 11),
+                   z0_res = svraddhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnt_s16.c
new file mode 100644 (file)
index 0000000..1516154
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** raddhnt_s16_tied1:
+**     raddhnt z0\.b, (z4\.h, z5\.h|z5\.h, z4\.h)
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_s16_tied1, svint8_t, svint16_t,
+            z0 = svraddhnt_s16 (z0, z4, z5),
+            z0 = svraddhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (raddhnt_s16_tied2, svint8_t, svint16_t,
+                z0_res = svraddhnt_s16 (z4, z0, z1),
+                z0_res = svraddhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (raddhnt_s16_tied3, svint8_t, svint16_t,
+                z0_res = svraddhnt_s16 (z4, z1, z0),
+                z0_res = svraddhnt (z4, z1, z0))
+
+/*
+** raddhnt_s16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     raddhnt z0\.b, (z4\.h, z5\.h|z5\.h, z4\.h)
+** |
+**     raddhnt z1\.b, (z4\.h, z5\.h|z5\.h, z4\.h)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_s16_untied, svint8_t, svint16_t,
+            z0 = svraddhnt_s16 (z1, z4, z5),
+            z0 = svraddhnt (z1, z4, z5))
+
+/*
+** raddhnt_w0_s16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     raddhnt z0\.b, (z4\.h, \1|\1, z4\.h)
+**     ret
+*/
+TEST_DUAL_ZX (raddhnt_w0_s16_tied1, svint8_t, svint16_t, int16_t,
+             z0 = svraddhnt_n_s16 (z0, z4, x0),
+             z0 = svraddhnt (z0, z4, x0))
+
+/*
+** raddhnt_w0_s16_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     mov     z0\.d, z1\.d
+**     raddhnt z0\.b, (z4\.h, \1|\1, z4\.h)
+** |
+**     raddhnt z1\.b, (z4\.h, \1|\1, z4\.h)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (raddhnt_w0_s16_untied, svint8_t, svint16_t, int16_t,
+             z0 = svraddhnt_n_s16 (z1, z4, x0),
+             z0 = svraddhnt (z1, z4, x0))
+
+/*
+** raddhnt_11_s16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     raddhnt z0\.b, (z4\.h, \1|\1, z4\.h)
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_11_s16_tied1, svint8_t, svint16_t,
+            z0 = svraddhnt_n_s16 (z0, z4, 11),
+            z0 = svraddhnt (z0, z4, 11))
+
+/*
+** raddhnt_11_s16_untied:
+**     mov     (z[0-9]+\.h), #11
+** (
+**     mov     z0\.d, z1\.d
+**     raddhnt z0\.b, (z4\.h, \1|\1, z4\.h)
+** |
+**     raddhnt z1\.b, (z4\.h, \1|\1, z4\.h)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_11_s16_untied, svint8_t, svint16_t,
+            z0 = svraddhnt_n_s16 (z1, z4, 11),
+            z0 = svraddhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnt_s32.c
new file mode 100644 (file)
index 0000000..cdd87cb
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** raddhnt_s32_tied1:
+**     raddhnt z0\.h, (z4\.s, z5\.s|z5\.s, z4\.s)
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_s32_tied1, svint16_t, svint32_t,
+            z0 = svraddhnt_s32 (z0, z4, z5),
+            z0 = svraddhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (raddhnt_s32_tied2, svint16_t, svint32_t,
+                z0_res = svraddhnt_s32 (z4, z0, z1),
+                z0_res = svraddhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (raddhnt_s32_tied3, svint16_t, svint32_t,
+                z0_res = svraddhnt_s32 (z4, z1, z0),
+                z0_res = svraddhnt (z4, z1, z0))
+
+/*
+** raddhnt_s32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     raddhnt z0\.h, (z4\.s, z5\.s|z5\.s, z4\.s)
+** |
+**     raddhnt z1\.h, (z4\.s, z5\.s|z5\.s, z4\.s)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_s32_untied, svint16_t, svint32_t,
+            z0 = svraddhnt_s32 (z1, z4, z5),
+            z0 = svraddhnt (z1, z4, z5))
+
+/*
+** raddhnt_w0_s32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     raddhnt z0\.h, (z4\.s, \1|\1, z4\.s)
+**     ret
+*/
+TEST_DUAL_ZX (raddhnt_w0_s32_tied1, svint16_t, svint32_t, int32_t,
+             z0 = svraddhnt_n_s32 (z0, z4, x0),
+             z0 = svraddhnt (z0, z4, x0))
+
+/*
+** raddhnt_w0_s32_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     mov     z0\.d, z1\.d
+**     raddhnt z0\.h, (z4\.s, \1|\1, z4\.s)
+** |
+**     raddhnt z1\.h, (z4\.s, \1|\1, z4\.s)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (raddhnt_w0_s32_untied, svint16_t, svint32_t, int32_t,
+             z0 = svraddhnt_n_s32 (z1, z4, x0),
+             z0 = svraddhnt (z1, z4, x0))
+
+/*
+** raddhnt_11_s32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     raddhnt z0\.h, (z4\.s, \1|\1, z4\.s)
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_11_s32_tied1, svint16_t, svint32_t,
+            z0 = svraddhnt_n_s32 (z0, z4, 11),
+            z0 = svraddhnt (z0, z4, 11))
+
+/*
+** raddhnt_11_s32_untied:
+**     mov     (z[0-9]+\.s), #11
+** (
+**     mov     z0\.d, z1\.d
+**     raddhnt z0\.h, (z4\.s, \1|\1, z4\.s)
+** |
+**     raddhnt z1\.h, (z4\.s, \1|\1, z4\.s)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_11_s32_untied, svint16_t, svint32_t,
+            z0 = svraddhnt_n_s32 (z1, z4, 11),
+            z0 = svraddhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnt_s64.c
new file mode 100644 (file)
index 0000000..e465ed0
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** raddhnt_s64_tied1:
+**     raddhnt z0\.s, (z4\.d, z5\.d|z5\.d, z4\.d)
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_s64_tied1, svint32_t, svint64_t,
+            z0 = svraddhnt_s64 (z0, z4, z5),
+            z0 = svraddhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (raddhnt_s64_tied2, svint32_t, svint64_t,
+                z0_res = svraddhnt_s64 (z4, z0, z1),
+                z0_res = svraddhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (raddhnt_s64_tied3, svint32_t, svint64_t,
+                z0_res = svraddhnt_s64 (z4, z1, z0),
+                z0_res = svraddhnt (z4, z1, z0))
+
+/*
+** raddhnt_s64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     raddhnt z0\.s, (z4\.d, z5\.d|z5\.d, z4\.d)
+** |
+**     raddhnt z1\.s, (z4\.d, z5\.d|z5\.d, z4\.d)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_s64_untied, svint32_t, svint64_t,
+            z0 = svraddhnt_s64 (z1, z4, z5),
+            z0 = svraddhnt (z1, z4, z5))
+
+/*
+** raddhnt_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     raddhnt z0\.s, (z4\.d, \1|\1, z4\.d)
+**     ret
+*/
+TEST_DUAL_ZX (raddhnt_x0_s64_tied1, svint32_t, svint64_t, int64_t,
+             z0 = svraddhnt_n_s64 (z0, z4, x0),
+             z0 = svraddhnt (z0, z4, x0))
+
+/*
+** raddhnt_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     mov     z0\.d, z1\.d
+**     raddhnt z0\.s, (z4\.d, \1|\1, z4\.d)
+** |
+**     raddhnt z1\.s, (z4\.d, \1|\1, z4\.d)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (raddhnt_x0_s64_untied, svint32_t, svint64_t, int64_t,
+             z0 = svraddhnt_n_s64 (z1, z4, x0),
+             z0 = svraddhnt (z1, z4, x0))
+
+/*
+** raddhnt_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     raddhnt z0\.s, (z4\.d, \1|\1, z4\.d)
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_11_s64_tied1, svint32_t, svint64_t,
+            z0 = svraddhnt_n_s64 (z0, z4, 11),
+            z0 = svraddhnt (z0, z4, 11))
+
+/*
+** raddhnt_11_s64_untied:
+**     mov     (z[0-9]+\.d), #11
+** (
+**     mov     z0\.d, z1\.d
+**     raddhnt z0\.s, (z4\.d, \1|\1, z4\.d)
+** |
+**     raddhnt z1\.s, (z4\.d, \1|\1, z4\.d)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_11_s64_untied, svint32_t, svint64_t,
+            z0 = svraddhnt_n_s64 (z1, z4, 11),
+            z0 = svraddhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnt_u16.c
new file mode 100644 (file)
index 0000000..d7572fd
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** raddhnt_u16_tied1:
+**     raddhnt z0\.b, (z4\.h, z5\.h|z5\.h, z4\.h)
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_u16_tied1, svuint8_t, svuint16_t,
+            z0 = svraddhnt_u16 (z0, z4, z5),
+            z0 = svraddhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (raddhnt_u16_tied2, svuint8_t, svuint16_t,
+                z0_res = svraddhnt_u16 (z4, z0, z1),
+                z0_res = svraddhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (raddhnt_u16_tied3, svuint8_t, svuint16_t,
+                z0_res = svraddhnt_u16 (z4, z1, z0),
+                z0_res = svraddhnt (z4, z1, z0))
+
+/*
+** raddhnt_u16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     raddhnt z0\.b, (z4\.h, z5\.h|z5\.h, z4\.h)
+** |
+**     raddhnt z1\.b, (z4\.h, z5\.h|z5\.h, z4\.h)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_u16_untied, svuint8_t, svuint16_t,
+            z0 = svraddhnt_u16 (z1, z4, z5),
+            z0 = svraddhnt (z1, z4, z5))
+
+/*
+** raddhnt_w0_u16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     raddhnt z0\.b, (z4\.h, \1|\1, z4\.h)
+**     ret
+*/
+TEST_DUAL_ZX (raddhnt_w0_u16_tied1, svuint8_t, svuint16_t, uint16_t,
+             z0 = svraddhnt_n_u16 (z0, z4, x0),
+             z0 = svraddhnt (z0, z4, x0))
+
+/*
+** raddhnt_w0_u16_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     mov     z0\.d, z1\.d
+**     raddhnt z0\.b, (z4\.h, \1|\1, z4\.h)
+** |
+**     raddhnt z1\.b, (z4\.h, \1|\1, z4\.h)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (raddhnt_w0_u16_untied, svuint8_t, svuint16_t, uint16_t,
+             z0 = svraddhnt_n_u16 (z1, z4, x0),
+             z0 = svraddhnt (z1, z4, x0))
+
+/*
+** raddhnt_11_u16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     raddhnt z0\.b, (z4\.h, \1|\1, z4\.h)
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_11_u16_tied1, svuint8_t, svuint16_t,
+            z0 = svraddhnt_n_u16 (z0, z4, 11),
+            z0 = svraddhnt (z0, z4, 11))
+
+/*
+** raddhnt_11_u16_untied:
+**     mov     (z[0-9]+\.h), #11
+** (
+**     mov     z0\.d, z1\.d
+**     raddhnt z0\.b, (z4\.h, \1|\1, z4\.h)
+** |
+**     raddhnt z1\.b, (z4\.h, \1|\1, z4\.h)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_11_u16_untied, svuint8_t, svuint16_t,
+            z0 = svraddhnt_n_u16 (z1, z4, 11),
+            z0 = svraddhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnt_u32.c
new file mode 100644 (file)
index 0000000..ef0dc61
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** raddhnt_u32_tied1:
+**     raddhnt z0\.h, (z4\.s, z5\.s|z5\.s, z4\.s)
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_u32_tied1, svuint16_t, svuint32_t,
+            z0 = svraddhnt_u32 (z0, z4, z5),
+            z0 = svraddhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (raddhnt_u32_tied2, svuint16_t, svuint32_t,
+                z0_res = svraddhnt_u32 (z4, z0, z1),
+                z0_res = svraddhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (raddhnt_u32_tied3, svuint16_t, svuint32_t,
+                z0_res = svraddhnt_u32 (z4, z1, z0),
+                z0_res = svraddhnt (z4, z1, z0))
+
+/*
+** raddhnt_u32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     raddhnt z0\.h, (z4\.s, z5\.s|z5\.s, z4\.s)
+** |
+**     raddhnt z1\.h, (z4\.s, z5\.s|z5\.s, z4\.s)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_u32_untied, svuint16_t, svuint32_t,
+            z0 = svraddhnt_u32 (z1, z4, z5),
+            z0 = svraddhnt (z1, z4, z5))
+
+/*
+** raddhnt_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     raddhnt z0\.h, (z4\.s, \1|\1, z4\.s)
+**     ret
+*/
+TEST_DUAL_ZX (raddhnt_w0_u32_tied1, svuint16_t, svuint32_t, uint32_t,
+             z0 = svraddhnt_n_u32 (z0, z4, x0),
+             z0 = svraddhnt (z0, z4, x0))
+
+/*
+** raddhnt_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     mov     z0\.d, z1\.d
+**     raddhnt z0\.h, (z4\.s, \1|\1, z4\.s)
+** |
+**     raddhnt z1\.h, (z4\.s, \1|\1, z4\.s)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (raddhnt_w0_u32_untied, svuint16_t, svuint32_t, uint32_t,
+             z0 = svraddhnt_n_u32 (z1, z4, x0),
+             z0 = svraddhnt (z1, z4, x0))
+
+/*
+** raddhnt_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     raddhnt z0\.h, (z4\.s, \1|\1, z4\.s)
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_11_u32_tied1, svuint16_t, svuint32_t,
+            z0 = svraddhnt_n_u32 (z0, z4, 11),
+            z0 = svraddhnt (z0, z4, 11))
+
+/*
+** raddhnt_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+** (
+**     mov     z0\.d, z1\.d
+**     raddhnt z0\.h, (z4\.s, \1|\1, z4\.s)
+** |
+**     raddhnt z1\.h, (z4\.s, \1|\1, z4\.s)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_11_u32_untied, svuint16_t, svuint32_t,
+            z0 = svraddhnt_n_u32 (z1, z4, 11),
+            z0 = svraddhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/raddhnt_u64.c
new file mode 100644 (file)
index 0000000..e576f0d
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** raddhnt_u64_tied1:
+**     raddhnt z0\.s, (z4\.d, z5\.d|z5\.d, z4\.d)
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_u64_tied1, svuint32_t, svuint64_t,
+            z0 = svraddhnt_u64 (z0, z4, z5),
+            z0 = svraddhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (raddhnt_u64_tied2, svuint32_t, svuint64_t,
+                z0_res = svraddhnt_u64 (z4, z0, z1),
+                z0_res = svraddhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (raddhnt_u64_tied3, svuint32_t, svuint64_t,
+                z0_res = svraddhnt_u64 (z4, z1, z0),
+                z0_res = svraddhnt (z4, z1, z0))
+
+/*
+** raddhnt_u64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     raddhnt z0\.s, (z4\.d, z5\.d|z5\.d, z4\.d)
+** |
+**     raddhnt z1\.s, (z4\.d, z5\.d|z5\.d, z4\.d)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_u64_untied, svuint32_t, svuint64_t,
+            z0 = svraddhnt_u64 (z1, z4, z5),
+            z0 = svraddhnt (z1, z4, z5))
+
+/*
+** raddhnt_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     raddhnt z0\.s, (z4\.d, \1|\1, z4\.d)
+**     ret
+*/
+TEST_DUAL_ZX (raddhnt_x0_u64_tied1, svuint32_t, svuint64_t, uint64_t,
+             z0 = svraddhnt_n_u64 (z0, z4, x0),
+             z0 = svraddhnt (z0, z4, x0))
+
+/*
+** raddhnt_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     mov     z0\.d, z1\.d
+**     raddhnt z0\.s, (z4\.d, \1|\1, z4\.d)
+** |
+**     raddhnt z1\.s, (z4\.d, \1|\1, z4\.d)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (raddhnt_x0_u64_untied, svuint32_t, svuint64_t, uint64_t,
+             z0 = svraddhnt_n_u64 (z1, z4, x0),
+             z0 = svraddhnt (z1, z4, x0))
+
+/*
+** raddhnt_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     raddhnt z0\.s, (z4\.d, \1|\1, z4\.d)
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_11_u64_tied1, svuint32_t, svuint64_t,
+            z0 = svraddhnt_n_u64 (z0, z4, 11),
+            z0 = svraddhnt (z0, z4, 11))
+
+/*
+** raddhnt_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+** (
+**     mov     z0\.d, z1\.d
+**     raddhnt z0\.s, (z4\.d, \1|\1, z4\.d)
+** |
+**     raddhnt z1\.s, (z4\.d, \1|\1, z4\.d)
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (raddhnt_11_u64_untied, svuint32_t, svuint64_t,
+            z0 = svraddhnt_n_u64 (z1, z4, 11),
+            z0 = svraddhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rax1_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rax1_s64.c
new file mode 100644 (file)
index 0000000..ea80d40
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-sha3"
+
+/*
+** rax1_s64_tied1:
+**     rax1    z0\.d, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rax1_s64_tied1, svint64_t,
+               z0 = svrax1_s64 (z0, z1),
+               z0 = svrax1 (z0, z1))
+
+/*
+** rax1_s64_tied2:
+**     rax1    z0\.d, z1\.d, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rax1_s64_tied2, svint64_t,
+               z0 = svrax1_s64 (z1, z0),
+               z0 = svrax1 (z1, z0))
+
+/*
+** rax1_s64_untied:
+**     rax1    z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rax1_s64_untied, svint64_t,
+               z0 = svrax1_s64 (z1, z2),
+               z0 = svrax1 (z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rax1_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rax1_u64.c
new file mode 100644 (file)
index 0000000..b237c7e
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-sha3"
+
+/*
+** rax1_u64_tied1:
+**     rax1    z0\.d, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rax1_u64_tied1, svuint64_t,
+               z0 = svrax1_u64 (z0, z1),
+               z0 = svrax1 (z0, z1))
+
+/*
+** rax1_u64_tied2:
+**     rax1    z0\.d, z1\.d, z0\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rax1_u64_tied2, svuint64_t,
+               z0 = svrax1_u64 (z1, z0),
+               z0 = svrax1 (z1, z0))
+
+/*
+** rax1_u64_untied:
+**     rax1    z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rax1_u64_untied, svuint64_t,
+               z0 = svrax1_u64 (z1, z2),
+               z0 = svrax1 (z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/recpe_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/recpe_u32.c
new file mode 100644 (file)
index 0000000..17c6a72
--- /dev/null
@@ -0,0 +1,81 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** recpe_u32_m_tied12:
+**     urecpe  z0\.s, p0/m, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (recpe_u32_m_tied12, svuint32_t,
+               z0 = svrecpe_u32_m (z0, p0, z0),
+               z0 = svrecpe_m (z0, p0, z0))
+
+/*
+** recpe_u32_m_tied1:
+**     urecpe  z0\.s, p0/m, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (recpe_u32_m_tied1, svuint32_t,
+               z0 = svrecpe_u32_m (z0, p0, z1),
+               z0 = svrecpe_m (z0, p0, z1))
+
+/*
+** recpe_u32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     urecpe  z0\.s, p0/m, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (recpe_u32_m_tied2, svuint32_t,
+               z0 = svrecpe_u32_m (z1, p0, z0),
+               z0 = svrecpe_m (z1, p0, z0))
+
+/*
+** recpe_u32_m_untied:
+**     movprfx z0, z2
+**     urecpe  z0\.s, p0/m, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (recpe_u32_m_untied, svuint32_t,
+               z0 = svrecpe_u32_m (z2, p0, z1),
+               z0 = svrecpe_m (z2, p0, z1))
+
+/*
+** recpe_u32_z_tied1:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.s, p0/z, \1\.s
+**     urecpe  z0\.s, p0/m, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (recpe_u32_z_tied1, svuint32_t,
+               z0 = svrecpe_u32_z (p0, z0),
+               z0 = svrecpe_z (p0, z0))
+
+/*
+** recpe_u32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     urecpe  z0\.s, p0/m, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (recpe_u32_z_untied, svuint32_t,
+               z0 = svrecpe_u32_z (p0, z1),
+               z0 = svrecpe_z (p0, z1))
+
+/*
+** recpe_u32_x_tied1:
+**     urecpe  z0\.s, p0/m, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (recpe_u32_x_tied1, svuint32_t,
+               z0 = svrecpe_u32_x (p0, z0),
+               z0 = svrecpe_x (p0, z0))
+
+/*
+** recpe_u32_x_untied:
+**     urecpe  z0\.s, p0/m, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (recpe_u32_x_untied, svuint32_t,
+               z0 = svrecpe_u32_x (p0, z1),
+               z0 = svrecpe_x (p0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_s16.c
new file mode 100644 (file)
index 0000000..6f16f41
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rhadd_s16_m_tied1:
+**     srhadd  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s16_m_tied1, svint16_t,
+               z0 = svrhadd_s16_m (p0, z0, z1),
+               z0 = svrhadd_m (p0, z0, z1))
+
+/*
+** rhadd_s16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     srhadd  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s16_m_tied2, svint16_t,
+               z0 = svrhadd_s16_m (p0, z1, z0),
+               z0 = svrhadd_m (p0, z1, z0))
+
+/*
+** rhadd_s16_m_untied:
+**     movprfx z0, z1
+**     srhadd  z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s16_m_untied, svint16_t,
+               z0 = svrhadd_s16_m (p0, z1, z2),
+               z0 = svrhadd_m (p0, z1, z2))
+
+/*
+** rhadd_w0_s16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     srhadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_s16_m_tied1, svint16_t, int16_t,
+                z0 = svrhadd_n_s16_m (p0, z0, x0),
+                z0 = svrhadd_m (p0, z0, x0))
+
+/*
+** rhadd_w0_s16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     srhadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_s16_m_untied, svint16_t, int16_t,
+                z0 = svrhadd_n_s16_m (p0, z1, x0),
+                z0 = svrhadd_m (p0, z1, x0))
+
+/*
+** rhadd_11_s16_m_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     srhadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s16_m_tied1, svint16_t,
+               z0 = svrhadd_n_s16_m (p0, z0, 11),
+               z0 = svrhadd_m (p0, z0, 11))
+
+/*
+** rhadd_11_s16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     srhadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s16_m_untied, svint16_t,
+               z0 = svrhadd_n_s16_m (p0, z1, 11),
+               z0 = svrhadd_m (p0, z1, 11))
+
+/*
+** rhadd_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     srhadd  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s16_z_tied1, svint16_t,
+               z0 = svrhadd_s16_z (p0, z0, z1),
+               z0 = svrhadd_z (p0, z0, z1))
+
+/*
+** rhadd_s16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     srhadd  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s16_z_tied2, svint16_t,
+               z0 = svrhadd_s16_z (p0, z1, z0),
+               z0 = svrhadd_z (p0, z1, z0))
+
+/*
+** rhadd_s16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     srhadd  z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0\.h, p0/z, z2\.h
+**     srhadd  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s16_z_untied, svint16_t,
+               z0 = svrhadd_s16_z (p0, z1, z2),
+               z0 = svrhadd_z (p0, z1, z2))
+
+/*
+** rhadd_w0_s16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     srhadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_s16_z_tied1, svint16_t, int16_t,
+                z0 = svrhadd_n_s16_z (p0, z0, x0),
+                z0 = svrhadd_z (p0, z0, x0))
+
+/*
+** rhadd_w0_s16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     srhadd  z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     srhadd  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_s16_z_untied, svint16_t, int16_t,
+                z0 = svrhadd_n_s16_z (p0, z1, x0),
+                z0 = svrhadd_z (p0, z1, x0))
+
+/*
+** rhadd_11_s16_z_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0\.h, p0/z, z0\.h
+**     srhadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s16_z_tied1, svint16_t,
+               z0 = svrhadd_n_s16_z (p0, z0, 11),
+               z0 = svrhadd_z (p0, z0, 11))
+
+/*
+** rhadd_11_s16_z_untied:
+**     mov     (z[0-9]+\.h), #11
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     srhadd  z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     srhadd  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s16_z_untied, svint16_t,
+               z0 = svrhadd_n_s16_z (p0, z1, 11),
+               z0 = svrhadd_z (p0, z1, 11))
+
+/*
+** rhadd_s16_x_tied1:
+**     srhadd  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s16_x_tied1, svint16_t,
+               z0 = svrhadd_s16_x (p0, z0, z1),
+               z0 = svrhadd_x (p0, z0, z1))
+
+/*
+** rhadd_s16_x_tied2:
+**     srhadd  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s16_x_tied2, svint16_t,
+               z0 = svrhadd_s16_x (p0, z1, z0),
+               z0 = svrhadd_x (p0, z1, z0))
+
+/*
+** rhadd_s16_x_untied:
+** (
+**     movprfx z0, z1
+**     srhadd  z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0, z2
+**     srhadd  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s16_x_untied, svint16_t,
+               z0 = svrhadd_s16_x (p0, z1, z2),
+               z0 = svrhadd_x (p0, z1, z2))
+
+/*
+** rhadd_w0_s16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     srhadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_s16_x_tied1, svint16_t, int16_t,
+                z0 = svrhadd_n_s16_x (p0, z0, x0),
+                z0 = svrhadd_x (p0, z0, x0))
+
+/*
+** rhadd_w0_s16_x_untied:
+**     mov     z0\.h, w0
+**     srhadd  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_s16_x_untied, svint16_t, int16_t,
+                z0 = svrhadd_n_s16_x (p0, z1, x0),
+                z0 = svrhadd_x (p0, z1, x0))
+
+/*
+** rhadd_11_s16_x_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     srhadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s16_x_tied1, svint16_t,
+               z0 = svrhadd_n_s16_x (p0, z0, 11),
+               z0 = svrhadd_x (p0, z0, 11))
+
+/*
+** rhadd_11_s16_x_untied:
+**     mov     z0\.h, #11
+**     srhadd  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s16_x_untied, svint16_t,
+               z0 = svrhadd_n_s16_x (p0, z1, 11),
+               z0 = svrhadd_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_s32.c
new file mode 100644 (file)
index 0000000..c278b3d
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rhadd_s32_m_tied1:
+**     srhadd  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s32_m_tied1, svint32_t,
+               z0 = svrhadd_s32_m (p0, z0, z1),
+               z0 = svrhadd_m (p0, z0, z1))
+
+/*
+** rhadd_s32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     srhadd  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s32_m_tied2, svint32_t,
+               z0 = svrhadd_s32_m (p0, z1, z0),
+               z0 = svrhadd_m (p0, z1, z0))
+
+/*
+** rhadd_s32_m_untied:
+**     movprfx z0, z1
+**     srhadd  z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s32_m_untied, svint32_t,
+               z0 = svrhadd_s32_m (p0, z1, z2),
+               z0 = svrhadd_m (p0, z1, z2))
+
+/*
+** rhadd_w0_s32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     srhadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_s32_m_tied1, svint32_t, int32_t,
+                z0 = svrhadd_n_s32_m (p0, z0, x0),
+                z0 = svrhadd_m (p0, z0, x0))
+
+/*
+** rhadd_w0_s32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     srhadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_s32_m_untied, svint32_t, int32_t,
+                z0 = svrhadd_n_s32_m (p0, z1, x0),
+                z0 = svrhadd_m (p0, z1, x0))
+
+/*
+** rhadd_11_s32_m_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     srhadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s32_m_tied1, svint32_t,
+               z0 = svrhadd_n_s32_m (p0, z0, 11),
+               z0 = svrhadd_m (p0, z0, 11))
+
+/*
+** rhadd_11_s32_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     srhadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s32_m_untied, svint32_t,
+               z0 = svrhadd_n_s32_m (p0, z1, 11),
+               z0 = svrhadd_m (p0, z1, 11))
+
+/*
+** rhadd_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     srhadd  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s32_z_tied1, svint32_t,
+               z0 = svrhadd_s32_z (p0, z0, z1),
+               z0 = svrhadd_z (p0, z0, z1))
+
+/*
+** rhadd_s32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     srhadd  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s32_z_tied2, svint32_t,
+               z0 = svrhadd_s32_z (p0, z1, z0),
+               z0 = svrhadd_z (p0, z1, z0))
+
+/*
+** rhadd_s32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     srhadd  z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0\.s, p0/z, z2\.s
+**     srhadd  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s32_z_untied, svint32_t,
+               z0 = svrhadd_s32_z (p0, z1, z2),
+               z0 = svrhadd_z (p0, z1, z2))
+
+/*
+** rhadd_w0_s32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     srhadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_s32_z_tied1, svint32_t, int32_t,
+                z0 = svrhadd_n_s32_z (p0, z0, x0),
+                z0 = svrhadd_z (p0, z0, x0))
+
+/*
+** rhadd_w0_s32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     srhadd  z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     srhadd  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_s32_z_untied, svint32_t, int32_t,
+                z0 = svrhadd_n_s32_z (p0, z1, x0),
+                z0 = svrhadd_z (p0, z1, x0))
+
+/*
+** rhadd_11_s32_z_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0\.s, p0/z, z0\.s
+**     srhadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s32_z_tied1, svint32_t,
+               z0 = svrhadd_n_s32_z (p0, z0, 11),
+               z0 = svrhadd_z (p0, z0, 11))
+
+/*
+** rhadd_11_s32_z_untied:
+**     mov     (z[0-9]+\.s), #11
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     srhadd  z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     srhadd  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s32_z_untied, svint32_t,
+               z0 = svrhadd_n_s32_z (p0, z1, 11),
+               z0 = svrhadd_z (p0, z1, 11))
+
+/*
+** rhadd_s32_x_tied1:
+**     srhadd  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s32_x_tied1, svint32_t,
+               z0 = svrhadd_s32_x (p0, z0, z1),
+               z0 = svrhadd_x (p0, z0, z1))
+
+/*
+** rhadd_s32_x_tied2:
+**     srhadd  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s32_x_tied2, svint32_t,
+               z0 = svrhadd_s32_x (p0, z1, z0),
+               z0 = svrhadd_x (p0, z1, z0))
+
+/*
+** rhadd_s32_x_untied:
+** (
+**     movprfx z0, z1
+**     srhadd  z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0, z2
+**     srhadd  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s32_x_untied, svint32_t,
+               z0 = svrhadd_s32_x (p0, z1, z2),
+               z0 = svrhadd_x (p0, z1, z2))
+
+/*
+** rhadd_w0_s32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     srhadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_s32_x_tied1, svint32_t, int32_t,
+                z0 = svrhadd_n_s32_x (p0, z0, x0),
+                z0 = svrhadd_x (p0, z0, x0))
+
+/*
+** rhadd_w0_s32_x_untied:
+**     mov     z0\.s, w0
+**     srhadd  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_s32_x_untied, svint32_t, int32_t,
+                z0 = svrhadd_n_s32_x (p0, z1, x0),
+                z0 = svrhadd_x (p0, z1, x0))
+
+/*
+** rhadd_11_s32_x_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     srhadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s32_x_tied1, svint32_t,
+               z0 = svrhadd_n_s32_x (p0, z0, 11),
+               z0 = svrhadd_x (p0, z0, 11))
+
+/*
+** rhadd_11_s32_x_untied:
+**     mov     z0\.s, #11
+**     srhadd  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s32_x_untied, svint32_t,
+               z0 = svrhadd_n_s32_x (p0, z1, 11),
+               z0 = svrhadd_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_s64.c
new file mode 100644 (file)
index 0000000..759502c
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rhadd_s64_m_tied1:
+**     srhadd  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s64_m_tied1, svint64_t,
+               z0 = svrhadd_s64_m (p0, z0, z1),
+               z0 = svrhadd_m (p0, z0, z1))
+
+/*
+** rhadd_s64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     srhadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s64_m_tied2, svint64_t,
+               z0 = svrhadd_s64_m (p0, z1, z0),
+               z0 = svrhadd_m (p0, z1, z0))
+
+/*
+** rhadd_s64_m_untied:
+**     movprfx z0, z1
+**     srhadd  z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s64_m_untied, svint64_t,
+               z0 = svrhadd_s64_m (p0, z1, z2),
+               z0 = svrhadd_m (p0, z1, z2))
+
+/*
+** rhadd_x0_s64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     srhadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_x0_s64_m_tied1, svint64_t, int64_t,
+                z0 = svrhadd_n_s64_m (p0, z0, x0),
+                z0 = svrhadd_m (p0, z0, x0))
+
+/*
+** rhadd_x0_s64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     srhadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_x0_s64_m_untied, svint64_t, int64_t,
+                z0 = svrhadd_n_s64_m (p0, z1, x0),
+                z0 = svrhadd_m (p0, z1, x0))
+
+/*
+** rhadd_11_s64_m_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     srhadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s64_m_tied1, svint64_t,
+               z0 = svrhadd_n_s64_m (p0, z0, 11),
+               z0 = svrhadd_m (p0, z0, 11))
+
+/*
+** rhadd_11_s64_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     srhadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s64_m_untied, svint64_t,
+               z0 = svrhadd_n_s64_m (p0, z1, 11),
+               z0 = svrhadd_m (p0, z1, 11))
+
+/*
+** rhadd_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     srhadd  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s64_z_tied1, svint64_t,
+               z0 = svrhadd_s64_z (p0, z0, z1),
+               z0 = svrhadd_z (p0, z0, z1))
+
+/*
+** rhadd_s64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     srhadd  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s64_z_tied2, svint64_t,
+               z0 = svrhadd_s64_z (p0, z1, z0),
+               z0 = svrhadd_z (p0, z1, z0))
+
+/*
+** rhadd_s64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     srhadd  z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0\.d, p0/z, z2\.d
+**     srhadd  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s64_z_untied, svint64_t,
+               z0 = svrhadd_s64_z (p0, z1, z2),
+               z0 = svrhadd_z (p0, z1, z2))
+
+/*
+** rhadd_x0_s64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     srhadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_x0_s64_z_tied1, svint64_t, int64_t,
+                z0 = svrhadd_n_s64_z (p0, z0, x0),
+                z0 = svrhadd_z (p0, z0, x0))
+
+/*
+** rhadd_x0_s64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     srhadd  z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     srhadd  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_x0_s64_z_untied, svint64_t, int64_t,
+                z0 = svrhadd_n_s64_z (p0, z1, x0),
+                z0 = svrhadd_z (p0, z1, x0))
+
+/*
+** rhadd_11_s64_z_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0\.d, p0/z, z0\.d
+**     srhadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s64_z_tied1, svint64_t,
+               z0 = svrhadd_n_s64_z (p0, z0, 11),
+               z0 = svrhadd_z (p0, z0, 11))
+
+/*
+** rhadd_11_s64_z_untied:
+**     mov     (z[0-9]+\.d), #11
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     srhadd  z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     srhadd  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s64_z_untied, svint64_t,
+               z0 = svrhadd_n_s64_z (p0, z1, 11),
+               z0 = svrhadd_z (p0, z1, 11))
+
+/*
+** rhadd_s64_x_tied1:
+**     srhadd  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s64_x_tied1, svint64_t,
+               z0 = svrhadd_s64_x (p0, z0, z1),
+               z0 = svrhadd_x (p0, z0, z1))
+
+/*
+** rhadd_s64_x_tied2:
+**     srhadd  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s64_x_tied2, svint64_t,
+               z0 = svrhadd_s64_x (p0, z1, z0),
+               z0 = svrhadd_x (p0, z1, z0))
+
+/*
+** rhadd_s64_x_untied:
+** (
+**     movprfx z0, z1
+**     srhadd  z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0, z2
+**     srhadd  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s64_x_untied, svint64_t,
+               z0 = svrhadd_s64_x (p0, z1, z2),
+               z0 = svrhadd_x (p0, z1, z2))
+
+/*
+** rhadd_x0_s64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     srhadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_x0_s64_x_tied1, svint64_t, int64_t,
+                z0 = svrhadd_n_s64_x (p0, z0, x0),
+                z0 = svrhadd_x (p0, z0, x0))
+
+/*
+** rhadd_x0_s64_x_untied:
+**     mov     z0\.d, x0
+**     srhadd  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_x0_s64_x_untied, svint64_t, int64_t,
+                z0 = svrhadd_n_s64_x (p0, z1, x0),
+                z0 = svrhadd_x (p0, z1, x0))
+
+/*
+** rhadd_11_s64_x_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     srhadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s64_x_tied1, svint64_t,
+               z0 = svrhadd_n_s64_x (p0, z0, 11),
+               z0 = svrhadd_x (p0, z0, 11))
+
+/*
+** rhadd_11_s64_x_untied:
+**     mov     z0\.d, #11
+**     srhadd  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s64_x_untied, svint64_t,
+               z0 = svrhadd_n_s64_x (p0, z1, 11),
+               z0 = svrhadd_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_s8.c
new file mode 100644 (file)
index 0000000..58a7bd8
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rhadd_s8_m_tied1:
+**     srhadd  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s8_m_tied1, svint8_t,
+               z0 = svrhadd_s8_m (p0, z0, z1),
+               z0 = svrhadd_m (p0, z0, z1))
+
+/*
+** rhadd_s8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     srhadd  z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s8_m_tied2, svint8_t,
+               z0 = svrhadd_s8_m (p0, z1, z0),
+               z0 = svrhadd_m (p0, z1, z0))
+
+/*
+** rhadd_s8_m_untied:
+**     movprfx z0, z1
+**     srhadd  z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s8_m_untied, svint8_t,
+               z0 = svrhadd_s8_m (p0, z1, z2),
+               z0 = svrhadd_m (p0, z1, z2))
+
+/*
+** rhadd_w0_s8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     srhadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_s8_m_tied1, svint8_t, int8_t,
+                z0 = svrhadd_n_s8_m (p0, z0, x0),
+                z0 = svrhadd_m (p0, z0, x0))
+
+/*
+** rhadd_w0_s8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     srhadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_s8_m_untied, svint8_t, int8_t,
+                z0 = svrhadd_n_s8_m (p0, z1, x0),
+                z0 = svrhadd_m (p0, z1, x0))
+
+/*
+** rhadd_11_s8_m_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     srhadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s8_m_tied1, svint8_t,
+               z0 = svrhadd_n_s8_m (p0, z0, 11),
+               z0 = svrhadd_m (p0, z0, 11))
+
+/*
+** rhadd_11_s8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     srhadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s8_m_untied, svint8_t,
+               z0 = svrhadd_n_s8_m (p0, z1, 11),
+               z0 = svrhadd_m (p0, z1, 11))
+
+/*
+** rhadd_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     srhadd  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s8_z_tied1, svint8_t,
+               z0 = svrhadd_s8_z (p0, z0, z1),
+               z0 = svrhadd_z (p0, z0, z1))
+
+/*
+** rhadd_s8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     srhadd  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s8_z_tied2, svint8_t,
+               z0 = svrhadd_s8_z (p0, z1, z0),
+               z0 = svrhadd_z (p0, z1, z0))
+
+/*
+** rhadd_s8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     srhadd  z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0\.b, p0/z, z2\.b
+**     srhadd  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s8_z_untied, svint8_t,
+               z0 = svrhadd_s8_z (p0, z1, z2),
+               z0 = svrhadd_z (p0, z1, z2))
+
+/*
+** rhadd_w0_s8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     srhadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_s8_z_tied1, svint8_t, int8_t,
+                z0 = svrhadd_n_s8_z (p0, z0, x0),
+                z0 = svrhadd_z (p0, z0, x0))
+
+/*
+** rhadd_w0_s8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     srhadd  z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     srhadd  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_s8_z_untied, svint8_t, int8_t,
+                z0 = svrhadd_n_s8_z (p0, z1, x0),
+                z0 = svrhadd_z (p0, z1, x0))
+
+/*
+** rhadd_11_s8_z_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0\.b, p0/z, z0\.b
+**     srhadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s8_z_tied1, svint8_t,
+               z0 = svrhadd_n_s8_z (p0, z0, 11),
+               z0 = svrhadd_z (p0, z0, 11))
+
+/*
+** rhadd_11_s8_z_untied:
+**     mov     (z[0-9]+\.b), #11
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     srhadd  z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     srhadd  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s8_z_untied, svint8_t,
+               z0 = svrhadd_n_s8_z (p0, z1, 11),
+               z0 = svrhadd_z (p0, z1, 11))
+
+/*
+** rhadd_s8_x_tied1:
+**     srhadd  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s8_x_tied1, svint8_t,
+               z0 = svrhadd_s8_x (p0, z0, z1),
+               z0 = svrhadd_x (p0, z0, z1))
+
+/*
+** rhadd_s8_x_tied2:
+**     srhadd  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s8_x_tied2, svint8_t,
+               z0 = svrhadd_s8_x (p0, z1, z0),
+               z0 = svrhadd_x (p0, z1, z0))
+
+/*
+** rhadd_s8_x_untied:
+** (
+**     movprfx z0, z1
+**     srhadd  z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0, z2
+**     srhadd  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_s8_x_untied, svint8_t,
+               z0 = svrhadd_s8_x (p0, z1, z2),
+               z0 = svrhadd_x (p0, z1, z2))
+
+/*
+** rhadd_w0_s8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     srhadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_s8_x_tied1, svint8_t, int8_t,
+                z0 = svrhadd_n_s8_x (p0, z0, x0),
+                z0 = svrhadd_x (p0, z0, x0))
+
+/*
+** rhadd_w0_s8_x_untied:
+**     mov     z0\.b, w0
+**     srhadd  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_s8_x_untied, svint8_t, int8_t,
+                z0 = svrhadd_n_s8_x (p0, z1, x0),
+                z0 = svrhadd_x (p0, z1, x0))
+
+/*
+** rhadd_11_s8_x_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     srhadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s8_x_tied1, svint8_t,
+               z0 = svrhadd_n_s8_x (p0, z0, 11),
+               z0 = svrhadd_x (p0, z0, 11))
+
+/*
+** rhadd_11_s8_x_untied:
+**     mov     z0\.b, #11
+**     srhadd  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_s8_x_untied, svint8_t,
+               z0 = svrhadd_n_s8_x (p0, z1, 11),
+               z0 = svrhadd_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_u16.c
new file mode 100644 (file)
index 0000000..ba5a429
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rhadd_u16_m_tied1:
+**     urhadd  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u16_m_tied1, svuint16_t,
+               z0 = svrhadd_u16_m (p0, z0, z1),
+               z0 = svrhadd_m (p0, z0, z1))
+
+/*
+** rhadd_u16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     urhadd  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u16_m_tied2, svuint16_t,
+               z0 = svrhadd_u16_m (p0, z1, z0),
+               z0 = svrhadd_m (p0, z1, z0))
+
+/*
+** rhadd_u16_m_untied:
+**     movprfx z0, z1
+**     urhadd  z0\.h, p0/m, z0\.h, z2\.h
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u16_m_untied, svuint16_t,
+               z0 = svrhadd_u16_m (p0, z1, z2),
+               z0 = svrhadd_m (p0, z1, z2))
+
+/*
+** rhadd_w0_u16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     urhadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_u16_m_tied1, svuint16_t, uint16_t,
+                z0 = svrhadd_n_u16_m (p0, z0, x0),
+                z0 = svrhadd_m (p0, z0, x0))
+
+/*
+** rhadd_w0_u16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     urhadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_u16_m_untied, svuint16_t, uint16_t,
+                z0 = svrhadd_n_u16_m (p0, z1, x0),
+                z0 = svrhadd_m (p0, z1, x0))
+
+/*
+** rhadd_11_u16_m_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     urhadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u16_m_tied1, svuint16_t,
+               z0 = svrhadd_n_u16_m (p0, z0, 11),
+               z0 = svrhadd_m (p0, z0, 11))
+
+/*
+** rhadd_11_u16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0, z1
+**     urhadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u16_m_untied, svuint16_t,
+               z0 = svrhadd_n_u16_m (p0, z1, 11),
+               z0 = svrhadd_m (p0, z1, 11))
+
+/*
+** rhadd_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     urhadd  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u16_z_tied1, svuint16_t,
+               z0 = svrhadd_u16_z (p0, z0, z1),
+               z0 = svrhadd_z (p0, z0, z1))
+
+/*
+** rhadd_u16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     urhadd  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u16_z_tied2, svuint16_t,
+               z0 = svrhadd_u16_z (p0, z1, z0),
+               z0 = svrhadd_z (p0, z1, z0))
+
+/*
+** rhadd_u16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     urhadd  z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0\.h, p0/z, z2\.h
+**     urhadd  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u16_z_untied, svuint16_t,
+               z0 = svrhadd_u16_z (p0, z1, z2),
+               z0 = svrhadd_z (p0, z1, z2))
+
+/*
+** rhadd_w0_u16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     urhadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_u16_z_tied1, svuint16_t, uint16_t,
+                z0 = svrhadd_n_u16_z (p0, z0, x0),
+                z0 = svrhadd_z (p0, z0, x0))
+
+/*
+** rhadd_w0_u16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     urhadd  z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     urhadd  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_u16_z_untied, svuint16_t, uint16_t,
+                z0 = svrhadd_n_u16_z (p0, z1, x0),
+                z0 = svrhadd_z (p0, z1, x0))
+
+/*
+** rhadd_11_u16_z_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     movprfx z0\.h, p0/z, z0\.h
+**     urhadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u16_z_tied1, svuint16_t,
+               z0 = svrhadd_n_u16_z (p0, z0, 11),
+               z0 = svrhadd_z (p0, z0, 11))
+
+/*
+** rhadd_11_u16_z_untied:
+**     mov     (z[0-9]+\.h), #11
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     urhadd  z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     urhadd  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u16_z_untied, svuint16_t,
+               z0 = svrhadd_n_u16_z (p0, z1, 11),
+               z0 = svrhadd_z (p0, z1, 11))
+
+/*
+** rhadd_u16_x_tied1:
+**     urhadd  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u16_x_tied1, svuint16_t,
+               z0 = svrhadd_u16_x (p0, z0, z1),
+               z0 = svrhadd_x (p0, z0, z1))
+
+/*
+** rhadd_u16_x_tied2:
+**     urhadd  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u16_x_tied2, svuint16_t,
+               z0 = svrhadd_u16_x (p0, z1, z0),
+               z0 = svrhadd_x (p0, z1, z0))
+
+/*
+** rhadd_u16_x_untied:
+** (
+**     movprfx z0, z1
+**     urhadd  z0\.h, p0/m, z0\.h, z2\.h
+** |
+**     movprfx z0, z2
+**     urhadd  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u16_x_untied, svuint16_t,
+               z0 = svrhadd_u16_x (p0, z1, z2),
+               z0 = svrhadd_x (p0, z1, z2))
+
+/*
+** rhadd_w0_u16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     urhadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_u16_x_tied1, svuint16_t, uint16_t,
+                z0 = svrhadd_n_u16_x (p0, z0, x0),
+                z0 = svrhadd_x (p0, z0, x0))
+
+/*
+** rhadd_w0_u16_x_untied:
+**     mov     z0\.h, w0
+**     urhadd  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_u16_x_untied, svuint16_t, uint16_t,
+                z0 = svrhadd_n_u16_x (p0, z1, x0),
+                z0 = svrhadd_x (p0, z1, x0))
+
+/*
+** rhadd_11_u16_x_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     urhadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u16_x_tied1, svuint16_t,
+               z0 = svrhadd_n_u16_x (p0, z0, 11),
+               z0 = svrhadd_x (p0, z0, 11))
+
+/*
+** rhadd_11_u16_x_untied:
+**     mov     z0\.h, #11
+**     urhadd  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u16_x_untied, svuint16_t,
+               z0 = svrhadd_n_u16_x (p0, z1, 11),
+               z0 = svrhadd_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_u32.c
new file mode 100644 (file)
index 0000000..0cf6dc5
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rhadd_u32_m_tied1:
+**     urhadd  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u32_m_tied1, svuint32_t,
+               z0 = svrhadd_u32_m (p0, z0, z1),
+               z0 = svrhadd_m (p0, z0, z1))
+
+/*
+** rhadd_u32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     urhadd  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u32_m_tied2, svuint32_t,
+               z0 = svrhadd_u32_m (p0, z1, z0),
+               z0 = svrhadd_m (p0, z1, z0))
+
+/*
+** rhadd_u32_m_untied:
+**     movprfx z0, z1
+**     urhadd  z0\.s, p0/m, z0\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u32_m_untied, svuint32_t,
+               z0 = svrhadd_u32_m (p0, z1, z2),
+               z0 = svrhadd_m (p0, z1, z2))
+
+/*
+** rhadd_w0_u32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     urhadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_u32_m_tied1, svuint32_t, uint32_t,
+                z0 = svrhadd_n_u32_m (p0, z0, x0),
+                z0 = svrhadd_m (p0, z0, x0))
+
+/*
+** rhadd_w0_u32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     urhadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_u32_m_untied, svuint32_t, uint32_t,
+                z0 = svrhadd_n_u32_m (p0, z1, x0),
+                z0 = svrhadd_m (p0, z1, x0))
+
+/*
+** rhadd_11_u32_m_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     urhadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u32_m_tied1, svuint32_t,
+               z0 = svrhadd_n_u32_m (p0, z0, 11),
+               z0 = svrhadd_m (p0, z0, 11))
+
+/*
+** rhadd_11_u32_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     urhadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u32_m_untied, svuint32_t,
+               z0 = svrhadd_n_u32_m (p0, z1, 11),
+               z0 = svrhadd_m (p0, z1, 11))
+
+/*
+** rhadd_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     urhadd  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u32_z_tied1, svuint32_t,
+               z0 = svrhadd_u32_z (p0, z0, z1),
+               z0 = svrhadd_z (p0, z0, z1))
+
+/*
+** rhadd_u32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     urhadd  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u32_z_tied2, svuint32_t,
+               z0 = svrhadd_u32_z (p0, z1, z0),
+               z0 = svrhadd_z (p0, z1, z0))
+
+/*
+** rhadd_u32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     urhadd  z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0\.s, p0/z, z2\.s
+**     urhadd  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u32_z_untied, svuint32_t,
+               z0 = svrhadd_u32_z (p0, z1, z2),
+               z0 = svrhadd_z (p0, z1, z2))
+
+/*
+** rhadd_w0_u32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     urhadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_u32_z_tied1, svuint32_t, uint32_t,
+                z0 = svrhadd_n_u32_z (p0, z0, x0),
+                z0 = svrhadd_z (p0, z0, x0))
+
+/*
+** rhadd_w0_u32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     urhadd  z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     urhadd  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_u32_z_untied, svuint32_t, uint32_t,
+                z0 = svrhadd_n_u32_z (p0, z1, x0),
+                z0 = svrhadd_z (p0, z1, x0))
+
+/*
+** rhadd_11_u32_z_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0\.s, p0/z, z0\.s
+**     urhadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u32_z_tied1, svuint32_t,
+               z0 = svrhadd_n_u32_z (p0, z0, 11),
+               z0 = svrhadd_z (p0, z0, 11))
+
+/*
+** rhadd_11_u32_z_untied:
+**     mov     (z[0-9]+\.s), #11
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     urhadd  z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     urhadd  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u32_z_untied, svuint32_t,
+               z0 = svrhadd_n_u32_z (p0, z1, 11),
+               z0 = svrhadd_z (p0, z1, 11))
+
+/*
+** rhadd_u32_x_tied1:
+**     urhadd  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u32_x_tied1, svuint32_t,
+               z0 = svrhadd_u32_x (p0, z0, z1),
+               z0 = svrhadd_x (p0, z0, z1))
+
+/*
+** rhadd_u32_x_tied2:
+**     urhadd  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u32_x_tied2, svuint32_t,
+               z0 = svrhadd_u32_x (p0, z1, z0),
+               z0 = svrhadd_x (p0, z1, z0))
+
+/*
+** rhadd_u32_x_untied:
+** (
+**     movprfx z0, z1
+**     urhadd  z0\.s, p0/m, z0\.s, z2\.s
+** |
+**     movprfx z0, z2
+**     urhadd  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u32_x_untied, svuint32_t,
+               z0 = svrhadd_u32_x (p0, z1, z2),
+               z0 = svrhadd_x (p0, z1, z2))
+
+/*
+** rhadd_w0_u32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     urhadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_u32_x_tied1, svuint32_t, uint32_t,
+                z0 = svrhadd_n_u32_x (p0, z0, x0),
+                z0 = svrhadd_x (p0, z0, x0))
+
+/*
+** rhadd_w0_u32_x_untied:
+**     mov     z0\.s, w0
+**     urhadd  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_u32_x_untied, svuint32_t, uint32_t,
+                z0 = svrhadd_n_u32_x (p0, z1, x0),
+                z0 = svrhadd_x (p0, z1, x0))
+
+/*
+** rhadd_11_u32_x_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     urhadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u32_x_tied1, svuint32_t,
+               z0 = svrhadd_n_u32_x (p0, z0, 11),
+               z0 = svrhadd_x (p0, z0, 11))
+
+/*
+** rhadd_11_u32_x_untied:
+**     mov     z0\.s, #11
+**     urhadd  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u32_x_untied, svuint32_t,
+               z0 = svrhadd_n_u32_x (p0, z1, 11),
+               z0 = svrhadd_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_u64.c
new file mode 100644 (file)
index 0000000..d38f36a
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rhadd_u64_m_tied1:
+**     urhadd  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u64_m_tied1, svuint64_t,
+               z0 = svrhadd_u64_m (p0, z0, z1),
+               z0 = svrhadd_m (p0, z0, z1))
+
+/*
+** rhadd_u64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     urhadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u64_m_tied2, svuint64_t,
+               z0 = svrhadd_u64_m (p0, z1, z0),
+               z0 = svrhadd_m (p0, z1, z0))
+
+/*
+** rhadd_u64_m_untied:
+**     movprfx z0, z1
+**     urhadd  z0\.d, p0/m, z0\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u64_m_untied, svuint64_t,
+               z0 = svrhadd_u64_m (p0, z1, z2),
+               z0 = svrhadd_m (p0, z1, z2))
+
+/*
+** rhadd_x0_u64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     urhadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_x0_u64_m_tied1, svuint64_t, uint64_t,
+                z0 = svrhadd_n_u64_m (p0, z0, x0),
+                z0 = svrhadd_m (p0, z0, x0))
+
+/*
+** rhadd_x0_u64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     urhadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_x0_u64_m_untied, svuint64_t, uint64_t,
+                z0 = svrhadd_n_u64_m (p0, z1, x0),
+                z0 = svrhadd_m (p0, z1, x0))
+
+/*
+** rhadd_11_u64_m_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     urhadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u64_m_tied1, svuint64_t,
+               z0 = svrhadd_n_u64_m (p0, z0, 11),
+               z0 = svrhadd_m (p0, z0, 11))
+
+/*
+** rhadd_11_u64_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     urhadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u64_m_untied, svuint64_t,
+               z0 = svrhadd_n_u64_m (p0, z1, 11),
+               z0 = svrhadd_m (p0, z1, 11))
+
+/*
+** rhadd_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     urhadd  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u64_z_tied1, svuint64_t,
+               z0 = svrhadd_u64_z (p0, z0, z1),
+               z0 = svrhadd_z (p0, z0, z1))
+
+/*
+** rhadd_u64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     urhadd  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u64_z_tied2, svuint64_t,
+               z0 = svrhadd_u64_z (p0, z1, z0),
+               z0 = svrhadd_z (p0, z1, z0))
+
+/*
+** rhadd_u64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     urhadd  z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0\.d, p0/z, z2\.d
+**     urhadd  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u64_z_untied, svuint64_t,
+               z0 = svrhadd_u64_z (p0, z1, z2),
+               z0 = svrhadd_z (p0, z1, z2))
+
+/*
+** rhadd_x0_u64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     urhadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_x0_u64_z_tied1, svuint64_t, uint64_t,
+                z0 = svrhadd_n_u64_z (p0, z0, x0),
+                z0 = svrhadd_z (p0, z0, x0))
+
+/*
+** rhadd_x0_u64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     urhadd  z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     urhadd  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_x0_u64_z_untied, svuint64_t, uint64_t,
+                z0 = svrhadd_n_u64_z (p0, z1, x0),
+                z0 = svrhadd_z (p0, z1, x0))
+
+/*
+** rhadd_11_u64_z_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0\.d, p0/z, z0\.d
+**     urhadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u64_z_tied1, svuint64_t,
+               z0 = svrhadd_n_u64_z (p0, z0, 11),
+               z0 = svrhadd_z (p0, z0, 11))
+
+/*
+** rhadd_11_u64_z_untied:
+**     mov     (z[0-9]+\.d), #11
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     urhadd  z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     urhadd  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u64_z_untied, svuint64_t,
+               z0 = svrhadd_n_u64_z (p0, z1, 11),
+               z0 = svrhadd_z (p0, z1, 11))
+
+/*
+** rhadd_u64_x_tied1:
+**     urhadd  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u64_x_tied1, svuint64_t,
+               z0 = svrhadd_u64_x (p0, z0, z1),
+               z0 = svrhadd_x (p0, z0, z1))
+
+/*
+** rhadd_u64_x_tied2:
+**     urhadd  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u64_x_tied2, svuint64_t,
+               z0 = svrhadd_u64_x (p0, z1, z0),
+               z0 = svrhadd_x (p0, z1, z0))
+
+/*
+** rhadd_u64_x_untied:
+** (
+**     movprfx z0, z1
+**     urhadd  z0\.d, p0/m, z0\.d, z2\.d
+** |
+**     movprfx z0, z2
+**     urhadd  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u64_x_untied, svuint64_t,
+               z0 = svrhadd_u64_x (p0, z1, z2),
+               z0 = svrhadd_x (p0, z1, z2))
+
+/*
+** rhadd_x0_u64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     urhadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_x0_u64_x_tied1, svuint64_t, uint64_t,
+                z0 = svrhadd_n_u64_x (p0, z0, x0),
+                z0 = svrhadd_x (p0, z0, x0))
+
+/*
+** rhadd_x0_u64_x_untied:
+**     mov     z0\.d, x0
+**     urhadd  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_x0_u64_x_untied, svuint64_t, uint64_t,
+                z0 = svrhadd_n_u64_x (p0, z1, x0),
+                z0 = svrhadd_x (p0, z1, x0))
+
+/*
+** rhadd_11_u64_x_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     urhadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u64_x_tied1, svuint64_t,
+               z0 = svrhadd_n_u64_x (p0, z0, 11),
+               z0 = svrhadd_x (p0, z0, 11))
+
+/*
+** rhadd_11_u64_x_untied:
+**     mov     z0\.d, #11
+**     urhadd  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u64_x_untied, svuint64_t,
+               z0 = svrhadd_n_u64_x (p0, z1, 11),
+               z0 = svrhadd_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rhadd_u8.c
new file mode 100644 (file)
index 0000000..72efdc3
--- /dev/null
@@ -0,0 +1,237 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rhadd_u8_m_tied1:
+**     urhadd  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u8_m_tied1, svuint8_t,
+               z0 = svrhadd_u8_m (p0, z0, z1),
+               z0 = svrhadd_m (p0, z0, z1))
+
+/*
+** rhadd_u8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     urhadd  z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u8_m_tied2, svuint8_t,
+               z0 = svrhadd_u8_m (p0, z1, z0),
+               z0 = svrhadd_m (p0, z1, z0))
+
+/*
+** rhadd_u8_m_untied:
+**     movprfx z0, z1
+**     urhadd  z0\.b, p0/m, z0\.b, z2\.b
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u8_m_untied, svuint8_t,
+               z0 = svrhadd_u8_m (p0, z1, z2),
+               z0 = svrhadd_m (p0, z1, z2))
+
+/*
+** rhadd_w0_u8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     urhadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_u8_m_tied1, svuint8_t, uint8_t,
+                z0 = svrhadd_n_u8_m (p0, z0, x0),
+                z0 = svrhadd_m (p0, z0, x0))
+
+/*
+** rhadd_w0_u8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     urhadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_u8_m_untied, svuint8_t, uint8_t,
+                z0 = svrhadd_n_u8_m (p0, z1, x0),
+                z0 = svrhadd_m (p0, z1, x0))
+
+/*
+** rhadd_11_u8_m_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     urhadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u8_m_tied1, svuint8_t,
+               z0 = svrhadd_n_u8_m (p0, z0, 11),
+               z0 = svrhadd_m (p0, z0, 11))
+
+/*
+** rhadd_11_u8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0, z1
+**     urhadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u8_m_untied, svuint8_t,
+               z0 = svrhadd_n_u8_m (p0, z1, 11),
+               z0 = svrhadd_m (p0, z1, 11))
+
+/*
+** rhadd_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     urhadd  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u8_z_tied1, svuint8_t,
+               z0 = svrhadd_u8_z (p0, z0, z1),
+               z0 = svrhadd_z (p0, z0, z1))
+
+/*
+** rhadd_u8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     urhadd  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u8_z_tied2, svuint8_t,
+               z0 = svrhadd_u8_z (p0, z1, z0),
+               z0 = svrhadd_z (p0, z1, z0))
+
+/*
+** rhadd_u8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     urhadd  z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0\.b, p0/z, z2\.b
+**     urhadd  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u8_z_untied, svuint8_t,
+               z0 = svrhadd_u8_z (p0, z1, z2),
+               z0 = svrhadd_z (p0, z1, z2))
+
+/*
+** rhadd_w0_u8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     urhadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_u8_z_tied1, svuint8_t, uint8_t,
+                z0 = svrhadd_n_u8_z (p0, z0, x0),
+                z0 = svrhadd_z (p0, z0, x0))
+
+/*
+** rhadd_w0_u8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     urhadd  z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     urhadd  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_u8_z_untied, svuint8_t, uint8_t,
+                z0 = svrhadd_n_u8_z (p0, z1, x0),
+                z0 = svrhadd_z (p0, z1, x0))
+
+/*
+** rhadd_11_u8_z_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     movprfx z0\.b, p0/z, z0\.b
+**     urhadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u8_z_tied1, svuint8_t,
+               z0 = svrhadd_n_u8_z (p0, z0, 11),
+               z0 = svrhadd_z (p0, z0, 11))
+
+/*
+** rhadd_11_u8_z_untied:
+**     mov     (z[0-9]+\.b), #11
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     urhadd  z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     urhadd  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u8_z_untied, svuint8_t,
+               z0 = svrhadd_n_u8_z (p0, z1, 11),
+               z0 = svrhadd_z (p0, z1, 11))
+
+/*
+** rhadd_u8_x_tied1:
+**     urhadd  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u8_x_tied1, svuint8_t,
+               z0 = svrhadd_u8_x (p0, z0, z1),
+               z0 = svrhadd_x (p0, z0, z1))
+
+/*
+** rhadd_u8_x_tied2:
+**     urhadd  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u8_x_tied2, svuint8_t,
+               z0 = svrhadd_u8_x (p0, z1, z0),
+               z0 = svrhadd_x (p0, z1, z0))
+
+/*
+** rhadd_u8_x_untied:
+** (
+**     movprfx z0, z1
+**     urhadd  z0\.b, p0/m, z0\.b, z2\.b
+** |
+**     movprfx z0, z2
+**     urhadd  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_u8_x_untied, svuint8_t,
+               z0 = svrhadd_u8_x (p0, z1, z2),
+               z0 = svrhadd_x (p0, z1, z2))
+
+/*
+** rhadd_w0_u8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     urhadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_u8_x_tied1, svuint8_t, uint8_t,
+                z0 = svrhadd_n_u8_x (p0, z0, x0),
+                z0 = svrhadd_x (p0, z0, x0))
+
+/*
+** rhadd_w0_u8_x_untied:
+**     mov     z0\.b, w0
+**     urhadd  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_ZX (rhadd_w0_u8_x_untied, svuint8_t, uint8_t,
+                z0 = svrhadd_n_u8_x (p0, z1, x0),
+                z0 = svrhadd_x (p0, z1, x0))
+
+/*
+** rhadd_11_u8_x_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     urhadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u8_x_tied1, svuint8_t,
+               z0 = svrhadd_n_u8_x (p0, z0, 11),
+               z0 = svrhadd_x (p0, z0, 11))
+
+/*
+** rhadd_11_u8_x_untied:
+**     mov     z0\.b, #11
+**     urhadd  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_Z (rhadd_11_u8_x_untied, svuint8_t,
+               z0 = svrhadd_n_u8_x (p0, z1, 11),
+               z0 = svrhadd_x (p0, z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_s16.c
new file mode 100644 (file)
index 0000000..103af35
--- /dev/null
@@ -0,0 +1,396 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshl_s16_m_tied1:
+**     srshl   z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (rshl_s16_m_tied1, svint16_t, svint16_t,
+            z0 = svrshl_s16_m (p0, z0, z4),
+            z0 = svrshl_m (p0, z0, z4))
+
+/*
+** rshl_s16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     srshl   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_s16_m_tied2, svint16_t, svint16_t,
+                z0_res = svrshl_s16_m (p0, z4, z0),
+                z0_res = svrshl_m (p0, z4, z0))
+
+/*
+** rshl_s16_m_untied:
+**     movprfx z0, z1
+**     srshl   z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (rshl_s16_m_untied, svint16_t, svint16_t,
+            z0 = svrshl_s16_m (p0, z1, z4),
+            z0 = svrshl_m (p0, z1, z4))
+
+/*
+** rshl_w0_s16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     srshl   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_s16_m_tied1, svint16_t, int16_t,
+                z0 = svrshl_n_s16_m (p0, z0, x0),
+                z0 = svrshl_m (p0, z0, x0))
+
+/*
+** rshl_w0_s16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     srshl   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_s16_m_untied, svint16_t, int16_t,
+                z0 = svrshl_n_s16_m (p0, z1, x0),
+                z0 = svrshl_m (p0, z1, x0))
+
+/*
+** rshl_m16_s16_m:
+**     srshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m16_s16_m, svint16_t,
+               z0 = svrshl_n_s16_m (p0, z0, -16),
+               z0 = svrshl_m (p0, z0, -16))
+
+/*
+** rshl_m2_s16_m:
+**     srshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_s16_m, svint16_t,
+               z0 = svrshl_n_s16_m (p0, z0, -2),
+               z0 = svrshl_m (p0, z0, -2))
+
+/*
+** rshl_m1_s16_m_tied1:
+**     srshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s16_m_tied1, svint16_t,
+               z0 = svrshl_n_s16_m (p0, z0, -1),
+               z0 = svrshl_m (p0, z0, -1))
+
+/*
+** rshl_m1_s16_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s16_m_untied, svint16_t,
+               z0 = svrshl_n_s16_m (p0, z1, -1),
+               z0 = svrshl_m (p0, z1, -1))
+
+/*
+** rshl_1_s16_m_tied1:
+**     lsl     z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s16_m_tied1, svint16_t,
+               z0 = svrshl_n_s16_m (p0, z0, 1),
+               z0 = svrshl_m (p0, z0, 1))
+
+/*
+** rshl_1_s16_m_untied:
+**     movprfx z0, z1
+**     lsl     z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s16_m_untied, svint16_t,
+               z0 = svrshl_n_s16_m (p0, z1, 1),
+               z0 = svrshl_m (p0, z1, 1))
+
+/*
+** rshl_2_s16_m:
+**     lsl     z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_s16_m, svint16_t,
+               z0 = svrshl_n_s16_m (p0, z0, 2),
+               z0 = svrshl_m (p0, z0, 2))
+
+/*
+** rshl_15_s16_m:
+**     lsl     z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_15_s16_m, svint16_t,
+               z0 = svrshl_n_s16_m (p0, z0, 15),
+               z0 = svrshl_m (p0, z0, 15))
+
+/*
+** rshl_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     srshl   z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (rshl_s16_z_tied1, svint16_t, svint16_t,
+            z0 = svrshl_s16_z (p0, z0, z4),
+            z0 = svrshl_z (p0, z0, z4))
+
+/*
+** rshl_s16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     srshlr  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_s16_z_tied2, svint16_t, svint16_t,
+                z0_res = svrshl_s16_z (p0, z4, z0),
+                z0_res = svrshl_z (p0, z4, z0))
+
+/*
+** rshl_s16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     srshl   z0\.h, p0/m, z0\.h, z4\.h
+** |
+**     movprfx z0\.h, p0/z, z4\.h
+**     srshlr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshl_s16_z_untied, svint16_t, svint16_t,
+            z0 = svrshl_s16_z (p0, z1, z4),
+            z0 = svrshl_z (p0, z1, z4))
+
+/*
+** rshl_w0_s16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     srshl   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_s16_z_tied1, svint16_t, int16_t,
+                z0 = svrshl_n_s16_z (p0, z0, x0),
+                z0 = svrshl_z (p0, z0, x0))
+
+/*
+** rshl_w0_s16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     srshl   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     srshlr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_s16_z_untied, svint16_t, int16_t,
+                z0 = svrshl_n_s16_z (p0, z1, x0),
+                z0 = svrshl_z (p0, z1, x0))
+
+/*
+** rshl_m16_s16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     srshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m16_s16_z, svint16_t,
+               z0 = svrshl_n_s16_z (p0, z0, -16),
+               z0 = svrshl_z (p0, z0, -16))
+
+/*
+** rshl_m2_s16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     srshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_s16_z, svint16_t,
+               z0 = svrshl_n_s16_z (p0, z0, -2),
+               z0 = svrshl_z (p0, z0, -2))
+
+/*
+** rshl_m1_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     srshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s16_z_tied1, svint16_t,
+               z0 = svrshl_n_s16_z (p0, z0, -1),
+               z0 = svrshl_z (p0, z0, -1))
+
+/*
+** rshl_m1_s16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     srshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s16_z_untied, svint16_t,
+               z0 = svrshl_n_s16_z (p0, z1, -1),
+               z0 = svrshl_z (p0, z1, -1))
+
+/*
+** rshl_1_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     lsl     z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s16_z_tied1, svint16_t,
+               z0 = svrshl_n_s16_z (p0, z0, 1),
+               z0 = svrshl_z (p0, z0, 1))
+
+/*
+** rshl_1_s16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     lsl     z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s16_z_untied, svint16_t,
+               z0 = svrshl_n_s16_z (p0, z1, 1),
+               z0 = svrshl_z (p0, z1, 1))
+
+/*
+** rshl_2_s16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     lsl     z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_s16_z, svint16_t,
+               z0 = svrshl_n_s16_z (p0, z0, 2),
+               z0 = svrshl_z (p0, z0, 2))
+
+/*
+** rshl_15_s16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     lsl     z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_15_s16_z, svint16_t,
+               z0 = svrshl_n_s16_z (p0, z0, 15),
+               z0 = svrshl_z (p0, z0, 15))
+
+/*
+** rshl_s16_x_tied1:
+**     srshl   z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (rshl_s16_x_tied1, svint16_t, svint16_t,
+            z0 = svrshl_s16_x (p0, z0, z4),
+            z0 = svrshl_x (p0, z0, z4))
+
+/*
+** rshl_s16_x_tied2:
+**     srshlr  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_s16_x_tied2, svint16_t, svint16_t,
+                z0_res = svrshl_s16_x (p0, z4, z0),
+                z0_res = svrshl_x (p0, z4, z0))
+
+/*
+** rshl_s16_x_untied:
+** (
+**     movprfx z0, z1
+**     srshl   z0\.h, p0/m, z0\.h, z4\.h
+** |
+**     movprfx z0, z4
+**     srshlr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshl_s16_x_untied, svint16_t, svint16_t,
+            z0 = svrshl_s16_x (p0, z1, z4),
+            z0 = svrshl_x (p0, z1, z4))
+
+/*
+** rshl_w0_s16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     srshl   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_s16_x_tied1, svint16_t, int16_t,
+                z0 = svrshl_n_s16_x (p0, z0, x0),
+                z0 = svrshl_x (p0, z0, x0))
+
+/*
+** rshl_w0_s16_x_untied:
+**     mov     z0\.h, w0
+**     srshlr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_s16_x_untied, svint16_t, int16_t,
+                z0 = svrshl_n_s16_x (p0, z1, x0),
+                z0 = svrshl_x (p0, z1, x0))
+
+/*
+** rshl_m16_s16_x:
+**     srshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m16_s16_x, svint16_t,
+               z0 = svrshl_n_s16_x (p0, z0, -16),
+               z0 = svrshl_x (p0, z0, -16))
+
+/*
+** rshl_m2_s16_x:
+**     srshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_s16_x, svint16_t,
+               z0 = svrshl_n_s16_x (p0, z0, -2),
+               z0 = svrshl_x (p0, z0, -2))
+
+/*
+** rshl_m1_s16_x_tied1:
+**     srshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s16_x_tied1, svint16_t,
+               z0 = svrshl_n_s16_x (p0, z0, -1),
+               z0 = svrshl_x (p0, z0, -1))
+
+/*
+** rshl_m1_s16_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s16_x_untied, svint16_t,
+               z0 = svrshl_n_s16_x (p0, z1, -1),
+               z0 = svrshl_x (p0, z1, -1))
+
+/*
+** rshl_1_s16_x_tied1:
+**     lsl     z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s16_x_tied1, svint16_t,
+               z0 = svrshl_n_s16_x (p0, z0, 1),
+               z0 = svrshl_x (p0, z0, 1))
+
+/*
+** rshl_1_s16_x_untied:
+**     lsl     z0\.h, z1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s16_x_untied, svint16_t,
+               z0 = svrshl_n_s16_x (p0, z1, 1),
+               z0 = svrshl_x (p0, z1, 1))
+
+/*
+** rshl_2_s16_x:
+**     lsl     z0\.h, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_s16_x, svint16_t,
+               z0 = svrshl_n_s16_x (p0, z0, 2),
+               z0 = svrshl_x (p0, z0, 2))
+
+/*
+** rshl_15_s16_x:
+**     lsl     z0\.h, z0\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_15_s16_x, svint16_t,
+               z0 = svrshl_n_s16_x (p0, z0, 15),
+               z0 = svrshl_x (p0, z0, 15))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_s32.c
new file mode 100644 (file)
index 0000000..542c857
--- /dev/null
@@ -0,0 +1,396 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshl_s32_m_tied1:
+**     srshl   z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (rshl_s32_m_tied1, svint32_t, svint32_t,
+            z0 = svrshl_s32_m (p0, z0, z4),
+            z0 = svrshl_m (p0, z0, z4))
+
+/*
+** rshl_s32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     srshl   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_s32_m_tied2, svint32_t, svint32_t,
+                z0_res = svrshl_s32_m (p0, z4, z0),
+                z0_res = svrshl_m (p0, z4, z0))
+
+/*
+** rshl_s32_m_untied:
+**     movprfx z0, z1
+**     srshl   z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (rshl_s32_m_untied, svint32_t, svint32_t,
+            z0 = svrshl_s32_m (p0, z1, z4),
+            z0 = svrshl_m (p0, z1, z4))
+
+/*
+** rshl_w0_s32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     srshl   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_s32_m_tied1, svint32_t, int32_t,
+                z0 = svrshl_n_s32_m (p0, z0, x0),
+                z0 = svrshl_m (p0, z0, x0))
+
+/*
+** rshl_w0_s32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     srshl   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_s32_m_untied, svint32_t, int32_t,
+                z0 = svrshl_n_s32_m (p0, z1, x0),
+                z0 = svrshl_m (p0, z1, x0))
+
+/*
+** rshl_m32_s32_m:
+**     srshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m32_s32_m, svint32_t,
+               z0 = svrshl_n_s32_m (p0, z0, -32),
+               z0 = svrshl_m (p0, z0, -32))
+
+/*
+** rshl_m2_s32_m:
+**     srshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_s32_m, svint32_t,
+               z0 = svrshl_n_s32_m (p0, z0, -2),
+               z0 = svrshl_m (p0, z0, -2))
+
+/*
+** rshl_m1_s32_m_tied1:
+**     srshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s32_m_tied1, svint32_t,
+               z0 = svrshl_n_s32_m (p0, z0, -1),
+               z0 = svrshl_m (p0, z0, -1))
+
+/*
+** rshl_m1_s32_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s32_m_untied, svint32_t,
+               z0 = svrshl_n_s32_m (p0, z1, -1),
+               z0 = svrshl_m (p0, z1, -1))
+
+/*
+** rshl_1_s32_m_tied1:
+**     lsl     z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s32_m_tied1, svint32_t,
+               z0 = svrshl_n_s32_m (p0, z0, 1),
+               z0 = svrshl_m (p0, z0, 1))
+
+/*
+** rshl_1_s32_m_untied:
+**     movprfx z0, z1
+**     lsl     z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s32_m_untied, svint32_t,
+               z0 = svrshl_n_s32_m (p0, z1, 1),
+               z0 = svrshl_m (p0, z1, 1))
+
+/*
+** rshl_2_s32_m:
+**     lsl     z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_s32_m, svint32_t,
+               z0 = svrshl_n_s32_m (p0, z0, 2),
+               z0 = svrshl_m (p0, z0, 2))
+
+/*
+** rshl_31_s32_m:
+**     lsl     z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_31_s32_m, svint32_t,
+               z0 = svrshl_n_s32_m (p0, z0, 31),
+               z0 = svrshl_m (p0, z0, 31))
+
+/*
+** rshl_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     srshl   z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (rshl_s32_z_tied1, svint32_t, svint32_t,
+            z0 = svrshl_s32_z (p0, z0, z4),
+            z0 = svrshl_z (p0, z0, z4))
+
+/*
+** rshl_s32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     srshlr  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_s32_z_tied2, svint32_t, svint32_t,
+                z0_res = svrshl_s32_z (p0, z4, z0),
+                z0_res = svrshl_z (p0, z4, z0))
+
+/*
+** rshl_s32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     srshl   z0\.s, p0/m, z0\.s, z4\.s
+** |
+**     movprfx z0\.s, p0/z, z4\.s
+**     srshlr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshl_s32_z_untied, svint32_t, svint32_t,
+            z0 = svrshl_s32_z (p0, z1, z4),
+            z0 = svrshl_z (p0, z1, z4))
+
+/*
+** rshl_w0_s32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     srshl   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_s32_z_tied1, svint32_t, int32_t,
+                z0 = svrshl_n_s32_z (p0, z0, x0),
+                z0 = svrshl_z (p0, z0, x0))
+
+/*
+** rshl_w0_s32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     srshl   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     srshlr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_s32_z_untied, svint32_t, int32_t,
+                z0 = svrshl_n_s32_z (p0, z1, x0),
+                z0 = svrshl_z (p0, z1, x0))
+
+/*
+** rshl_m32_s32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     srshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m32_s32_z, svint32_t,
+               z0 = svrshl_n_s32_z (p0, z0, -32),
+               z0 = svrshl_z (p0, z0, -32))
+
+/*
+** rshl_m2_s32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     srshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_s32_z, svint32_t,
+               z0 = svrshl_n_s32_z (p0, z0, -2),
+               z0 = svrshl_z (p0, z0, -2))
+
+/*
+** rshl_m1_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     srshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s32_z_tied1, svint32_t,
+               z0 = svrshl_n_s32_z (p0, z0, -1),
+               z0 = svrshl_z (p0, z0, -1))
+
+/*
+** rshl_m1_s32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     srshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s32_z_untied, svint32_t,
+               z0 = svrshl_n_s32_z (p0, z1, -1),
+               z0 = svrshl_z (p0, z1, -1))
+
+/*
+** rshl_1_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     lsl     z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s32_z_tied1, svint32_t,
+               z0 = svrshl_n_s32_z (p0, z0, 1),
+               z0 = svrshl_z (p0, z0, 1))
+
+/*
+** rshl_1_s32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     lsl     z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s32_z_untied, svint32_t,
+               z0 = svrshl_n_s32_z (p0, z1, 1),
+               z0 = svrshl_z (p0, z1, 1))
+
+/*
+** rshl_2_s32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     lsl     z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_s32_z, svint32_t,
+               z0 = svrshl_n_s32_z (p0, z0, 2),
+               z0 = svrshl_z (p0, z0, 2))
+
+/*
+** rshl_31_s32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     lsl     z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_31_s32_z, svint32_t,
+               z0 = svrshl_n_s32_z (p0, z0, 31),
+               z0 = svrshl_z (p0, z0, 31))
+
+/*
+** rshl_s32_x_tied1:
+**     srshl   z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (rshl_s32_x_tied1, svint32_t, svint32_t,
+            z0 = svrshl_s32_x (p0, z0, z4),
+            z0 = svrshl_x (p0, z0, z4))
+
+/*
+** rshl_s32_x_tied2:
+**     srshlr  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_s32_x_tied2, svint32_t, svint32_t,
+                z0_res = svrshl_s32_x (p0, z4, z0),
+                z0_res = svrshl_x (p0, z4, z0))
+
+/*
+** rshl_s32_x_untied:
+** (
+**     movprfx z0, z1
+**     srshl   z0\.s, p0/m, z0\.s, z4\.s
+** |
+**     movprfx z0, z4
+**     srshlr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshl_s32_x_untied, svint32_t, svint32_t,
+            z0 = svrshl_s32_x (p0, z1, z4),
+            z0 = svrshl_x (p0, z1, z4))
+
+/*
+** rshl_w0_s32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     srshl   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_s32_x_tied1, svint32_t, int32_t,
+                z0 = svrshl_n_s32_x (p0, z0, x0),
+                z0 = svrshl_x (p0, z0, x0))
+
+/*
+** rshl_w0_s32_x_untied:
+**     mov     z0\.s, w0
+**     srshlr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_s32_x_untied, svint32_t, int32_t,
+                z0 = svrshl_n_s32_x (p0, z1, x0),
+                z0 = svrshl_x (p0, z1, x0))
+
+/*
+** rshl_m32_s32_x:
+**     srshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m32_s32_x, svint32_t,
+               z0 = svrshl_n_s32_x (p0, z0, -32),
+               z0 = svrshl_x (p0, z0, -32))
+
+/*
+** rshl_m2_s32_x:
+**     srshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_s32_x, svint32_t,
+               z0 = svrshl_n_s32_x (p0, z0, -2),
+               z0 = svrshl_x (p0, z0, -2))
+
+/*
+** rshl_m1_s32_x_tied1:
+**     srshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s32_x_tied1, svint32_t,
+               z0 = svrshl_n_s32_x (p0, z0, -1),
+               z0 = svrshl_x (p0, z0, -1))
+
+/*
+** rshl_m1_s32_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s32_x_untied, svint32_t,
+               z0 = svrshl_n_s32_x (p0, z1, -1),
+               z0 = svrshl_x (p0, z1, -1))
+
+/*
+** rshl_1_s32_x_tied1:
+**     lsl     z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s32_x_tied1, svint32_t,
+               z0 = svrshl_n_s32_x (p0, z0, 1),
+               z0 = svrshl_x (p0, z0, 1))
+
+/*
+** rshl_1_s32_x_untied:
+**     lsl     z0\.s, z1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s32_x_untied, svint32_t,
+               z0 = svrshl_n_s32_x (p0, z1, 1),
+               z0 = svrshl_x (p0, z1, 1))
+
+/*
+** rshl_2_s32_x:
+**     lsl     z0\.s, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_s32_x, svint32_t,
+               z0 = svrshl_n_s32_x (p0, z0, 2),
+               z0 = svrshl_x (p0, z0, 2))
+
+/*
+** rshl_31_s32_x:
+**     lsl     z0\.s, z0\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_31_s32_x, svint32_t,
+               z0 = svrshl_n_s32_x (p0, z0, 31),
+               z0 = svrshl_x (p0, z0, 31))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_s64.c
new file mode 100644 (file)
index 0000000..b85fbb5
--- /dev/null
@@ -0,0 +1,396 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshl_s64_m_tied1:
+**     srshl   z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (rshl_s64_m_tied1, svint64_t, svint64_t,
+            z0 = svrshl_s64_m (p0, z0, z4),
+            z0 = svrshl_m (p0, z0, z4))
+
+/*
+** rshl_s64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z4
+**     srshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_s64_m_tied2, svint64_t, svint64_t,
+                z0_res = svrshl_s64_m (p0, z4, z0),
+                z0_res = svrshl_m (p0, z4, z0))
+
+/*
+** rshl_s64_m_untied:
+**     movprfx z0, z1
+**     srshl   z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (rshl_s64_m_untied, svint64_t, svint64_t,
+            z0 = svrshl_s64_m (p0, z1, z4),
+            z0 = svrshl_m (p0, z1, z4))
+
+/*
+** rshl_x0_s64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     srshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_x0_s64_m_tied1, svint64_t, int64_t,
+                z0 = svrshl_n_s64_m (p0, z0, x0),
+                z0 = svrshl_m (p0, z0, x0))
+
+/*
+** rshl_x0_s64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     srshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_x0_s64_m_untied, svint64_t, int64_t,
+                z0 = svrshl_n_s64_m (p0, z1, x0),
+                z0 = svrshl_m (p0, z1, x0))
+
+/*
+** rshl_m64_s64_m:
+**     srshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m64_s64_m, svint64_t,
+               z0 = svrshl_n_s64_m (p0, z0, -64),
+               z0 = svrshl_m (p0, z0, -64))
+
+/*
+** rshl_m2_s64_m:
+**     srshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_s64_m, svint64_t,
+               z0 = svrshl_n_s64_m (p0, z0, -2),
+               z0 = svrshl_m (p0, z0, -2))
+
+/*
+** rshl_m1_s64_m_tied1:
+**     srshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s64_m_tied1, svint64_t,
+               z0 = svrshl_n_s64_m (p0, z0, -1),
+               z0 = svrshl_m (p0, z0, -1))
+
+/*
+** rshl_m1_s64_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s64_m_untied, svint64_t,
+               z0 = svrshl_n_s64_m (p0, z1, -1),
+               z0 = svrshl_m (p0, z1, -1))
+
+/*
+** rshl_1_s64_m_tied1:
+**     lsl     z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s64_m_tied1, svint64_t,
+               z0 = svrshl_n_s64_m (p0, z0, 1),
+               z0 = svrshl_m (p0, z0, 1))
+
+/*
+** rshl_1_s64_m_untied:
+**     movprfx z0, z1
+**     lsl     z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s64_m_untied, svint64_t,
+               z0 = svrshl_n_s64_m (p0, z1, 1),
+               z0 = svrshl_m (p0, z1, 1))
+
+/*
+** rshl_2_s64_m:
+**     lsl     z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_s64_m, svint64_t,
+               z0 = svrshl_n_s64_m (p0, z0, 2),
+               z0 = svrshl_m (p0, z0, 2))
+
+/*
+** rshl_63_s64_m:
+**     lsl     z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_63_s64_m, svint64_t,
+               z0 = svrshl_n_s64_m (p0, z0, 63),
+               z0 = svrshl_m (p0, z0, 63))
+
+/*
+** rshl_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     srshl   z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (rshl_s64_z_tied1, svint64_t, svint64_t,
+            z0 = svrshl_s64_z (p0, z0, z4),
+            z0 = svrshl_z (p0, z0, z4))
+
+/*
+** rshl_s64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     srshlr  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_s64_z_tied2, svint64_t, svint64_t,
+                z0_res = svrshl_s64_z (p0, z4, z0),
+                z0_res = svrshl_z (p0, z4, z0))
+
+/*
+** rshl_s64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     srshl   z0\.d, p0/m, z0\.d, z4\.d
+** |
+**     movprfx z0\.d, p0/z, z4\.d
+**     srshlr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshl_s64_z_untied, svint64_t, svint64_t,
+            z0 = svrshl_s64_z (p0, z1, z4),
+            z0 = svrshl_z (p0, z1, z4))
+
+/*
+** rshl_x0_s64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     srshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_x0_s64_z_tied1, svint64_t, int64_t,
+                z0 = svrshl_n_s64_z (p0, z0, x0),
+                z0 = svrshl_z (p0, z0, x0))
+
+/*
+** rshl_x0_s64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     srshl   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     srshlr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_x0_s64_z_untied, svint64_t, int64_t,
+                z0 = svrshl_n_s64_z (p0, z1, x0),
+                z0 = svrshl_z (p0, z1, x0))
+
+/*
+** rshl_m64_s64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     srshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m64_s64_z, svint64_t,
+               z0 = svrshl_n_s64_z (p0, z0, -64),
+               z0 = svrshl_z (p0, z0, -64))
+
+/*
+** rshl_m2_s64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     srshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_s64_z, svint64_t,
+               z0 = svrshl_n_s64_z (p0, z0, -2),
+               z0 = svrshl_z (p0, z0, -2))
+
+/*
+** rshl_m1_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     srshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s64_z_tied1, svint64_t,
+               z0 = svrshl_n_s64_z (p0, z0, -1),
+               z0 = svrshl_z (p0, z0, -1))
+
+/*
+** rshl_m1_s64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     srshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s64_z_untied, svint64_t,
+               z0 = svrshl_n_s64_z (p0, z1, -1),
+               z0 = svrshl_z (p0, z1, -1))
+
+/*
+** rshl_1_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     lsl     z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s64_z_tied1, svint64_t,
+               z0 = svrshl_n_s64_z (p0, z0, 1),
+               z0 = svrshl_z (p0, z0, 1))
+
+/*
+** rshl_1_s64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     lsl     z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s64_z_untied, svint64_t,
+               z0 = svrshl_n_s64_z (p0, z1, 1),
+               z0 = svrshl_z (p0, z1, 1))
+
+/*
+** rshl_2_s64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     lsl     z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_s64_z, svint64_t,
+               z0 = svrshl_n_s64_z (p0, z0, 2),
+               z0 = svrshl_z (p0, z0, 2))
+
+/*
+** rshl_63_s64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     lsl     z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_63_s64_z, svint64_t,
+               z0 = svrshl_n_s64_z (p0, z0, 63),
+               z0 = svrshl_z (p0, z0, 63))
+
+/*
+** rshl_s64_x_tied1:
+**     srshl   z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (rshl_s64_x_tied1, svint64_t, svint64_t,
+            z0 = svrshl_s64_x (p0, z0, z4),
+            z0 = svrshl_x (p0, z0, z4))
+
+/*
+** rshl_s64_x_tied2:
+**     srshlr  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_s64_x_tied2, svint64_t, svint64_t,
+                z0_res = svrshl_s64_x (p0, z4, z0),
+                z0_res = svrshl_x (p0, z4, z0))
+
+/*
+** rshl_s64_x_untied:
+** (
+**     movprfx z0, z1
+**     srshl   z0\.d, p0/m, z0\.d, z4\.d
+** |
+**     movprfx z0, z4
+**     srshlr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshl_s64_x_untied, svint64_t, svint64_t,
+            z0 = svrshl_s64_x (p0, z1, z4),
+            z0 = svrshl_x (p0, z1, z4))
+
+/*
+** rshl_x0_s64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     srshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_x0_s64_x_tied1, svint64_t, int64_t,
+                z0 = svrshl_n_s64_x (p0, z0, x0),
+                z0 = svrshl_x (p0, z0, x0))
+
+/*
+** rshl_x0_s64_x_untied:
+**     mov     z0\.d, x0
+**     srshlr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_x0_s64_x_untied, svint64_t, int64_t,
+                z0 = svrshl_n_s64_x (p0, z1, x0),
+                z0 = svrshl_x (p0, z1, x0))
+
+/*
+** rshl_m64_s64_x:
+**     srshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m64_s64_x, svint64_t,
+               z0 = svrshl_n_s64_x (p0, z0, -64),
+               z0 = svrshl_x (p0, z0, -64))
+
+/*
+** rshl_m2_s64_x:
+**     srshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_s64_x, svint64_t,
+               z0 = svrshl_n_s64_x (p0, z0, -2),
+               z0 = svrshl_x (p0, z0, -2))
+
+/*
+** rshl_m1_s64_x_tied1:
+**     srshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s64_x_tied1, svint64_t,
+               z0 = svrshl_n_s64_x (p0, z0, -1),
+               z0 = svrshl_x (p0, z0, -1))
+
+/*
+** rshl_m1_s64_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s64_x_untied, svint64_t,
+               z0 = svrshl_n_s64_x (p0, z1, -1),
+               z0 = svrshl_x (p0, z1, -1))
+
+/*
+** rshl_1_s64_x_tied1:
+**     lsl     z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s64_x_tied1, svint64_t,
+               z0 = svrshl_n_s64_x (p0, z0, 1),
+               z0 = svrshl_x (p0, z0, 1))
+
+/*
+** rshl_1_s64_x_untied:
+**     lsl     z0\.d, z1\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s64_x_untied, svint64_t,
+               z0 = svrshl_n_s64_x (p0, z1, 1),
+               z0 = svrshl_x (p0, z1, 1))
+
+/*
+** rshl_2_s64_x:
+**     lsl     z0\.d, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_s64_x, svint64_t,
+               z0 = svrshl_n_s64_x (p0, z0, 2),
+               z0 = svrshl_x (p0, z0, 2))
+
+/*
+** rshl_63_s64_x:
+**     lsl     z0\.d, z0\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_63_s64_x, svint64_t,
+               z0 = svrshl_n_s64_x (p0, z0, 63),
+               z0 = svrshl_x (p0, z0, 63))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_s8.c
new file mode 100644 (file)
index 0000000..f33102c
--- /dev/null
@@ -0,0 +1,396 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshl_s8_m_tied1:
+**     srshl   z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (rshl_s8_m_tied1, svint8_t, svint8_t,
+            z0 = svrshl_s8_m (p0, z0, z4),
+            z0 = svrshl_m (p0, z0, z4))
+
+/*
+** rshl_s8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     srshl   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_s8_m_tied2, svint8_t, svint8_t,
+                z0_res = svrshl_s8_m (p0, z4, z0),
+                z0_res = svrshl_m (p0, z4, z0))
+
+/*
+** rshl_s8_m_untied:
+**     movprfx z0, z1
+**     srshl   z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (rshl_s8_m_untied, svint8_t, svint8_t,
+            z0 = svrshl_s8_m (p0, z1, z4),
+            z0 = svrshl_m (p0, z1, z4))
+
+/*
+** rshl_w0_s8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     srshl   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_s8_m_tied1, svint8_t, int8_t,
+                z0 = svrshl_n_s8_m (p0, z0, x0),
+                z0 = svrshl_m (p0, z0, x0))
+
+/*
+** rshl_w0_s8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     srshl   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_s8_m_untied, svint8_t, int8_t,
+                z0 = svrshl_n_s8_m (p0, z1, x0),
+                z0 = svrshl_m (p0, z1, x0))
+
+/*
+** rshl_m8_s8_m:
+**     srshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m8_s8_m, svint8_t,
+               z0 = svrshl_n_s8_m (p0, z0, -8),
+               z0 = svrshl_m (p0, z0, -8))
+
+/*
+** rshl_m2_s8_m:
+**     srshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_s8_m, svint8_t,
+               z0 = svrshl_n_s8_m (p0, z0, -2),
+               z0 = svrshl_m (p0, z0, -2))
+
+/*
+** rshl_m1_s8_m_tied1:
+**     srshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s8_m_tied1, svint8_t,
+               z0 = svrshl_n_s8_m (p0, z0, -1),
+               z0 = svrshl_m (p0, z0, -1))
+
+/*
+** rshl_m1_s8_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s8_m_untied, svint8_t,
+               z0 = svrshl_n_s8_m (p0, z1, -1),
+               z0 = svrshl_m (p0, z1, -1))
+
+/*
+** rshl_1_s8_m_tied1:
+**     lsl     z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s8_m_tied1, svint8_t,
+               z0 = svrshl_n_s8_m (p0, z0, 1),
+               z0 = svrshl_m (p0, z0, 1))
+
+/*
+** rshl_1_s8_m_untied:
+**     movprfx z0, z1
+**     lsl     z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s8_m_untied, svint8_t,
+               z0 = svrshl_n_s8_m (p0, z1, 1),
+               z0 = svrshl_m (p0, z1, 1))
+
+/*
+** rshl_2_s8_m:
+**     lsl     z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_s8_m, svint8_t,
+               z0 = svrshl_n_s8_m (p0, z0, 2),
+               z0 = svrshl_m (p0, z0, 2))
+
+/*
+** rshl_7_s8_m:
+**     lsl     z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_7_s8_m, svint8_t,
+               z0 = svrshl_n_s8_m (p0, z0, 7),
+               z0 = svrshl_m (p0, z0, 7))
+
+/*
+** rshl_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     srshl   z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (rshl_s8_z_tied1, svint8_t, svint8_t,
+            z0 = svrshl_s8_z (p0, z0, z4),
+            z0 = svrshl_z (p0, z0, z4))
+
+/*
+** rshl_s8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     srshlr  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_s8_z_tied2, svint8_t, svint8_t,
+                z0_res = svrshl_s8_z (p0, z4, z0),
+                z0_res = svrshl_z (p0, z4, z0))
+
+/*
+** rshl_s8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     srshl   z0\.b, p0/m, z0\.b, z4\.b
+** |
+**     movprfx z0\.b, p0/z, z4\.b
+**     srshlr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshl_s8_z_untied, svint8_t, svint8_t,
+            z0 = svrshl_s8_z (p0, z1, z4),
+            z0 = svrshl_z (p0, z1, z4))
+
+/*
+** rshl_w0_s8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     srshl   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_s8_z_tied1, svint8_t, int8_t,
+                z0 = svrshl_n_s8_z (p0, z0, x0),
+                z0 = svrshl_z (p0, z0, x0))
+
+/*
+** rshl_w0_s8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     srshl   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     srshlr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_s8_z_untied, svint8_t, int8_t,
+                z0 = svrshl_n_s8_z (p0, z1, x0),
+                z0 = svrshl_z (p0, z1, x0))
+
+/*
+** rshl_m8_s8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     srshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m8_s8_z, svint8_t,
+               z0 = svrshl_n_s8_z (p0, z0, -8),
+               z0 = svrshl_z (p0, z0, -8))
+
+/*
+** rshl_m2_s8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     srshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_s8_z, svint8_t,
+               z0 = svrshl_n_s8_z (p0, z0, -2),
+               z0 = svrshl_z (p0, z0, -2))
+
+/*
+** rshl_m1_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     srshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s8_z_tied1, svint8_t,
+               z0 = svrshl_n_s8_z (p0, z0, -1),
+               z0 = svrshl_z (p0, z0, -1))
+
+/*
+** rshl_m1_s8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     srshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s8_z_untied, svint8_t,
+               z0 = svrshl_n_s8_z (p0, z1, -1),
+               z0 = svrshl_z (p0, z1, -1))
+
+/*
+** rshl_1_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     lsl     z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s8_z_tied1, svint8_t,
+               z0 = svrshl_n_s8_z (p0, z0, 1),
+               z0 = svrshl_z (p0, z0, 1))
+
+/*
+** rshl_1_s8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     lsl     z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s8_z_untied, svint8_t,
+               z0 = svrshl_n_s8_z (p0, z1, 1),
+               z0 = svrshl_z (p0, z1, 1))
+
+/*
+** rshl_2_s8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     lsl     z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_s8_z, svint8_t,
+               z0 = svrshl_n_s8_z (p0, z0, 2),
+               z0 = svrshl_z (p0, z0, 2))
+
+/*
+** rshl_7_s8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     lsl     z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_7_s8_z, svint8_t,
+               z0 = svrshl_n_s8_z (p0, z0, 7),
+               z0 = svrshl_z (p0, z0, 7))
+
+/*
+** rshl_s8_x_tied1:
+**     srshl   z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (rshl_s8_x_tied1, svint8_t, svint8_t,
+            z0 = svrshl_s8_x (p0, z0, z4),
+            z0 = svrshl_x (p0, z0, z4))
+
+/*
+** rshl_s8_x_tied2:
+**     srshlr  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_s8_x_tied2, svint8_t, svint8_t,
+                z0_res = svrshl_s8_x (p0, z4, z0),
+                z0_res = svrshl_x (p0, z4, z0))
+
+/*
+** rshl_s8_x_untied:
+** (
+**     movprfx z0, z1
+**     srshl   z0\.b, p0/m, z0\.b, z4\.b
+** |
+**     movprfx z0, z4
+**     srshlr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshl_s8_x_untied, svint8_t, svint8_t,
+            z0 = svrshl_s8_x (p0, z1, z4),
+            z0 = svrshl_x (p0, z1, z4))
+
+/*
+** rshl_w0_s8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     srshl   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_s8_x_tied1, svint8_t, int8_t,
+                z0 = svrshl_n_s8_x (p0, z0, x0),
+                z0 = svrshl_x (p0, z0, x0))
+
+/*
+** rshl_w0_s8_x_untied:
+**     mov     z0\.b, w0
+**     srshlr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_s8_x_untied, svint8_t, int8_t,
+                z0 = svrshl_n_s8_x (p0, z1, x0),
+                z0 = svrshl_x (p0, z1, x0))
+
+/*
+** rshl_m8_s8_x:
+**     srshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m8_s8_x, svint8_t,
+               z0 = svrshl_n_s8_x (p0, z0, -8),
+               z0 = svrshl_x (p0, z0, -8))
+
+/*
+** rshl_m2_s8_x:
+**     srshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_s8_x, svint8_t,
+               z0 = svrshl_n_s8_x (p0, z0, -2),
+               z0 = svrshl_x (p0, z0, -2))
+
+/*
+** rshl_m1_s8_x_tied1:
+**     srshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s8_x_tied1, svint8_t,
+               z0 = svrshl_n_s8_x (p0, z0, -1),
+               z0 = svrshl_x (p0, z0, -1))
+
+/*
+** rshl_m1_s8_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_s8_x_untied, svint8_t,
+               z0 = svrshl_n_s8_x (p0, z1, -1),
+               z0 = svrshl_x (p0, z1, -1))
+
+/*
+** rshl_1_s8_x_tied1:
+**     lsl     z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s8_x_tied1, svint8_t,
+               z0 = svrshl_n_s8_x (p0, z0, 1),
+               z0 = svrshl_x (p0, z0, 1))
+
+/*
+** rshl_1_s8_x_untied:
+**     lsl     z0\.b, z1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_s8_x_untied, svint8_t,
+               z0 = svrshl_n_s8_x (p0, z1, 1),
+               z0 = svrshl_x (p0, z1, 1))
+
+/*
+** rshl_2_s8_x:
+**     lsl     z0\.b, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_s8_x, svint8_t,
+               z0 = svrshl_n_s8_x (p0, z0, 2),
+               z0 = svrshl_x (p0, z0, 2))
+
+/*
+** rshl_7_s8_x:
+**     lsl     z0\.b, z0\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_7_s8_x, svint8_t,
+               z0 = svrshl_n_s8_x (p0, z0, 7),
+               z0 = svrshl_x (p0, z0, 7))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_u16.c
new file mode 100644 (file)
index 0000000..3b7abfe
--- /dev/null
@@ -0,0 +1,396 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshl_u16_m_tied1:
+**     urshl   z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (rshl_u16_m_tied1, svuint16_t, svint16_t,
+            z0 = svrshl_u16_m (p0, z0, z4),
+            z0 = svrshl_m (p0, z0, z4))
+
+/*
+** rshl_u16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     urshl   z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_u16_m_tied2, svuint16_t, svint16_t,
+                z0_res = svrshl_u16_m (p0, z4, z0),
+                z0_res = svrshl_m (p0, z4, z0))
+
+/*
+** rshl_u16_m_untied:
+**     movprfx z0, z1
+**     urshl   z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (rshl_u16_m_untied, svuint16_t, svint16_t,
+            z0 = svrshl_u16_m (p0, z1, z4),
+            z0 = svrshl_m (p0, z1, z4))
+
+/*
+** rshl_w0_u16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     urshl   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_u16_m_tied1, svuint16_t, int16_t,
+                z0 = svrshl_n_u16_m (p0, z0, x0),
+                z0 = svrshl_m (p0, z0, x0))
+
+/*
+** rshl_w0_u16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     urshl   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_u16_m_untied, svuint16_t, int16_t,
+                z0 = svrshl_n_u16_m (p0, z1, x0),
+                z0 = svrshl_m (p0, z1, x0))
+
+/*
+** rshl_m16_u16_m:
+**     urshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m16_u16_m, svuint16_t,
+               z0 = svrshl_n_u16_m (p0, z0, -16),
+               z0 = svrshl_m (p0, z0, -16))
+
+/*
+** rshl_m2_u16_m:
+**     urshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_u16_m, svuint16_t,
+               z0 = svrshl_n_u16_m (p0, z0, -2),
+               z0 = svrshl_m (p0, z0, -2))
+
+/*
+** rshl_m1_u16_m_tied1:
+**     urshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u16_m_tied1, svuint16_t,
+               z0 = svrshl_n_u16_m (p0, z0, -1),
+               z0 = svrshl_m (p0, z0, -1))
+
+/*
+** rshl_m1_u16_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u16_m_untied, svuint16_t,
+               z0 = svrshl_n_u16_m (p0, z1, -1),
+               z0 = svrshl_m (p0, z1, -1))
+
+/*
+** rshl_1_u16_m_tied1:
+**     lsl     z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u16_m_tied1, svuint16_t,
+               z0 = svrshl_n_u16_m (p0, z0, 1),
+               z0 = svrshl_m (p0, z0, 1))
+
+/*
+** rshl_1_u16_m_untied:
+**     movprfx z0, z1
+**     lsl     z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u16_m_untied, svuint16_t,
+               z0 = svrshl_n_u16_m (p0, z1, 1),
+               z0 = svrshl_m (p0, z1, 1))
+
+/*
+** rshl_2_u16_m:
+**     lsl     z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_u16_m, svuint16_t,
+               z0 = svrshl_n_u16_m (p0, z0, 2),
+               z0 = svrshl_m (p0, z0, 2))
+
+/*
+** rshl_15_u16_m:
+**     lsl     z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_15_u16_m, svuint16_t,
+               z0 = svrshl_n_u16_m (p0, z0, 15),
+               z0 = svrshl_m (p0, z0, 15))
+
+/*
+** rshl_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     urshl   z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (rshl_u16_z_tied1, svuint16_t, svint16_t,
+            z0 = svrshl_u16_z (p0, z0, z4),
+            z0 = svrshl_z (p0, z0, z4))
+
+/*
+** rshl_u16_z_tied2:
+**     movprfx z0\.h, p0/z, z0\.h
+**     urshlr  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_u16_z_tied2, svuint16_t, svint16_t,
+                z0_res = svrshl_u16_z (p0, z4, z0),
+                z0_res = svrshl_z (p0, z4, z0))
+
+/*
+** rshl_u16_z_untied:
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     urshl   z0\.h, p0/m, z0\.h, z4\.h
+** |
+**     movprfx z0\.h, p0/z, z4\.h
+**     urshlr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshl_u16_z_untied, svuint16_t, svint16_t,
+            z0 = svrshl_u16_z (p0, z1, z4),
+            z0 = svrshl_z (p0, z1, z4))
+
+/*
+** rshl_w0_u16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     urshl   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_u16_z_tied1, svuint16_t, int16_t,
+                z0 = svrshl_n_u16_z (p0, z0, x0),
+                z0 = svrshl_z (p0, z0, x0))
+
+/*
+** rshl_w0_u16_z_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     movprfx z0\.h, p0/z, z1\.h
+**     urshl   z0\.h, p0/m, z0\.h, \1
+** |
+**     movprfx z0\.h, p0/z, \1
+**     urshlr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_u16_z_untied, svuint16_t, int16_t,
+                z0 = svrshl_n_u16_z (p0, z1, x0),
+                z0 = svrshl_z (p0, z1, x0))
+
+/*
+** rshl_m16_u16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     urshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m16_u16_z, svuint16_t,
+               z0 = svrshl_n_u16_z (p0, z0, -16),
+               z0 = svrshl_z (p0, z0, -16))
+
+/*
+** rshl_m2_u16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     urshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_u16_z, svuint16_t,
+               z0 = svrshl_n_u16_z (p0, z0, -2),
+               z0 = svrshl_z (p0, z0, -2))
+
+/*
+** rshl_m1_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     urshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u16_z_tied1, svuint16_t,
+               z0 = svrshl_n_u16_z (p0, z0, -1),
+               z0 = svrshl_z (p0, z0, -1))
+
+/*
+** rshl_m1_u16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     urshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u16_z_untied, svuint16_t,
+               z0 = svrshl_n_u16_z (p0, z1, -1),
+               z0 = svrshl_z (p0, z1, -1))
+
+/*
+** rshl_1_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     lsl     z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u16_z_tied1, svuint16_t,
+               z0 = svrshl_n_u16_z (p0, z0, 1),
+               z0 = svrshl_z (p0, z0, 1))
+
+/*
+** rshl_1_u16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     lsl     z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u16_z_untied, svuint16_t,
+               z0 = svrshl_n_u16_z (p0, z1, 1),
+               z0 = svrshl_z (p0, z1, 1))
+
+/*
+** rshl_2_u16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     lsl     z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_u16_z, svuint16_t,
+               z0 = svrshl_n_u16_z (p0, z0, 2),
+               z0 = svrshl_z (p0, z0, 2))
+
+/*
+** rshl_15_u16_z:
+**     movprfx z0\.h, p0/z, z0\.h
+**     lsl     z0\.h, p0/m, z0\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_15_u16_z, svuint16_t,
+               z0 = svrshl_n_u16_z (p0, z0, 15),
+               z0 = svrshl_z (p0, z0, 15))
+
+/*
+** rshl_u16_x_tied1:
+**     urshl   z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (rshl_u16_x_tied1, svuint16_t, svint16_t,
+            z0 = svrshl_u16_x (p0, z0, z4),
+            z0 = svrshl_x (p0, z0, z4))
+
+/*
+** rshl_u16_x_tied2:
+**     urshlr  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_u16_x_tied2, svuint16_t, svint16_t,
+                z0_res = svrshl_u16_x (p0, z4, z0),
+                z0_res = svrshl_x (p0, z4, z0))
+
+/*
+** rshl_u16_x_untied:
+** (
+**     movprfx z0, z1
+**     urshl   z0\.h, p0/m, z0\.h, z4\.h
+** |
+**     movprfx z0, z4
+**     urshlr  z0\.h, p0/m, z0\.h, z1\.h
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshl_u16_x_untied, svuint16_t, svint16_t,
+            z0 = svrshl_u16_x (p0, z1, z4),
+            z0 = svrshl_x (p0, z1, z4))
+
+/*
+** rshl_w0_u16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     urshl   z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_u16_x_tied1, svuint16_t, int16_t,
+                z0 = svrshl_n_u16_x (p0, z0, x0),
+                z0 = svrshl_x (p0, z0, x0))
+
+/*
+** rshl_w0_u16_x_untied:
+**     mov     z0\.h, w0
+**     urshlr  z0\.h, p0/m, z0\.h, z1\.h
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_u16_x_untied, svuint16_t, int16_t,
+                z0 = svrshl_n_u16_x (p0, z1, x0),
+                z0 = svrshl_x (p0, z1, x0))
+
+/*
+** rshl_m16_u16_x:
+**     urshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m16_u16_x, svuint16_t,
+               z0 = svrshl_n_u16_x (p0, z0, -16),
+               z0 = svrshl_x (p0, z0, -16))
+
+/*
+** rshl_m2_u16_x:
+**     urshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_u16_x, svuint16_t,
+               z0 = svrshl_n_u16_x (p0, z0, -2),
+               z0 = svrshl_x (p0, z0, -2))
+
+/*
+** rshl_m1_u16_x_tied1:
+**     urshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u16_x_tied1, svuint16_t,
+               z0 = svrshl_n_u16_x (p0, z0, -1),
+               z0 = svrshl_x (p0, z0, -1))
+
+/*
+** rshl_m1_u16_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u16_x_untied, svuint16_t,
+               z0 = svrshl_n_u16_x (p0, z1, -1),
+               z0 = svrshl_x (p0, z1, -1))
+
+/*
+** rshl_1_u16_x_tied1:
+**     lsl     z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u16_x_tied1, svuint16_t,
+               z0 = svrshl_n_u16_x (p0, z0, 1),
+               z0 = svrshl_x (p0, z0, 1))
+
+/*
+** rshl_1_u16_x_untied:
+**     lsl     z0\.h, z1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u16_x_untied, svuint16_t,
+               z0 = svrshl_n_u16_x (p0, z1, 1),
+               z0 = svrshl_x (p0, z1, 1))
+
+/*
+** rshl_2_u16_x:
+**     lsl     z0\.h, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_u16_x, svuint16_t,
+               z0 = svrshl_n_u16_x (p0, z0, 2),
+               z0 = svrshl_x (p0, z0, 2))
+
+/*
+** rshl_15_u16_x:
+**     lsl     z0\.h, z0\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_15_u16_x, svuint16_t,
+               z0 = svrshl_n_u16_x (p0, z0, 15),
+               z0 = svrshl_x (p0, z0, 15))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_u32.c
new file mode 100644 (file)
index 0000000..ed86ae0
--- /dev/null
@@ -0,0 +1,396 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshl_u32_m_tied1:
+**     urshl   z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (rshl_u32_m_tied1, svuint32_t, svint32_t,
+            z0 = svrshl_u32_m (p0, z0, z4),
+            z0 = svrshl_m (p0, z0, z4))
+
+/*
+** rshl_u32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     urshl   z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_u32_m_tied2, svuint32_t, svint32_t,
+                z0_res = svrshl_u32_m (p0, z4, z0),
+                z0_res = svrshl_m (p0, z4, z0))
+
+/*
+** rshl_u32_m_untied:
+**     movprfx z0, z1
+**     urshl   z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (rshl_u32_m_untied, svuint32_t, svint32_t,
+            z0 = svrshl_u32_m (p0, z1, z4),
+            z0 = svrshl_m (p0, z1, z4))
+
+/*
+** rshl_w0_u32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     urshl   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_u32_m_tied1, svuint32_t, int32_t,
+                z0 = svrshl_n_u32_m (p0, z0, x0),
+                z0 = svrshl_m (p0, z0, x0))
+
+/*
+** rshl_w0_u32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     urshl   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_u32_m_untied, svuint32_t, int32_t,
+                z0 = svrshl_n_u32_m (p0, z1, x0),
+                z0 = svrshl_m (p0, z1, x0))
+
+/*
+** rshl_m32_u32_m:
+**     urshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m32_u32_m, svuint32_t,
+               z0 = svrshl_n_u32_m (p0, z0, -32),
+               z0 = svrshl_m (p0, z0, -32))
+
+/*
+** rshl_m2_u32_m:
+**     urshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_u32_m, svuint32_t,
+               z0 = svrshl_n_u32_m (p0, z0, -2),
+               z0 = svrshl_m (p0, z0, -2))
+
+/*
+** rshl_m1_u32_m_tied1:
+**     urshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u32_m_tied1, svuint32_t,
+               z0 = svrshl_n_u32_m (p0, z0, -1),
+               z0 = svrshl_m (p0, z0, -1))
+
+/*
+** rshl_m1_u32_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u32_m_untied, svuint32_t,
+               z0 = svrshl_n_u32_m (p0, z1, -1),
+               z0 = svrshl_m (p0, z1, -1))
+
+/*
+** rshl_1_u32_m_tied1:
+**     lsl     z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u32_m_tied1, svuint32_t,
+               z0 = svrshl_n_u32_m (p0, z0, 1),
+               z0 = svrshl_m (p0, z0, 1))
+
+/*
+** rshl_1_u32_m_untied:
+**     movprfx z0, z1
+**     lsl     z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u32_m_untied, svuint32_t,
+               z0 = svrshl_n_u32_m (p0, z1, 1),
+               z0 = svrshl_m (p0, z1, 1))
+
+/*
+** rshl_2_u32_m:
+**     lsl     z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_u32_m, svuint32_t,
+               z0 = svrshl_n_u32_m (p0, z0, 2),
+               z0 = svrshl_m (p0, z0, 2))
+
+/*
+** rshl_31_u32_m:
+**     lsl     z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_31_u32_m, svuint32_t,
+               z0 = svrshl_n_u32_m (p0, z0, 31),
+               z0 = svrshl_m (p0, z0, 31))
+
+/*
+** rshl_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     urshl   z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (rshl_u32_z_tied1, svuint32_t, svint32_t,
+            z0 = svrshl_u32_z (p0, z0, z4),
+            z0 = svrshl_z (p0, z0, z4))
+
+/*
+** rshl_u32_z_tied2:
+**     movprfx z0\.s, p0/z, z0\.s
+**     urshlr  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_u32_z_tied2, svuint32_t, svint32_t,
+                z0_res = svrshl_u32_z (p0, z4, z0),
+                z0_res = svrshl_z (p0, z4, z0))
+
+/*
+** rshl_u32_z_untied:
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     urshl   z0\.s, p0/m, z0\.s, z4\.s
+** |
+**     movprfx z0\.s, p0/z, z4\.s
+**     urshlr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshl_u32_z_untied, svuint32_t, svint32_t,
+            z0 = svrshl_u32_z (p0, z1, z4),
+            z0 = svrshl_z (p0, z1, z4))
+
+/*
+** rshl_w0_u32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     urshl   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_u32_z_tied1, svuint32_t, int32_t,
+                z0 = svrshl_n_u32_z (p0, z0, x0),
+                z0 = svrshl_z (p0, z0, x0))
+
+/*
+** rshl_w0_u32_z_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     movprfx z0\.s, p0/z, z1\.s
+**     urshl   z0\.s, p0/m, z0\.s, \1
+** |
+**     movprfx z0\.s, p0/z, \1
+**     urshlr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_u32_z_untied, svuint32_t, int32_t,
+                z0 = svrshl_n_u32_z (p0, z1, x0),
+                z0 = svrshl_z (p0, z1, x0))
+
+/*
+** rshl_m32_u32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     urshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m32_u32_z, svuint32_t,
+               z0 = svrshl_n_u32_z (p0, z0, -32),
+               z0 = svrshl_z (p0, z0, -32))
+
+/*
+** rshl_m2_u32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     urshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_u32_z, svuint32_t,
+               z0 = svrshl_n_u32_z (p0, z0, -2),
+               z0 = svrshl_z (p0, z0, -2))
+
+/*
+** rshl_m1_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     urshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u32_z_tied1, svuint32_t,
+               z0 = svrshl_n_u32_z (p0, z0, -1),
+               z0 = svrshl_z (p0, z0, -1))
+
+/*
+** rshl_m1_u32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     urshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u32_z_untied, svuint32_t,
+               z0 = svrshl_n_u32_z (p0, z1, -1),
+               z0 = svrshl_z (p0, z1, -1))
+
+/*
+** rshl_1_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     lsl     z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u32_z_tied1, svuint32_t,
+               z0 = svrshl_n_u32_z (p0, z0, 1),
+               z0 = svrshl_z (p0, z0, 1))
+
+/*
+** rshl_1_u32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     lsl     z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u32_z_untied, svuint32_t,
+               z0 = svrshl_n_u32_z (p0, z1, 1),
+               z0 = svrshl_z (p0, z1, 1))
+
+/*
+** rshl_2_u32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     lsl     z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_u32_z, svuint32_t,
+               z0 = svrshl_n_u32_z (p0, z0, 2),
+               z0 = svrshl_z (p0, z0, 2))
+
+/*
+** rshl_31_u32_z:
+**     movprfx z0\.s, p0/z, z0\.s
+**     lsl     z0\.s, p0/m, z0\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_31_u32_z, svuint32_t,
+               z0 = svrshl_n_u32_z (p0, z0, 31),
+               z0 = svrshl_z (p0, z0, 31))
+
+/*
+** rshl_u32_x_tied1:
+**     urshl   z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (rshl_u32_x_tied1, svuint32_t, svint32_t,
+            z0 = svrshl_u32_x (p0, z0, z4),
+            z0 = svrshl_x (p0, z0, z4))
+
+/*
+** rshl_u32_x_tied2:
+**     urshlr  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_u32_x_tied2, svuint32_t, svint32_t,
+                z0_res = svrshl_u32_x (p0, z4, z0),
+                z0_res = svrshl_x (p0, z4, z0))
+
+/*
+** rshl_u32_x_untied:
+** (
+**     movprfx z0, z1
+**     urshl   z0\.s, p0/m, z0\.s, z4\.s
+** |
+**     movprfx z0, z4
+**     urshlr  z0\.s, p0/m, z0\.s, z1\.s
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshl_u32_x_untied, svuint32_t, svint32_t,
+            z0 = svrshl_u32_x (p0, z1, z4),
+            z0 = svrshl_x (p0, z1, z4))
+
+/*
+** rshl_w0_u32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     urshl   z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_u32_x_tied1, svuint32_t, int32_t,
+                z0 = svrshl_n_u32_x (p0, z0, x0),
+                z0 = svrshl_x (p0, z0, x0))
+
+/*
+** rshl_w0_u32_x_untied:
+**     mov     z0\.s, w0
+**     urshlr  z0\.s, p0/m, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_u32_x_untied, svuint32_t, int32_t,
+                z0 = svrshl_n_u32_x (p0, z1, x0),
+                z0 = svrshl_x (p0, z1, x0))
+
+/*
+** rshl_m32_u32_x:
+**     urshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m32_u32_x, svuint32_t,
+               z0 = svrshl_n_u32_x (p0, z0, -32),
+               z0 = svrshl_x (p0, z0, -32))
+
+/*
+** rshl_m2_u32_x:
+**     urshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_u32_x, svuint32_t,
+               z0 = svrshl_n_u32_x (p0, z0, -2),
+               z0 = svrshl_x (p0, z0, -2))
+
+/*
+** rshl_m1_u32_x_tied1:
+**     urshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u32_x_tied1, svuint32_t,
+               z0 = svrshl_n_u32_x (p0, z0, -1),
+               z0 = svrshl_x (p0, z0, -1))
+
+/*
+** rshl_m1_u32_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u32_x_untied, svuint32_t,
+               z0 = svrshl_n_u32_x (p0, z1, -1),
+               z0 = svrshl_x (p0, z1, -1))
+
+/*
+** rshl_1_u32_x_tied1:
+**     lsl     z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u32_x_tied1, svuint32_t,
+               z0 = svrshl_n_u32_x (p0, z0, 1),
+               z0 = svrshl_x (p0, z0, 1))
+
+/*
+** rshl_1_u32_x_untied:
+**     lsl     z0\.s, z1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u32_x_untied, svuint32_t,
+               z0 = svrshl_n_u32_x (p0, z1, 1),
+               z0 = svrshl_x (p0, z1, 1))
+
+/*
+** rshl_2_u32_x:
+**     lsl     z0\.s, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_u32_x, svuint32_t,
+               z0 = svrshl_n_u32_x (p0, z0, 2),
+               z0 = svrshl_x (p0, z0, 2))
+
+/*
+** rshl_31_u32_x:
+**     lsl     z0\.s, z0\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_31_u32_x, svuint32_t,
+               z0 = svrshl_n_u32_x (p0, z0, 31),
+               z0 = svrshl_x (p0, z0, 31))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_u64.c
new file mode 100644 (file)
index 0000000..cd92206
--- /dev/null
@@ -0,0 +1,396 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshl_u64_m_tied1:
+**     urshl   z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (rshl_u64_m_tied1, svuint64_t, svint64_t,
+            z0 = svrshl_u64_m (p0, z0, z4),
+            z0 = svrshl_m (p0, z0, z4))
+
+/*
+** rshl_u64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z4
+**     urshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_u64_m_tied2, svuint64_t, svint64_t,
+                z0_res = svrshl_u64_m (p0, z4, z0),
+                z0_res = svrshl_m (p0, z4, z0))
+
+/*
+** rshl_u64_m_untied:
+**     movprfx z0, z1
+**     urshl   z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (rshl_u64_m_untied, svuint64_t, svint64_t,
+            z0 = svrshl_u64_m (p0, z1, z4),
+            z0 = svrshl_m (p0, z1, z4))
+
+/*
+** rshl_x0_u64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     urshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_x0_u64_m_tied1, svuint64_t, int64_t,
+                z0 = svrshl_n_u64_m (p0, z0, x0),
+                z0 = svrshl_m (p0, z0, x0))
+
+/*
+** rshl_x0_u64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     urshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_x0_u64_m_untied, svuint64_t, int64_t,
+                z0 = svrshl_n_u64_m (p0, z1, x0),
+                z0 = svrshl_m (p0, z1, x0))
+
+/*
+** rshl_m64_u64_m:
+**     urshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m64_u64_m, svuint64_t,
+               z0 = svrshl_n_u64_m (p0, z0, -64),
+               z0 = svrshl_m (p0, z0, -64))
+
+/*
+** rshl_m2_u64_m:
+**     urshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_u64_m, svuint64_t,
+               z0 = svrshl_n_u64_m (p0, z0, -2),
+               z0 = svrshl_m (p0, z0, -2))
+
+/*
+** rshl_m1_u64_m_tied1:
+**     urshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u64_m_tied1, svuint64_t,
+               z0 = svrshl_n_u64_m (p0, z0, -1),
+               z0 = svrshl_m (p0, z0, -1))
+
+/*
+** rshl_m1_u64_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u64_m_untied, svuint64_t,
+               z0 = svrshl_n_u64_m (p0, z1, -1),
+               z0 = svrshl_m (p0, z1, -1))
+
+/*
+** rshl_1_u64_m_tied1:
+**     lsl     z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u64_m_tied1, svuint64_t,
+               z0 = svrshl_n_u64_m (p0, z0, 1),
+               z0 = svrshl_m (p0, z0, 1))
+
+/*
+** rshl_1_u64_m_untied:
+**     movprfx z0, z1
+**     lsl     z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u64_m_untied, svuint64_t,
+               z0 = svrshl_n_u64_m (p0, z1, 1),
+               z0 = svrshl_m (p0, z1, 1))
+
+/*
+** rshl_2_u64_m:
+**     lsl     z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_u64_m, svuint64_t,
+               z0 = svrshl_n_u64_m (p0, z0, 2),
+               z0 = svrshl_m (p0, z0, 2))
+
+/*
+** rshl_63_u64_m:
+**     lsl     z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_63_u64_m, svuint64_t,
+               z0 = svrshl_n_u64_m (p0, z0, 63),
+               z0 = svrshl_m (p0, z0, 63))
+
+/*
+** rshl_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     urshl   z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (rshl_u64_z_tied1, svuint64_t, svint64_t,
+            z0 = svrshl_u64_z (p0, z0, z4),
+            z0 = svrshl_z (p0, z0, z4))
+
+/*
+** rshl_u64_z_tied2:
+**     movprfx z0\.d, p0/z, z0\.d
+**     urshlr  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_u64_z_tied2, svuint64_t, svint64_t,
+                z0_res = svrshl_u64_z (p0, z4, z0),
+                z0_res = svrshl_z (p0, z4, z0))
+
+/*
+** rshl_u64_z_untied:
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     urshl   z0\.d, p0/m, z0\.d, z4\.d
+** |
+**     movprfx z0\.d, p0/z, z4\.d
+**     urshlr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshl_u64_z_untied, svuint64_t, svint64_t,
+            z0 = svrshl_u64_z (p0, z1, z4),
+            z0 = svrshl_z (p0, z1, z4))
+
+/*
+** rshl_x0_u64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     urshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_x0_u64_z_tied1, svuint64_t, int64_t,
+                z0 = svrshl_n_u64_z (p0, z0, x0),
+                z0 = svrshl_z (p0, z0, x0))
+
+/*
+** rshl_x0_u64_z_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     movprfx z0\.d, p0/z, z1\.d
+**     urshl   z0\.d, p0/m, z0\.d, \1
+** |
+**     movprfx z0\.d, p0/z, \1
+**     urshlr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_x0_u64_z_untied, svuint64_t, int64_t,
+                z0 = svrshl_n_u64_z (p0, z1, x0),
+                z0 = svrshl_z (p0, z1, x0))
+
+/*
+** rshl_m64_u64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     urshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m64_u64_z, svuint64_t,
+               z0 = svrshl_n_u64_z (p0, z0, -64),
+               z0 = svrshl_z (p0, z0, -64))
+
+/*
+** rshl_m2_u64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     urshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_u64_z, svuint64_t,
+               z0 = svrshl_n_u64_z (p0, z0, -2),
+               z0 = svrshl_z (p0, z0, -2))
+
+/*
+** rshl_m1_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     urshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u64_z_tied1, svuint64_t,
+               z0 = svrshl_n_u64_z (p0, z0, -1),
+               z0 = svrshl_z (p0, z0, -1))
+
+/*
+** rshl_m1_u64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     urshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u64_z_untied, svuint64_t,
+               z0 = svrshl_n_u64_z (p0, z1, -1),
+               z0 = svrshl_z (p0, z1, -1))
+
+/*
+** rshl_1_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     lsl     z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u64_z_tied1, svuint64_t,
+               z0 = svrshl_n_u64_z (p0, z0, 1),
+               z0 = svrshl_z (p0, z0, 1))
+
+/*
+** rshl_1_u64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     lsl     z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u64_z_untied, svuint64_t,
+               z0 = svrshl_n_u64_z (p0, z1, 1),
+               z0 = svrshl_z (p0, z1, 1))
+
+/*
+** rshl_2_u64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     lsl     z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_u64_z, svuint64_t,
+               z0 = svrshl_n_u64_z (p0, z0, 2),
+               z0 = svrshl_z (p0, z0, 2))
+
+/*
+** rshl_63_u64_z:
+**     movprfx z0\.d, p0/z, z0\.d
+**     lsl     z0\.d, p0/m, z0\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_63_u64_z, svuint64_t,
+               z0 = svrshl_n_u64_z (p0, z0, 63),
+               z0 = svrshl_z (p0, z0, 63))
+
+/*
+** rshl_u64_x_tied1:
+**     urshl   z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (rshl_u64_x_tied1, svuint64_t, svint64_t,
+            z0 = svrshl_u64_x (p0, z0, z4),
+            z0 = svrshl_x (p0, z0, z4))
+
+/*
+** rshl_u64_x_tied2:
+**     urshlr  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_u64_x_tied2, svuint64_t, svint64_t,
+                z0_res = svrshl_u64_x (p0, z4, z0),
+                z0_res = svrshl_x (p0, z4, z0))
+
+/*
+** rshl_u64_x_untied:
+** (
+**     movprfx z0, z1
+**     urshl   z0\.d, p0/m, z0\.d, z4\.d
+** |
+**     movprfx z0, z4
+**     urshlr  z0\.d, p0/m, z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshl_u64_x_untied, svuint64_t, svint64_t,
+            z0 = svrshl_u64_x (p0, z1, z4),
+            z0 = svrshl_x (p0, z1, z4))
+
+/*
+** rshl_x0_u64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     urshl   z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_x0_u64_x_tied1, svuint64_t, int64_t,
+                z0 = svrshl_n_u64_x (p0, z0, x0),
+                z0 = svrshl_x (p0, z0, x0))
+
+/*
+** rshl_x0_u64_x_untied:
+**     mov     z0\.d, x0
+**     urshlr  z0\.d, p0/m, z0\.d, z1\.d
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_x0_u64_x_untied, svuint64_t, int64_t,
+                z0 = svrshl_n_u64_x (p0, z1, x0),
+                z0 = svrshl_x (p0, z1, x0))
+
+/*
+** rshl_m64_u64_x:
+**     urshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m64_u64_x, svuint64_t,
+               z0 = svrshl_n_u64_x (p0, z0, -64),
+               z0 = svrshl_x (p0, z0, -64))
+
+/*
+** rshl_m2_u64_x:
+**     urshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_u64_x, svuint64_t,
+               z0 = svrshl_n_u64_x (p0, z0, -2),
+               z0 = svrshl_x (p0, z0, -2))
+
+/*
+** rshl_m1_u64_x_tied1:
+**     urshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u64_x_tied1, svuint64_t,
+               z0 = svrshl_n_u64_x (p0, z0, -1),
+               z0 = svrshl_x (p0, z0, -1))
+
+/*
+** rshl_m1_u64_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u64_x_untied, svuint64_t,
+               z0 = svrshl_n_u64_x (p0, z1, -1),
+               z0 = svrshl_x (p0, z1, -1))
+
+/*
+** rshl_1_u64_x_tied1:
+**     lsl     z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u64_x_tied1, svuint64_t,
+               z0 = svrshl_n_u64_x (p0, z0, 1),
+               z0 = svrshl_x (p0, z0, 1))
+
+/*
+** rshl_1_u64_x_untied:
+**     lsl     z0\.d, z1\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u64_x_untied, svuint64_t,
+               z0 = svrshl_n_u64_x (p0, z1, 1),
+               z0 = svrshl_x (p0, z1, 1))
+
+/*
+** rshl_2_u64_x:
+**     lsl     z0\.d, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_u64_x, svuint64_t,
+               z0 = svrshl_n_u64_x (p0, z0, 2),
+               z0 = svrshl_x (p0, z0, 2))
+
+/*
+** rshl_63_u64_x:
+**     lsl     z0\.d, z0\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_63_u64_x, svuint64_t,
+               z0 = svrshl_n_u64_x (p0, z0, 63),
+               z0 = svrshl_x (p0, z0, 63))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshl_u8.c
new file mode 100644 (file)
index 0000000..4cc0036
--- /dev/null
@@ -0,0 +1,396 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshl_u8_m_tied1:
+**     urshl   z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (rshl_u8_m_tied1, svuint8_t, svint8_t,
+            z0 = svrshl_u8_m (p0, z0, z4),
+            z0 = svrshl_m (p0, z0, z4))
+
+/*
+** rshl_u8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     urshl   z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_u8_m_tied2, svuint8_t, svint8_t,
+                z0_res = svrshl_u8_m (p0, z4, z0),
+                z0_res = svrshl_m (p0, z4, z0))
+
+/*
+** rshl_u8_m_untied:
+**     movprfx z0, z1
+**     urshl   z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (rshl_u8_m_untied, svuint8_t, svint8_t,
+            z0 = svrshl_u8_m (p0, z1, z4),
+            z0 = svrshl_m (p0, z1, z4))
+
+/*
+** rshl_w0_u8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     urshl   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_u8_m_tied1, svuint8_t, int8_t,
+                z0 = svrshl_n_u8_m (p0, z0, x0),
+                z0 = svrshl_m (p0, z0, x0))
+
+/*
+** rshl_w0_u8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     urshl   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_u8_m_untied, svuint8_t, int8_t,
+                z0 = svrshl_n_u8_m (p0, z1, x0),
+                z0 = svrshl_m (p0, z1, x0))
+
+/*
+** rshl_m8_u8_m:
+**     urshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m8_u8_m, svuint8_t,
+               z0 = svrshl_n_u8_m (p0, z0, -8),
+               z0 = svrshl_m (p0, z0, -8))
+
+/*
+** rshl_m2_u8_m:
+**     urshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_u8_m, svuint8_t,
+               z0 = svrshl_n_u8_m (p0, z0, -2),
+               z0 = svrshl_m (p0, z0, -2))
+
+/*
+** rshl_m1_u8_m_tied1:
+**     urshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u8_m_tied1, svuint8_t,
+               z0 = svrshl_n_u8_m (p0, z0, -1),
+               z0 = svrshl_m (p0, z0, -1))
+
+/*
+** rshl_m1_u8_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u8_m_untied, svuint8_t,
+               z0 = svrshl_n_u8_m (p0, z1, -1),
+               z0 = svrshl_m (p0, z1, -1))
+
+/*
+** rshl_1_u8_m_tied1:
+**     lsl     z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u8_m_tied1, svuint8_t,
+               z0 = svrshl_n_u8_m (p0, z0, 1),
+               z0 = svrshl_m (p0, z0, 1))
+
+/*
+** rshl_1_u8_m_untied:
+**     movprfx z0, z1
+**     lsl     z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u8_m_untied, svuint8_t,
+               z0 = svrshl_n_u8_m (p0, z1, 1),
+               z0 = svrshl_m (p0, z1, 1))
+
+/*
+** rshl_2_u8_m:
+**     lsl     z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_u8_m, svuint8_t,
+               z0 = svrshl_n_u8_m (p0, z0, 2),
+               z0 = svrshl_m (p0, z0, 2))
+
+/*
+** rshl_7_u8_m:
+**     lsl     z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_7_u8_m, svuint8_t,
+               z0 = svrshl_n_u8_m (p0, z0, 7),
+               z0 = svrshl_m (p0, z0, 7))
+
+/*
+** rshl_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     urshl   z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (rshl_u8_z_tied1, svuint8_t, svint8_t,
+            z0 = svrshl_u8_z (p0, z0, z4),
+            z0 = svrshl_z (p0, z0, z4))
+
+/*
+** rshl_u8_z_tied2:
+**     movprfx z0\.b, p0/z, z0\.b
+**     urshlr  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_u8_z_tied2, svuint8_t, svint8_t,
+                z0_res = svrshl_u8_z (p0, z4, z0),
+                z0_res = svrshl_z (p0, z4, z0))
+
+/*
+** rshl_u8_z_untied:
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     urshl   z0\.b, p0/m, z0\.b, z4\.b
+** |
+**     movprfx z0\.b, p0/z, z4\.b
+**     urshlr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshl_u8_z_untied, svuint8_t, svint8_t,
+            z0 = svrshl_u8_z (p0, z1, z4),
+            z0 = svrshl_z (p0, z1, z4))
+
+/*
+** rshl_w0_u8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     urshl   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_u8_z_tied1, svuint8_t, int8_t,
+                z0 = svrshl_n_u8_z (p0, z0, x0),
+                z0 = svrshl_z (p0, z0, x0))
+
+/*
+** rshl_w0_u8_z_untied:
+**     mov     (z[0-9]+\.b), w0
+** (
+**     movprfx z0\.b, p0/z, z1\.b
+**     urshl   z0\.b, p0/m, z0\.b, \1
+** |
+**     movprfx z0\.b, p0/z, \1
+**     urshlr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_u8_z_untied, svuint8_t, int8_t,
+                z0 = svrshl_n_u8_z (p0, z1, x0),
+                z0 = svrshl_z (p0, z1, x0))
+
+/*
+** rshl_m8_u8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     urshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m8_u8_z, svuint8_t,
+               z0 = svrshl_n_u8_z (p0, z0, -8),
+               z0 = svrshl_z (p0, z0, -8))
+
+/*
+** rshl_m2_u8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     urshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_u8_z, svuint8_t,
+               z0 = svrshl_n_u8_z (p0, z0, -2),
+               z0 = svrshl_z (p0, z0, -2))
+
+/*
+** rshl_m1_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     urshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u8_z_tied1, svuint8_t,
+               z0 = svrshl_n_u8_z (p0, z0, -1),
+               z0 = svrshl_z (p0, z0, -1))
+
+/*
+** rshl_m1_u8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     urshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u8_z_untied, svuint8_t,
+               z0 = svrshl_n_u8_z (p0, z1, -1),
+               z0 = svrshl_z (p0, z1, -1))
+
+/*
+** rshl_1_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     lsl     z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u8_z_tied1, svuint8_t,
+               z0 = svrshl_n_u8_z (p0, z0, 1),
+               z0 = svrshl_z (p0, z0, 1))
+
+/*
+** rshl_1_u8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     lsl     z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u8_z_untied, svuint8_t,
+               z0 = svrshl_n_u8_z (p0, z1, 1),
+               z0 = svrshl_z (p0, z1, 1))
+
+/*
+** rshl_2_u8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     lsl     z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_u8_z, svuint8_t,
+               z0 = svrshl_n_u8_z (p0, z0, 2),
+               z0 = svrshl_z (p0, z0, 2))
+
+/*
+** rshl_7_u8_z:
+**     movprfx z0\.b, p0/z, z0\.b
+**     lsl     z0\.b, p0/m, z0\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_7_u8_z, svuint8_t,
+               z0 = svrshl_n_u8_z (p0, z0, 7),
+               z0 = svrshl_z (p0, z0, 7))
+
+/*
+** rshl_u8_x_tied1:
+**     urshl   z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (rshl_u8_x_tied1, svuint8_t, svint8_t,
+            z0 = svrshl_u8_x (p0, z0, z4),
+            z0 = svrshl_x (p0, z0, z4))
+
+/*
+** rshl_u8_x_tied2:
+**     urshlr  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (rshl_u8_x_tied2, svuint8_t, svint8_t,
+                z0_res = svrshl_u8_x (p0, z4, z0),
+                z0_res = svrshl_x (p0, z4, z0))
+
+/*
+** rshl_u8_x_untied:
+** (
+**     movprfx z0, z1
+**     urshl   z0\.b, p0/m, z0\.b, z4\.b
+** |
+**     movprfx z0, z4
+**     urshlr  z0\.b, p0/m, z0\.b, z1\.b
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshl_u8_x_untied, svuint8_t, svint8_t,
+            z0 = svrshl_u8_x (p0, z1, z4),
+            z0 = svrshl_x (p0, z1, z4))
+
+/*
+** rshl_w0_u8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     urshl   z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_u8_x_tied1, svuint8_t, int8_t,
+                z0 = svrshl_n_u8_x (p0, z0, x0),
+                z0 = svrshl_x (p0, z0, x0))
+
+/*
+** rshl_w0_u8_x_untied:
+**     mov     z0\.b, w0
+**     urshlr  z0\.b, p0/m, z0\.b, z1\.b
+**     ret
+*/
+TEST_UNIFORM_ZX (rshl_w0_u8_x_untied, svuint8_t, int8_t,
+                z0 = svrshl_n_u8_x (p0, z1, x0),
+                z0 = svrshl_x (p0, z1, x0))
+
+/*
+** rshl_m8_u8_x:
+**     urshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m8_u8_x, svuint8_t,
+               z0 = svrshl_n_u8_x (p0, z0, -8),
+               z0 = svrshl_x (p0, z0, -8))
+
+/*
+** rshl_m2_u8_x:
+**     urshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m2_u8_x, svuint8_t,
+               z0 = svrshl_n_u8_x (p0, z0, -2),
+               z0 = svrshl_x (p0, z0, -2))
+
+/*
+** rshl_m1_u8_x_tied1:
+**     urshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u8_x_tied1, svuint8_t,
+               z0 = svrshl_n_u8_x (p0, z0, -1),
+               z0 = svrshl_x (p0, z0, -1))
+
+/*
+** rshl_m1_u8_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_m1_u8_x_untied, svuint8_t,
+               z0 = svrshl_n_u8_x (p0, z1, -1),
+               z0 = svrshl_x (p0, z1, -1))
+
+/*
+** rshl_1_u8_x_tied1:
+**     lsl     z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u8_x_tied1, svuint8_t,
+               z0 = svrshl_n_u8_x (p0, z0, 1),
+               z0 = svrshl_x (p0, z0, 1))
+
+/*
+** rshl_1_u8_x_untied:
+**     lsl     z0\.b, z1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_1_u8_x_untied, svuint8_t,
+               z0 = svrshl_n_u8_x (p0, z1, 1),
+               z0 = svrshl_x (p0, z1, 1))
+
+/*
+** rshl_2_u8_x:
+**     lsl     z0\.b, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_2_u8_x, svuint8_t,
+               z0 = svrshl_n_u8_x (p0, z0, 2),
+               z0 = svrshl_x (p0, z0, 2))
+
+/*
+** rshl_7_u8_x:
+**     lsl     z0\.b, z0\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (rshl_7_u8_x, svuint8_t,
+               z0 = svrshl_n_u8_x (p0, z0, 7),
+               z0 = svrshl_x (p0, z0, 7))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_s16.c
new file mode 100644 (file)
index 0000000..72f201f
--- /dev/null
@@ -0,0 +1,177 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshr_1_s16_m_tied1:
+**     srshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s16_m_tied1, svint16_t,
+               z0 = svrshr_n_s16_m (p0, z0, 1),
+               z0 = svrshr_m (p0, z0, 1))
+
+/*
+** rshr_1_s16_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s16_m_untied, svint16_t,
+               z0 = svrshr_n_s16_m (p0, z1, 1),
+               z0 = svrshr_m (p0, z1, 1))
+
+/*
+** rshr_2_s16_m_tied1:
+**     srshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s16_m_tied1, svint16_t,
+               z0 = svrshr_n_s16_m (p0, z0, 2),
+               z0 = svrshr_m (p0, z0, 2))
+
+/*
+** rshr_2_s16_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s16_m_untied, svint16_t,
+               z0 = svrshr_n_s16_m (p0, z1, 2),
+               z0 = svrshr_m (p0, z1, 2))
+
+/*
+** rshr_16_s16_m_tied1:
+**     srshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_16_s16_m_tied1, svint16_t,
+               z0 = svrshr_n_s16_m (p0, z0, 16),
+               z0 = svrshr_m (p0, z0, 16))
+
+/*
+** rshr_16_s16_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_16_s16_m_untied, svint16_t,
+               z0 = svrshr_n_s16_m (p0, z1, 16),
+               z0 = svrshr_m (p0, z1, 16))
+
+/*
+** rshr_1_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     srshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s16_z_tied1, svint16_t,
+               z0 = svrshr_n_s16_z (p0, z0, 1),
+               z0 = svrshr_z (p0, z0, 1))
+
+/*
+** rshr_1_s16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     srshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s16_z_untied, svint16_t,
+               z0 = svrshr_n_s16_z (p0, z1, 1),
+               z0 = svrshr_z (p0, z1, 1))
+
+/*
+** rshr_2_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     srshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s16_z_tied1, svint16_t,
+               z0 = svrshr_n_s16_z (p0, z0, 2),
+               z0 = svrshr_z (p0, z0, 2))
+
+/*
+** rshr_2_s16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     srshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s16_z_untied, svint16_t,
+               z0 = svrshr_n_s16_z (p0, z1, 2),
+               z0 = svrshr_z (p0, z1, 2))
+
+/*
+** rshr_16_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     srshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_16_s16_z_tied1, svint16_t,
+               z0 = svrshr_n_s16_z (p0, z0, 16),
+               z0 = svrshr_z (p0, z0, 16))
+
+/*
+** rshr_16_s16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     srshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_16_s16_z_untied, svint16_t,
+               z0 = svrshr_n_s16_z (p0, z1, 16),
+               z0 = svrshr_z (p0, z1, 16))
+
+/*
+** rshr_1_s16_x_tied1:
+**     srshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s16_x_tied1, svint16_t,
+               z0 = svrshr_n_s16_x (p0, z0, 1),
+               z0 = svrshr_x (p0, z0, 1))
+
+/*
+** rshr_1_s16_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s16_x_untied, svint16_t,
+               z0 = svrshr_n_s16_x (p0, z1, 1),
+               z0 = svrshr_x (p0, z1, 1))
+
+/*
+** rshr_2_s16_x_tied1:
+**     srshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s16_x_tied1, svint16_t,
+               z0 = svrshr_n_s16_x (p0, z0, 2),
+               z0 = svrshr_x (p0, z0, 2))
+
+/*
+** rshr_2_s16_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s16_x_untied, svint16_t,
+               z0 = svrshr_n_s16_x (p0, z1, 2),
+               z0 = svrshr_x (p0, z1, 2))
+
+/*
+** rshr_16_s16_x_tied1:
+**     srshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_16_s16_x_tied1, svint16_t,
+               z0 = svrshr_n_s16_x (p0, z0, 16),
+               z0 = svrshr_x (p0, z0, 16))
+
+/*
+** rshr_16_s16_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_16_s16_x_untied, svint16_t,
+               z0 = svrshr_n_s16_x (p0, z1, 16),
+               z0 = svrshr_x (p0, z1, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_s32.c
new file mode 100644 (file)
index 0000000..9655901
--- /dev/null
@@ -0,0 +1,177 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshr_1_s32_m_tied1:
+**     srshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s32_m_tied1, svint32_t,
+               z0 = svrshr_n_s32_m (p0, z0, 1),
+               z0 = svrshr_m (p0, z0, 1))
+
+/*
+** rshr_1_s32_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s32_m_untied, svint32_t,
+               z0 = svrshr_n_s32_m (p0, z1, 1),
+               z0 = svrshr_m (p0, z1, 1))
+
+/*
+** rshr_2_s32_m_tied1:
+**     srshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s32_m_tied1, svint32_t,
+               z0 = svrshr_n_s32_m (p0, z0, 2),
+               z0 = svrshr_m (p0, z0, 2))
+
+/*
+** rshr_2_s32_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s32_m_untied, svint32_t,
+               z0 = svrshr_n_s32_m (p0, z1, 2),
+               z0 = svrshr_m (p0, z1, 2))
+
+/*
+** rshr_32_s32_m_tied1:
+**     srshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_32_s32_m_tied1, svint32_t,
+               z0 = svrshr_n_s32_m (p0, z0, 32),
+               z0 = svrshr_m (p0, z0, 32))
+
+/*
+** rshr_32_s32_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_32_s32_m_untied, svint32_t,
+               z0 = svrshr_n_s32_m (p0, z1, 32),
+               z0 = svrshr_m (p0, z1, 32))
+
+/*
+** rshr_1_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     srshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s32_z_tied1, svint32_t,
+               z0 = svrshr_n_s32_z (p0, z0, 1),
+               z0 = svrshr_z (p0, z0, 1))
+
+/*
+** rshr_1_s32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     srshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s32_z_untied, svint32_t,
+               z0 = svrshr_n_s32_z (p0, z1, 1),
+               z0 = svrshr_z (p0, z1, 1))
+
+/*
+** rshr_2_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     srshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s32_z_tied1, svint32_t,
+               z0 = svrshr_n_s32_z (p0, z0, 2),
+               z0 = svrshr_z (p0, z0, 2))
+
+/*
+** rshr_2_s32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     srshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s32_z_untied, svint32_t,
+               z0 = svrshr_n_s32_z (p0, z1, 2),
+               z0 = svrshr_z (p0, z1, 2))
+
+/*
+** rshr_32_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     srshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_32_s32_z_tied1, svint32_t,
+               z0 = svrshr_n_s32_z (p0, z0, 32),
+               z0 = svrshr_z (p0, z0, 32))
+
+/*
+** rshr_32_s32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     srshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_32_s32_z_untied, svint32_t,
+               z0 = svrshr_n_s32_z (p0, z1, 32),
+               z0 = svrshr_z (p0, z1, 32))
+
+/*
+** rshr_1_s32_x_tied1:
+**     srshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s32_x_tied1, svint32_t,
+               z0 = svrshr_n_s32_x (p0, z0, 1),
+               z0 = svrshr_x (p0, z0, 1))
+
+/*
+** rshr_1_s32_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s32_x_untied, svint32_t,
+               z0 = svrshr_n_s32_x (p0, z1, 1),
+               z0 = svrshr_x (p0, z1, 1))
+
+/*
+** rshr_2_s32_x_tied1:
+**     srshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s32_x_tied1, svint32_t,
+               z0 = svrshr_n_s32_x (p0, z0, 2),
+               z0 = svrshr_x (p0, z0, 2))
+
+/*
+** rshr_2_s32_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s32_x_untied, svint32_t,
+               z0 = svrshr_n_s32_x (p0, z1, 2),
+               z0 = svrshr_x (p0, z1, 2))
+
+/*
+** rshr_32_s32_x_tied1:
+**     srshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_32_s32_x_tied1, svint32_t,
+               z0 = svrshr_n_s32_x (p0, z0, 32),
+               z0 = svrshr_x (p0, z0, 32))
+
+/*
+** rshr_32_s32_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_32_s32_x_untied, svint32_t,
+               z0 = svrshr_n_s32_x (p0, z1, 32),
+               z0 = svrshr_x (p0, z1, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_s64.c
new file mode 100644 (file)
index 0000000..4e91720
--- /dev/null
@@ -0,0 +1,177 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshr_1_s64_m_tied1:
+**     srshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s64_m_tied1, svint64_t,
+               z0 = svrshr_n_s64_m (p0, z0, 1),
+               z0 = svrshr_m (p0, z0, 1))
+
+/*
+** rshr_1_s64_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s64_m_untied, svint64_t,
+               z0 = svrshr_n_s64_m (p0, z1, 1),
+               z0 = svrshr_m (p0, z1, 1))
+
+/*
+** rshr_2_s64_m_tied1:
+**     srshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s64_m_tied1, svint64_t,
+               z0 = svrshr_n_s64_m (p0, z0, 2),
+               z0 = svrshr_m (p0, z0, 2))
+
+/*
+** rshr_2_s64_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s64_m_untied, svint64_t,
+               z0 = svrshr_n_s64_m (p0, z1, 2),
+               z0 = svrshr_m (p0, z1, 2))
+
+/*
+** rshr_64_s64_m_tied1:
+**     srshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_64_s64_m_tied1, svint64_t,
+               z0 = svrshr_n_s64_m (p0, z0, 64),
+               z0 = svrshr_m (p0, z0, 64))
+
+/*
+** rshr_64_s64_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_64_s64_m_untied, svint64_t,
+               z0 = svrshr_n_s64_m (p0, z1, 64),
+               z0 = svrshr_m (p0, z1, 64))
+
+/*
+** rshr_1_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     srshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s64_z_tied1, svint64_t,
+               z0 = svrshr_n_s64_z (p0, z0, 1),
+               z0 = svrshr_z (p0, z0, 1))
+
+/*
+** rshr_1_s64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     srshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s64_z_untied, svint64_t,
+               z0 = svrshr_n_s64_z (p0, z1, 1),
+               z0 = svrshr_z (p0, z1, 1))
+
+/*
+** rshr_2_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     srshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s64_z_tied1, svint64_t,
+               z0 = svrshr_n_s64_z (p0, z0, 2),
+               z0 = svrshr_z (p0, z0, 2))
+
+/*
+** rshr_2_s64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     srshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s64_z_untied, svint64_t,
+               z0 = svrshr_n_s64_z (p0, z1, 2),
+               z0 = svrshr_z (p0, z1, 2))
+
+/*
+** rshr_64_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     srshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_64_s64_z_tied1, svint64_t,
+               z0 = svrshr_n_s64_z (p0, z0, 64),
+               z0 = svrshr_z (p0, z0, 64))
+
+/*
+** rshr_64_s64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     srshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_64_s64_z_untied, svint64_t,
+               z0 = svrshr_n_s64_z (p0, z1, 64),
+               z0 = svrshr_z (p0, z1, 64))
+
+/*
+** rshr_1_s64_x_tied1:
+**     srshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s64_x_tied1, svint64_t,
+               z0 = svrshr_n_s64_x (p0, z0, 1),
+               z0 = svrshr_x (p0, z0, 1))
+
+/*
+** rshr_1_s64_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s64_x_untied, svint64_t,
+               z0 = svrshr_n_s64_x (p0, z1, 1),
+               z0 = svrshr_x (p0, z1, 1))
+
+/*
+** rshr_2_s64_x_tied1:
+**     srshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s64_x_tied1, svint64_t,
+               z0 = svrshr_n_s64_x (p0, z0, 2),
+               z0 = svrshr_x (p0, z0, 2))
+
+/*
+** rshr_2_s64_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s64_x_untied, svint64_t,
+               z0 = svrshr_n_s64_x (p0, z1, 2),
+               z0 = svrshr_x (p0, z1, 2))
+
+/*
+** rshr_64_s64_x_tied1:
+**     srshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_64_s64_x_tied1, svint64_t,
+               z0 = svrshr_n_s64_x (p0, z0, 64),
+               z0 = svrshr_x (p0, z0, 64))
+
+/*
+** rshr_64_s64_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_64_s64_x_untied, svint64_t,
+               z0 = svrshr_n_s64_x (p0, z1, 64),
+               z0 = svrshr_x (p0, z1, 64))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_s8.c
new file mode 100644 (file)
index 0000000..7dbc444
--- /dev/null
@@ -0,0 +1,177 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshr_1_s8_m_tied1:
+**     srshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s8_m_tied1, svint8_t,
+               z0 = svrshr_n_s8_m (p0, z0, 1),
+               z0 = svrshr_m (p0, z0, 1))
+
+/*
+** rshr_1_s8_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s8_m_untied, svint8_t,
+               z0 = svrshr_n_s8_m (p0, z1, 1),
+               z0 = svrshr_m (p0, z1, 1))
+
+/*
+** rshr_2_s8_m_tied1:
+**     srshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s8_m_tied1, svint8_t,
+               z0 = svrshr_n_s8_m (p0, z0, 2),
+               z0 = svrshr_m (p0, z0, 2))
+
+/*
+** rshr_2_s8_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s8_m_untied, svint8_t,
+               z0 = svrshr_n_s8_m (p0, z1, 2),
+               z0 = svrshr_m (p0, z1, 2))
+
+/*
+** rshr_8_s8_m_tied1:
+**     srshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_8_s8_m_tied1, svint8_t,
+               z0 = svrshr_n_s8_m (p0, z0, 8),
+               z0 = svrshr_m (p0, z0, 8))
+
+/*
+** rshr_8_s8_m_untied:
+**     movprfx z0, z1
+**     srshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_8_s8_m_untied, svint8_t,
+               z0 = svrshr_n_s8_m (p0, z1, 8),
+               z0 = svrshr_m (p0, z1, 8))
+
+/*
+** rshr_1_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     srshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s8_z_tied1, svint8_t,
+               z0 = svrshr_n_s8_z (p0, z0, 1),
+               z0 = svrshr_z (p0, z0, 1))
+
+/*
+** rshr_1_s8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     srshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s8_z_untied, svint8_t,
+               z0 = svrshr_n_s8_z (p0, z1, 1),
+               z0 = svrshr_z (p0, z1, 1))
+
+/*
+** rshr_2_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     srshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s8_z_tied1, svint8_t,
+               z0 = svrshr_n_s8_z (p0, z0, 2),
+               z0 = svrshr_z (p0, z0, 2))
+
+/*
+** rshr_2_s8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     srshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s8_z_untied, svint8_t,
+               z0 = svrshr_n_s8_z (p0, z1, 2),
+               z0 = svrshr_z (p0, z1, 2))
+
+/*
+** rshr_8_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     srshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_8_s8_z_tied1, svint8_t,
+               z0 = svrshr_n_s8_z (p0, z0, 8),
+               z0 = svrshr_z (p0, z0, 8))
+
+/*
+** rshr_8_s8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     srshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_8_s8_z_untied, svint8_t,
+               z0 = svrshr_n_s8_z (p0, z1, 8),
+               z0 = svrshr_z (p0, z1, 8))
+
+/*
+** rshr_1_s8_x_tied1:
+**     srshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s8_x_tied1, svint8_t,
+               z0 = svrshr_n_s8_x (p0, z0, 1),
+               z0 = svrshr_x (p0, z0, 1))
+
+/*
+** rshr_1_s8_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_s8_x_untied, svint8_t,
+               z0 = svrshr_n_s8_x (p0, z1, 1),
+               z0 = svrshr_x (p0, z1, 1))
+
+/*
+** rshr_2_s8_x_tied1:
+**     srshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s8_x_tied1, svint8_t,
+               z0 = svrshr_n_s8_x (p0, z0, 2),
+               z0 = svrshr_x (p0, z0, 2))
+
+/*
+** rshr_2_s8_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_s8_x_untied, svint8_t,
+               z0 = svrshr_n_s8_x (p0, z1, 2),
+               z0 = svrshr_x (p0, z1, 2))
+
+/*
+** rshr_8_s8_x_tied1:
+**     srshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_8_s8_x_tied1, svint8_t,
+               z0 = svrshr_n_s8_x (p0, z0, 8),
+               z0 = svrshr_x (p0, z0, 8))
+
+/*
+** rshr_8_s8_x_untied:
+**     movprfx z0, z1
+**     srshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_8_s8_x_untied, svint8_t,
+               z0 = svrshr_n_s8_x (p0, z1, 8),
+               z0 = svrshr_x (p0, z1, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_u16.c
new file mode 100644 (file)
index 0000000..7b253a8
--- /dev/null
@@ -0,0 +1,177 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshr_1_u16_m_tied1:
+**     urshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u16_m_tied1, svuint16_t,
+               z0 = svrshr_n_u16_m (p0, z0, 1),
+               z0 = svrshr_m (p0, z0, 1))
+
+/*
+** rshr_1_u16_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u16_m_untied, svuint16_t,
+               z0 = svrshr_n_u16_m (p0, z1, 1),
+               z0 = svrshr_m (p0, z1, 1))
+
+/*
+** rshr_2_u16_m_tied1:
+**     urshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u16_m_tied1, svuint16_t,
+               z0 = svrshr_n_u16_m (p0, z0, 2),
+               z0 = svrshr_m (p0, z0, 2))
+
+/*
+** rshr_2_u16_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u16_m_untied, svuint16_t,
+               z0 = svrshr_n_u16_m (p0, z1, 2),
+               z0 = svrshr_m (p0, z1, 2))
+
+/*
+** rshr_16_u16_m_tied1:
+**     urshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_16_u16_m_tied1, svuint16_t,
+               z0 = svrshr_n_u16_m (p0, z0, 16),
+               z0 = svrshr_m (p0, z0, 16))
+
+/*
+** rshr_16_u16_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_16_u16_m_untied, svuint16_t,
+               z0 = svrshr_n_u16_m (p0, z1, 16),
+               z0 = svrshr_m (p0, z1, 16))
+
+/*
+** rshr_1_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     urshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u16_z_tied1, svuint16_t,
+               z0 = svrshr_n_u16_z (p0, z0, 1),
+               z0 = svrshr_z (p0, z0, 1))
+
+/*
+** rshr_1_u16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     urshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u16_z_untied, svuint16_t,
+               z0 = svrshr_n_u16_z (p0, z1, 1),
+               z0 = svrshr_z (p0, z1, 1))
+
+/*
+** rshr_2_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     urshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u16_z_tied1, svuint16_t,
+               z0 = svrshr_n_u16_z (p0, z0, 2),
+               z0 = svrshr_z (p0, z0, 2))
+
+/*
+** rshr_2_u16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     urshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u16_z_untied, svuint16_t,
+               z0 = svrshr_n_u16_z (p0, z1, 2),
+               z0 = svrshr_z (p0, z1, 2))
+
+/*
+** rshr_16_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     urshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_16_u16_z_tied1, svuint16_t,
+               z0 = svrshr_n_u16_z (p0, z0, 16),
+               z0 = svrshr_z (p0, z0, 16))
+
+/*
+** rshr_16_u16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     urshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_16_u16_z_untied, svuint16_t,
+               z0 = svrshr_n_u16_z (p0, z1, 16),
+               z0 = svrshr_z (p0, z1, 16))
+
+/*
+** rshr_1_u16_x_tied1:
+**     urshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u16_x_tied1, svuint16_t,
+               z0 = svrshr_n_u16_x (p0, z0, 1),
+               z0 = svrshr_x (p0, z0, 1))
+
+/*
+** rshr_1_u16_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.h, p0/m, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u16_x_untied, svuint16_t,
+               z0 = svrshr_n_u16_x (p0, z1, 1),
+               z0 = svrshr_x (p0, z1, 1))
+
+/*
+** rshr_2_u16_x_tied1:
+**     urshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u16_x_tied1, svuint16_t,
+               z0 = svrshr_n_u16_x (p0, z0, 2),
+               z0 = svrshr_x (p0, z0, 2))
+
+/*
+** rshr_2_u16_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.h, p0/m, z0\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u16_x_untied, svuint16_t,
+               z0 = svrshr_n_u16_x (p0, z1, 2),
+               z0 = svrshr_x (p0, z1, 2))
+
+/*
+** rshr_16_u16_x_tied1:
+**     urshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_16_u16_x_tied1, svuint16_t,
+               z0 = svrshr_n_u16_x (p0, z0, 16),
+               z0 = svrshr_x (p0, z0, 16))
+
+/*
+** rshr_16_u16_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.h, p0/m, z0\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_16_u16_x_untied, svuint16_t,
+               z0 = svrshr_n_u16_x (p0, z1, 16),
+               z0 = svrshr_x (p0, z1, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_u32.c
new file mode 100644 (file)
index 0000000..29ce3bb
--- /dev/null
@@ -0,0 +1,177 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshr_1_u32_m_tied1:
+**     urshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u32_m_tied1, svuint32_t,
+               z0 = svrshr_n_u32_m (p0, z0, 1),
+               z0 = svrshr_m (p0, z0, 1))
+
+/*
+** rshr_1_u32_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u32_m_untied, svuint32_t,
+               z0 = svrshr_n_u32_m (p0, z1, 1),
+               z0 = svrshr_m (p0, z1, 1))
+
+/*
+** rshr_2_u32_m_tied1:
+**     urshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u32_m_tied1, svuint32_t,
+               z0 = svrshr_n_u32_m (p0, z0, 2),
+               z0 = svrshr_m (p0, z0, 2))
+
+/*
+** rshr_2_u32_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u32_m_untied, svuint32_t,
+               z0 = svrshr_n_u32_m (p0, z1, 2),
+               z0 = svrshr_m (p0, z1, 2))
+
+/*
+** rshr_32_u32_m_tied1:
+**     urshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_32_u32_m_tied1, svuint32_t,
+               z0 = svrshr_n_u32_m (p0, z0, 32),
+               z0 = svrshr_m (p0, z0, 32))
+
+/*
+** rshr_32_u32_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_32_u32_m_untied, svuint32_t,
+               z0 = svrshr_n_u32_m (p0, z1, 32),
+               z0 = svrshr_m (p0, z1, 32))
+
+/*
+** rshr_1_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     urshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u32_z_tied1, svuint32_t,
+               z0 = svrshr_n_u32_z (p0, z0, 1),
+               z0 = svrshr_z (p0, z0, 1))
+
+/*
+** rshr_1_u32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     urshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u32_z_untied, svuint32_t,
+               z0 = svrshr_n_u32_z (p0, z1, 1),
+               z0 = svrshr_z (p0, z1, 1))
+
+/*
+** rshr_2_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     urshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u32_z_tied1, svuint32_t,
+               z0 = svrshr_n_u32_z (p0, z0, 2),
+               z0 = svrshr_z (p0, z0, 2))
+
+/*
+** rshr_2_u32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     urshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u32_z_untied, svuint32_t,
+               z0 = svrshr_n_u32_z (p0, z1, 2),
+               z0 = svrshr_z (p0, z1, 2))
+
+/*
+** rshr_32_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     urshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_32_u32_z_tied1, svuint32_t,
+               z0 = svrshr_n_u32_z (p0, z0, 32),
+               z0 = svrshr_z (p0, z0, 32))
+
+/*
+** rshr_32_u32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     urshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_32_u32_z_untied, svuint32_t,
+               z0 = svrshr_n_u32_z (p0, z1, 32),
+               z0 = svrshr_z (p0, z1, 32))
+
+/*
+** rshr_1_u32_x_tied1:
+**     urshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u32_x_tied1, svuint32_t,
+               z0 = svrshr_n_u32_x (p0, z0, 1),
+               z0 = svrshr_x (p0, z0, 1))
+
+/*
+** rshr_1_u32_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.s, p0/m, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u32_x_untied, svuint32_t,
+               z0 = svrshr_n_u32_x (p0, z1, 1),
+               z0 = svrshr_x (p0, z1, 1))
+
+/*
+** rshr_2_u32_x_tied1:
+**     urshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u32_x_tied1, svuint32_t,
+               z0 = svrshr_n_u32_x (p0, z0, 2),
+               z0 = svrshr_x (p0, z0, 2))
+
+/*
+** rshr_2_u32_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.s, p0/m, z0\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u32_x_untied, svuint32_t,
+               z0 = svrshr_n_u32_x (p0, z1, 2),
+               z0 = svrshr_x (p0, z1, 2))
+
+/*
+** rshr_32_u32_x_tied1:
+**     urshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_32_u32_x_tied1, svuint32_t,
+               z0 = svrshr_n_u32_x (p0, z0, 32),
+               z0 = svrshr_x (p0, z0, 32))
+
+/*
+** rshr_32_u32_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.s, p0/m, z0\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_32_u32_x_untied, svuint32_t,
+               z0 = svrshr_n_u32_x (p0, z1, 32),
+               z0 = svrshr_x (p0, z1, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_u64.c
new file mode 100644 (file)
index 0000000..84b942b
--- /dev/null
@@ -0,0 +1,177 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshr_1_u64_m_tied1:
+**     urshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u64_m_tied1, svuint64_t,
+               z0 = svrshr_n_u64_m (p0, z0, 1),
+               z0 = svrshr_m (p0, z0, 1))
+
+/*
+** rshr_1_u64_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u64_m_untied, svuint64_t,
+               z0 = svrshr_n_u64_m (p0, z1, 1),
+               z0 = svrshr_m (p0, z1, 1))
+
+/*
+** rshr_2_u64_m_tied1:
+**     urshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u64_m_tied1, svuint64_t,
+               z0 = svrshr_n_u64_m (p0, z0, 2),
+               z0 = svrshr_m (p0, z0, 2))
+
+/*
+** rshr_2_u64_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u64_m_untied, svuint64_t,
+               z0 = svrshr_n_u64_m (p0, z1, 2),
+               z0 = svrshr_m (p0, z1, 2))
+
+/*
+** rshr_64_u64_m_tied1:
+**     urshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_64_u64_m_tied1, svuint64_t,
+               z0 = svrshr_n_u64_m (p0, z0, 64),
+               z0 = svrshr_m (p0, z0, 64))
+
+/*
+** rshr_64_u64_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_64_u64_m_untied, svuint64_t,
+               z0 = svrshr_n_u64_m (p0, z1, 64),
+               z0 = svrshr_m (p0, z1, 64))
+
+/*
+** rshr_1_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     urshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u64_z_tied1, svuint64_t,
+               z0 = svrshr_n_u64_z (p0, z0, 1),
+               z0 = svrshr_z (p0, z0, 1))
+
+/*
+** rshr_1_u64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     urshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u64_z_untied, svuint64_t,
+               z0 = svrshr_n_u64_z (p0, z1, 1),
+               z0 = svrshr_z (p0, z1, 1))
+
+/*
+** rshr_2_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     urshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u64_z_tied1, svuint64_t,
+               z0 = svrshr_n_u64_z (p0, z0, 2),
+               z0 = svrshr_z (p0, z0, 2))
+
+/*
+** rshr_2_u64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     urshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u64_z_untied, svuint64_t,
+               z0 = svrshr_n_u64_z (p0, z1, 2),
+               z0 = svrshr_z (p0, z1, 2))
+
+/*
+** rshr_64_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     urshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_64_u64_z_tied1, svuint64_t,
+               z0 = svrshr_n_u64_z (p0, z0, 64),
+               z0 = svrshr_z (p0, z0, 64))
+
+/*
+** rshr_64_u64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     urshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_64_u64_z_untied, svuint64_t,
+               z0 = svrshr_n_u64_z (p0, z1, 64),
+               z0 = svrshr_z (p0, z1, 64))
+
+/*
+** rshr_1_u64_x_tied1:
+**     urshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u64_x_tied1, svuint64_t,
+               z0 = svrshr_n_u64_x (p0, z0, 1),
+               z0 = svrshr_x (p0, z0, 1))
+
+/*
+** rshr_1_u64_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.d, p0/m, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u64_x_untied, svuint64_t,
+               z0 = svrshr_n_u64_x (p0, z1, 1),
+               z0 = svrshr_x (p0, z1, 1))
+
+/*
+** rshr_2_u64_x_tied1:
+**     urshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u64_x_tied1, svuint64_t,
+               z0 = svrshr_n_u64_x (p0, z0, 2),
+               z0 = svrshr_x (p0, z0, 2))
+
+/*
+** rshr_2_u64_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.d, p0/m, z0\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u64_x_untied, svuint64_t,
+               z0 = svrshr_n_u64_x (p0, z1, 2),
+               z0 = svrshr_x (p0, z1, 2))
+
+/*
+** rshr_64_u64_x_tied1:
+**     urshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_64_u64_x_tied1, svuint64_t,
+               z0 = svrshr_n_u64_x (p0, z0, 64),
+               z0 = svrshr_x (p0, z0, 64))
+
+/*
+** rshr_64_u64_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.d, p0/m, z0\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_64_u64_x_untied, svuint64_t,
+               z0 = svrshr_n_u64_x (p0, z1, 64),
+               z0 = svrshr_x (p0, z1, 64))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshr_u8.c
new file mode 100644 (file)
index 0000000..7a563ec
--- /dev/null
@@ -0,0 +1,177 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshr_1_u8_m_tied1:
+**     urshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u8_m_tied1, svuint8_t,
+               z0 = svrshr_n_u8_m (p0, z0, 1),
+               z0 = svrshr_m (p0, z0, 1))
+
+/*
+** rshr_1_u8_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u8_m_untied, svuint8_t,
+               z0 = svrshr_n_u8_m (p0, z1, 1),
+               z0 = svrshr_m (p0, z1, 1))
+
+/*
+** rshr_2_u8_m_tied1:
+**     urshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u8_m_tied1, svuint8_t,
+               z0 = svrshr_n_u8_m (p0, z0, 2),
+               z0 = svrshr_m (p0, z0, 2))
+
+/*
+** rshr_2_u8_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u8_m_untied, svuint8_t,
+               z0 = svrshr_n_u8_m (p0, z1, 2),
+               z0 = svrshr_m (p0, z1, 2))
+
+/*
+** rshr_8_u8_m_tied1:
+**     urshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_8_u8_m_tied1, svuint8_t,
+               z0 = svrshr_n_u8_m (p0, z0, 8),
+               z0 = svrshr_m (p0, z0, 8))
+
+/*
+** rshr_8_u8_m_untied:
+**     movprfx z0, z1
+**     urshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_8_u8_m_untied, svuint8_t,
+               z0 = svrshr_n_u8_m (p0, z1, 8),
+               z0 = svrshr_m (p0, z1, 8))
+
+/*
+** rshr_1_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     urshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u8_z_tied1, svuint8_t,
+               z0 = svrshr_n_u8_z (p0, z0, 1),
+               z0 = svrshr_z (p0, z0, 1))
+
+/*
+** rshr_1_u8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     urshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u8_z_untied, svuint8_t,
+               z0 = svrshr_n_u8_z (p0, z1, 1),
+               z0 = svrshr_z (p0, z1, 1))
+
+/*
+** rshr_2_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     urshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u8_z_tied1, svuint8_t,
+               z0 = svrshr_n_u8_z (p0, z0, 2),
+               z0 = svrshr_z (p0, z0, 2))
+
+/*
+** rshr_2_u8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     urshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u8_z_untied, svuint8_t,
+               z0 = svrshr_n_u8_z (p0, z1, 2),
+               z0 = svrshr_z (p0, z1, 2))
+
+/*
+** rshr_8_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     urshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_8_u8_z_tied1, svuint8_t,
+               z0 = svrshr_n_u8_z (p0, z0, 8),
+               z0 = svrshr_z (p0, z0, 8))
+
+/*
+** rshr_8_u8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     urshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_8_u8_z_untied, svuint8_t,
+               z0 = svrshr_n_u8_z (p0, z1, 8),
+               z0 = svrshr_z (p0, z1, 8))
+
+/*
+** rshr_1_u8_x_tied1:
+**     urshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u8_x_tied1, svuint8_t,
+               z0 = svrshr_n_u8_x (p0, z0, 1),
+               z0 = svrshr_x (p0, z0, 1))
+
+/*
+** rshr_1_u8_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.b, p0/m, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_1_u8_x_untied, svuint8_t,
+               z0 = svrshr_n_u8_x (p0, z1, 1),
+               z0 = svrshr_x (p0, z1, 1))
+
+/*
+** rshr_2_u8_x_tied1:
+**     urshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u8_x_tied1, svuint8_t,
+               z0 = svrshr_n_u8_x (p0, z0, 2),
+               z0 = svrshr_x (p0, z0, 2))
+
+/*
+** rshr_2_u8_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.b, p0/m, z0\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_2_u8_x_untied, svuint8_t,
+               z0 = svrshr_n_u8_x (p0, z1, 2),
+               z0 = svrshr_x (p0, z1, 2))
+
+/*
+** rshr_8_u8_x_tied1:
+**     urshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_8_u8_x_tied1, svuint8_t,
+               z0 = svrshr_n_u8_x (p0, z0, 8),
+               z0 = svrshr_x (p0, z0, 8))
+
+/*
+** rshr_8_u8_x_untied:
+**     movprfx z0, z1
+**     urshr   z0\.b, p0/m, z0\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rshr_8_u8_x_untied, svuint8_t,
+               z0 = svrshr_n_u8_x (p0, z1, 8),
+               z0 = svrshr_x (p0, z1, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnb_s16.c
new file mode 100644 (file)
index 0000000..7b4d984
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshrnb_1_s16:
+**     rshrnb  z0\.b, z0\.h, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_1_s16, svint8_t, svint16_t,
+                   z0_res = svrshrnb_n_s16 (z0, 1),
+                   z0_res = svrshrnb (z0, 1))
+
+/*
+** rshrnb_2_s16:
+**     rshrnb  z0\.b, z0\.h, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_2_s16, svint8_t, svint16_t,
+                   z0_res = svrshrnb_n_s16 (z0, 2),
+                   z0_res = svrshrnb (z0, 2))
+
+/*
+** rshrnb_8_s16_tied1:
+**     rshrnb  z0\.b, z0\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_8_s16_tied1, svint8_t, svint16_t,
+                   z0_res = svrshrnb_n_s16 (z0, 8),
+                   z0_res = svrshrnb (z0, 8))
+
+/*
+** rshrnb_8_s16_untied:
+**     rshrnb  z0\.b, z1\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_8_s16_untied, svint8_t, svint16_t,
+                   z0_res = svrshrnb_n_s16 (z1, 8),
+                   z0_res = svrshrnb (z1, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnb_s32.c
new file mode 100644 (file)
index 0000000..cd15203
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshrnb_1_s32:
+**     rshrnb  z0\.h, z0\.s, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_1_s32, svint16_t, svint32_t,
+                   z0_res = svrshrnb_n_s32 (z0, 1),
+                   z0_res = svrshrnb (z0, 1))
+
+/*
+** rshrnb_2_s32:
+**     rshrnb  z0\.h, z0\.s, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_2_s32, svint16_t, svint32_t,
+                   z0_res = svrshrnb_n_s32 (z0, 2),
+                   z0_res = svrshrnb (z0, 2))
+
+/*
+** rshrnb_16_s32_tied1:
+**     rshrnb  z0\.h, z0\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_16_s32_tied1, svint16_t, svint32_t,
+                   z0_res = svrshrnb_n_s32 (z0, 16),
+                   z0_res = svrshrnb (z0, 16))
+
+/*
+** rshrnb_16_s32_untied:
+**     rshrnb  z0\.h, z1\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_16_s32_untied, svint16_t, svint32_t,
+                   z0_res = svrshrnb_n_s32 (z1, 16),
+                   z0_res = svrshrnb (z1, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnb_s64.c
new file mode 100644 (file)
index 0000000..4fdefd9
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshrnb_1_s64:
+**     rshrnb  z0\.s, z0\.d, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_1_s64, svint32_t, svint64_t,
+                   z0_res = svrshrnb_n_s64 (z0, 1),
+                   z0_res = svrshrnb (z0, 1))
+
+/*
+** rshrnb_2_s64:
+**     rshrnb  z0\.s, z0\.d, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_2_s64, svint32_t, svint64_t,
+                   z0_res = svrshrnb_n_s64 (z0, 2),
+                   z0_res = svrshrnb (z0, 2))
+
+/*
+** rshrnb_32_s64_tied1:
+**     rshrnb  z0\.s, z0\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_32_s64_tied1, svint32_t, svint64_t,
+                   z0_res = svrshrnb_n_s64 (z0, 32),
+                   z0_res = svrshrnb (z0, 32))
+
+/*
+** rshrnb_32_s64_untied:
+**     rshrnb  z0\.s, z1\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_32_s64_untied, svint32_t, svint64_t,
+                   z0_res = svrshrnb_n_s64 (z1, 32),
+                   z0_res = svrshrnb (z1, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnb_u16.c
new file mode 100644 (file)
index 0000000..64f2881
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshrnb_1_u16:
+**     rshrnb  z0\.b, z0\.h, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_1_u16, svuint8_t, svuint16_t,
+                   z0_res = svrshrnb_n_u16 (z0, 1),
+                   z0_res = svrshrnb (z0, 1))
+
+/*
+** rshrnb_2_u16:
+**     rshrnb  z0\.b, z0\.h, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_2_u16, svuint8_t, svuint16_t,
+                   z0_res = svrshrnb_n_u16 (z0, 2),
+                   z0_res = svrshrnb (z0, 2))
+
+/*
+** rshrnb_8_u16_tied1:
+**     rshrnb  z0\.b, z0\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_8_u16_tied1, svuint8_t, svuint16_t,
+                   z0_res = svrshrnb_n_u16 (z0, 8),
+                   z0_res = svrshrnb (z0, 8))
+
+/*
+** rshrnb_8_u16_untied:
+**     rshrnb  z0\.b, z1\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_8_u16_untied, svuint8_t, svuint16_t,
+                   z0_res = svrshrnb_n_u16 (z1, 8),
+                   z0_res = svrshrnb (z1, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnb_u32.c
new file mode 100644 (file)
index 0000000..4388e56
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshrnb_1_u32:
+**     rshrnb  z0\.h, z0\.s, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_1_u32, svuint16_t, svuint32_t,
+                   z0_res = svrshrnb_n_u32 (z0, 1),
+                   z0_res = svrshrnb (z0, 1))
+
+/*
+** rshrnb_2_u32:
+**     rshrnb  z0\.h, z0\.s, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_2_u32, svuint16_t, svuint32_t,
+                   z0_res = svrshrnb_n_u32 (z0, 2),
+                   z0_res = svrshrnb (z0, 2))
+
+/*
+** rshrnb_16_u32_tied1:
+**     rshrnb  z0\.h, z0\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_16_u32_tied1, svuint16_t, svuint32_t,
+                   z0_res = svrshrnb_n_u32 (z0, 16),
+                   z0_res = svrshrnb (z0, 16))
+
+/*
+** rshrnb_16_u32_untied:
+**     rshrnb  z0\.h, z1\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_16_u32_untied, svuint16_t, svuint32_t,
+                   z0_res = svrshrnb_n_u32 (z1, 16),
+                   z0_res = svrshrnb (z1, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnb_u64.c
new file mode 100644 (file)
index 0000000..652a03f
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshrnb_1_u64:
+**     rshrnb  z0\.s, z0\.d, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_1_u64, svuint32_t, svuint64_t,
+                   z0_res = svrshrnb_n_u64 (z0, 1),
+                   z0_res = svrshrnb (z0, 1))
+
+/*
+** rshrnb_2_u64:
+**     rshrnb  z0\.s, z0\.d, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_2_u64, svuint32_t, svuint64_t,
+                   z0_res = svrshrnb_n_u64 (z0, 2),
+                   z0_res = svrshrnb (z0, 2))
+
+/*
+** rshrnb_32_u64_tied1:
+**     rshrnb  z0\.s, z0\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_32_u64_tied1, svuint32_t, svuint64_t,
+                   z0_res = svrshrnb_n_u64 (z0, 32),
+                   z0_res = svrshrnb (z0, 32))
+
+/*
+** rshrnb_32_u64_untied:
+**     rshrnb  z0\.s, z1\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rshrnb_32_u64_untied, svuint32_t, svuint64_t,
+                   z0_res = svrshrnb_n_u64 (z1, 32),
+                   z0_res = svrshrnb (z1, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnt_s16.c
new file mode 100644 (file)
index 0000000..2c40a7e
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshrnt_1_s16:
+**     rshrnt  z0\.b, z4\.h, #1
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_1_s16, svint8_t, svint16_t,
+            z0 = svrshrnt_n_s16 (z0, z4, 1),
+            z0 = svrshrnt (z0, z4, 1))
+
+/*
+** rshrnt_2_s16:
+**     rshrnt  z0\.b, z4\.h, #2
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_2_s16, svint8_t, svint16_t,
+            z0 = svrshrnt_n_s16 (z0, z4, 2),
+            z0 = svrshrnt (z0, z4, 2))
+
+/*
+** rshrnt_8_s16_tied1:
+**     rshrnt  z0\.b, z4\.h, #8
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_8_s16_tied1, svint8_t, svint16_t,
+            z0 = svrshrnt_n_s16 (z0, z4, 8),
+            z0 = svrshrnt (z0, z4, 8))
+
+/*
+** rshrnt_8_s16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     rshrnt  z0\.b, z4\.h, #8
+** |
+**     rshrnt  z1\.b, z4\.h, #8
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_8_s16_untied, svint8_t, svint16_t,
+            z0 = svrshrnt_n_s16 (z1, z4, 8),
+            z0 = svrshrnt (z1, z4, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnt_s32.c
new file mode 100644 (file)
index 0000000..e5c0595
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshrnt_1_s32:
+**     rshrnt  z0\.h, z4\.s, #1
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_1_s32, svint16_t, svint32_t,
+            z0 = svrshrnt_n_s32 (z0, z4, 1),
+            z0 = svrshrnt (z0, z4, 1))
+
+/*
+** rshrnt_2_s32:
+**     rshrnt  z0\.h, z4\.s, #2
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_2_s32, svint16_t, svint32_t,
+            z0 = svrshrnt_n_s32 (z0, z4, 2),
+            z0 = svrshrnt (z0, z4, 2))
+
+/*
+** rshrnt_16_s32_tied1:
+**     rshrnt  z0\.h, z4\.s, #16
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_16_s32_tied1, svint16_t, svint32_t,
+            z0 = svrshrnt_n_s32 (z0, z4, 16),
+            z0 = svrshrnt (z0, z4, 16))
+
+/*
+** rshrnt_16_s32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     rshrnt  z0\.h, z4\.s, #16
+** |
+**     rshrnt  z1\.h, z4\.s, #16
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_16_s32_untied, svint16_t, svint32_t,
+            z0 = svrshrnt_n_s32 (z1, z4, 16),
+            z0 = svrshrnt (z1, z4, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnt_s64.c
new file mode 100644 (file)
index 0000000..63c0ea4
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshrnt_1_s64:
+**     rshrnt  z0\.s, z4\.d, #1
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_1_s64, svint32_t, svint64_t,
+            z0 = svrshrnt_n_s64 (z0, z4, 1),
+            z0 = svrshrnt (z0, z4, 1))
+
+/*
+** rshrnt_2_s64:
+**     rshrnt  z0\.s, z4\.d, #2
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_2_s64, svint32_t, svint64_t,
+            z0 = svrshrnt_n_s64 (z0, z4, 2),
+            z0 = svrshrnt (z0, z4, 2))
+
+/*
+** rshrnt_32_s64_tied1:
+**     rshrnt  z0\.s, z4\.d, #32
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_32_s64_tied1, svint32_t, svint64_t,
+            z0 = svrshrnt_n_s64 (z0, z4, 32),
+            z0 = svrshrnt (z0, z4, 32))
+
+/*
+** rshrnt_32_s64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     rshrnt  z0\.s, z4\.d, #32
+** |
+**     rshrnt  z1\.s, z4\.d, #32
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_32_s64_untied, svint32_t, svint64_t,
+            z0 = svrshrnt_n_s64 (z1, z4, 32),
+            z0 = svrshrnt (z1, z4, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnt_u16.c
new file mode 100644 (file)
index 0000000..9e5d6f9
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshrnt_1_u16:
+**     rshrnt  z0\.b, z4\.h, #1
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_1_u16, svuint8_t, svuint16_t,
+            z0 = svrshrnt_n_u16 (z0, z4, 1),
+            z0 = svrshrnt (z0, z4, 1))
+
+/*
+** rshrnt_2_u16:
+**     rshrnt  z0\.b, z4\.h, #2
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_2_u16, svuint8_t, svuint16_t,
+            z0 = svrshrnt_n_u16 (z0, z4, 2),
+            z0 = svrshrnt (z0, z4, 2))
+
+/*
+** rshrnt_8_u16_tied1:
+**     rshrnt  z0\.b, z4\.h, #8
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_8_u16_tied1, svuint8_t, svuint16_t,
+            z0 = svrshrnt_n_u16 (z0, z4, 8),
+            z0 = svrshrnt (z0, z4, 8))
+
+/*
+** rshrnt_8_u16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     rshrnt  z0\.b, z4\.h, #8
+** |
+**     rshrnt  z1\.b, z4\.h, #8
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_8_u16_untied, svuint8_t, svuint16_t,
+            z0 = svrshrnt_n_u16 (z1, z4, 8),
+            z0 = svrshrnt (z1, z4, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnt_u32.c
new file mode 100644 (file)
index 0000000..b14383b
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshrnt_1_u32:
+**     rshrnt  z0\.h, z4\.s, #1
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_1_u32, svuint16_t, svuint32_t,
+            z0 = svrshrnt_n_u32 (z0, z4, 1),
+            z0 = svrshrnt (z0, z4, 1))
+
+/*
+** rshrnt_2_u32:
+**     rshrnt  z0\.h, z4\.s, #2
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_2_u32, svuint16_t, svuint32_t,
+            z0 = svrshrnt_n_u32 (z0, z4, 2),
+            z0 = svrshrnt (z0, z4, 2))
+
+/*
+** rshrnt_16_u32_tied1:
+**     rshrnt  z0\.h, z4\.s, #16
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_16_u32_tied1, svuint16_t, svuint32_t,
+            z0 = svrshrnt_n_u32 (z0, z4, 16),
+            z0 = svrshrnt (z0, z4, 16))
+
+/*
+** rshrnt_16_u32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     rshrnt  z0\.h, z4\.s, #16
+** |
+**     rshrnt  z1\.h, z4\.s, #16
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_16_u32_untied, svuint16_t, svuint32_t,
+            z0 = svrshrnt_n_u32 (z1, z4, 16),
+            z0 = svrshrnt (z1, z4, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rshrnt_u64.c
new file mode 100644 (file)
index 0000000..e6b008f
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rshrnt_1_u64:
+**     rshrnt  z0\.s, z4\.d, #1
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_1_u64, svuint32_t, svuint64_t,
+            z0 = svrshrnt_n_u64 (z0, z4, 1),
+            z0 = svrshrnt (z0, z4, 1))
+
+/*
+** rshrnt_2_u64:
+**     rshrnt  z0\.s, z4\.d, #2
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_2_u64, svuint32_t, svuint64_t,
+            z0 = svrshrnt_n_u64 (z0, z4, 2),
+            z0 = svrshrnt (z0, z4, 2))
+
+/*
+** rshrnt_32_u64_tied1:
+**     rshrnt  z0\.s, z4\.d, #32
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_32_u64_tied1, svuint32_t, svuint64_t,
+            z0 = svrshrnt_n_u64 (z0, z4, 32),
+            z0 = svrshrnt (z0, z4, 32))
+
+/*
+** rshrnt_32_u64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     rshrnt  z0\.s, z4\.d, #32
+** |
+**     rshrnt  z1\.s, z4\.d, #32
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rshrnt_32_u64_untied, svuint32_t, svuint64_t,
+            z0 = svrshrnt_n_u64 (z1, z4, 32),
+            z0 = svrshrnt (z1, z4, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsqrte_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsqrte_u32.c
new file mode 100644 (file)
index 0000000..e9e4fb7
--- /dev/null
@@ -0,0 +1,81 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsqrte_u32_m_tied12:
+**     ursqrte z0\.s, p0/m, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rsqrte_u32_m_tied12, svuint32_t,
+               z0 = svrsqrte_u32_m (z0, p0, z0),
+               z0 = svrsqrte_m (z0, p0, z0))
+
+/*
+** rsqrte_u32_m_tied1:
+**     ursqrte z0\.s, p0/m, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rsqrte_u32_m_tied1, svuint32_t,
+               z0 = svrsqrte_u32_m (z0, p0, z1),
+               z0 = svrsqrte_m (z0, p0, z1))
+
+/*
+** rsqrte_u32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     ursqrte z0\.s, p0/m, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rsqrte_u32_m_tied2, svuint32_t,
+               z0 = svrsqrte_u32_m (z1, p0, z0),
+               z0 = svrsqrte_m (z1, p0, z0))
+
+/*
+** rsqrte_u32_m_untied:
+**     movprfx z0, z2
+**     ursqrte z0\.s, p0/m, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rsqrte_u32_m_untied, svuint32_t,
+               z0 = svrsqrte_u32_m (z2, p0, z1),
+               z0 = svrsqrte_m (z2, p0, z1))
+
+/*
+** rsqrte_u32_z_tied1:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.s, p0/z, \1\.s
+**     ursqrte z0\.s, p0/m, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rsqrte_u32_z_tied1, svuint32_t,
+               z0 = svrsqrte_u32_z (p0, z0),
+               z0 = svrsqrte_z (p0, z0))
+
+/*
+** rsqrte_u32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     ursqrte z0\.s, p0/m, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rsqrte_u32_z_untied, svuint32_t,
+               z0 = svrsqrte_u32_z (p0, z1),
+               z0 = svrsqrte_z (p0, z1))
+
+/*
+** rsqrte_u32_x_tied1:
+**     ursqrte z0\.s, p0/m, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rsqrte_u32_x_tied1, svuint32_t,
+               z0 = svrsqrte_u32_x (p0, z0),
+               z0 = svrsqrte_x (p0, z0))
+
+/*
+** rsqrte_u32_x_untied:
+**     ursqrte z0\.s, p0/m, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (rsqrte_u32_x_untied, svuint32_t,
+               z0 = svrsqrte_u32_x (p0, z1),
+               z0 = svrsqrte_x (p0, z1))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_s16.c
new file mode 100644 (file)
index 0000000..be815ff
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsra_1_s16_tied1:
+**     srsra   z0\.h, z1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_s16_tied1, svint16_t,
+               z0 = svrsra_n_s16 (z0, z1, 1),
+               z0 = svrsra (z0, z1, 1))
+
+/*
+** rsra_1_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     srsra   z0\.h, \1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_s16_tied2, svint16_t,
+               z0 = svrsra_n_s16 (z1, z0, 1),
+               z0 = svrsra (z1, z0, 1))
+
+/*
+** rsra_1_s16_untied:
+**     movprfx z0, z1
+**     srsra   z0\.h, z2\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_s16_untied, svint16_t,
+               z0 = svrsra_n_s16 (z1, z2, 1),
+               z0 = svrsra (z1, z2, 1))
+
+/*
+** rsra_2_s16_tied1:
+**     srsra   z0\.h, z1\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_s16_tied1, svint16_t,
+               z0 = svrsra_n_s16 (z0, z1, 2),
+               z0 = svrsra (z0, z1, 2))
+
+/*
+** rsra_2_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     srsra   z0\.h, \1\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_s16_tied2, svint16_t,
+               z0 = svrsra_n_s16 (z1, z0, 2),
+               z0 = svrsra (z1, z0, 2))
+
+/*
+** rsra_2_s16_untied:
+**     movprfx z0, z1
+**     srsra   z0\.h, z2\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_s16_untied, svint16_t,
+               z0 = svrsra_n_s16 (z1, z2, 2),
+               z0 = svrsra (z1, z2, 2))
+
+/*
+** rsra_16_s16_tied1:
+**     srsra   z0\.h, z1\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_16_s16_tied1, svint16_t,
+               z0 = svrsra_n_s16 (z0, z1, 16),
+               z0 = svrsra (z0, z1, 16))
+
+/*
+** rsra_16_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     srsra   z0\.h, \1\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_16_s16_tied2, svint16_t,
+               z0 = svrsra_n_s16 (z1, z0, 16),
+               z0 = svrsra (z1, z0, 16))
+
+/*
+** rsra_16_s16_untied:
+**     movprfx z0, z1
+**     srsra   z0\.h, z2\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_16_s16_untied, svint16_t,
+               z0 = svrsra_n_s16 (z1, z2, 16),
+               z0 = svrsra (z1, z2, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_s32.c
new file mode 100644 (file)
index 0000000..241f210
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsra_1_s32_tied1:
+**     srsra   z0\.s, z1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_s32_tied1, svint32_t,
+               z0 = svrsra_n_s32 (z0, z1, 1),
+               z0 = svrsra (z0, z1, 1))
+
+/*
+** rsra_1_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     srsra   z0\.s, \1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_s32_tied2, svint32_t,
+               z0 = svrsra_n_s32 (z1, z0, 1),
+               z0 = svrsra (z1, z0, 1))
+
+/*
+** rsra_1_s32_untied:
+**     movprfx z0, z1
+**     srsra   z0\.s, z2\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_s32_untied, svint32_t,
+               z0 = svrsra_n_s32 (z1, z2, 1),
+               z0 = svrsra (z1, z2, 1))
+
+/*
+** rsra_2_s32_tied1:
+**     srsra   z0\.s, z1\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_s32_tied1, svint32_t,
+               z0 = svrsra_n_s32 (z0, z1, 2),
+               z0 = svrsra (z0, z1, 2))
+
+/*
+** rsra_2_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     srsra   z0\.s, \1\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_s32_tied2, svint32_t,
+               z0 = svrsra_n_s32 (z1, z0, 2),
+               z0 = svrsra (z1, z0, 2))
+
+/*
+** rsra_2_s32_untied:
+**     movprfx z0, z1
+**     srsra   z0\.s, z2\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_s32_untied, svint32_t,
+               z0 = svrsra_n_s32 (z1, z2, 2),
+               z0 = svrsra (z1, z2, 2))
+
+/*
+** rsra_32_s32_tied1:
+**     srsra   z0\.s, z1\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_32_s32_tied1, svint32_t,
+               z0 = svrsra_n_s32 (z0, z1, 32),
+               z0 = svrsra (z0, z1, 32))
+
+/*
+** rsra_32_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     srsra   z0\.s, \1\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_32_s32_tied2, svint32_t,
+               z0 = svrsra_n_s32 (z1, z0, 32),
+               z0 = svrsra (z1, z0, 32))
+
+/*
+** rsra_32_s32_untied:
+**     movprfx z0, z1
+**     srsra   z0\.s, z2\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_32_s32_untied, svint32_t,
+               z0 = svrsra_n_s32 (z1, z2, 32),
+               z0 = svrsra (z1, z2, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_s64.c
new file mode 100644 (file)
index 0000000..0a076ea
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsra_1_s64_tied1:
+**     srsra   z0\.d, z1\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_s64_tied1, svint64_t,
+               z0 = svrsra_n_s64 (z0, z1, 1),
+               z0 = svrsra (z0, z1, 1))
+
+/*
+** rsra_1_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     srsra   z0\.d, \1, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_s64_tied2, svint64_t,
+               z0 = svrsra_n_s64 (z1, z0, 1),
+               z0 = svrsra (z1, z0, 1))
+
+/*
+** rsra_1_s64_untied:
+**     movprfx z0, z1
+**     srsra   z0\.d, z2\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_s64_untied, svint64_t,
+               z0 = svrsra_n_s64 (z1, z2, 1),
+               z0 = svrsra (z1, z2, 1))
+
+/*
+** rsra_2_s64_tied1:
+**     srsra   z0\.d, z1\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_s64_tied1, svint64_t,
+               z0 = svrsra_n_s64 (z0, z1, 2),
+               z0 = svrsra (z0, z1, 2))
+
+/*
+** rsra_2_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     srsra   z0\.d, \1, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_s64_tied2, svint64_t,
+               z0 = svrsra_n_s64 (z1, z0, 2),
+               z0 = svrsra (z1, z0, 2))
+
+/*
+** rsra_2_s64_untied:
+**     movprfx z0, z1
+**     srsra   z0\.d, z2\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_s64_untied, svint64_t,
+               z0 = svrsra_n_s64 (z1, z2, 2),
+               z0 = svrsra (z1, z2, 2))
+
+/*
+** rsra_64_s64_tied1:
+**     srsra   z0\.d, z1\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_64_s64_tied1, svint64_t,
+               z0 = svrsra_n_s64 (z0, z1, 64),
+               z0 = svrsra (z0, z1, 64))
+
+/*
+** rsra_64_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     srsra   z0\.d, \1, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_64_s64_tied2, svint64_t,
+               z0 = svrsra_n_s64 (z1, z0, 64),
+               z0 = svrsra (z1, z0, 64))
+
+/*
+** rsra_64_s64_untied:
+**     movprfx z0, z1
+**     srsra   z0\.d, z2\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_64_s64_untied, svint64_t,
+               z0 = svrsra_n_s64 (z1, z2, 64),
+               z0 = svrsra (z1, z2, 64))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_s8.c
new file mode 100644 (file)
index 0000000..5e197b4
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsra_1_s8_tied1:
+**     srsra   z0\.b, z1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_s8_tied1, svint8_t,
+               z0 = svrsra_n_s8 (z0, z1, 1),
+               z0 = svrsra (z0, z1, 1))
+
+/*
+** rsra_1_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     srsra   z0\.b, \1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_s8_tied2, svint8_t,
+               z0 = svrsra_n_s8 (z1, z0, 1),
+               z0 = svrsra (z1, z0, 1))
+
+/*
+** rsra_1_s8_untied:
+**     movprfx z0, z1
+**     srsra   z0\.b, z2\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_s8_untied, svint8_t,
+               z0 = svrsra_n_s8 (z1, z2, 1),
+               z0 = svrsra (z1, z2, 1))
+
+/*
+** rsra_2_s8_tied1:
+**     srsra   z0\.b, z1\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_s8_tied1, svint8_t,
+               z0 = svrsra_n_s8 (z0, z1, 2),
+               z0 = svrsra (z0, z1, 2))
+
+/*
+** rsra_2_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     srsra   z0\.b, \1\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_s8_tied2, svint8_t,
+               z0 = svrsra_n_s8 (z1, z0, 2),
+               z0 = svrsra (z1, z0, 2))
+
+/*
+** rsra_2_s8_untied:
+**     movprfx z0, z1
+**     srsra   z0\.b, z2\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_s8_untied, svint8_t,
+               z0 = svrsra_n_s8 (z1, z2, 2),
+               z0 = svrsra (z1, z2, 2))
+
+/*
+** rsra_8_s8_tied1:
+**     srsra   z0\.b, z1\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_8_s8_tied1, svint8_t,
+               z0 = svrsra_n_s8 (z0, z1, 8),
+               z0 = svrsra (z0, z1, 8))
+
+/*
+** rsra_8_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     srsra   z0\.b, \1\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_8_s8_tied2, svint8_t,
+               z0 = svrsra_n_s8 (z1, z0, 8),
+               z0 = svrsra (z1, z0, 8))
+
+/*
+** rsra_8_s8_untied:
+**     movprfx z0, z1
+**     srsra   z0\.b, z2\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_8_s8_untied, svint8_t,
+               z0 = svrsra_n_s8 (z1, z2, 8),
+               z0 = svrsra (z1, z2, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_u16.c
new file mode 100644 (file)
index 0000000..f0f40dc
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsra_1_u16_tied1:
+**     ursra   z0\.h, z1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_u16_tied1, svuint16_t,
+               z0 = svrsra_n_u16 (z0, z1, 1),
+               z0 = svrsra (z0, z1, 1))
+
+/*
+** rsra_1_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     ursra   z0\.h, \1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_u16_tied2, svuint16_t,
+               z0 = svrsra_n_u16 (z1, z0, 1),
+               z0 = svrsra (z1, z0, 1))
+
+/*
+** rsra_1_u16_untied:
+**     movprfx z0, z1
+**     ursra   z0\.h, z2\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_u16_untied, svuint16_t,
+               z0 = svrsra_n_u16 (z1, z2, 1),
+               z0 = svrsra (z1, z2, 1))
+
+/*
+** rsra_2_u16_tied1:
+**     ursra   z0\.h, z1\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_u16_tied1, svuint16_t,
+               z0 = svrsra_n_u16 (z0, z1, 2),
+               z0 = svrsra (z0, z1, 2))
+
+/*
+** rsra_2_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     ursra   z0\.h, \1\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_u16_tied2, svuint16_t,
+               z0 = svrsra_n_u16 (z1, z0, 2),
+               z0 = svrsra (z1, z0, 2))
+
+/*
+** rsra_2_u16_untied:
+**     movprfx z0, z1
+**     ursra   z0\.h, z2\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_u16_untied, svuint16_t,
+               z0 = svrsra_n_u16 (z1, z2, 2),
+               z0 = svrsra (z1, z2, 2))
+
+/*
+** rsra_16_u16_tied1:
+**     ursra   z0\.h, z1\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_16_u16_tied1, svuint16_t,
+               z0 = svrsra_n_u16 (z0, z1, 16),
+               z0 = svrsra (z0, z1, 16))
+
+/*
+** rsra_16_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     ursra   z0\.h, \1\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_16_u16_tied2, svuint16_t,
+               z0 = svrsra_n_u16 (z1, z0, 16),
+               z0 = svrsra (z1, z0, 16))
+
+/*
+** rsra_16_u16_untied:
+**     movprfx z0, z1
+**     ursra   z0\.h, z2\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_16_u16_untied, svuint16_t,
+               z0 = svrsra_n_u16 (z1, z2, 16),
+               z0 = svrsra (z1, z2, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_u32.c
new file mode 100644 (file)
index 0000000..ac37a40
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsra_1_u32_tied1:
+**     ursra   z0\.s, z1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_u32_tied1, svuint32_t,
+               z0 = svrsra_n_u32 (z0, z1, 1),
+               z0 = svrsra (z0, z1, 1))
+
+/*
+** rsra_1_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     ursra   z0\.s, \1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_u32_tied2, svuint32_t,
+               z0 = svrsra_n_u32 (z1, z0, 1),
+               z0 = svrsra (z1, z0, 1))
+
+/*
+** rsra_1_u32_untied:
+**     movprfx z0, z1
+**     ursra   z0\.s, z2\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_u32_untied, svuint32_t,
+               z0 = svrsra_n_u32 (z1, z2, 1),
+               z0 = svrsra (z1, z2, 1))
+
+/*
+** rsra_2_u32_tied1:
+**     ursra   z0\.s, z1\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_u32_tied1, svuint32_t,
+               z0 = svrsra_n_u32 (z0, z1, 2),
+               z0 = svrsra (z0, z1, 2))
+
+/*
+** rsra_2_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     ursra   z0\.s, \1\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_u32_tied2, svuint32_t,
+               z0 = svrsra_n_u32 (z1, z0, 2),
+               z0 = svrsra (z1, z0, 2))
+
+/*
+** rsra_2_u32_untied:
+**     movprfx z0, z1
+**     ursra   z0\.s, z2\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_u32_untied, svuint32_t,
+               z0 = svrsra_n_u32 (z1, z2, 2),
+               z0 = svrsra (z1, z2, 2))
+
+/*
+** rsra_32_u32_tied1:
+**     ursra   z0\.s, z1\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_32_u32_tied1, svuint32_t,
+               z0 = svrsra_n_u32 (z0, z1, 32),
+               z0 = svrsra (z0, z1, 32))
+
+/*
+** rsra_32_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     ursra   z0\.s, \1\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_32_u32_tied2, svuint32_t,
+               z0 = svrsra_n_u32 (z1, z0, 32),
+               z0 = svrsra (z1, z0, 32))
+
+/*
+** rsra_32_u32_untied:
+**     movprfx z0, z1
+**     ursra   z0\.s, z2\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_32_u32_untied, svuint32_t,
+               z0 = svrsra_n_u32 (z1, z2, 32),
+               z0 = svrsra (z1, z2, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_u64.c
new file mode 100644 (file)
index 0000000..b0fbb6a
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsra_1_u64_tied1:
+**     ursra   z0\.d, z1\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_u64_tied1, svuint64_t,
+               z0 = svrsra_n_u64 (z0, z1, 1),
+               z0 = svrsra (z0, z1, 1))
+
+/*
+** rsra_1_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     ursra   z0\.d, \1, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_u64_tied2, svuint64_t,
+               z0 = svrsra_n_u64 (z1, z0, 1),
+               z0 = svrsra (z1, z0, 1))
+
+/*
+** rsra_1_u64_untied:
+**     movprfx z0, z1
+**     ursra   z0\.d, z2\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_u64_untied, svuint64_t,
+               z0 = svrsra_n_u64 (z1, z2, 1),
+               z0 = svrsra (z1, z2, 1))
+
+/*
+** rsra_2_u64_tied1:
+**     ursra   z0\.d, z1\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_u64_tied1, svuint64_t,
+               z0 = svrsra_n_u64 (z0, z1, 2),
+               z0 = svrsra (z0, z1, 2))
+
+/*
+** rsra_2_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     ursra   z0\.d, \1, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_u64_tied2, svuint64_t,
+               z0 = svrsra_n_u64 (z1, z0, 2),
+               z0 = svrsra (z1, z0, 2))
+
+/*
+** rsra_2_u64_untied:
+**     movprfx z0, z1
+**     ursra   z0\.d, z2\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_u64_untied, svuint64_t,
+               z0 = svrsra_n_u64 (z1, z2, 2),
+               z0 = svrsra (z1, z2, 2))
+
+/*
+** rsra_64_u64_tied1:
+**     ursra   z0\.d, z1\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_64_u64_tied1, svuint64_t,
+               z0 = svrsra_n_u64 (z0, z1, 64),
+               z0 = svrsra (z0, z1, 64))
+
+/*
+** rsra_64_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     ursra   z0\.d, \1, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_64_u64_tied2, svuint64_t,
+               z0 = svrsra_n_u64 (z1, z0, 64),
+               z0 = svrsra (z1, z0, 64))
+
+/*
+** rsra_64_u64_untied:
+**     movprfx z0, z1
+**     ursra   z0\.d, z2\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_64_u64_untied, svuint64_t,
+               z0 = svrsra_n_u64 (z1, z2, 64),
+               z0 = svrsra (z1, z2, 64))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsra_u8.c
new file mode 100644 (file)
index 0000000..a9641a2
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsra_1_u8_tied1:
+**     ursra   z0\.b, z1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_u8_tied1, svuint8_t,
+               z0 = svrsra_n_u8 (z0, z1, 1),
+               z0 = svrsra (z0, z1, 1))
+
+/*
+** rsra_1_u8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     ursra   z0\.b, \1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_u8_tied2, svuint8_t,
+               z0 = svrsra_n_u8 (z1, z0, 1),
+               z0 = svrsra (z1, z0, 1))
+
+/*
+** rsra_1_u8_untied:
+**     movprfx z0, z1
+**     ursra   z0\.b, z2\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_1_u8_untied, svuint8_t,
+               z0 = svrsra_n_u8 (z1, z2, 1),
+               z0 = svrsra (z1, z2, 1))
+
+/*
+** rsra_2_u8_tied1:
+**     ursra   z0\.b, z1\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_u8_tied1, svuint8_t,
+               z0 = svrsra_n_u8 (z0, z1, 2),
+               z0 = svrsra (z0, z1, 2))
+
+/*
+** rsra_2_u8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     ursra   z0\.b, \1\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_u8_tied2, svuint8_t,
+               z0 = svrsra_n_u8 (z1, z0, 2),
+               z0 = svrsra (z1, z0, 2))
+
+/*
+** rsra_2_u8_untied:
+**     movprfx z0, z1
+**     ursra   z0\.b, z2\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_2_u8_untied, svuint8_t,
+               z0 = svrsra_n_u8 (z1, z2, 2),
+               z0 = svrsra (z1, z2, 2))
+
+/*
+** rsra_8_u8_tied1:
+**     ursra   z0\.b, z1\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_8_u8_tied1, svuint8_t,
+               z0 = svrsra_n_u8 (z0, z1, 8),
+               z0 = svrsra (z0, z1, 8))
+
+/*
+** rsra_8_u8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     ursra   z0\.b, \1\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_8_u8_tied2, svuint8_t,
+               z0 = svrsra_n_u8 (z1, z0, 8),
+               z0 = svrsra (z1, z0, 8))
+
+/*
+** rsra_8_u8_untied:
+**     movprfx z0, z1
+**     ursra   z0\.b, z2\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (rsra_8_u8_untied, svuint8_t,
+               z0 = svrsra_n_u8 (z1, z2, 8),
+               z0 = svrsra (z1, z2, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnb_s16.c
new file mode 100644 (file)
index 0000000..f0ab471
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsubhnb_s16_tied1:
+**     rsubhnb z0\.b, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_s16_tied1, svint8_t, svint16_t,
+                   z0_res = svrsubhnb_s16 (z0, z1),
+                   z0_res = svrsubhnb (z0, z1))
+
+/*
+** rsubhnb_s16_tied2:
+**     rsubhnb z0\.b, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_s16_tied2, svint8_t, svint16_t,
+                   z0_res = svrsubhnb_s16 (z1, z0),
+                   z0_res = svrsubhnb (z1, z0))
+
+/*
+** rsubhnb_s16_untied:
+**     rsubhnb z0\.b, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_s16_untied, svint8_t, svint16_t,
+                   z0_res = svrsubhnb_s16 (z1, z2),
+                   z0_res = svrsubhnb (z1, z2))
+
+/*
+** rsubhnb_w0_s16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     rsubhnb z0\.b, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (rsubhnb_w0_s16_tied1, svint8_t, svint16_t, int16_t,
+                    z0_res = svrsubhnb_n_s16 (z0, x0),
+                    z0_res = svrsubhnb (z0, x0))
+
+/*
+** rsubhnb_w0_s16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     rsubhnb z0\.b, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (rsubhnb_w0_s16_untied, svint8_t, svint16_t, int16_t,
+                    z0_res = svrsubhnb_n_s16 (z1, x0),
+                    z0_res = svrsubhnb (z1, x0))
+
+/*
+** rsubhnb_11_s16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     rsubhnb z0\.b, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_11_s16_tied1, svint8_t, svint16_t,
+                   z0_res = svrsubhnb_n_s16 (z0, 11),
+                   z0_res = svrsubhnb (z0, 11))
+
+/*
+** rsubhnb_11_s16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     rsubhnb z0\.b, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_11_s16_untied, svint8_t, svint16_t,
+                   z0_res = svrsubhnb_n_s16 (z1, 11),
+                   z0_res = svrsubhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnb_s32.c
new file mode 100644 (file)
index 0000000..fb64cdd
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsubhnb_s32_tied1:
+**     rsubhnb z0\.h, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_s32_tied1, svint16_t, svint32_t,
+                   z0_res = svrsubhnb_s32 (z0, z1),
+                   z0_res = svrsubhnb (z0, z1))
+
+/*
+** rsubhnb_s32_tied2:
+**     rsubhnb z0\.h, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_s32_tied2, svint16_t, svint32_t,
+                   z0_res = svrsubhnb_s32 (z1, z0),
+                   z0_res = svrsubhnb (z1, z0))
+
+/*
+** rsubhnb_s32_untied:
+**     rsubhnb z0\.h, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_s32_untied, svint16_t, svint32_t,
+                   z0_res = svrsubhnb_s32 (z1, z2),
+                   z0_res = svrsubhnb (z1, z2))
+
+/*
+** rsubhnb_w0_s32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     rsubhnb z0\.h, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (rsubhnb_w0_s32_tied1, svint16_t, svint32_t, int32_t,
+                    z0_res = svrsubhnb_n_s32 (z0, x0),
+                    z0_res = svrsubhnb (z0, x0))
+
+/*
+** rsubhnb_w0_s32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     rsubhnb z0\.h, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (rsubhnb_w0_s32_untied, svint16_t, svint32_t, int32_t,
+                    z0_res = svrsubhnb_n_s32 (z1, x0),
+                    z0_res = svrsubhnb (z1, x0))
+
+/*
+** rsubhnb_11_s32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     rsubhnb z0\.h, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_11_s32_tied1, svint16_t, svint32_t,
+                   z0_res = svrsubhnb_n_s32 (z0, 11),
+                   z0_res = svrsubhnb (z0, 11))
+
+/*
+** rsubhnb_11_s32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     rsubhnb z0\.h, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_11_s32_untied, svint16_t, svint32_t,
+                   z0_res = svrsubhnb_n_s32 (z1, 11),
+                   z0_res = svrsubhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnb_s64.c
new file mode 100644 (file)
index 0000000..f2dc4aa
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsubhnb_s64_tied1:
+**     rsubhnb z0\.s, z0\.d, z1\.d
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_s64_tied1, svint32_t, svint64_t,
+                   z0_res = svrsubhnb_s64 (z0, z1),
+                   z0_res = svrsubhnb (z0, z1))
+
+/*
+** rsubhnb_s64_tied2:
+**     rsubhnb z0\.s, z1\.d, z0\.d
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_s64_tied2, svint32_t, svint64_t,
+                   z0_res = svrsubhnb_s64 (z1, z0),
+                   z0_res = svrsubhnb (z1, z0))
+
+/*
+** rsubhnb_s64_untied:
+**     rsubhnb z0\.s, z1\.d, z2\.d
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_s64_untied, svint32_t, svint64_t,
+                   z0_res = svrsubhnb_s64 (z1, z2),
+                   z0_res = svrsubhnb (z1, z2))
+
+/*
+** rsubhnb_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     rsubhnb z0\.s, z0\.d, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (rsubhnb_x0_s64_tied1, svint32_t, svint64_t, int64_t,
+                    z0_res = svrsubhnb_n_s64 (z0, x0),
+                    z0_res = svrsubhnb (z0, x0))
+
+/*
+** rsubhnb_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     rsubhnb z0\.s, z1\.d, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (rsubhnb_x0_s64_untied, svint32_t, svint64_t, int64_t,
+                    z0_res = svrsubhnb_n_s64 (z1, x0),
+                    z0_res = svrsubhnb (z1, x0))
+
+/*
+** rsubhnb_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     rsubhnb z0\.s, z0\.d, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_11_s64_tied1, svint32_t, svint64_t,
+                   z0_res = svrsubhnb_n_s64 (z0, 11),
+                   z0_res = svrsubhnb (z0, 11))
+
+/*
+** rsubhnb_11_s64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     rsubhnb z0\.s, z1\.d, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_11_s64_untied, svint32_t, svint64_t,
+                   z0_res = svrsubhnb_n_s64 (z1, 11),
+                   z0_res = svrsubhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnb_u16.c
new file mode 100644 (file)
index 0000000..9396b72
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsubhnb_u16_tied1:
+**     rsubhnb z0\.b, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_u16_tied1, svuint8_t, svuint16_t,
+                   z0_res = svrsubhnb_u16 (z0, z1),
+                   z0_res = svrsubhnb (z0, z1))
+
+/*
+** rsubhnb_u16_tied2:
+**     rsubhnb z0\.b, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_u16_tied2, svuint8_t, svuint16_t,
+                   z0_res = svrsubhnb_u16 (z1, z0),
+                   z0_res = svrsubhnb (z1, z0))
+
+/*
+** rsubhnb_u16_untied:
+**     rsubhnb z0\.b, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_u16_untied, svuint8_t, svuint16_t,
+                   z0_res = svrsubhnb_u16 (z1, z2),
+                   z0_res = svrsubhnb (z1, z2))
+
+/*
+** rsubhnb_w0_u16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     rsubhnb z0\.b, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (rsubhnb_w0_u16_tied1, svuint8_t, svuint16_t, uint16_t,
+                    z0_res = svrsubhnb_n_u16 (z0, x0),
+                    z0_res = svrsubhnb (z0, x0))
+
+/*
+** rsubhnb_w0_u16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     rsubhnb z0\.b, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (rsubhnb_w0_u16_untied, svuint8_t, svuint16_t, uint16_t,
+                    z0_res = svrsubhnb_n_u16 (z1, x0),
+                    z0_res = svrsubhnb (z1, x0))
+
+/*
+** rsubhnb_11_u16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     rsubhnb z0\.b, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_11_u16_tied1, svuint8_t, svuint16_t,
+                   z0_res = svrsubhnb_n_u16 (z0, 11),
+                   z0_res = svrsubhnb (z0, 11))
+
+/*
+** rsubhnb_11_u16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     rsubhnb z0\.b, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_11_u16_untied, svuint8_t, svuint16_t,
+                   z0_res = svrsubhnb_n_u16 (z1, 11),
+                   z0_res = svrsubhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnb_u32.c
new file mode 100644 (file)
index 0000000..4e6c74f
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsubhnb_u32_tied1:
+**     rsubhnb z0\.h, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_u32_tied1, svuint16_t, svuint32_t,
+                   z0_res = svrsubhnb_u32 (z0, z1),
+                   z0_res = svrsubhnb (z0, z1))
+
+/*
+** rsubhnb_u32_tied2:
+**     rsubhnb z0\.h, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_u32_tied2, svuint16_t, svuint32_t,
+                   z0_res = svrsubhnb_u32 (z1, z0),
+                   z0_res = svrsubhnb (z1, z0))
+
+/*
+** rsubhnb_u32_untied:
+**     rsubhnb z0\.h, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_u32_untied, svuint16_t, svuint32_t,
+                   z0_res = svrsubhnb_u32 (z1, z2),
+                   z0_res = svrsubhnb (z1, z2))
+
+/*
+** rsubhnb_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     rsubhnb z0\.h, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (rsubhnb_w0_u32_tied1, svuint16_t, svuint32_t, uint32_t,
+                    z0_res = svrsubhnb_n_u32 (z0, x0),
+                    z0_res = svrsubhnb (z0, x0))
+
+/*
+** rsubhnb_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     rsubhnb z0\.h, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (rsubhnb_w0_u32_untied, svuint16_t, svuint32_t, uint32_t,
+                    z0_res = svrsubhnb_n_u32 (z1, x0),
+                    z0_res = svrsubhnb (z1, x0))
+
+/*
+** rsubhnb_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     rsubhnb z0\.h, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_11_u32_tied1, svuint16_t, svuint32_t,
+                   z0_res = svrsubhnb_n_u32 (z0, 11),
+                   z0_res = svrsubhnb (z0, 11))
+
+/*
+** rsubhnb_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     rsubhnb z0\.h, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_11_u32_untied, svuint16_t, svuint32_t,
+                   z0_res = svrsubhnb_n_u32 (z1, 11),
+                   z0_res = svrsubhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnb_u64.c
new file mode 100644 (file)
index 0000000..e58c1db
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsubhnb_u64_tied1:
+**     rsubhnb z0\.s, z0\.d, z1\.d
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_u64_tied1, svuint32_t, svuint64_t,
+                   z0_res = svrsubhnb_u64 (z0, z1),
+                   z0_res = svrsubhnb (z0, z1))
+
+/*
+** rsubhnb_u64_tied2:
+**     rsubhnb z0\.s, z1\.d, z0\.d
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_u64_tied2, svuint32_t, svuint64_t,
+                   z0_res = svrsubhnb_u64 (z1, z0),
+                   z0_res = svrsubhnb (z1, z0))
+
+/*
+** rsubhnb_u64_untied:
+**     rsubhnb z0\.s, z1\.d, z2\.d
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_u64_untied, svuint32_t, svuint64_t,
+                   z0_res = svrsubhnb_u64 (z1, z2),
+                   z0_res = svrsubhnb (z1, z2))
+
+/*
+** rsubhnb_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     rsubhnb z0\.s, z0\.d, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (rsubhnb_x0_u64_tied1, svuint32_t, svuint64_t, uint64_t,
+                    z0_res = svrsubhnb_n_u64 (z0, x0),
+                    z0_res = svrsubhnb (z0, x0))
+
+/*
+** rsubhnb_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     rsubhnb z0\.s, z1\.d, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (rsubhnb_x0_u64_untied, svuint32_t, svuint64_t, uint64_t,
+                    z0_res = svrsubhnb_n_u64 (z1, x0),
+                    z0_res = svrsubhnb (z1, x0))
+
+/*
+** rsubhnb_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     rsubhnb z0\.s, z0\.d, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_11_u64_tied1, svuint32_t, svuint64_t,
+                   z0_res = svrsubhnb_n_u64 (z0, 11),
+                   z0_res = svrsubhnb (z0, 11))
+
+/*
+** rsubhnb_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     rsubhnb z0\.s, z1\.d, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (rsubhnb_11_u64_untied, svuint32_t, svuint64_t,
+                   z0_res = svrsubhnb_n_u64 (z1, 11),
+                   z0_res = svrsubhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnt_s16.c
new file mode 100644 (file)
index 0000000..a836ab8
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsubhnt_s16_tied1:
+**     rsubhnt z0\.b, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_s16_tied1, svint8_t, svint16_t,
+            z0 = svrsubhnt_s16 (z0, z4, z5),
+            z0 = svrsubhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (rsubhnt_s16_tied2, svint8_t, svint16_t,
+                z0_res = svrsubhnt_s16 (z4, z0, z1),
+                z0_res = svrsubhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (rsubhnt_s16_tied3, svint8_t, svint16_t,
+                z0_res = svrsubhnt_s16 (z4, z1, z0),
+                z0_res = svrsubhnt (z4, z1, z0))
+
+/*
+** rsubhnt_s16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     rsubhnt z0\.b, z4\.h, z5\.h
+** |
+**     rsubhnt z1\.b, z4\.h, z5\.h
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_s16_untied, svint8_t, svint16_t,
+            z0 = svrsubhnt_s16 (z1, z4, z5),
+            z0 = svrsubhnt (z1, z4, z5))
+
+/*
+** rsubhnt_w0_s16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     rsubhnt z0\.b, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (rsubhnt_w0_s16_tied1, svint8_t, svint16_t, int16_t,
+             z0 = svrsubhnt_n_s16 (z0, z4, x0),
+             z0 = svrsubhnt (z0, z4, x0))
+
+/*
+** rsubhnt_w0_s16_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     mov     z0\.d, z1\.d
+**     rsubhnt z0\.b, z4\.h, \1
+** |
+**     rsubhnt z1\.b, z4\.h, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (rsubhnt_w0_s16_untied, svint8_t, svint16_t, int16_t,
+             z0 = svrsubhnt_n_s16 (z1, z4, x0),
+             z0 = svrsubhnt (z1, z4, x0))
+
+/*
+** rsubhnt_11_s16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     rsubhnt z0\.b, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_11_s16_tied1, svint8_t, svint16_t,
+            z0 = svrsubhnt_n_s16 (z0, z4, 11),
+            z0 = svrsubhnt (z0, z4, 11))
+
+/*
+** rsubhnt_11_s16_untied:
+**     mov     (z[0-9]+\.h), #11
+** (
+**     mov     z0\.d, z1\.d
+**     rsubhnt z0\.b, z4\.h, \1
+** |
+**     rsubhnt z1\.b, z4\.h, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_11_s16_untied, svint8_t, svint16_t,
+            z0 = svrsubhnt_n_s16 (z1, z4, 11),
+            z0 = svrsubhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnt_s32.c
new file mode 100644 (file)
index 0000000..7032402
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsubhnt_s32_tied1:
+**     rsubhnt z0\.h, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_s32_tied1, svint16_t, svint32_t,
+            z0 = svrsubhnt_s32 (z0, z4, z5),
+            z0 = svrsubhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (rsubhnt_s32_tied2, svint16_t, svint32_t,
+                z0_res = svrsubhnt_s32 (z4, z0, z1),
+                z0_res = svrsubhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (rsubhnt_s32_tied3, svint16_t, svint32_t,
+                z0_res = svrsubhnt_s32 (z4, z1, z0),
+                z0_res = svrsubhnt (z4, z1, z0))
+
+/*
+** rsubhnt_s32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     rsubhnt z0\.h, z4\.s, z5\.s
+** |
+**     rsubhnt z1\.h, z4\.s, z5\.s
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_s32_untied, svint16_t, svint32_t,
+            z0 = svrsubhnt_s32 (z1, z4, z5),
+            z0 = svrsubhnt (z1, z4, z5))
+
+/*
+** rsubhnt_w0_s32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     rsubhnt z0\.h, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (rsubhnt_w0_s32_tied1, svint16_t, svint32_t, int32_t,
+             z0 = svrsubhnt_n_s32 (z0, z4, x0),
+             z0 = svrsubhnt (z0, z4, x0))
+
+/*
+** rsubhnt_w0_s32_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     mov     z0\.d, z1\.d
+**     rsubhnt z0\.h, z4\.s, \1
+** |
+**     rsubhnt z1\.h, z4\.s, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (rsubhnt_w0_s32_untied, svint16_t, svint32_t, int32_t,
+             z0 = svrsubhnt_n_s32 (z1, z4, x0),
+             z0 = svrsubhnt (z1, z4, x0))
+
+/*
+** rsubhnt_11_s32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     rsubhnt z0\.h, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_11_s32_tied1, svint16_t, svint32_t,
+            z0 = svrsubhnt_n_s32 (z0, z4, 11),
+            z0 = svrsubhnt (z0, z4, 11))
+
+/*
+** rsubhnt_11_s32_untied:
+**     mov     (z[0-9]+\.s), #11
+** (
+**     mov     z0\.d, z1\.d
+**     rsubhnt z0\.h, z4\.s, \1
+** |
+**     rsubhnt z1\.h, z4\.s, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_11_s32_untied, svint16_t, svint32_t,
+            z0 = svrsubhnt_n_s32 (z1, z4, 11),
+            z0 = svrsubhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnt_s64.c
new file mode 100644 (file)
index 0000000..aaa2fad
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsubhnt_s64_tied1:
+**     rsubhnt z0\.s, z4\.d, z5\.d
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_s64_tied1, svint32_t, svint64_t,
+            z0 = svrsubhnt_s64 (z0, z4, z5),
+            z0 = svrsubhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (rsubhnt_s64_tied2, svint32_t, svint64_t,
+                z0_res = svrsubhnt_s64 (z4, z0, z1),
+                z0_res = svrsubhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (rsubhnt_s64_tied3, svint32_t, svint64_t,
+                z0_res = svrsubhnt_s64 (z4, z1, z0),
+                z0_res = svrsubhnt (z4, z1, z0))
+
+/*
+** rsubhnt_s64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     rsubhnt z0\.s, z4\.d, z5\.d
+** |
+**     rsubhnt z1\.s, z4\.d, z5\.d
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_s64_untied, svint32_t, svint64_t,
+            z0 = svrsubhnt_s64 (z1, z4, z5),
+            z0 = svrsubhnt (z1, z4, z5))
+
+/*
+** rsubhnt_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     rsubhnt z0\.s, z4\.d, \1
+**     ret
+*/
+TEST_DUAL_ZX (rsubhnt_x0_s64_tied1, svint32_t, svint64_t, int64_t,
+             z0 = svrsubhnt_n_s64 (z0, z4, x0),
+             z0 = svrsubhnt (z0, z4, x0))
+
+/*
+** rsubhnt_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     mov     z0\.d, z1\.d
+**     rsubhnt z0\.s, z4\.d, \1
+** |
+**     rsubhnt z1\.s, z4\.d, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (rsubhnt_x0_s64_untied, svint32_t, svint64_t, int64_t,
+             z0 = svrsubhnt_n_s64 (z1, z4, x0),
+             z0 = svrsubhnt (z1, z4, x0))
+
+/*
+** rsubhnt_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     rsubhnt z0\.s, z4\.d, \1
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_11_s64_tied1, svint32_t, svint64_t,
+            z0 = svrsubhnt_n_s64 (z0, z4, 11),
+            z0 = svrsubhnt (z0, z4, 11))
+
+/*
+** rsubhnt_11_s64_untied:
+**     mov     (z[0-9]+\.d), #11
+** (
+**     mov     z0\.d, z1\.d
+**     rsubhnt z0\.s, z4\.d, \1
+** |
+**     rsubhnt z1\.s, z4\.d, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_11_s64_untied, svint32_t, svint64_t,
+            z0 = svrsubhnt_n_s64 (z1, z4, 11),
+            z0 = svrsubhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnt_u16.c
new file mode 100644 (file)
index 0000000..9e36ff0
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsubhnt_u16_tied1:
+**     rsubhnt z0\.b, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_u16_tied1, svuint8_t, svuint16_t,
+            z0 = svrsubhnt_u16 (z0, z4, z5),
+            z0 = svrsubhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (rsubhnt_u16_tied2, svuint8_t, svuint16_t,
+                z0_res = svrsubhnt_u16 (z4, z0, z1),
+                z0_res = svrsubhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (rsubhnt_u16_tied3, svuint8_t, svuint16_t,
+                z0_res = svrsubhnt_u16 (z4, z1, z0),
+                z0_res = svrsubhnt (z4, z1, z0))
+
+/*
+** rsubhnt_u16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     rsubhnt z0\.b, z4\.h, z5\.h
+** |
+**     rsubhnt z1\.b, z4\.h, z5\.h
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_u16_untied, svuint8_t, svuint16_t,
+            z0 = svrsubhnt_u16 (z1, z4, z5),
+            z0 = svrsubhnt (z1, z4, z5))
+
+/*
+** rsubhnt_w0_u16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     rsubhnt z0\.b, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (rsubhnt_w0_u16_tied1, svuint8_t, svuint16_t, uint16_t,
+             z0 = svrsubhnt_n_u16 (z0, z4, x0),
+             z0 = svrsubhnt (z0, z4, x0))
+
+/*
+** rsubhnt_w0_u16_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     mov     z0\.d, z1\.d
+**     rsubhnt z0\.b, z4\.h, \1
+** |
+**     rsubhnt z1\.b, z4\.h, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (rsubhnt_w0_u16_untied, svuint8_t, svuint16_t, uint16_t,
+             z0 = svrsubhnt_n_u16 (z1, z4, x0),
+             z0 = svrsubhnt (z1, z4, x0))
+
+/*
+** rsubhnt_11_u16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     rsubhnt z0\.b, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_11_u16_tied1, svuint8_t, svuint16_t,
+            z0 = svrsubhnt_n_u16 (z0, z4, 11),
+            z0 = svrsubhnt (z0, z4, 11))
+
+/*
+** rsubhnt_11_u16_untied:
+**     mov     (z[0-9]+\.h), #11
+** (
+**     mov     z0\.d, z1\.d
+**     rsubhnt z0\.b, z4\.h, \1
+** |
+**     rsubhnt z1\.b, z4\.h, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_11_u16_untied, svuint8_t, svuint16_t,
+            z0 = svrsubhnt_n_u16 (z1, z4, 11),
+            z0 = svrsubhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnt_u32.c
new file mode 100644 (file)
index 0000000..c9ddfee
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsubhnt_u32_tied1:
+**     rsubhnt z0\.h, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_u32_tied1, svuint16_t, svuint32_t,
+            z0 = svrsubhnt_u32 (z0, z4, z5),
+            z0 = svrsubhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (rsubhnt_u32_tied2, svuint16_t, svuint32_t,
+                z0_res = svrsubhnt_u32 (z4, z0, z1),
+                z0_res = svrsubhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (rsubhnt_u32_tied3, svuint16_t, svuint32_t,
+                z0_res = svrsubhnt_u32 (z4, z1, z0),
+                z0_res = svrsubhnt (z4, z1, z0))
+
+/*
+** rsubhnt_u32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     rsubhnt z0\.h, z4\.s, z5\.s
+** |
+**     rsubhnt z1\.h, z4\.s, z5\.s
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_u32_untied, svuint16_t, svuint32_t,
+            z0 = svrsubhnt_u32 (z1, z4, z5),
+            z0 = svrsubhnt (z1, z4, z5))
+
+/*
+** rsubhnt_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     rsubhnt z0\.h, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (rsubhnt_w0_u32_tied1, svuint16_t, svuint32_t, uint32_t,
+             z0 = svrsubhnt_n_u32 (z0, z4, x0),
+             z0 = svrsubhnt (z0, z4, x0))
+
+/*
+** rsubhnt_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     mov     z0\.d, z1\.d
+**     rsubhnt z0\.h, z4\.s, \1
+** |
+**     rsubhnt z1\.h, z4\.s, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (rsubhnt_w0_u32_untied, svuint16_t, svuint32_t, uint32_t,
+             z0 = svrsubhnt_n_u32 (z1, z4, x0),
+             z0 = svrsubhnt (z1, z4, x0))
+
+/*
+** rsubhnt_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     rsubhnt z0\.h, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_11_u32_tied1, svuint16_t, svuint32_t,
+            z0 = svrsubhnt_n_u32 (z0, z4, 11),
+            z0 = svrsubhnt (z0, z4, 11))
+
+/*
+** rsubhnt_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+** (
+**     mov     z0\.d, z1\.d
+**     rsubhnt z0\.h, z4\.s, \1
+** |
+**     rsubhnt z1\.h, z4\.s, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_11_u32_untied, svuint16_t, svuint32_t,
+            z0 = svrsubhnt_n_u32 (z1, z4, 11),
+            z0 = svrsubhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/rsubhnt_u64.c
new file mode 100644 (file)
index 0000000..e75334b
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** rsubhnt_u64_tied1:
+**     rsubhnt z0\.s, z4\.d, z5\.d
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_u64_tied1, svuint32_t, svuint64_t,
+            z0 = svrsubhnt_u64 (z0, z4, z5),
+            z0 = svrsubhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (rsubhnt_u64_tied2, svuint32_t, svuint64_t,
+                z0_res = svrsubhnt_u64 (z4, z0, z1),
+                z0_res = svrsubhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (rsubhnt_u64_tied3, svuint32_t, svuint64_t,
+                z0_res = svrsubhnt_u64 (z4, z1, z0),
+                z0_res = svrsubhnt (z4, z1, z0))
+
+/*
+** rsubhnt_u64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     rsubhnt z0\.s, z4\.d, z5\.d
+** |
+**     rsubhnt z1\.s, z4\.d, z5\.d
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_u64_untied, svuint32_t, svuint64_t,
+            z0 = svrsubhnt_u64 (z1, z4, z5),
+            z0 = svrsubhnt (z1, z4, z5))
+
+/*
+** rsubhnt_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     rsubhnt z0\.s, z4\.d, \1
+**     ret
+*/
+TEST_DUAL_ZX (rsubhnt_x0_u64_tied1, svuint32_t, svuint64_t, uint64_t,
+             z0 = svrsubhnt_n_u64 (z0, z4, x0),
+             z0 = svrsubhnt (z0, z4, x0))
+
+/*
+** rsubhnt_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     mov     z0\.d, z1\.d
+**     rsubhnt z0\.s, z4\.d, \1
+** |
+**     rsubhnt z1\.s, z4\.d, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (rsubhnt_x0_u64_untied, svuint32_t, svuint64_t, uint64_t,
+             z0 = svrsubhnt_n_u64 (z1, z4, x0),
+             z0 = svrsubhnt (z1, z4, x0))
+
+/*
+** rsubhnt_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     rsubhnt z0\.s, z4\.d, \1
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_11_u64_tied1, svuint32_t, svuint64_t,
+            z0 = svrsubhnt_n_u64 (z0, z4, 11),
+            z0 = svrsubhnt (z0, z4, 11))
+
+/*
+** rsubhnt_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+** (
+**     mov     z0\.d, z1\.d
+**     rsubhnt z0\.s, z4\.d, \1
+** |
+**     rsubhnt z1\.s, z4\.d, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (rsubhnt_11_u64_untied, svuint32_t, svuint64_t,
+            z0 = svrsubhnt_n_u64 (z1, z4, 11),
+            z0 = svrsubhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sbclb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sbclb_u32.c
new file mode 100644 (file)
index 0000000..639e181
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sbclb_u32_tied1:
+**     sbclb   z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (sbclb_u32_tied1, svuint32_t,
+               z0 = svsbclb_u32 (z0, z1, z2),
+               z0 = svsbclb (z0, z1, z2))
+
+/*
+** sbclb_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sbclb   z0\.s, \1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (sbclb_u32_tied2, svuint32_t,
+               z0 = svsbclb_u32 (z1, z0, z2),
+               z0 = svsbclb (z1, z0, z2))
+
+/*
+** sbclb_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sbclb   z0\.s, z2\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (sbclb_u32_tied3, svuint32_t,
+               z0 = svsbclb_u32 (z1, z2, z0),
+               z0 = svsbclb (z1, z2, z0))
+
+/*
+** sbclb_u32_untied:
+**     movprfx z0, z1
+**     sbclb   z0\.s, z2\.s, z3\.s
+**     ret
+*/
+TEST_UNIFORM_Z (sbclb_u32_untied, svuint32_t,
+               z0 = svsbclb_u32 (z1, z2, z3),
+               z0 = svsbclb (z1, z2, z3))
+
+/*
+** sbclb_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sbclb   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sbclb_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = svsbclb_n_u32 (z0, z1, x0),
+                z0 = svsbclb (z0, z1, x0))
+
+/*
+** sbclb_w0_u32_tied2:
+**     mov     (z[0-9]+\.s), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sbclb   z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sbclb_w0_u32_tied2, svuint32_t, uint32_t,
+                z0 = svsbclb_n_u32 (z1, z0, x0),
+                z0 = svsbclb (z1, z0, x0))
+
+/*
+** sbclb_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     sbclb   z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sbclb_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = svsbclb_n_u32 (z1, z2, x0),
+                z0 = svsbclb (z1, z2, x0))
+
+/*
+** sbclb_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     sbclb   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sbclb_11_u32_tied1, svuint32_t,
+               z0 = svsbclb_n_u32 (z0, z1, 11),
+               z0 = svsbclb (z0, z1, 11))
+
+/*
+** sbclb_11_u32_tied2:
+**     mov     (z[0-9]+\.s), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sbclb   z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sbclb_11_u32_tied2, svuint32_t,
+               z0 = svsbclb_n_u32 (z1, z0, 11),
+               z0 = svsbclb (z1, z0, 11))
+
+/*
+** sbclb_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     sbclb   z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sbclb_11_u32_untied, svuint32_t,
+               z0 = svsbclb_n_u32 (z1, z2, 11),
+               z0 = svsbclb (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sbclb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sbclb_u64.c
new file mode 100644 (file)
index 0000000..ee0441c
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sbclb_u64_tied1:
+**     sbclb   z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (sbclb_u64_tied1, svuint64_t,
+               z0 = svsbclb_u64 (z0, z1, z2),
+               z0 = svsbclb (z0, z1, z2))
+
+/*
+** sbclb_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sbclb   z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (sbclb_u64_tied2, svuint64_t,
+               z0 = svsbclb_u64 (z1, z0, z2),
+               z0 = svsbclb (z1, z0, z2))
+
+/*
+** sbclb_u64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sbclb   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sbclb_u64_tied3, svuint64_t,
+               z0 = svsbclb_u64 (z1, z2, z0),
+               z0 = svsbclb (z1, z2, z0))
+
+/*
+** sbclb_u64_untied:
+**     movprfx z0, z1
+**     sbclb   z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (sbclb_u64_untied, svuint64_t,
+               z0 = svsbclb_u64 (z1, z2, z3),
+               z0 = svsbclb (z1, z2, z3))
+
+/*
+** sbclb_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     sbclb   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sbclb_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = svsbclb_n_u64 (z0, z1, x0),
+                z0 = svsbclb (z0, z1, x0))
+
+/*
+** sbclb_x0_u64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sbclb   z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sbclb_x0_u64_tied2, svuint64_t, uint64_t,
+                z0 = svsbclb_n_u64 (z1, z0, x0),
+                z0 = svsbclb (z1, z0, x0))
+
+/*
+** sbclb_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     sbclb   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sbclb_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = svsbclb_n_u64 (z1, z2, x0),
+                z0 = svsbclb (z1, z2, x0))
+
+/*
+** sbclb_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     sbclb   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sbclb_11_u64_tied1, svuint64_t,
+               z0 = svsbclb_n_u64 (z0, z1, 11),
+               z0 = svsbclb (z0, z1, 11))
+
+/*
+** sbclb_11_u64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sbclb   z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sbclb_11_u64_tied2, svuint64_t,
+               z0 = svsbclb_n_u64 (z1, z0, 11),
+               z0 = svsbclb (z1, z0, 11))
+
+/*
+** sbclb_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     sbclb   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sbclb_11_u64_untied, svuint64_t,
+               z0 = svsbclb_n_u64 (z1, z2, 11),
+               z0 = svsbclb (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sbclt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sbclt_u32.c
new file mode 100644 (file)
index 0000000..65ac15e
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sbclt_u32_tied1:
+**     sbclt   z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (sbclt_u32_tied1, svuint32_t,
+               z0 = svsbclt_u32 (z0, z1, z2),
+               z0 = svsbclt (z0, z1, z2))
+
+/*
+** sbclt_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sbclt   z0\.s, \1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (sbclt_u32_tied2, svuint32_t,
+               z0 = svsbclt_u32 (z1, z0, z2),
+               z0 = svsbclt (z1, z0, z2))
+
+/*
+** sbclt_u32_tied3:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sbclt   z0\.s, z2\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (sbclt_u32_tied3, svuint32_t,
+               z0 = svsbclt_u32 (z1, z2, z0),
+               z0 = svsbclt (z1, z2, z0))
+
+/*
+** sbclt_u32_untied:
+**     movprfx z0, z1
+**     sbclt   z0\.s, z2\.s, z3\.s
+**     ret
+*/
+TEST_UNIFORM_Z (sbclt_u32_untied, svuint32_t,
+               z0 = svsbclt_u32 (z1, z2, z3),
+               z0 = svsbclt (z1, z2, z3))
+
+/*
+** sbclt_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     sbclt   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sbclt_w0_u32_tied1, svuint32_t, uint32_t,
+                z0 = svsbclt_n_u32 (z0, z1, x0),
+                z0 = svsbclt (z0, z1, x0))
+
+/*
+** sbclt_w0_u32_tied2:
+**     mov     (z[0-9]+\.s), w0
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sbclt   z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sbclt_w0_u32_tied2, svuint32_t, uint32_t,
+                z0 = svsbclt_n_u32 (z1, z0, x0),
+                z0 = svsbclt (z1, z0, x0))
+
+/*
+** sbclt_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     sbclt   z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sbclt_w0_u32_untied, svuint32_t, uint32_t,
+                z0 = svsbclt_n_u32 (z1, z2, x0),
+                z0 = svsbclt (z1, z2, x0))
+
+/*
+** sbclt_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     sbclt   z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sbclt_11_u32_tied1, svuint32_t,
+               z0 = svsbclt_n_u32 (z0, z1, 11),
+               z0 = svsbclt (z0, z1, 11))
+
+/*
+** sbclt_11_u32_tied2:
+**     mov     (z[0-9]+\.s), #11
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     sbclt   z0\.s, \2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sbclt_11_u32_tied2, svuint32_t,
+               z0 = svsbclt_n_u32 (z1, z0, 11),
+               z0 = svsbclt (z1, z0, 11))
+
+/*
+** sbclt_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     movprfx z0, z1
+**     sbclt   z0\.s, z2\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sbclt_11_u32_untied, svuint32_t,
+               z0 = svsbclt_n_u32 (z1, z2, 11),
+               z0 = svsbclt (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sbclt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sbclt_u64.c
new file mode 100644 (file)
index 0000000..1bfb542
--- /dev/null
@@ -0,0 +1,110 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sbclt_u64_tied1:
+**     sbclt   z0\.d, z1\.d, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (sbclt_u64_tied1, svuint64_t,
+               z0 = svsbclt_u64 (z0, z1, z2),
+               z0 = svsbclt (z0, z1, z2))
+
+/*
+** sbclt_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sbclt   z0\.d, \1, z2\.d
+**     ret
+*/
+TEST_UNIFORM_Z (sbclt_u64_tied2, svuint64_t,
+               z0 = svsbclt_u64 (z1, z0, z2),
+               z0 = svsbclt (z1, z0, z2))
+
+/*
+** sbclt_u64_tied3:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sbclt   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sbclt_u64_tied3, svuint64_t,
+               z0 = svsbclt_u64 (z1, z2, z0),
+               z0 = svsbclt (z1, z2, z0))
+
+/*
+** sbclt_u64_untied:
+**     movprfx z0, z1
+**     sbclt   z0\.d, z2\.d, z3\.d
+**     ret
+*/
+TEST_UNIFORM_Z (sbclt_u64_untied, svuint64_t,
+               z0 = svsbclt_u64 (z1, z2, z3),
+               z0 = svsbclt (z1, z2, z3))
+
+/*
+** sbclt_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     sbclt   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sbclt_x0_u64_tied1, svuint64_t, uint64_t,
+                z0 = svsbclt_n_u64 (z0, z1, x0),
+                z0 = svsbclt (z0, z1, x0))
+
+/*
+** sbclt_x0_u64_tied2:
+**     mov     (z[0-9]+\.d), x0
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sbclt   z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sbclt_x0_u64_tied2, svuint64_t, uint64_t,
+                z0 = svsbclt_n_u64 (z1, z0, x0),
+                z0 = svsbclt (z1, z0, x0))
+
+/*
+** sbclt_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     sbclt   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sbclt_x0_u64_untied, svuint64_t, uint64_t,
+                z0 = svsbclt_n_u64 (z1, z2, x0),
+                z0 = svsbclt (z1, z2, x0))
+
+/*
+** sbclt_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     sbclt   z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sbclt_11_u64_tied1, svuint64_t,
+               z0 = svsbclt_n_u64 (z0, z1, 11),
+               z0 = svsbclt (z0, z1, 11))
+
+/*
+** sbclt_11_u64_tied2:
+**     mov     (z[0-9]+\.d), #11
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     sbclt   z0\.d, \2, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sbclt_11_u64_tied2, svuint64_t,
+               z0 = svsbclt_n_u64 (z1, z0, 11),
+               z0 = svsbclt (z1, z0, 11))
+
+/*
+** sbclt_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     movprfx z0, z1
+**     sbclt   z0\.d, z2\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sbclt_11_u64_untied, svuint64_t,
+               z0 = svsbclt_n_u64 (z1, z2, 11),
+               z0 = svsbclt (z1, z2, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllb_s16.c
new file mode 100644 (file)
index 0000000..430e392
--- /dev/null
@@ -0,0 +1,57 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shllb_0_s16_tied1:
+**     sshllb  z0\.h, z0\.b, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_0_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svshllb_n_s16 (z0, 0),
+                   z0_res = svshllb (z0, 0))
+
+/*
+** shllb_0_s16_untied:
+**     sshllb  z0\.h, z1\.b, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_0_s16_untied, svint16_t, svint8_t,
+                   z0_res = svshllb_n_s16 (z1, 0),
+                   z0_res = svshllb (z1, 0))
+
+/*
+** shllb_1_s16_tied1:
+**     sshllb  z0\.h, z0\.b, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_1_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svshllb_n_s16 (z0, 1),
+                   z0_res = svshllb (z0, 1))
+
+/*
+** shllb_1_s16_untied:
+**     sshllb  z0\.h, z1\.b, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_1_s16_untied, svint16_t, svint8_t,
+                   z0_res = svshllb_n_s16 (z1, 1),
+                   z0_res = svshllb (z1, 1))
+
+/*
+** shllb_7_s16_tied1:
+**     sshllb  z0\.h, z0\.b, #7
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_7_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svshllb_n_s16 (z0, 7),
+                   z0_res = svshllb (z0, 7))
+
+/*
+** shllb_7_s16_untied:
+**     sshllb  z0\.h, z1\.b, #7
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_7_s16_untied, svint16_t, svint8_t,
+                   z0_res = svshllb_n_s16 (z1, 7),
+                   z0_res = svshllb (z1, 7))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllb_s32.c
new file mode 100644 (file)
index 0000000..56e6494
--- /dev/null
@@ -0,0 +1,57 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shllb_0_s32_tied1:
+**     sshllb  z0\.s, z0\.h, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_0_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svshllb_n_s32 (z0, 0),
+                   z0_res = svshllb (z0, 0))
+
+/*
+** shllb_0_s32_untied:
+**     sshllb  z0\.s, z1\.h, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_0_s32_untied, svint32_t, svint16_t,
+                   z0_res = svshllb_n_s32 (z1, 0),
+                   z0_res = svshllb (z1, 0))
+
+/*
+** shllb_1_s32_tied1:
+**     sshllb  z0\.s, z0\.h, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_1_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svshllb_n_s32 (z0, 1),
+                   z0_res = svshllb (z0, 1))
+
+/*
+** shllb_1_s32_untied:
+**     sshllb  z0\.s, z1\.h, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_1_s32_untied, svint32_t, svint16_t,
+                   z0_res = svshllb_n_s32 (z1, 1),
+                   z0_res = svshllb (z1, 1))
+
+/*
+** shllb_15_s32_tied1:
+**     sshllb  z0\.s, z0\.h, #15
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_15_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svshllb_n_s32 (z0, 15),
+                   z0_res = svshllb (z0, 15))
+
+/*
+** shllb_15_s32_untied:
+**     sshllb  z0\.s, z1\.h, #15
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_15_s32_untied, svint32_t, svint16_t,
+                   z0_res = svshllb_n_s32 (z1, 15),
+                   z0_res = svshllb (z1, 15))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllb_s64.c
new file mode 100644 (file)
index 0000000..f6da9de
--- /dev/null
@@ -0,0 +1,57 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shllb_0_s64_tied1:
+**     sshllb  z0\.d, z0\.s, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_0_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svshllb_n_s64 (z0, 0),
+                   z0_res = svshllb (z0, 0))
+
+/*
+** shllb_0_s64_untied:
+**     sshllb  z0\.d, z1\.s, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_0_s64_untied, svint64_t, svint32_t,
+                   z0_res = svshllb_n_s64 (z1, 0),
+                   z0_res = svshllb (z1, 0))
+
+/*
+** shllb_1_s64_tied1:
+**     sshllb  z0\.d, z0\.s, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_1_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svshllb_n_s64 (z0, 1),
+                   z0_res = svshllb (z0, 1))
+
+/*
+** shllb_1_s64_untied:
+**     sshllb  z0\.d, z1\.s, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_1_s64_untied, svint64_t, svint32_t,
+                   z0_res = svshllb_n_s64 (z1, 1),
+                   z0_res = svshllb (z1, 1))
+
+/*
+** shllb_31_s64_tied1:
+**     sshllb  z0\.d, z0\.s, #31
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_31_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svshllb_n_s64 (z0, 31),
+                   z0_res = svshllb (z0, 31))
+
+/*
+** shllb_31_s64_untied:
+**     sshllb  z0\.d, z1\.s, #31
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_31_s64_untied, svint64_t, svint32_t,
+                   z0_res = svshllb_n_s64 (z1, 31),
+                   z0_res = svshllb (z1, 31))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllb_u16.c
new file mode 100644 (file)
index 0000000..5384d94
--- /dev/null
@@ -0,0 +1,57 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shllb_0_u16_tied1:
+**     ushllb  z0\.h, z0\.b, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_0_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svshllb_n_u16 (z0, 0),
+                   z0_res = svshllb (z0, 0))
+
+/*
+** shllb_0_u16_untied:
+**     ushllb  z0\.h, z1\.b, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_0_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svshllb_n_u16 (z1, 0),
+                   z0_res = svshllb (z1, 0))
+
+/*
+** shllb_1_u16_tied1:
+**     ushllb  z0\.h, z0\.b, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_1_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svshllb_n_u16 (z0, 1),
+                   z0_res = svshllb (z0, 1))
+
+/*
+** shllb_1_u16_untied:
+**     ushllb  z0\.h, z1\.b, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_1_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svshllb_n_u16 (z1, 1),
+                   z0_res = svshllb (z1, 1))
+
+/*
+** shllb_7_u16_tied1:
+**     ushllb  z0\.h, z0\.b, #7
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_7_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svshllb_n_u16 (z0, 7),
+                   z0_res = svshllb (z0, 7))
+
+/*
+** shllb_7_u16_untied:
+**     ushllb  z0\.h, z1\.b, #7
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_7_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svshllb_n_u16 (z1, 7),
+                   z0_res = svshllb (z1, 7))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllb_u32.c
new file mode 100644 (file)
index 0000000..2becd80
--- /dev/null
@@ -0,0 +1,57 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shllb_0_u32_tied1:
+**     ushllb  z0\.s, z0\.h, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_0_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svshllb_n_u32 (z0, 0),
+                   z0_res = svshllb (z0, 0))
+
+/*
+** shllb_0_u32_untied:
+**     ushllb  z0\.s, z1\.h, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_0_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svshllb_n_u32 (z1, 0),
+                   z0_res = svshllb (z1, 0))
+
+/*
+** shllb_1_u32_tied1:
+**     ushllb  z0\.s, z0\.h, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_1_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svshllb_n_u32 (z0, 1),
+                   z0_res = svshllb (z0, 1))
+
+/*
+** shllb_1_u32_untied:
+**     ushllb  z0\.s, z1\.h, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_1_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svshllb_n_u32 (z1, 1),
+                   z0_res = svshllb (z1, 1))
+
+/*
+** shllb_15_u32_tied1:
+**     ushllb  z0\.s, z0\.h, #15
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_15_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svshllb_n_u32 (z0, 15),
+                   z0_res = svshllb (z0, 15))
+
+/*
+** shllb_15_u32_untied:
+**     ushllb  z0\.s, z1\.h, #15
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_15_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svshllb_n_u32 (z1, 15),
+                   z0_res = svshllb (z1, 15))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllb_u64.c
new file mode 100644 (file)
index 0000000..37d5b9d
--- /dev/null
@@ -0,0 +1,57 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shllb_0_u64_tied1:
+**     ushllb  z0\.d, z0\.s, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_0_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svshllb_n_u64 (z0, 0),
+                   z0_res = svshllb (z0, 0))
+
+/*
+** shllb_0_u64_untied:
+**     ushllb  z0\.d, z1\.s, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_0_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svshllb_n_u64 (z1, 0),
+                   z0_res = svshllb (z1, 0))
+
+/*
+** shllb_1_u64_tied1:
+**     ushllb  z0\.d, z0\.s, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_1_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svshllb_n_u64 (z0, 1),
+                   z0_res = svshllb (z0, 1))
+
+/*
+** shllb_1_u64_untied:
+**     ushllb  z0\.d, z1\.s, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_1_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svshllb_n_u64 (z1, 1),
+                   z0_res = svshllb (z1, 1))
+
+/*
+** shllb_31_u64_tied1:
+**     ushllb  z0\.d, z0\.s, #31
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_31_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svshllb_n_u64 (z0, 31),
+                   z0_res = svshllb (z0, 31))
+
+/*
+** shllb_31_u64_untied:
+**     ushllb  z0\.d, z1\.s, #31
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllb_31_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svshllb_n_u64 (z1, 31),
+                   z0_res = svshllb (z1, 31))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllt_s16.c
new file mode 100644 (file)
index 0000000..ad2ca1b
--- /dev/null
@@ -0,0 +1,57 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shllt_0_s16_tied1:
+**     sshllt  z0\.h, z0\.b, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_0_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svshllt_n_s16 (z0, 0),
+                   z0_res = svshllt (z0, 0))
+
+/*
+** shllt_0_s16_untied:
+**     sshllt  z0\.h, z1\.b, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_0_s16_untied, svint16_t, svint8_t,
+                   z0_res = svshllt_n_s16 (z1, 0),
+                   z0_res = svshllt (z1, 0))
+
+/*
+** shllt_1_s16_tied1:
+**     sshllt  z0\.h, z0\.b, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_1_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svshllt_n_s16 (z0, 1),
+                   z0_res = svshllt (z0, 1))
+
+/*
+** shllt_1_s16_untied:
+**     sshllt  z0\.h, z1\.b, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_1_s16_untied, svint16_t, svint8_t,
+                   z0_res = svshllt_n_s16 (z1, 1),
+                   z0_res = svshllt (z1, 1))
+
+/*
+** shllt_7_s16_tied1:
+**     sshllt  z0\.h, z0\.b, #7
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_7_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svshllt_n_s16 (z0, 7),
+                   z0_res = svshllt (z0, 7))
+
+/*
+** shllt_7_s16_untied:
+**     sshllt  z0\.h, z1\.b, #7
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_7_s16_untied, svint16_t, svint8_t,
+                   z0_res = svshllt_n_s16 (z1, 7),
+                   z0_res = svshllt (z1, 7))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllt_s32.c
new file mode 100644 (file)
index 0000000..3f2ab5f
--- /dev/null
@@ -0,0 +1,57 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shllt_0_s32_tied1:
+**     sshllt  z0\.s, z0\.h, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_0_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svshllt_n_s32 (z0, 0),
+                   z0_res = svshllt (z0, 0))
+
+/*
+** shllt_0_s32_untied:
+**     sshllt  z0\.s, z1\.h, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_0_s32_untied, svint32_t, svint16_t,
+                   z0_res = svshllt_n_s32 (z1, 0),
+                   z0_res = svshllt (z1, 0))
+
+/*
+** shllt_1_s32_tied1:
+**     sshllt  z0\.s, z0\.h, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_1_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svshllt_n_s32 (z0, 1),
+                   z0_res = svshllt (z0, 1))
+
+/*
+** shllt_1_s32_untied:
+**     sshllt  z0\.s, z1\.h, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_1_s32_untied, svint32_t, svint16_t,
+                   z0_res = svshllt_n_s32 (z1, 1),
+                   z0_res = svshllt (z1, 1))
+
+/*
+** shllt_15_s32_tied1:
+**     sshllt  z0\.s, z0\.h, #15
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_15_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svshllt_n_s32 (z0, 15),
+                   z0_res = svshllt (z0, 15))
+
+/*
+** shllt_15_s32_untied:
+**     sshllt  z0\.s, z1\.h, #15
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_15_s32_untied, svint32_t, svint16_t,
+                   z0_res = svshllt_n_s32 (z1, 15),
+                   z0_res = svshllt (z1, 15))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllt_s64.c
new file mode 100644 (file)
index 0000000..f53b29b
--- /dev/null
@@ -0,0 +1,57 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shllt_0_s64_tied1:
+**     sshllt  z0\.d, z0\.s, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_0_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svshllt_n_s64 (z0, 0),
+                   z0_res = svshllt (z0, 0))
+
+/*
+** shllt_0_s64_untied:
+**     sshllt  z0\.d, z1\.s, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_0_s64_untied, svint64_t, svint32_t,
+                   z0_res = svshllt_n_s64 (z1, 0),
+                   z0_res = svshllt (z1, 0))
+
+/*
+** shllt_1_s64_tied1:
+**     sshllt  z0\.d, z0\.s, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_1_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svshllt_n_s64 (z0, 1),
+                   z0_res = svshllt (z0, 1))
+
+/*
+** shllt_1_s64_untied:
+**     sshllt  z0\.d, z1\.s, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_1_s64_untied, svint64_t, svint32_t,
+                   z0_res = svshllt_n_s64 (z1, 1),
+                   z0_res = svshllt (z1, 1))
+
+/*
+** shllt_31_s64_tied1:
+**     sshllt  z0\.d, z0\.s, #31
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_31_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svshllt_n_s64 (z0, 31),
+                   z0_res = svshllt (z0, 31))
+
+/*
+** shllt_31_s64_untied:
+**     sshllt  z0\.d, z1\.s, #31
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_31_s64_untied, svint64_t, svint32_t,
+                   z0_res = svshllt_n_s64 (z1, 31),
+                   z0_res = svshllt (z1, 31))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllt_u16.c
new file mode 100644 (file)
index 0000000..4fa6180
--- /dev/null
@@ -0,0 +1,57 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shllt_0_u16_tied1:
+**     ushllt  z0\.h, z0\.b, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_0_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svshllt_n_u16 (z0, 0),
+                   z0_res = svshllt (z0, 0))
+
+/*
+** shllt_0_u16_untied:
+**     ushllt  z0\.h, z1\.b, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_0_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svshllt_n_u16 (z1, 0),
+                   z0_res = svshllt (z1, 0))
+
+/*
+** shllt_1_u16_tied1:
+**     ushllt  z0\.h, z0\.b, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_1_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svshllt_n_u16 (z0, 1),
+                   z0_res = svshllt (z0, 1))
+
+/*
+** shllt_1_u16_untied:
+**     ushllt  z0\.h, z1\.b, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_1_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svshllt_n_u16 (z1, 1),
+                   z0_res = svshllt (z1, 1))
+
+/*
+** shllt_7_u16_tied1:
+**     ushllt  z0\.h, z0\.b, #7
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_7_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svshllt_n_u16 (z0, 7),
+                   z0_res = svshllt (z0, 7))
+
+/*
+** shllt_7_u16_untied:
+**     ushllt  z0\.h, z1\.b, #7
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_7_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svshllt_n_u16 (z1, 7),
+                   z0_res = svshllt (z1, 7))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllt_u32.c
new file mode 100644 (file)
index 0000000..a0911f0
--- /dev/null
@@ -0,0 +1,57 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shllt_0_u32_tied1:
+**     ushllt  z0\.s, z0\.h, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_0_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svshllt_n_u32 (z0, 0),
+                   z0_res = svshllt (z0, 0))
+
+/*
+** shllt_0_u32_untied:
+**     ushllt  z0\.s, z1\.h, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_0_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svshllt_n_u32 (z1, 0),
+                   z0_res = svshllt (z1, 0))
+
+/*
+** shllt_1_u32_tied1:
+**     ushllt  z0\.s, z0\.h, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_1_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svshllt_n_u32 (z0, 1),
+                   z0_res = svshllt (z0, 1))
+
+/*
+** shllt_1_u32_untied:
+**     ushllt  z0\.s, z1\.h, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_1_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svshllt_n_u32 (z1, 1),
+                   z0_res = svshllt (z1, 1))
+
+/*
+** shllt_15_u32_tied1:
+**     ushllt  z0\.s, z0\.h, #15
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_15_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svshllt_n_u32 (z0, 15),
+                   z0_res = svshllt (z0, 15))
+
+/*
+** shllt_15_u32_untied:
+**     ushllt  z0\.s, z1\.h, #15
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_15_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svshllt_n_u32 (z1, 15),
+                   z0_res = svshllt (z1, 15))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shllt_u64.c
new file mode 100644 (file)
index 0000000..f4cca08
--- /dev/null
@@ -0,0 +1,57 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shllt_0_u64_tied1:
+**     ushllt  z0\.d, z0\.s, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_0_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svshllt_n_u64 (z0, 0),
+                   z0_res = svshllt (z0, 0))
+
+/*
+** shllt_0_u64_untied:
+**     ushllt  z0\.d, z1\.s, #0
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_0_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svshllt_n_u64 (z1, 0),
+                   z0_res = svshllt (z1, 0))
+
+/*
+** shllt_1_u64_tied1:
+**     ushllt  z0\.d, z0\.s, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_1_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svshllt_n_u64 (z0, 1),
+                   z0_res = svshllt (z0, 1))
+
+/*
+** shllt_1_u64_untied:
+**     ushllt  z0\.d, z1\.s, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_1_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svshllt_n_u64 (z1, 1),
+                   z0_res = svshllt (z1, 1))
+
+/*
+** shllt_31_u64_tied1:
+**     ushllt  z0\.d, z0\.s, #31
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_31_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svshllt_n_u64 (z0, 31),
+                   z0_res = svshllt (z0, 31))
+
+/*
+** shllt_31_u64_untied:
+**     ushllt  z0\.d, z1\.s, #31
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shllt_31_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svshllt_n_u64 (z1, 31),
+                   z0_res = svshllt (z1, 31))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnb_s16.c
new file mode 100644 (file)
index 0000000..b0c8c20
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shrnb_1_s16:
+**     shrnb   z0\.b, z0\.h, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_1_s16, svint8_t, svint16_t,
+                   z0_res = svshrnb_n_s16 (z0, 1),
+                   z0_res = svshrnb (z0, 1))
+
+/*
+** shrnb_2_s16:
+**     shrnb   z0\.b, z0\.h, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_2_s16, svint8_t, svint16_t,
+                   z0_res = svshrnb_n_s16 (z0, 2),
+                   z0_res = svshrnb (z0, 2))
+
+/*
+** shrnb_8_s16_tied1:
+**     shrnb   z0\.b, z0\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_8_s16_tied1, svint8_t, svint16_t,
+                   z0_res = svshrnb_n_s16 (z0, 8),
+                   z0_res = svshrnb (z0, 8))
+
+/*
+** shrnb_8_s16_untied:
+**     shrnb   z0\.b, z1\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_8_s16_untied, svint8_t, svint16_t,
+                   z0_res = svshrnb_n_s16 (z1, 8),
+                   z0_res = svshrnb (z1, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnb_s32.c
new file mode 100644 (file)
index 0000000..8fff1d2
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shrnb_1_s32:
+**     shrnb   z0\.h, z0\.s, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_1_s32, svint16_t, svint32_t,
+                   z0_res = svshrnb_n_s32 (z0, 1),
+                   z0_res = svshrnb (z0, 1))
+
+/*
+** shrnb_2_s32:
+**     shrnb   z0\.h, z0\.s, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_2_s32, svint16_t, svint32_t,
+                   z0_res = svshrnb_n_s32 (z0, 2),
+                   z0_res = svshrnb (z0, 2))
+
+/*
+** shrnb_16_s32_tied1:
+**     shrnb   z0\.h, z0\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_16_s32_tied1, svint16_t, svint32_t,
+                   z0_res = svshrnb_n_s32 (z0, 16),
+                   z0_res = svshrnb (z0, 16))
+
+/*
+** shrnb_16_s32_untied:
+**     shrnb   z0\.h, z1\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_16_s32_untied, svint16_t, svint32_t,
+                   z0_res = svshrnb_n_s32 (z1, 16),
+                   z0_res = svshrnb (z1, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnb_s64.c
new file mode 100644 (file)
index 0000000..6e50a36
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shrnb_1_s64:
+**     shrnb   z0\.s, z0\.d, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_1_s64, svint32_t, svint64_t,
+                   z0_res = svshrnb_n_s64 (z0, 1),
+                   z0_res = svshrnb (z0, 1))
+
+/*
+** shrnb_2_s64:
+**     shrnb   z0\.s, z0\.d, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_2_s64, svint32_t, svint64_t,
+                   z0_res = svshrnb_n_s64 (z0, 2),
+                   z0_res = svshrnb (z0, 2))
+
+/*
+** shrnb_32_s64_tied1:
+**     shrnb   z0\.s, z0\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_32_s64_tied1, svint32_t, svint64_t,
+                   z0_res = svshrnb_n_s64 (z0, 32),
+                   z0_res = svshrnb (z0, 32))
+
+/*
+** shrnb_32_s64_untied:
+**     shrnb   z0\.s, z1\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_32_s64_untied, svint32_t, svint64_t,
+                   z0_res = svshrnb_n_s64 (z1, 32),
+                   z0_res = svshrnb (z1, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnb_u16.c
new file mode 100644 (file)
index 0000000..3f791ef
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shrnb_1_u16:
+**     shrnb   z0\.b, z0\.h, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_1_u16, svuint8_t, svuint16_t,
+                   z0_res = svshrnb_n_u16 (z0, 1),
+                   z0_res = svshrnb (z0, 1))
+
+/*
+** shrnb_2_u16:
+**     shrnb   z0\.b, z0\.h, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_2_u16, svuint8_t, svuint16_t,
+                   z0_res = svshrnb_n_u16 (z0, 2),
+                   z0_res = svshrnb (z0, 2))
+
+/*
+** shrnb_8_u16_tied1:
+**     shrnb   z0\.b, z0\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_8_u16_tied1, svuint8_t, svuint16_t,
+                   z0_res = svshrnb_n_u16 (z0, 8),
+                   z0_res = svshrnb (z0, 8))
+
+/*
+** shrnb_8_u16_untied:
+**     shrnb   z0\.b, z1\.h, #8
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_8_u16_untied, svuint8_t, svuint16_t,
+                   z0_res = svshrnb_n_u16 (z1, 8),
+                   z0_res = svshrnb (z1, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnb_u32.c
new file mode 100644 (file)
index 0000000..de395d6
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shrnb_1_u32:
+**     shrnb   z0\.h, z0\.s, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_1_u32, svuint16_t, svuint32_t,
+                   z0_res = svshrnb_n_u32 (z0, 1),
+                   z0_res = svshrnb (z0, 1))
+
+/*
+** shrnb_2_u32:
+**     shrnb   z0\.h, z0\.s, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_2_u32, svuint16_t, svuint32_t,
+                   z0_res = svshrnb_n_u32 (z0, 2),
+                   z0_res = svshrnb (z0, 2))
+
+/*
+** shrnb_16_u32_tied1:
+**     shrnb   z0\.h, z0\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_16_u32_tied1, svuint16_t, svuint32_t,
+                   z0_res = svshrnb_n_u32 (z0, 16),
+                   z0_res = svshrnb (z0, 16))
+
+/*
+** shrnb_16_u32_untied:
+**     shrnb   z0\.h, z1\.s, #16
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_16_u32_untied, svuint16_t, svuint32_t,
+                   z0_res = svshrnb_n_u32 (z1, 16),
+                   z0_res = svshrnb (z1, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnb_u64.c
new file mode 100644 (file)
index 0000000..020579d
--- /dev/null
@@ -0,0 +1,39 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shrnb_1_u64:
+**     shrnb   z0\.s, z0\.d, #1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_1_u64, svuint32_t, svuint64_t,
+                   z0_res = svshrnb_n_u64 (z0, 1),
+                   z0_res = svshrnb (z0, 1))
+
+/*
+** shrnb_2_u64:
+**     shrnb   z0\.s, z0\.d, #2
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_2_u64, svuint32_t, svuint64_t,
+                   z0_res = svshrnb_n_u64 (z0, 2),
+                   z0_res = svshrnb (z0, 2))
+
+/*
+** shrnb_32_u64_tied1:
+**     shrnb   z0\.s, z0\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_32_u64_tied1, svuint32_t, svuint64_t,
+                   z0_res = svshrnb_n_u64 (z0, 32),
+                   z0_res = svshrnb (z0, 32))
+
+/*
+** shrnb_32_u64_untied:
+**     shrnb   z0\.s, z1\.d, #32
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (shrnb_32_u64_untied, svuint32_t, svuint64_t,
+                   z0_res = svshrnb_n_u64 (z1, 32),
+                   z0_res = svshrnb (z1, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnt_s16.c
new file mode 100644 (file)
index 0000000..bcbe12e
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shrnt_1_s16:
+**     shrnt   z0\.b, z4\.h, #1
+**     ret
+*/
+TEST_DUAL_Z (shrnt_1_s16, svint8_t, svint16_t,
+            z0 = svshrnt_n_s16 (z0, z4, 1),
+            z0 = svshrnt (z0, z4, 1))
+
+/*
+** shrnt_2_s16:
+**     shrnt   z0\.b, z4\.h, #2
+**     ret
+*/
+TEST_DUAL_Z (shrnt_2_s16, svint8_t, svint16_t,
+            z0 = svshrnt_n_s16 (z0, z4, 2),
+            z0 = svshrnt (z0, z4, 2))
+
+/*
+** shrnt_8_s16_tied1:
+**     shrnt   z0\.b, z4\.h, #8
+**     ret
+*/
+TEST_DUAL_Z (shrnt_8_s16_tied1, svint8_t, svint16_t,
+            z0 = svshrnt_n_s16 (z0, z4, 8),
+            z0 = svshrnt (z0, z4, 8))
+
+/*
+** shrnt_8_s16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     shrnt   z0\.b, z4\.h, #8
+** |
+**     shrnt   z1\.b, z4\.h, #8
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (shrnt_8_s16_untied, svint8_t, svint16_t,
+            z0 = svshrnt_n_s16 (z1, z4, 8),
+            z0 = svshrnt (z1, z4, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnt_s32.c
new file mode 100644 (file)
index 0000000..a45f71c
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shrnt_1_s32:
+**     shrnt   z0\.h, z4\.s, #1
+**     ret
+*/
+TEST_DUAL_Z (shrnt_1_s32, svint16_t, svint32_t,
+            z0 = svshrnt_n_s32 (z0, z4, 1),
+            z0 = svshrnt (z0, z4, 1))
+
+/*
+** shrnt_2_s32:
+**     shrnt   z0\.h, z4\.s, #2
+**     ret
+*/
+TEST_DUAL_Z (shrnt_2_s32, svint16_t, svint32_t,
+            z0 = svshrnt_n_s32 (z0, z4, 2),
+            z0 = svshrnt (z0, z4, 2))
+
+/*
+** shrnt_16_s32_tied1:
+**     shrnt   z0\.h, z4\.s, #16
+**     ret
+*/
+TEST_DUAL_Z (shrnt_16_s32_tied1, svint16_t, svint32_t,
+            z0 = svshrnt_n_s32 (z0, z4, 16),
+            z0 = svshrnt (z0, z4, 16))
+
+/*
+** shrnt_16_s32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     shrnt   z0\.h, z4\.s, #16
+** |
+**     shrnt   z1\.h, z4\.s, #16
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (shrnt_16_s32_untied, svint16_t, svint32_t,
+            z0 = svshrnt_n_s32 (z1, z4, 16),
+            z0 = svshrnt (z1, z4, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnt_s64.c
new file mode 100644 (file)
index 0000000..752497e
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shrnt_1_s64:
+**     shrnt   z0\.s, z4\.d, #1
+**     ret
+*/
+TEST_DUAL_Z (shrnt_1_s64, svint32_t, svint64_t,
+            z0 = svshrnt_n_s64 (z0, z4, 1),
+            z0 = svshrnt (z0, z4, 1))
+
+/*
+** shrnt_2_s64:
+**     shrnt   z0\.s, z4\.d, #2
+**     ret
+*/
+TEST_DUAL_Z (shrnt_2_s64, svint32_t, svint64_t,
+            z0 = svshrnt_n_s64 (z0, z4, 2),
+            z0 = svshrnt (z0, z4, 2))
+
+/*
+** shrnt_32_s64_tied1:
+**     shrnt   z0\.s, z4\.d, #32
+**     ret
+*/
+TEST_DUAL_Z (shrnt_32_s64_tied1, svint32_t, svint64_t,
+            z0 = svshrnt_n_s64 (z0, z4, 32),
+            z0 = svshrnt (z0, z4, 32))
+
+/*
+** shrnt_32_s64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     shrnt   z0\.s, z4\.d, #32
+** |
+**     shrnt   z1\.s, z4\.d, #32
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (shrnt_32_s64_untied, svint32_t, svint64_t,
+            z0 = svshrnt_n_s64 (z1, z4, 32),
+            z0 = svshrnt (z1, z4, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnt_u16.c
new file mode 100644 (file)
index 0000000..695fcbc
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shrnt_1_u16:
+**     shrnt   z0\.b, z4\.h, #1
+**     ret
+*/
+TEST_DUAL_Z (shrnt_1_u16, svuint8_t, svuint16_t,
+            z0 = svshrnt_n_u16 (z0, z4, 1),
+            z0 = svshrnt (z0, z4, 1))
+
+/*
+** shrnt_2_u16:
+**     shrnt   z0\.b, z4\.h, #2
+**     ret
+*/
+TEST_DUAL_Z (shrnt_2_u16, svuint8_t, svuint16_t,
+            z0 = svshrnt_n_u16 (z0, z4, 2),
+            z0 = svshrnt (z0, z4, 2))
+
+/*
+** shrnt_8_u16_tied1:
+**     shrnt   z0\.b, z4\.h, #8
+**     ret
+*/
+TEST_DUAL_Z (shrnt_8_u16_tied1, svuint8_t, svuint16_t,
+            z0 = svshrnt_n_u16 (z0, z4, 8),
+            z0 = svshrnt (z0, z4, 8))
+
+/*
+** shrnt_8_u16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     shrnt   z0\.b, z4\.h, #8
+** |
+**     shrnt   z1\.b, z4\.h, #8
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (shrnt_8_u16_untied, svuint8_t, svuint16_t,
+            z0 = svshrnt_n_u16 (z1, z4, 8),
+            z0 = svshrnt (z1, z4, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnt_u32.c
new file mode 100644 (file)
index 0000000..13e61f7
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shrnt_1_u32:
+**     shrnt   z0\.h, z4\.s, #1
+**     ret
+*/
+TEST_DUAL_Z (shrnt_1_u32, svuint16_t, svuint32_t,
+            z0 = svshrnt_n_u32 (z0, z4, 1),
+            z0 = svshrnt (z0, z4, 1))
+
+/*
+** shrnt_2_u32:
+**     shrnt   z0\.h, z4\.s, #2
+**     ret
+*/
+TEST_DUAL_Z (shrnt_2_u32, svuint16_t, svuint32_t,
+            z0 = svshrnt_n_u32 (z0, z4, 2),
+            z0 = svshrnt (z0, z4, 2))
+
+/*
+** shrnt_16_u32_tied1:
+**     shrnt   z0\.h, z4\.s, #16
+**     ret
+*/
+TEST_DUAL_Z (shrnt_16_u32_tied1, svuint16_t, svuint32_t,
+            z0 = svshrnt_n_u32 (z0, z4, 16),
+            z0 = svshrnt (z0, z4, 16))
+
+/*
+** shrnt_16_u32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     shrnt   z0\.h, z4\.s, #16
+** |
+**     shrnt   z1\.h, z4\.s, #16
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (shrnt_16_u32_untied, svuint16_t, svuint32_t,
+            z0 = svshrnt_n_u32 (z1, z4, 16),
+            z0 = svshrnt (z1, z4, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/shrnt_u64.c
new file mode 100644 (file)
index 0000000..c9ee20c
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** shrnt_1_u64:
+**     shrnt   z0\.s, z4\.d, #1
+**     ret
+*/
+TEST_DUAL_Z (shrnt_1_u64, svuint32_t, svuint64_t,
+            z0 = svshrnt_n_u64 (z0, z4, 1),
+            z0 = svshrnt (z0, z4, 1))
+
+/*
+** shrnt_2_u64:
+**     shrnt   z0\.s, z4\.d, #2
+**     ret
+*/
+TEST_DUAL_Z (shrnt_2_u64, svuint32_t, svuint64_t,
+            z0 = svshrnt_n_u64 (z0, z4, 2),
+            z0 = svshrnt (z0, z4, 2))
+
+/*
+** shrnt_32_u64_tied1:
+**     shrnt   z0\.s, z4\.d, #32
+**     ret
+*/
+TEST_DUAL_Z (shrnt_32_u64_tied1, svuint32_t, svuint64_t,
+            z0 = svshrnt_n_u64 (z0, z4, 32),
+            z0 = svshrnt (z0, z4, 32))
+
+/*
+** shrnt_32_u64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     shrnt   z0\.s, z4\.d, #32
+** |
+**     shrnt   z1\.s, z4\.d, #32
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (shrnt_32_u64_untied, svuint32_t, svuint64_t,
+            z0 = svshrnt_n_u64 (z1, z4, 32),
+            z0 = svshrnt (z1, z4, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_s16.c
new file mode 100644 (file)
index 0000000..6772a56
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sli_0_s16_tied1:
+**     sli     z0\.h, z1\.h, #0
+**     ret
+*/
+TEST_UNIFORM_Z (sli_0_s16_tied1, svint16_t,
+               z0 = svsli_n_s16 (z0, z1, 0),
+               z0 = svsli (z0, z1, 0))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_0_s16_tied2, svint16_t,
+               z0 = svsli_n_s16 (z1, z0, 0),
+               z0 = svsli (z1, z0, 0))
+
+/*
+** sli_0_s16_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.h, z2\.h, #0
+**     ret
+*/
+TEST_UNIFORM_Z (sli_0_s16_untied, svint16_t,
+               z0 = svsli_n_s16 (z1, z2, 0),
+               z0 = svsli (z1, z2, 0))
+
+/*
+** sli_1_s16_tied1:
+**     sli     z0\.h, z1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sli_1_s16_tied1, svint16_t,
+               z0 = svsli_n_s16 (z0, z1, 1),
+               z0 = svsli (z0, z1, 1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_1_s16_tied2, svint16_t,
+               z0 = svsli_n_s16 (z1, z0, 1),
+               z0 = svsli (z1, z0, 1))
+
+/*
+** sli_1_s16_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.h, z2\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sli_1_s16_untied, svint16_t,
+               z0 = svsli_n_s16 (z1, z2, 1),
+               z0 = svsli (z1, z2, 1))
+
+/*
+** sli_15_s16_tied1:
+**     sli     z0\.h, z1\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (sli_15_s16_tied1, svint16_t,
+               z0 = svsli_n_s16 (z0, z1, 15),
+               z0 = svsli (z0, z1, 15))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_15_s16_tied2, svint16_t,
+               z0 = svsli_n_s16 (z1, z0, 15),
+               z0 = svsli (z1, z0, 15))
+
+/*
+** sli_15_s16_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.h, z2\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (sli_15_s16_untied, svint16_t,
+               z0 = svsli_n_s16 (z1, z2, 15),
+               z0 = svsli (z1, z2, 15))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_s32.c
new file mode 100644 (file)
index 0000000..023e7c4
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sli_0_s32_tied1:
+**     sli     z0\.s, z1\.s, #0
+**     ret
+*/
+TEST_UNIFORM_Z (sli_0_s32_tied1, svint32_t,
+               z0 = svsli_n_s32 (z0, z1, 0),
+               z0 = svsli (z0, z1, 0))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_0_s32_tied2, svint32_t,
+               z0 = svsli_n_s32 (z1, z0, 0),
+               z0 = svsli (z1, z0, 0))
+
+/*
+** sli_0_s32_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.s, z2\.s, #0
+**     ret
+*/
+TEST_UNIFORM_Z (sli_0_s32_untied, svint32_t,
+               z0 = svsli_n_s32 (z1, z2, 0),
+               z0 = svsli (z1, z2, 0))
+
+/*
+** sli_1_s32_tied1:
+**     sli     z0\.s, z1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sli_1_s32_tied1, svint32_t,
+               z0 = svsli_n_s32 (z0, z1, 1),
+               z0 = svsli (z0, z1, 1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_1_s32_tied2, svint32_t,
+               z0 = svsli_n_s32 (z1, z0, 1),
+               z0 = svsli (z1, z0, 1))
+
+/*
+** sli_1_s32_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.s, z2\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sli_1_s32_untied, svint32_t,
+               z0 = svsli_n_s32 (z1, z2, 1),
+               z0 = svsli (z1, z2, 1))
+
+/*
+** sli_31_s32_tied1:
+**     sli     z0\.s, z1\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (sli_31_s32_tied1, svint32_t,
+               z0 = svsli_n_s32 (z0, z1, 31),
+               z0 = svsli (z0, z1, 31))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_31_s32_tied2, svint32_t,
+               z0 = svsli_n_s32 (z1, z0, 31),
+               z0 = svsli (z1, z0, 31))
+
+/*
+** sli_31_s32_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.s, z2\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (sli_31_s32_untied, svint32_t,
+               z0 = svsli_n_s32 (z1, z2, 31),
+               z0 = svsli (z1, z2, 31))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_s64.c
new file mode 100644 (file)
index 0000000..c37db1b
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sli_0_s64_tied1:
+**     sli     z0\.d, z1\.d, #0
+**     ret
+*/
+TEST_UNIFORM_Z (sli_0_s64_tied1, svint64_t,
+               z0 = svsli_n_s64 (z0, z1, 0),
+               z0 = svsli (z0, z1, 0))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_0_s64_tied2, svint64_t,
+               z0 = svsli_n_s64 (z1, z0, 0),
+               z0 = svsli (z1, z0, 0))
+
+/*
+** sli_0_s64_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.d, z2\.d, #0
+**     ret
+*/
+TEST_UNIFORM_Z (sli_0_s64_untied, svint64_t,
+               z0 = svsli_n_s64 (z1, z2, 0),
+               z0 = svsli (z1, z2, 0))
+
+/*
+** sli_1_s64_tied1:
+**     sli     z0\.d, z1\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sli_1_s64_tied1, svint64_t,
+               z0 = svsli_n_s64 (z0, z1, 1),
+               z0 = svsli (z0, z1, 1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_1_s64_tied2, svint64_t,
+               z0 = svsli_n_s64 (z1, z0, 1),
+               z0 = svsli (z1, z0, 1))
+
+/*
+** sli_1_s64_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.d, z2\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sli_1_s64_untied, svint64_t,
+               z0 = svsli_n_s64 (z1, z2, 1),
+               z0 = svsli (z1, z2, 1))
+
+/*
+** sli_63_s64_tied1:
+**     sli     z0\.d, z1\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (sli_63_s64_tied1, svint64_t,
+               z0 = svsli_n_s64 (z0, z1, 63),
+               z0 = svsli (z0, z1, 63))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_63_s64_tied2, svint64_t,
+               z0 = svsli_n_s64 (z1, z0, 63),
+               z0 = svsli (z1, z0, 63))
+
+/*
+** sli_63_s64_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.d, z2\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (sli_63_s64_untied, svint64_t,
+               z0 = svsli_n_s64 (z1, z2, 63),
+               z0 = svsli (z1, z2, 63))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_s8.c
new file mode 100644 (file)
index 0000000..ea0dcdc
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sli_0_s8_tied1:
+**     sli     z0\.b, z1\.b, #0
+**     ret
+*/
+TEST_UNIFORM_Z (sli_0_s8_tied1, svint8_t,
+               z0 = svsli_n_s8 (z0, z1, 0),
+               z0 = svsli (z0, z1, 0))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_0_s8_tied2, svint8_t,
+               z0 = svsli_n_s8 (z1, z0, 0),
+               z0 = svsli (z1, z0, 0))
+
+/*
+** sli_0_s8_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.b, z2\.b, #0
+**     ret
+*/
+TEST_UNIFORM_Z (sli_0_s8_untied, svint8_t,
+               z0 = svsli_n_s8 (z1, z2, 0),
+               z0 = svsli (z1, z2, 0))
+
+/*
+** sli_1_s8_tied1:
+**     sli     z0\.b, z1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sli_1_s8_tied1, svint8_t,
+               z0 = svsli_n_s8 (z0, z1, 1),
+               z0 = svsli (z0, z1, 1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_1_s8_tied2, svint8_t,
+               z0 = svsli_n_s8 (z1, z0, 1),
+               z0 = svsli (z1, z0, 1))
+
+/*
+** sli_1_s8_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.b, z2\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sli_1_s8_untied, svint8_t,
+               z0 = svsli_n_s8 (z1, z2, 1),
+               z0 = svsli (z1, z2, 1))
+
+/*
+** sli_7_s8_tied1:
+**     sli     z0\.b, z1\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (sli_7_s8_tied1, svint8_t,
+               z0 = svsli_n_s8 (z0, z1, 7),
+               z0 = svsli (z0, z1, 7))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_7_s8_tied2, svint8_t,
+               z0 = svsli_n_s8 (z1, z0, 7),
+               z0 = svsli (z1, z0, 7))
+
+/*
+** sli_7_s8_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.b, z2\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (sli_7_s8_untied, svint8_t,
+               z0 = svsli_n_s8 (z1, z2, 7),
+               z0 = svsli (z1, z2, 7))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_u16.c
new file mode 100644 (file)
index 0000000..475c00e
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sli_0_u16_tied1:
+**     sli     z0\.h, z1\.h, #0
+**     ret
+*/
+TEST_UNIFORM_Z (sli_0_u16_tied1, svuint16_t,
+               z0 = svsli_n_u16 (z0, z1, 0),
+               z0 = svsli (z0, z1, 0))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_0_u16_tied2, svuint16_t,
+               z0 = svsli_n_u16 (z1, z0, 0),
+               z0 = svsli (z1, z0, 0))
+
+/*
+** sli_0_u16_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.h, z2\.h, #0
+**     ret
+*/
+TEST_UNIFORM_Z (sli_0_u16_untied, svuint16_t,
+               z0 = svsli_n_u16 (z1, z2, 0),
+               z0 = svsli (z1, z2, 0))
+
+/*
+** sli_1_u16_tied1:
+**     sli     z0\.h, z1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sli_1_u16_tied1, svuint16_t,
+               z0 = svsli_n_u16 (z0, z1, 1),
+               z0 = svsli (z0, z1, 1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_1_u16_tied2, svuint16_t,
+               z0 = svsli_n_u16 (z1, z0, 1),
+               z0 = svsli (z1, z0, 1))
+
+/*
+** sli_1_u16_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.h, z2\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sli_1_u16_untied, svuint16_t,
+               z0 = svsli_n_u16 (z1, z2, 1),
+               z0 = svsli (z1, z2, 1))
+
+/*
+** sli_15_u16_tied1:
+**     sli     z0\.h, z1\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (sli_15_u16_tied1, svuint16_t,
+               z0 = svsli_n_u16 (z0, z1, 15),
+               z0 = svsli (z0, z1, 15))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_15_u16_tied2, svuint16_t,
+               z0 = svsli_n_u16 (z1, z0, 15),
+               z0 = svsli (z1, z0, 15))
+
+/*
+** sli_15_u16_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.h, z2\.h, #15
+**     ret
+*/
+TEST_UNIFORM_Z (sli_15_u16_untied, svuint16_t,
+               z0 = svsli_n_u16 (z1, z2, 15),
+               z0 = svsli (z1, z2, 15))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_u32.c
new file mode 100644 (file)
index 0000000..52bd837
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sli_0_u32_tied1:
+**     sli     z0\.s, z1\.s, #0
+**     ret
+*/
+TEST_UNIFORM_Z (sli_0_u32_tied1, svuint32_t,
+               z0 = svsli_n_u32 (z0, z1, 0),
+               z0 = svsli (z0, z1, 0))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_0_u32_tied2, svuint32_t,
+               z0 = svsli_n_u32 (z1, z0, 0),
+               z0 = svsli (z1, z0, 0))
+
+/*
+** sli_0_u32_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.s, z2\.s, #0
+**     ret
+*/
+TEST_UNIFORM_Z (sli_0_u32_untied, svuint32_t,
+               z0 = svsli_n_u32 (z1, z2, 0),
+               z0 = svsli (z1, z2, 0))
+
+/*
+** sli_1_u32_tied1:
+**     sli     z0\.s, z1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sli_1_u32_tied1, svuint32_t,
+               z0 = svsli_n_u32 (z0, z1, 1),
+               z0 = svsli (z0, z1, 1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_1_u32_tied2, svuint32_t,
+               z0 = svsli_n_u32 (z1, z0, 1),
+               z0 = svsli (z1, z0, 1))
+
+/*
+** sli_1_u32_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.s, z2\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sli_1_u32_untied, svuint32_t,
+               z0 = svsli_n_u32 (z1, z2, 1),
+               z0 = svsli (z1, z2, 1))
+
+/*
+** sli_31_u32_tied1:
+**     sli     z0\.s, z1\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (sli_31_u32_tied1, svuint32_t,
+               z0 = svsli_n_u32 (z0, z1, 31),
+               z0 = svsli (z0, z1, 31))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_31_u32_tied2, svuint32_t,
+               z0 = svsli_n_u32 (z1, z0, 31),
+               z0 = svsli (z1, z0, 31))
+
+/*
+** sli_31_u32_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.s, z2\.s, #31
+**     ret
+*/
+TEST_UNIFORM_Z (sli_31_u32_untied, svuint32_t,
+               z0 = svsli_n_u32 (z1, z2, 31),
+               z0 = svsli (z1, z2, 31))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_u64.c
new file mode 100644 (file)
index 0000000..ab75ba2
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sli_0_u64_tied1:
+**     sli     z0\.d, z1\.d, #0
+**     ret
+*/
+TEST_UNIFORM_Z (sli_0_u64_tied1, svuint64_t,
+               z0 = svsli_n_u64 (z0, z1, 0),
+               z0 = svsli (z0, z1, 0))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_0_u64_tied2, svuint64_t,
+               z0 = svsli_n_u64 (z1, z0, 0),
+               z0 = svsli (z1, z0, 0))
+
+/*
+** sli_0_u64_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.d, z2\.d, #0
+**     ret
+*/
+TEST_UNIFORM_Z (sli_0_u64_untied, svuint64_t,
+               z0 = svsli_n_u64 (z1, z2, 0),
+               z0 = svsli (z1, z2, 0))
+
+/*
+** sli_1_u64_tied1:
+**     sli     z0\.d, z1\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sli_1_u64_tied1, svuint64_t,
+               z0 = svsli_n_u64 (z0, z1, 1),
+               z0 = svsli (z0, z1, 1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_1_u64_tied2, svuint64_t,
+               z0 = svsli_n_u64 (z1, z0, 1),
+               z0 = svsli (z1, z0, 1))
+
+/*
+** sli_1_u64_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.d, z2\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sli_1_u64_untied, svuint64_t,
+               z0 = svsli_n_u64 (z1, z2, 1),
+               z0 = svsli (z1, z2, 1))
+
+/*
+** sli_63_u64_tied1:
+**     sli     z0\.d, z1\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (sli_63_u64_tied1, svuint64_t,
+               z0 = svsli_n_u64 (z0, z1, 63),
+               z0 = svsli (z0, z1, 63))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_63_u64_tied2, svuint64_t,
+               z0 = svsli_n_u64 (z1, z0, 63),
+               z0 = svsli (z1, z0, 63))
+
+/*
+** sli_63_u64_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.d, z2\.d, #63
+**     ret
+*/
+TEST_UNIFORM_Z (sli_63_u64_untied, svuint64_t,
+               z0 = svsli_n_u64 (z1, z2, 63),
+               z0 = svsli (z1, z2, 63))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sli_u8.c
new file mode 100644 (file)
index 0000000..e2207c3
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sli_0_u8_tied1:
+**     sli     z0\.b, z1\.b, #0
+**     ret
+*/
+TEST_UNIFORM_Z (sli_0_u8_tied1, svuint8_t,
+               z0 = svsli_n_u8 (z0, z1, 0),
+               z0 = svsli (z0, z1, 0))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_0_u8_tied2, svuint8_t,
+               z0 = svsli_n_u8 (z1, z0, 0),
+               z0 = svsli (z1, z0, 0))
+
+/*
+** sli_0_u8_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.b, z2\.b, #0
+**     ret
+*/
+TEST_UNIFORM_Z (sli_0_u8_untied, svuint8_t,
+               z0 = svsli_n_u8 (z1, z2, 0),
+               z0 = svsli (z1, z2, 0))
+
+/*
+** sli_1_u8_tied1:
+**     sli     z0\.b, z1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sli_1_u8_tied1, svuint8_t,
+               z0 = svsli_n_u8 (z0, z1, 1),
+               z0 = svsli (z0, z1, 1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_1_u8_tied2, svuint8_t,
+               z0 = svsli_n_u8 (z1, z0, 1),
+               z0 = svsli (z1, z0, 1))
+
+/*
+** sli_1_u8_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.b, z2\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sli_1_u8_untied, svuint8_t,
+               z0 = svsli_n_u8 (z1, z2, 1),
+               z0 = svsli (z1, z2, 1))
+
+/*
+** sli_7_u8_tied1:
+**     sli     z0\.b, z1\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (sli_7_u8_tied1, svuint8_t,
+               z0 = svsli_n_u8 (z0, z1, 7),
+               z0 = svsli (z0, z1, 7))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sli_7_u8_tied2, svuint8_t,
+               z0 = svsli_n_u8 (z1, z0, 7),
+               z0 = svsli (z1, z0, 7))
+
+/*
+** sli_7_u8_untied:
+**     mov     z0\.d, z1\.d
+**     sli     z0\.b, z2\.b, #7
+**     ret
+*/
+TEST_UNIFORM_Z (sli_7_u8_untied, svuint8_t,
+               z0 = svsli_n_u8 (z1, z2, 7),
+               z0 = svsli (z1, z2, 7))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sm4e_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sm4e_u32.c
new file mode 100644 (file)
index 0000000..0ff5746
--- /dev/null
@@ -0,0 +1,34 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-sm4"
+
+/*
+** sm4e_u32_tied1:
+**     sm4e    z0\.s, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (sm4e_u32_tied1, svuint32_t,
+               z0 = svsm4e_u32 (z0, z1),
+               z0 = svsm4e (z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sm4e_u32_tied2, svuint32_t,
+               z0 = svsm4e_u32 (z1, z0),
+               z0 = svsm4e (z1, z0))
+
+/*
+** sm4e_u32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     sm4e    z0\.s, z0\.s, z2\.s
+** |
+**     sm4e    z1\.s, z0\.s, z2\.s
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (sm4e_u32_untied, svuint32_t,
+               z0 = svsm4e_u32 (z1, z2),
+               z0 = svsm4e (z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sm4ekey_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sm4ekey_u32.c
new file mode 100644 (file)
index 0000000..58ad33c
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+#pragma GCC target "+sve2-sm4"
+
+/*
+** sm4ekey_u32_tied1:
+**     sm4ekey z0\.s, z0\.s, z1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (sm4ekey_u32_tied1, svuint32_t,
+               z0 = svsm4ekey_u32 (z0, z1),
+               z0 = svsm4ekey (z0, z1))
+
+/*
+** sm4ekey_u32_tied2:
+**     sm4ekey z0\.s, z1\.s, z0\.s
+**     ret
+*/
+TEST_UNIFORM_Z (sm4ekey_u32_tied2, svuint32_t,
+               z0 = svsm4ekey_u32 (z1, z0),
+               z0 = svsm4ekey (z1, z0))
+
+/*
+** sm4ekey_u32_untied:
+**     sm4ekey z0\.s, z1\.s, z2\.s
+**     ret
+*/
+TEST_UNIFORM_Z (sm4ekey_u32_untied, svuint32_t,
+               z0 = svsm4ekey_u32 (z1, z2),
+               z0 = svsm4ekey (z1, z2))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sqadd_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sqadd_u16.c
new file mode 100644 (file)
index 0000000..d689811
--- /dev/null
@@ -0,0 +1,403 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sqadd_u16_m_tied1:
+**     usqadd  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u16_m_tied1, svuint16_t, svint16_t,
+            z0 = svsqadd_u16_m (p0, z0, z4),
+            z0 = svsqadd_m (p0, z0, z4))
+
+/*
+** sqadd_u16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     usqadd  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (sqadd_u16_m_tied2, svuint16_t, svint16_t,
+                z0_res = svsqadd_u16_m (p0, z4, z0),
+                z0_res = svsqadd_m (p0, z4, z0))
+
+/*
+** sqadd_u16_m_untied:
+**     movprfx z0, z1
+**     usqadd  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u16_m_untied, svuint16_t, svint16_t,
+            z0 = svsqadd_u16_m (p0, z1, z4),
+            z0 = svsqadd_m (p0, z1, z4))
+
+/*
+** sqadd_w0_u16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_w0_u16_m_tied1, svuint16_t, int16_t,
+                z0 = svsqadd_n_u16_m (p0, z0, x0),
+                z0 = svsqadd_m (p0, z0, x0))
+
+/*
+** sqadd_w0_u16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_w0_u16_m_untied, svuint16_t, int16_t,
+                z0 = svsqadd_n_u16_m (p0, z1, x0),
+                z0 = svsqadd_m (p0, z1, x0))
+
+/*
+** sqadd_1_u16_m_tied1:
+**     mov     (z[0-9]+\.h), #1
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u16_m_tied1, svuint16_t,
+               z0 = svsqadd_n_u16_m (p0, z0, 1),
+               z0 = svsqadd_m (p0, z0, 1))
+
+/*
+** sqadd_1_u16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #1
+**     movprfx z0, z1
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u16_m_untied, svuint16_t,
+               z0 = svsqadd_n_u16_m (p0, z1, 1),
+               z0 = svsqadd_m (p0, z1, 1))
+
+/*
+** sqadd_127_u16_m:
+**     mov     (z[0-9]+\.h), #127
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_127_u16_m, svuint16_t,
+               z0 = svsqadd_n_u16_m (p0, z0, 127),
+               z0 = svsqadd_m (p0, z0, 127))
+
+/*
+** sqadd_128_u16_m:
+**     mov     (z[0-9]+\.h), #128
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_128_u16_m, svuint16_t,
+               z0 = svsqadd_n_u16_m (p0, z0, 128),
+               z0 = svsqadd_m (p0, z0, 128))
+
+/*
+** sqadd_255_u16_m:
+**     mov     (z[0-9]+\.h), #255
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_255_u16_m, svuint16_t,
+               z0 = svsqadd_n_u16_m (p0, z0, 255),
+               z0 = svsqadd_m (p0, z0, 255))
+
+/*
+** sqadd_m1_u16_m:
+**     mov     (z[0-9]+)\.b, #-1
+**     usqadd  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m1_u16_m, svuint16_t,
+               z0 = svsqadd_n_u16_m (p0, z0, -1),
+               z0 = svsqadd_m (p0, z0, -1))
+
+/*
+** sqadd_m127_u16_m:
+**     mov     (z[0-9]+\.h), #-127
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m127_u16_m, svuint16_t,
+               z0 = svsqadd_n_u16_m (p0, z0, -127),
+               z0 = svsqadd_m (p0, z0, -127))
+
+/*
+** sqadd_m128_u16_m:
+**     mov     (z[0-9]+\.h), #-128
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m128_u16_m, svuint16_t,
+               z0 = svsqadd_n_u16_m (p0, z0, -128),
+               z0 = svsqadd_m (p0, z0, -128))
+
+/*
+** sqadd_u16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     usqadd  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u16_z_tied1, svuint16_t, svint16_t,
+            z0 = svsqadd_u16_z (p0, z0, z4),
+            z0 = svsqadd_z (p0, z0, z4))
+
+/*
+** sqadd_u16_z_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.h, p0/z, z4\.h
+**     usqadd  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (sqadd_u16_z_tied2, svuint16_t, svint16_t,
+                z0_res = svsqadd_u16_z (p0, z4, z0),
+                z0_res = svsqadd_z (p0, z4, z0))
+
+/*
+** sqadd_u16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     usqadd  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u16_z_untied, svuint16_t, svint16_t,
+            z0 = svsqadd_u16_z (p0, z1, z4),
+            z0 = svsqadd_z (p0, z1, z4))
+
+/*
+** sqadd_w0_u16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_w0_u16_z_tied1, svuint16_t, int16_t,
+                z0 = svsqadd_n_u16_z (p0, z0, x0),
+                z0 = svsqadd_z (p0, z0, x0))
+
+/*
+** sqadd_w0_u16_z_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z1\.h
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_w0_u16_z_untied, svuint16_t, int16_t,
+                z0 = svsqadd_n_u16_z (p0, z1, x0),
+                z0 = svsqadd_z (p0, z1, x0))
+
+/*
+** sqadd_1_u16_z_tied1:
+**     mov     (z[0-9]+\.h), #1
+**     movprfx z0\.h, p0/z, z0\.h
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u16_z_tied1, svuint16_t,
+               z0 = svsqadd_n_u16_z (p0, z0, 1),
+               z0 = svsqadd_z (p0, z0, 1))
+
+/*
+** sqadd_1_u16_z_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #1
+**     movprfx z0\.h, p0/z, z1\.h
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u16_z_untied, svuint16_t,
+               z0 = svsqadd_n_u16_z (p0, z1, 1),
+               z0 = svsqadd_z (p0, z1, 1))
+
+/*
+** sqadd_127_u16_z:
+**     mov     (z[0-9]+\.h), #127
+**     movprfx z0\.h, p0/z, z0\.h
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_127_u16_z, svuint16_t,
+               z0 = svsqadd_n_u16_z (p0, z0, 127),
+               z0 = svsqadd_z (p0, z0, 127))
+
+/*
+** sqadd_128_u16_z:
+**     mov     (z[0-9]+\.h), #128
+**     movprfx z0\.h, p0/z, z0\.h
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_128_u16_z, svuint16_t,
+               z0 = svsqadd_n_u16_z (p0, z0, 128),
+               z0 = svsqadd_z (p0, z0, 128))
+
+/*
+** sqadd_255_u16_z:
+**     mov     (z[0-9]+\.h), #255
+**     movprfx z0\.h, p0/z, z0\.h
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_255_u16_z, svuint16_t,
+               z0 = svsqadd_n_u16_z (p0, z0, 255),
+               z0 = svsqadd_z (p0, z0, 255))
+
+/*
+** sqadd_m1_u16_z:
+**     mov     (z[0-9]+)\.b, #-1
+**     movprfx z0\.h, p0/z, z0\.h
+**     usqadd  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m1_u16_z, svuint16_t,
+               z0 = svsqadd_n_u16_z (p0, z0, -1),
+               z0 = svsqadd_z (p0, z0, -1))
+
+/*
+** sqadd_m127_u16_z:
+**     mov     (z[0-9]+\.h), #-127
+**     movprfx z0\.h, p0/z, z0\.h
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m127_u16_z, svuint16_t,
+               z0 = svsqadd_n_u16_z (p0, z0, -127),
+               z0 = svsqadd_z (p0, z0, -127))
+
+/*
+** sqadd_m128_u16_z:
+**     mov     (z[0-9]+\.h), #-128
+**     movprfx z0\.h, p0/z, z0\.h
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m128_u16_z, svuint16_t,
+               z0 = svsqadd_n_u16_z (p0, z0, -128),
+               z0 = svsqadd_z (p0, z0, -128))
+
+/*
+** sqadd_u16_x_tied1:
+**     usqadd  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u16_x_tied1, svuint16_t, svint16_t,
+            z0 = svsqadd_u16_x (p0, z0, z4),
+            z0 = svsqadd_x (p0, z0, z4))
+
+/*
+** sqadd_u16_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     usqadd  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (sqadd_u16_x_tied2, svuint16_t, svint16_t,
+                z0_res = svsqadd_u16_x (p0, z4, z0),
+                z0_res = svsqadd_x (p0, z4, z0))
+
+/*
+** sqadd_u16_x_untied:
+**     movprfx z0, z1
+**     usqadd  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u16_x_untied, svuint16_t, svint16_t,
+            z0 = svsqadd_u16_x (p0, z1, z4),
+            z0 = svsqadd_x (p0, z1, z4))
+
+/*
+** sqadd_w0_u16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_w0_u16_x_tied1, svuint16_t, int16_t,
+                z0 = svsqadd_n_u16_x (p0, z0, x0),
+                z0 = svsqadd_x (p0, z0, x0))
+
+/*
+** sqadd_w0_u16_x_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_w0_u16_x_untied, svuint16_t, int16_t,
+                z0 = svsqadd_n_u16_x (p0, z1, x0),
+                z0 = svsqadd_x (p0, z1, x0))
+
+/*
+** sqadd_1_u16_x_tied1:
+**     uqadd   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u16_x_tied1, svuint16_t,
+               z0 = svsqadd_n_u16_x (p0, z0, 1),
+               z0 = svsqadd_x (p0, z0, 1))
+
+/*
+** sqadd_1_u16_x_untied:
+**     movprfx z0, z1
+**     uqadd   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u16_x_untied, svuint16_t,
+               z0 = svsqadd_n_u16_x (p0, z1, 1),
+               z0 = svsqadd_x (p0, z1, 1))
+
+/*
+** sqadd_127_u16_x:
+**     uqadd   z0\.h, z0\.h, #127
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_127_u16_x, svuint16_t,
+               z0 = svsqadd_n_u16_x (p0, z0, 127),
+               z0 = svsqadd_x (p0, z0, 127))
+
+/*
+** sqadd_128_u16_x:
+**     uqadd   z0\.h, z0\.h, #128
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_128_u16_x, svuint16_t,
+               z0 = svsqadd_n_u16_x (p0, z0, 128),
+               z0 = svsqadd_x (p0, z0, 128))
+
+/*
+** sqadd_255_u16_x:
+**     uqadd   z0\.h, z0\.h, #255
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_255_u16_x, svuint16_t,
+               z0 = svsqadd_n_u16_x (p0, z0, 255),
+               z0 = svsqadd_x (p0, z0, 255))
+
+/*
+** sqadd_m1_u16_x:
+**     mov     (z[0-9]+)\.b, #-1
+**     usqadd  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m1_u16_x, svuint16_t,
+               z0 = svsqadd_n_u16_x (p0, z0, -1),
+               z0 = svsqadd_x (p0, z0, -1))
+
+/*
+** sqadd_m127_u16_x:
+**     mov     (z[0-9]+\.h), #-127
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m127_u16_x, svuint16_t,
+               z0 = svsqadd_n_u16_x (p0, z0, -127),
+               z0 = svsqadd_x (p0, z0, -127))
+
+/*
+** sqadd_m128_u16_x:
+**     mov     (z[0-9]+\.h), #-128
+**     usqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m128_u16_x, svuint16_t,
+               z0 = svsqadd_n_u16_x (p0, z0, -128),
+               z0 = svsqadd_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sqadd_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sqadd_u32.c
new file mode 100644 (file)
index 0000000..0f65f5a
--- /dev/null
@@ -0,0 +1,403 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sqadd_u32_m_tied1:
+**     usqadd  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u32_m_tied1, svuint32_t, svint32_t,
+            z0 = svsqadd_u32_m (p0, z0, z4),
+            z0 = svsqadd_m (p0, z0, z4))
+
+/*
+** sqadd_u32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     usqadd  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (sqadd_u32_m_tied2, svuint32_t, svint32_t,
+                z0_res = svsqadd_u32_m (p0, z4, z0),
+                z0_res = svsqadd_m (p0, z4, z0))
+
+/*
+** sqadd_u32_m_untied:
+**     movprfx z0, z1
+**     usqadd  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u32_m_untied, svuint32_t, svint32_t,
+            z0 = svsqadd_u32_m (p0, z1, z4),
+            z0 = svsqadd_m (p0, z1, z4))
+
+/*
+** sqadd_w0_u32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_w0_u32_m_tied1, svuint32_t, int32_t,
+                z0 = svsqadd_n_u32_m (p0, z0, x0),
+                z0 = svsqadd_m (p0, z0, x0))
+
+/*
+** sqadd_w0_u32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_w0_u32_m_untied, svuint32_t, int32_t,
+                z0 = svsqadd_n_u32_m (p0, z1, x0),
+                z0 = svsqadd_m (p0, z1, x0))
+
+/*
+** sqadd_1_u32_m_tied1:
+**     mov     (z[0-9]+\.s), #1
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u32_m_tied1, svuint32_t,
+               z0 = svsqadd_n_u32_m (p0, z0, 1),
+               z0 = svsqadd_m (p0, z0, 1))
+
+/*
+** sqadd_1_u32_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #1
+**     movprfx z0, z1
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u32_m_untied, svuint32_t,
+               z0 = svsqadd_n_u32_m (p0, z1, 1),
+               z0 = svsqadd_m (p0, z1, 1))
+
+/*
+** sqadd_127_u32_m:
+**     mov     (z[0-9]+\.s), #127
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_127_u32_m, svuint32_t,
+               z0 = svsqadd_n_u32_m (p0, z0, 127),
+               z0 = svsqadd_m (p0, z0, 127))
+
+/*
+** sqadd_128_u32_m:
+**     mov     (z[0-9]+\.s), #128
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_128_u32_m, svuint32_t,
+               z0 = svsqadd_n_u32_m (p0, z0, 128),
+               z0 = svsqadd_m (p0, z0, 128))
+
+/*
+** sqadd_255_u32_m:
+**     mov     (z[0-9]+\.s), #255
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_255_u32_m, svuint32_t,
+               z0 = svsqadd_n_u32_m (p0, z0, 255),
+               z0 = svsqadd_m (p0, z0, 255))
+
+/*
+** sqadd_m1_u32_m:
+**     mov     (z[0-9]+)\.b, #-1
+**     usqadd  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m1_u32_m, svuint32_t,
+               z0 = svsqadd_n_u32_m (p0, z0, -1),
+               z0 = svsqadd_m (p0, z0, -1))
+
+/*
+** sqadd_m127_u32_m:
+**     mov     (z[0-9]+\.s), #-127
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m127_u32_m, svuint32_t,
+               z0 = svsqadd_n_u32_m (p0, z0, -127),
+               z0 = svsqadd_m (p0, z0, -127))
+
+/*
+** sqadd_m128_u32_m:
+**     mov     (z[0-9]+\.s), #-128
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m128_u32_m, svuint32_t,
+               z0 = svsqadd_n_u32_m (p0, z0, -128),
+               z0 = svsqadd_m (p0, z0, -128))
+
+/*
+** sqadd_u32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     usqadd  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u32_z_tied1, svuint32_t, svint32_t,
+            z0 = svsqadd_u32_z (p0, z0, z4),
+            z0 = svsqadd_z (p0, z0, z4))
+
+/*
+** sqadd_u32_z_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.s, p0/z, z4\.s
+**     usqadd  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (sqadd_u32_z_tied2, svuint32_t, svint32_t,
+                z0_res = svsqadd_u32_z (p0, z4, z0),
+                z0_res = svsqadd_z (p0, z4, z0))
+
+/*
+** sqadd_u32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     usqadd  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u32_z_untied, svuint32_t, svint32_t,
+            z0 = svsqadd_u32_z (p0, z1, z4),
+            z0 = svsqadd_z (p0, z1, z4))
+
+/*
+** sqadd_w0_u32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_w0_u32_z_tied1, svuint32_t, int32_t,
+                z0 = svsqadd_n_u32_z (p0, z0, x0),
+                z0 = svsqadd_z (p0, z0, x0))
+
+/*
+** sqadd_w0_u32_z_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z1\.s
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_w0_u32_z_untied, svuint32_t, int32_t,
+                z0 = svsqadd_n_u32_z (p0, z1, x0),
+                z0 = svsqadd_z (p0, z1, x0))
+
+/*
+** sqadd_1_u32_z_tied1:
+**     mov     (z[0-9]+\.s), #1
+**     movprfx z0\.s, p0/z, z0\.s
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u32_z_tied1, svuint32_t,
+               z0 = svsqadd_n_u32_z (p0, z0, 1),
+               z0 = svsqadd_z (p0, z0, 1))
+
+/*
+** sqadd_1_u32_z_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #1
+**     movprfx z0\.s, p0/z, z1\.s
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u32_z_untied, svuint32_t,
+               z0 = svsqadd_n_u32_z (p0, z1, 1),
+               z0 = svsqadd_z (p0, z1, 1))
+
+/*
+** sqadd_127_u32_z:
+**     mov     (z[0-9]+\.s), #127
+**     movprfx z0\.s, p0/z, z0\.s
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_127_u32_z, svuint32_t,
+               z0 = svsqadd_n_u32_z (p0, z0, 127),
+               z0 = svsqadd_z (p0, z0, 127))
+
+/*
+** sqadd_128_u32_z:
+**     mov     (z[0-9]+\.s), #128
+**     movprfx z0\.s, p0/z, z0\.s
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_128_u32_z, svuint32_t,
+               z0 = svsqadd_n_u32_z (p0, z0, 128),
+               z0 = svsqadd_z (p0, z0, 128))
+
+/*
+** sqadd_255_u32_z:
+**     mov     (z[0-9]+\.s), #255
+**     movprfx z0\.s, p0/z, z0\.s
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_255_u32_z, svuint32_t,
+               z0 = svsqadd_n_u32_z (p0, z0, 255),
+               z0 = svsqadd_z (p0, z0, 255))
+
+/*
+** sqadd_m1_u32_z:
+**     mov     (z[0-9]+)\.b, #-1
+**     movprfx z0\.s, p0/z, z0\.s
+**     usqadd  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m1_u32_z, svuint32_t,
+               z0 = svsqadd_n_u32_z (p0, z0, -1),
+               z0 = svsqadd_z (p0, z0, -1))
+
+/*
+** sqadd_m127_u32_z:
+**     mov     (z[0-9]+\.s), #-127
+**     movprfx z0\.s, p0/z, z0\.s
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m127_u32_z, svuint32_t,
+               z0 = svsqadd_n_u32_z (p0, z0, -127),
+               z0 = svsqadd_z (p0, z0, -127))
+
+/*
+** sqadd_m128_u32_z:
+**     mov     (z[0-9]+\.s), #-128
+**     movprfx z0\.s, p0/z, z0\.s
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m128_u32_z, svuint32_t,
+               z0 = svsqadd_n_u32_z (p0, z0, -128),
+               z0 = svsqadd_z (p0, z0, -128))
+
+/*
+** sqadd_u32_x_tied1:
+**     usqadd  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u32_x_tied1, svuint32_t, svint32_t,
+            z0 = svsqadd_u32_x (p0, z0, z4),
+            z0 = svsqadd_x (p0, z0, z4))
+
+/*
+** sqadd_u32_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     usqadd  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (sqadd_u32_x_tied2, svuint32_t, svint32_t,
+                z0_res = svsqadd_u32_x (p0, z4, z0),
+                z0_res = svsqadd_x (p0, z4, z0))
+
+/*
+** sqadd_u32_x_untied:
+**     movprfx z0, z1
+**     usqadd  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u32_x_untied, svuint32_t, svint32_t,
+            z0 = svsqadd_u32_x (p0, z1, z4),
+            z0 = svsqadd_x (p0, z1, z4))
+
+/*
+** sqadd_w0_u32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_w0_u32_x_tied1, svuint32_t, int32_t,
+                z0 = svsqadd_n_u32_x (p0, z0, x0),
+                z0 = svsqadd_x (p0, z0, x0))
+
+/*
+** sqadd_w0_u32_x_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_w0_u32_x_untied, svuint32_t, int32_t,
+                z0 = svsqadd_n_u32_x (p0, z1, x0),
+                z0 = svsqadd_x (p0, z1, x0))
+
+/*
+** sqadd_1_u32_x_tied1:
+**     uqadd   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u32_x_tied1, svuint32_t,
+               z0 = svsqadd_n_u32_x (p0, z0, 1),
+               z0 = svsqadd_x (p0, z0, 1))
+
+/*
+** sqadd_1_u32_x_untied:
+**     movprfx z0, z1
+**     uqadd   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u32_x_untied, svuint32_t,
+               z0 = svsqadd_n_u32_x (p0, z1, 1),
+               z0 = svsqadd_x (p0, z1, 1))
+
+/*
+** sqadd_127_u32_x:
+**     uqadd   z0\.s, z0\.s, #127
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_127_u32_x, svuint32_t,
+               z0 = svsqadd_n_u32_x (p0, z0, 127),
+               z0 = svsqadd_x (p0, z0, 127))
+
+/*
+** sqadd_128_u32_x:
+**     uqadd   z0\.s, z0\.s, #128
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_128_u32_x, svuint32_t,
+               z0 = svsqadd_n_u32_x (p0, z0, 128),
+               z0 = svsqadd_x (p0, z0, 128))
+
+/*
+** sqadd_255_u32_x:
+**     uqadd   z0\.s, z0\.s, #255
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_255_u32_x, svuint32_t,
+               z0 = svsqadd_n_u32_x (p0, z0, 255),
+               z0 = svsqadd_x (p0, z0, 255))
+
+/*
+** sqadd_m1_u32_x:
+**     mov     (z[0-9]+)\.b, #-1
+**     usqadd  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m1_u32_x, svuint32_t,
+               z0 = svsqadd_n_u32_x (p0, z0, -1),
+               z0 = svsqadd_x (p0, z0, -1))
+
+/*
+** sqadd_m127_u32_x:
+**     mov     (z[0-9]+\.s), #-127
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m127_u32_x, svuint32_t,
+               z0 = svsqadd_n_u32_x (p0, z0, -127),
+               z0 = svsqadd_x (p0, z0, -127))
+
+/*
+** sqadd_m128_u32_x:
+**     mov     (z[0-9]+\.s), #-128
+**     usqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m128_u32_x, svuint32_t,
+               z0 = svsqadd_n_u32_x (p0, z0, -128),
+               z0 = svsqadd_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sqadd_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sqadd_u64.c
new file mode 100644 (file)
index 0000000..1f91b2e
--- /dev/null
@@ -0,0 +1,403 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sqadd_u64_m_tied1:
+**     usqadd  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u64_m_tied1, svuint64_t, svint64_t,
+            z0 = svsqadd_u64_m (p0, z0, z4),
+            z0 = svsqadd_m (p0, z0, z4))
+
+/*
+** sqadd_u64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z4
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_DUAL_Z_REV (sqadd_u64_m_tied2, svuint64_t, svint64_t,
+                z0_res = svsqadd_u64_m (p0, z4, z0),
+                z0_res = svsqadd_m (p0, z4, z0))
+
+/*
+** sqadd_u64_m_untied:
+**     movprfx z0, z1
+**     usqadd  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u64_m_untied, svuint64_t, svint64_t,
+            z0 = svsqadd_u64_m (p0, z1, z4),
+            z0 = svsqadd_m (p0, z1, z4))
+
+/*
+** sqadd_x0_u64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_x0_u64_m_tied1, svuint64_t, int64_t,
+                z0 = svsqadd_n_u64_m (p0, z0, x0),
+                z0 = svsqadd_m (p0, z0, x0))
+
+/*
+** sqadd_x0_u64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_x0_u64_m_untied, svuint64_t, int64_t,
+                z0 = svsqadd_n_u64_m (p0, z1, x0),
+                z0 = svsqadd_m (p0, z1, x0))
+
+/*
+** sqadd_1_u64_m_tied1:
+**     mov     (z[0-9]+\.d), #1
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u64_m_tied1, svuint64_t,
+               z0 = svsqadd_n_u64_m (p0, z0, 1),
+               z0 = svsqadd_m (p0, z0, 1))
+
+/*
+** sqadd_1_u64_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.d), #1
+**     movprfx z0, z1
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u64_m_untied, svuint64_t,
+               z0 = svsqadd_n_u64_m (p0, z1, 1),
+               z0 = svsqadd_m (p0, z1, 1))
+
+/*
+** sqadd_127_u64_m:
+**     mov     (z[0-9]+\.d), #127
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_127_u64_m, svuint64_t,
+               z0 = svsqadd_n_u64_m (p0, z0, 127),
+               z0 = svsqadd_m (p0, z0, 127))
+
+/*
+** sqadd_128_u64_m:
+**     mov     (z[0-9]+\.d), #128
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_128_u64_m, svuint64_t,
+               z0 = svsqadd_n_u64_m (p0, z0, 128),
+               z0 = svsqadd_m (p0, z0, 128))
+
+/*
+** sqadd_255_u64_m:
+**     mov     (z[0-9]+\.d), #255
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_255_u64_m, svuint64_t,
+               z0 = svsqadd_n_u64_m (p0, z0, 255),
+               z0 = svsqadd_m (p0, z0, 255))
+
+/*
+** sqadd_m1_u64_m:
+**     mov     (z[0-9]+)\.b, #-1
+**     usqadd  z0\.d, p0/m, z0\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m1_u64_m, svuint64_t,
+               z0 = svsqadd_n_u64_m (p0, z0, -1),
+               z0 = svsqadd_m (p0, z0, -1))
+
+/*
+** sqadd_m127_u64_m:
+**     mov     (z[0-9]+\.d), #-127
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m127_u64_m, svuint64_t,
+               z0 = svsqadd_n_u64_m (p0, z0, -127),
+               z0 = svsqadd_m (p0, z0, -127))
+
+/*
+** sqadd_m128_u64_m:
+**     mov     (z[0-9]+\.d), #-128
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m128_u64_m, svuint64_t,
+               z0 = svsqadd_n_u64_m (p0, z0, -128),
+               z0 = svsqadd_m (p0, z0, -128))
+
+/*
+** sqadd_u64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     usqadd  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u64_z_tied1, svuint64_t, svint64_t,
+            z0 = svsqadd_u64_z (p0, z0, z4),
+            z0 = svsqadd_z (p0, z0, z4))
+
+/*
+** sqadd_u64_z_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0\.d, p0/z, z4\.d
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_DUAL_Z_REV (sqadd_u64_z_tied2, svuint64_t, svint64_t,
+                z0_res = svsqadd_u64_z (p0, z4, z0),
+                z0_res = svsqadd_z (p0, z4, z0))
+
+/*
+** sqadd_u64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     usqadd  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u64_z_untied, svuint64_t, svint64_t,
+            z0 = svsqadd_u64_z (p0, z1, z4),
+            z0 = svsqadd_z (p0, z1, z4))
+
+/*
+** sqadd_x0_u64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_x0_u64_z_tied1, svuint64_t, int64_t,
+                z0 = svsqadd_n_u64_z (p0, z0, x0),
+                z0 = svsqadd_z (p0, z0, x0))
+
+/*
+** sqadd_x0_u64_z_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z1\.d
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_x0_u64_z_untied, svuint64_t, int64_t,
+                z0 = svsqadd_n_u64_z (p0, z1, x0),
+                z0 = svsqadd_z (p0, z1, x0))
+
+/*
+** sqadd_1_u64_z_tied1:
+**     mov     (z[0-9]+\.d), #1
+**     movprfx z0\.d, p0/z, z0\.d
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u64_z_tied1, svuint64_t,
+               z0 = svsqadd_n_u64_z (p0, z0, 1),
+               z0 = svsqadd_z (p0, z0, 1))
+
+/*
+** sqadd_1_u64_z_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.d), #1
+**     movprfx z0\.d, p0/z, z1\.d
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u64_z_untied, svuint64_t,
+               z0 = svsqadd_n_u64_z (p0, z1, 1),
+               z0 = svsqadd_z (p0, z1, 1))
+
+/*
+** sqadd_127_u64_z:
+**     mov     (z[0-9]+\.d), #127
+**     movprfx z0\.d, p0/z, z0\.d
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_127_u64_z, svuint64_t,
+               z0 = svsqadd_n_u64_z (p0, z0, 127),
+               z0 = svsqadd_z (p0, z0, 127))
+
+/*
+** sqadd_128_u64_z:
+**     mov     (z[0-9]+\.d), #128
+**     movprfx z0\.d, p0/z, z0\.d
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_128_u64_z, svuint64_t,
+               z0 = svsqadd_n_u64_z (p0, z0, 128),
+               z0 = svsqadd_z (p0, z0, 128))
+
+/*
+** sqadd_255_u64_z:
+**     mov     (z[0-9]+\.d), #255
+**     movprfx z0\.d, p0/z, z0\.d
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_255_u64_z, svuint64_t,
+               z0 = svsqadd_n_u64_z (p0, z0, 255),
+               z0 = svsqadd_z (p0, z0, 255))
+
+/*
+** sqadd_m1_u64_z:
+**     mov     (z[0-9]+)\.b, #-1
+**     movprfx z0\.d, p0/z, z0\.d
+**     usqadd  z0\.d, p0/m, z0\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m1_u64_z, svuint64_t,
+               z0 = svsqadd_n_u64_z (p0, z0, -1),
+               z0 = svsqadd_z (p0, z0, -1))
+
+/*
+** sqadd_m127_u64_z:
+**     mov     (z[0-9]+\.d), #-127
+**     movprfx z0\.d, p0/z, z0\.d
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m127_u64_z, svuint64_t,
+               z0 = svsqadd_n_u64_z (p0, z0, -127),
+               z0 = svsqadd_z (p0, z0, -127))
+
+/*
+** sqadd_m128_u64_z:
+**     mov     (z[0-9]+\.d), #-128
+**     movprfx z0\.d, p0/z, z0\.d
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m128_u64_z, svuint64_t,
+               z0 = svsqadd_n_u64_z (p0, z0, -128),
+               z0 = svsqadd_z (p0, z0, -128))
+
+/*
+** sqadd_u64_x_tied1:
+**     usqadd  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u64_x_tied1, svuint64_t, svint64_t,
+            z0 = svsqadd_u64_x (p0, z0, z4),
+            z0 = svsqadd_x (p0, z0, z4))
+
+/*
+** sqadd_u64_x_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z4
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_DUAL_Z_REV (sqadd_u64_x_tied2, svuint64_t, svint64_t,
+                z0_res = svsqadd_u64_x (p0, z4, z0),
+                z0_res = svsqadd_x (p0, z4, z0))
+
+/*
+** sqadd_u64_x_untied:
+**     movprfx z0, z1
+**     usqadd  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u64_x_untied, svuint64_t, svint64_t,
+            z0 = svsqadd_u64_x (p0, z1, z4),
+            z0 = svsqadd_x (p0, z1, z4))
+
+/*
+** sqadd_x0_u64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_x0_u64_x_tied1, svuint64_t, int64_t,
+                z0 = svsqadd_n_u64_x (p0, z0, x0),
+                z0 = svsqadd_x (p0, z0, x0))
+
+/*
+** sqadd_x0_u64_x_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_x0_u64_x_untied, svuint64_t, int64_t,
+                z0 = svsqadd_n_u64_x (p0, z1, x0),
+                z0 = svsqadd_x (p0, z1, x0))
+
+/*
+** sqadd_1_u64_x_tied1:
+**     uqadd   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u64_x_tied1, svuint64_t,
+               z0 = svsqadd_n_u64_x (p0, z0, 1),
+               z0 = svsqadd_x (p0, z0, 1))
+
+/*
+** sqadd_1_u64_x_untied:
+**     movprfx z0, z1
+**     uqadd   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u64_x_untied, svuint64_t,
+               z0 = svsqadd_n_u64_x (p0, z1, 1),
+               z0 = svsqadd_x (p0, z1, 1))
+
+/*
+** sqadd_127_u64_x:
+**     uqadd   z0\.d, z0\.d, #127
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_127_u64_x, svuint64_t,
+               z0 = svsqadd_n_u64_x (p0, z0, 127),
+               z0 = svsqadd_x (p0, z0, 127))
+
+/*
+** sqadd_128_u64_x:
+**     uqadd   z0\.d, z0\.d, #128
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_128_u64_x, svuint64_t,
+               z0 = svsqadd_n_u64_x (p0, z0, 128),
+               z0 = svsqadd_x (p0, z0, 128))
+
+/*
+** sqadd_255_u64_x:
+**     uqadd   z0\.d, z0\.d, #255
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_255_u64_x, svuint64_t,
+               z0 = svsqadd_n_u64_x (p0, z0, 255),
+               z0 = svsqadd_x (p0, z0, 255))
+
+/*
+** sqadd_m1_u64_x:
+**     mov     (z[0-9]+)\.b, #-1
+**     usqadd  z0\.d, p0/m, z0\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m1_u64_x, svuint64_t,
+               z0 = svsqadd_n_u64_x (p0, z0, -1),
+               z0 = svsqadd_x (p0, z0, -1))
+
+/*
+** sqadd_m127_u64_x:
+**     mov     (z[0-9]+\.d), #-127
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m127_u64_x, svuint64_t,
+               z0 = svsqadd_n_u64_x (p0, z0, -127),
+               z0 = svsqadd_x (p0, z0, -127))
+
+/*
+** sqadd_m128_u64_x:
+**     mov     (z[0-9]+\.d), #-128
+**     usqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m128_u64_x, svuint64_t,
+               z0 = svsqadd_n_u64_x (p0, z0, -128),
+               z0 = svsqadd_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sqadd_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sqadd_u8.c
new file mode 100644 (file)
index 0000000..5ba0164
--- /dev/null
@@ -0,0 +1,405 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sqadd_u8_m_tied1:
+**     usqadd  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u8_m_tied1, svuint8_t, svint8_t,
+            z0 = svsqadd_u8_m (p0, z0, z4),
+            z0 = svsqadd_m (p0, z0, z4))
+
+/*
+** sqadd_u8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     usqadd  z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (sqadd_u8_m_tied2, svuint8_t, svint8_t,
+                z0_res = svsqadd_u8_m (p0, z4, z0),
+                z0_res = svsqadd_m (p0, z4, z0))
+
+/*
+** sqadd_u8_m_untied:
+**     movprfx z0, z1
+**     usqadd  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u8_m_untied, svuint8_t, svint8_t,
+            z0 = svsqadd_u8_m (p0, z1, z4),
+            z0 = svsqadd_m (p0, z1, z4))
+
+/*
+** sqadd_w0_u8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_w0_u8_m_tied1, svuint8_t, int8_t,
+                z0 = svsqadd_n_u8_m (p0, z0, x0),
+                z0 = svsqadd_m (p0, z0, x0))
+
+/*
+** sqadd_w0_u8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_w0_u8_m_untied, svuint8_t, int8_t,
+                z0 = svsqadd_n_u8_m (p0, z1, x0),
+                z0 = svsqadd_m (p0, z1, x0))
+
+/*
+** sqadd_1_u8_m_tied1:
+**     mov     (z[0-9]+\.b), #1
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u8_m_tied1, svuint8_t,
+               z0 = svsqadd_n_u8_m (p0, z0, 1),
+               z0 = svsqadd_m (p0, z0, 1))
+
+/*
+** sqadd_1_u8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #1
+**     movprfx z0, z1
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u8_m_untied, svuint8_t,
+               z0 = svsqadd_n_u8_m (p0, z1, 1),
+               z0 = svsqadd_m (p0, z1, 1))
+
+/*
+** sqadd_127_u8_m:
+**     mov     (z[0-9]+\.b), #127
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_127_u8_m, svuint8_t,
+               z0 = svsqadd_n_u8_m (p0, z0, 127),
+               z0 = svsqadd_m (p0, z0, 127))
+
+/*
+** sqadd_128_u8_m:
+**     mov     (z[0-9]+\.b), #-128
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_128_u8_m, svuint8_t,
+               z0 = svsqadd_n_u8_m (p0, z0, 128),
+               z0 = svsqadd_m (p0, z0, 128))
+
+/*
+** sqadd_255_u8_m:
+**     mov     (z[0-9]+\.b), #-1
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_255_u8_m, svuint8_t,
+               z0 = svsqadd_n_u8_m (p0, z0, 255),
+               z0 = svsqadd_m (p0, z0, 255))
+
+/*
+** sqadd_m1_u8_m:
+**     mov     (z[0-9]+\.b), #-1
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m1_u8_m, svuint8_t,
+               z0 = svsqadd_n_u8_m (p0, z0, -1),
+               z0 = svsqadd_m (p0, z0, -1))
+
+/*
+** sqadd_m127_u8_m:
+**     mov     (z[0-9]+\.b), #-127
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m127_u8_m, svuint8_t,
+               z0 = svsqadd_n_u8_m (p0, z0, -127),
+               z0 = svsqadd_m (p0, z0, -127))
+
+/*
+** sqadd_m128_u8_m:
+**     mov     (z[0-9]+\.b), #-128
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m128_u8_m, svuint8_t,
+               z0 = svsqadd_n_u8_m (p0, z0, -128),
+               z0 = svsqadd_m (p0, z0, -128))
+
+/*
+** sqadd_u8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     usqadd  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u8_z_tied1, svuint8_t, svint8_t,
+            z0 = svsqadd_u8_z (p0, z0, z4),
+            z0 = svsqadd_z (p0, z0, z4))
+
+/*
+** sqadd_u8_z_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.b, p0/z, z4\.b
+**     usqadd  z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (sqadd_u8_z_tied2, svuint8_t, svint8_t,
+                z0_res = svsqadd_u8_z (p0, z4, z0),
+                z0_res = svsqadd_z (p0, z4, z0))
+
+/*
+** sqadd_u8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     usqadd  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u8_z_untied, svuint8_t, svint8_t,
+            z0 = svsqadd_u8_z (p0, z1, z4),
+            z0 = svsqadd_z (p0, z1, z4))
+
+/*
+** sqadd_w0_u8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_w0_u8_z_tied1, svuint8_t, int8_t,
+                z0 = svsqadd_n_u8_z (p0, z0, x0),
+                z0 = svsqadd_z (p0, z0, x0))
+
+/*
+** sqadd_w0_u8_z_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z1\.b
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_w0_u8_z_untied, svuint8_t, int8_t,
+                z0 = svsqadd_n_u8_z (p0, z1, x0),
+                z0 = svsqadd_z (p0, z1, x0))
+
+/*
+** sqadd_1_u8_z_tied1:
+**     mov     (z[0-9]+\.b), #1
+**     movprfx z0\.b, p0/z, z0\.b
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u8_z_tied1, svuint8_t,
+               z0 = svsqadd_n_u8_z (p0, z0, 1),
+               z0 = svsqadd_z (p0, z0, 1))
+
+/*
+** sqadd_1_u8_z_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #1
+**     movprfx z0\.b, p0/z, z1\.b
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u8_z_untied, svuint8_t,
+               z0 = svsqadd_n_u8_z (p0, z1, 1),
+               z0 = svsqadd_z (p0, z1, 1))
+
+/*
+** sqadd_127_u8_z:
+**     mov     (z[0-9]+\.b), #127
+**     movprfx z0\.b, p0/z, z0\.b
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_127_u8_z, svuint8_t,
+               z0 = svsqadd_n_u8_z (p0, z0, 127),
+               z0 = svsqadd_z (p0, z0, 127))
+
+/*
+** sqadd_128_u8_z:
+**     mov     (z[0-9]+\.b), #-128
+**     movprfx z0\.b, p0/z, z0\.b
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_128_u8_z, svuint8_t,
+               z0 = svsqadd_n_u8_z (p0, z0, 128),
+               z0 = svsqadd_z (p0, z0, 128))
+
+/*
+** sqadd_255_u8_z:
+**     mov     (z[0-9]+\.b), #-1
+**     movprfx z0\.b, p0/z, z0\.b
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_255_u8_z, svuint8_t,
+               z0 = svsqadd_n_u8_z (p0, z0, 255),
+               z0 = svsqadd_z (p0, z0, 255))
+
+/*
+** sqadd_m1_u8_z:
+**     mov     (z[0-9]+\.b), #-1
+**     movprfx z0\.b, p0/z, z0\.b
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m1_u8_z, svuint8_t,
+               z0 = svsqadd_n_u8_z (p0, z0, -1),
+               z0 = svsqadd_z (p0, z0, -1))
+
+/*
+** sqadd_m127_u8_z:
+**     mov     (z[0-9]+\.b), #-127
+**     movprfx z0\.b, p0/z, z0\.b
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m127_u8_z, svuint8_t,
+               z0 = svsqadd_n_u8_z (p0, z0, -127),
+               z0 = svsqadd_z (p0, z0, -127))
+
+/*
+** sqadd_m128_u8_z:
+**     mov     (z[0-9]+\.b), #-128
+**     movprfx z0\.b, p0/z, z0\.b
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m128_u8_z, svuint8_t,
+               z0 = svsqadd_n_u8_z (p0, z0, -128),
+               z0 = svsqadd_z (p0, z0, -128))
+
+/*
+** sqadd_u8_x_tied1:
+**     usqadd  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u8_x_tied1, svuint8_t, svint8_t,
+            z0 = svsqadd_u8_x (p0, z0, z4),
+            z0 = svsqadd_x (p0, z0, z4))
+
+/*
+** sqadd_u8_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     usqadd  z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (sqadd_u8_x_tied2, svuint8_t, svint8_t,
+                z0_res = svsqadd_u8_x (p0, z4, z0),
+                z0_res = svsqadd_x (p0, z4, z0))
+
+/*
+** sqadd_u8_x_untied:
+**     movprfx z0, z1
+**     usqadd  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (sqadd_u8_x_untied, svuint8_t, svint8_t,
+            z0 = svsqadd_u8_x (p0, z1, z4),
+            z0 = svsqadd_x (p0, z1, z4))
+
+/*
+** sqadd_w0_u8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_w0_u8_x_tied1, svuint8_t, int8_t,
+                z0 = svsqadd_n_u8_x (p0, z0, x0),
+                z0 = svsqadd_x (p0, z0, x0))
+
+/*
+** sqadd_w0_u8_x_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (sqadd_w0_u8_x_untied, svuint8_t, int8_t,
+                z0 = svsqadd_n_u8_x (p0, z1, x0),
+                z0 = svsqadd_x (p0, z1, x0))
+
+/*
+** sqadd_1_u8_x_tied1:
+**     uqadd   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u8_x_tied1, svuint8_t,
+               z0 = svsqadd_n_u8_x (p0, z0, 1),
+               z0 = svsqadd_x (p0, z0, 1))
+
+/*
+** sqadd_1_u8_x_untied:
+**     movprfx z0, z1
+**     uqadd   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_1_u8_x_untied, svuint8_t,
+               z0 = svsqadd_n_u8_x (p0, z1, 1),
+               z0 = svsqadd_x (p0, z1, 1))
+
+/*
+** sqadd_127_u8_x:
+**     uqadd   z0\.b, z0\.b, #127
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_127_u8_x, svuint8_t,
+               z0 = svsqadd_n_u8_x (p0, z0, 127),
+               z0 = svsqadd_x (p0, z0, 127))
+
+/*
+** sqadd_128_u8_x:
+**     mov     (z[0-9]+\.b), #-128
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_128_u8_x, svuint8_t,
+               z0 = svsqadd_n_u8_x (p0, z0, 128),
+               z0 = svsqadd_x (p0, z0, 128))
+
+/*
+** sqadd_255_u8_x:
+**     mov     (z[0-9]+\.b), #-1
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_255_u8_x, svuint8_t,
+               z0 = svsqadd_n_u8_x (p0, z0, 255),
+               z0 = svsqadd_x (p0, z0, 255))
+
+/*
+** sqadd_m1_u8_x:
+**     mov     (z[0-9]+\.b), #-1
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m1_u8_x, svuint8_t,
+               z0 = svsqadd_n_u8_x (p0, z0, -1),
+               z0 = svsqadd_x (p0, z0, -1))
+
+/*
+** sqadd_m127_u8_x:
+**     mov     (z[0-9]+\.b), #-127
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m127_u8_x, svuint8_t,
+               z0 = svsqadd_n_u8_x (p0, z0, -127),
+               z0 = svsqadd_x (p0, z0, -127))
+
+/*
+** sqadd_m128_u8_x:
+**     mov     (z[0-9]+\.b), #-128
+**     usqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (sqadd_m128_u8_x, svuint8_t,
+               z0 = svsqadd_n_u8_x (p0, z0, -128),
+               z0 = svsqadd_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_s16.c
new file mode 100644 (file)
index 0000000..3f1f407
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sra_1_s16_tied1:
+**     ssra    z0\.h, z1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_s16_tied1, svint16_t,
+               z0 = svsra_n_s16 (z0, z1, 1),
+               z0 = svsra (z0, z1, 1))
+
+/*
+** sra_1_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     ssra    z0\.h, \1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_s16_tied2, svint16_t,
+               z0 = svsra_n_s16 (z1, z0, 1),
+               z0 = svsra (z1, z0, 1))
+
+/*
+** sra_1_s16_untied:
+**     movprfx z0, z1
+**     ssra    z0\.h, z2\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_s16_untied, svint16_t,
+               z0 = svsra_n_s16 (z1, z2, 1),
+               z0 = svsra (z1, z2, 1))
+
+/*
+** sra_2_s16_tied1:
+**     ssra    z0\.h, z1\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_s16_tied1, svint16_t,
+               z0 = svsra_n_s16 (z0, z1, 2),
+               z0 = svsra (z0, z1, 2))
+
+/*
+** sra_2_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     ssra    z0\.h, \1\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_s16_tied2, svint16_t,
+               z0 = svsra_n_s16 (z1, z0, 2),
+               z0 = svsra (z1, z0, 2))
+
+/*
+** sra_2_s16_untied:
+**     movprfx z0, z1
+**     ssra    z0\.h, z2\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_s16_untied, svint16_t,
+               z0 = svsra_n_s16 (z1, z2, 2),
+               z0 = svsra (z1, z2, 2))
+
+/*
+** sra_16_s16_tied1:
+**     ssra    z0\.h, z1\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (sra_16_s16_tied1, svint16_t,
+               z0 = svsra_n_s16 (z0, z1, 16),
+               z0 = svsra (z0, z1, 16))
+
+/*
+** sra_16_s16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     ssra    z0\.h, \1\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (sra_16_s16_tied2, svint16_t,
+               z0 = svsra_n_s16 (z1, z0, 16),
+               z0 = svsra (z1, z0, 16))
+
+/*
+** sra_16_s16_untied:
+**     movprfx z0, z1
+**     ssra    z0\.h, z2\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (sra_16_s16_untied, svint16_t,
+               z0 = svsra_n_s16 (z1, z2, 16),
+               z0 = svsra (z1, z2, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_s32.c
new file mode 100644 (file)
index 0000000..ac992dc
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sra_1_s32_tied1:
+**     ssra    z0\.s, z1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_s32_tied1, svint32_t,
+               z0 = svsra_n_s32 (z0, z1, 1),
+               z0 = svsra (z0, z1, 1))
+
+/*
+** sra_1_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     ssra    z0\.s, \1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_s32_tied2, svint32_t,
+               z0 = svsra_n_s32 (z1, z0, 1),
+               z0 = svsra (z1, z0, 1))
+
+/*
+** sra_1_s32_untied:
+**     movprfx z0, z1
+**     ssra    z0\.s, z2\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_s32_untied, svint32_t,
+               z0 = svsra_n_s32 (z1, z2, 1),
+               z0 = svsra (z1, z2, 1))
+
+/*
+** sra_2_s32_tied1:
+**     ssra    z0\.s, z1\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_s32_tied1, svint32_t,
+               z0 = svsra_n_s32 (z0, z1, 2),
+               z0 = svsra (z0, z1, 2))
+
+/*
+** sra_2_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     ssra    z0\.s, \1\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_s32_tied2, svint32_t,
+               z0 = svsra_n_s32 (z1, z0, 2),
+               z0 = svsra (z1, z0, 2))
+
+/*
+** sra_2_s32_untied:
+**     movprfx z0, z1
+**     ssra    z0\.s, z2\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_s32_untied, svint32_t,
+               z0 = svsra_n_s32 (z1, z2, 2),
+               z0 = svsra (z1, z2, 2))
+
+/*
+** sra_32_s32_tied1:
+**     ssra    z0\.s, z1\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (sra_32_s32_tied1, svint32_t,
+               z0 = svsra_n_s32 (z0, z1, 32),
+               z0 = svsra (z0, z1, 32))
+
+/*
+** sra_32_s32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     ssra    z0\.s, \1\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (sra_32_s32_tied2, svint32_t,
+               z0 = svsra_n_s32 (z1, z0, 32),
+               z0 = svsra (z1, z0, 32))
+
+/*
+** sra_32_s32_untied:
+**     movprfx z0, z1
+**     ssra    z0\.s, z2\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (sra_32_s32_untied, svint32_t,
+               z0 = svsra_n_s32 (z1, z2, 32),
+               z0 = svsra (z1, z2, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_s64.c
new file mode 100644 (file)
index 0000000..9ea5657
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sra_1_s64_tied1:
+**     ssra    z0\.d, z1\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_s64_tied1, svint64_t,
+               z0 = svsra_n_s64 (z0, z1, 1),
+               z0 = svsra (z0, z1, 1))
+
+/*
+** sra_1_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     ssra    z0\.d, \1, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_s64_tied2, svint64_t,
+               z0 = svsra_n_s64 (z1, z0, 1),
+               z0 = svsra (z1, z0, 1))
+
+/*
+** sra_1_s64_untied:
+**     movprfx z0, z1
+**     ssra    z0\.d, z2\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_s64_untied, svint64_t,
+               z0 = svsra_n_s64 (z1, z2, 1),
+               z0 = svsra (z1, z2, 1))
+
+/*
+** sra_2_s64_tied1:
+**     ssra    z0\.d, z1\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_s64_tied1, svint64_t,
+               z0 = svsra_n_s64 (z0, z1, 2),
+               z0 = svsra (z0, z1, 2))
+
+/*
+** sra_2_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     ssra    z0\.d, \1, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_s64_tied2, svint64_t,
+               z0 = svsra_n_s64 (z1, z0, 2),
+               z0 = svsra (z1, z0, 2))
+
+/*
+** sra_2_s64_untied:
+**     movprfx z0, z1
+**     ssra    z0\.d, z2\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_s64_untied, svint64_t,
+               z0 = svsra_n_s64 (z1, z2, 2),
+               z0 = svsra (z1, z2, 2))
+
+/*
+** sra_64_s64_tied1:
+**     ssra    z0\.d, z1\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (sra_64_s64_tied1, svint64_t,
+               z0 = svsra_n_s64 (z0, z1, 64),
+               z0 = svsra (z0, z1, 64))
+
+/*
+** sra_64_s64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     ssra    z0\.d, \1, #64
+**     ret
+*/
+TEST_UNIFORM_Z (sra_64_s64_tied2, svint64_t,
+               z0 = svsra_n_s64 (z1, z0, 64),
+               z0 = svsra (z1, z0, 64))
+
+/*
+** sra_64_s64_untied:
+**     movprfx z0, z1
+**     ssra    z0\.d, z2\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (sra_64_s64_untied, svint64_t,
+               z0 = svsra_n_s64 (z1, z2, 64),
+               z0 = svsra (z1, z2, 64))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_s8.c
new file mode 100644 (file)
index 0000000..3dc8642
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sra_1_s8_tied1:
+**     ssra    z0\.b, z1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_s8_tied1, svint8_t,
+               z0 = svsra_n_s8 (z0, z1, 1),
+               z0 = svsra (z0, z1, 1))
+
+/*
+** sra_1_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     ssra    z0\.b, \1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_s8_tied2, svint8_t,
+               z0 = svsra_n_s8 (z1, z0, 1),
+               z0 = svsra (z1, z0, 1))
+
+/*
+** sra_1_s8_untied:
+**     movprfx z0, z1
+**     ssra    z0\.b, z2\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_s8_untied, svint8_t,
+               z0 = svsra_n_s8 (z1, z2, 1),
+               z0 = svsra (z1, z2, 1))
+
+/*
+** sra_2_s8_tied1:
+**     ssra    z0\.b, z1\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_s8_tied1, svint8_t,
+               z0 = svsra_n_s8 (z0, z1, 2),
+               z0 = svsra (z0, z1, 2))
+
+/*
+** sra_2_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     ssra    z0\.b, \1\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_s8_tied2, svint8_t,
+               z0 = svsra_n_s8 (z1, z0, 2),
+               z0 = svsra (z1, z0, 2))
+
+/*
+** sra_2_s8_untied:
+**     movprfx z0, z1
+**     ssra    z0\.b, z2\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_s8_untied, svint8_t,
+               z0 = svsra_n_s8 (z1, z2, 2),
+               z0 = svsra (z1, z2, 2))
+
+/*
+** sra_8_s8_tied1:
+**     ssra    z0\.b, z1\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (sra_8_s8_tied1, svint8_t,
+               z0 = svsra_n_s8 (z0, z1, 8),
+               z0 = svsra (z0, z1, 8))
+
+/*
+** sra_8_s8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     ssra    z0\.b, \1\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (sra_8_s8_tied2, svint8_t,
+               z0 = svsra_n_s8 (z1, z0, 8),
+               z0 = svsra (z1, z0, 8))
+
+/*
+** sra_8_s8_untied:
+**     movprfx z0, z1
+**     ssra    z0\.b, z2\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (sra_8_s8_untied, svint8_t,
+               z0 = svsra_n_s8 (z1, z2, 8),
+               z0 = svsra (z1, z2, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_u16.c
new file mode 100644 (file)
index 0000000..6a43cb2
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sra_1_u16_tied1:
+**     usra    z0\.h, z1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_u16_tied1, svuint16_t,
+               z0 = svsra_n_u16 (z0, z1, 1),
+               z0 = svsra (z0, z1, 1))
+
+/*
+** sra_1_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     usra    z0\.h, \1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_u16_tied2, svuint16_t,
+               z0 = svsra_n_u16 (z1, z0, 1),
+               z0 = svsra (z1, z0, 1))
+
+/*
+** sra_1_u16_untied:
+**     movprfx z0, z1
+**     usra    z0\.h, z2\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_u16_untied, svuint16_t,
+               z0 = svsra_n_u16 (z1, z2, 1),
+               z0 = svsra (z1, z2, 1))
+
+/*
+** sra_2_u16_tied1:
+**     usra    z0\.h, z1\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_u16_tied1, svuint16_t,
+               z0 = svsra_n_u16 (z0, z1, 2),
+               z0 = svsra (z0, z1, 2))
+
+/*
+** sra_2_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     usra    z0\.h, \1\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_u16_tied2, svuint16_t,
+               z0 = svsra_n_u16 (z1, z0, 2),
+               z0 = svsra (z1, z0, 2))
+
+/*
+** sra_2_u16_untied:
+**     movprfx z0, z1
+**     usra    z0\.h, z2\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_u16_untied, svuint16_t,
+               z0 = svsra_n_u16 (z1, z2, 2),
+               z0 = svsra (z1, z2, 2))
+
+/*
+** sra_16_u16_tied1:
+**     usra    z0\.h, z1\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (sra_16_u16_tied1, svuint16_t,
+               z0 = svsra_n_u16 (z0, z1, 16),
+               z0 = svsra (z0, z1, 16))
+
+/*
+** sra_16_u16_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     usra    z0\.h, \1\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (sra_16_u16_tied2, svuint16_t,
+               z0 = svsra_n_u16 (z1, z0, 16),
+               z0 = svsra (z1, z0, 16))
+
+/*
+** sra_16_u16_untied:
+**     movprfx z0, z1
+**     usra    z0\.h, z2\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (sra_16_u16_untied, svuint16_t,
+               z0 = svsra_n_u16 (z1, z2, 16),
+               z0 = svsra (z1, z2, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_u32.c
new file mode 100644 (file)
index 0000000..0902451
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sra_1_u32_tied1:
+**     usra    z0\.s, z1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_u32_tied1, svuint32_t,
+               z0 = svsra_n_u32 (z0, z1, 1),
+               z0 = svsra (z0, z1, 1))
+
+/*
+** sra_1_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     usra    z0\.s, \1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_u32_tied2, svuint32_t,
+               z0 = svsra_n_u32 (z1, z0, 1),
+               z0 = svsra (z1, z0, 1))
+
+/*
+** sra_1_u32_untied:
+**     movprfx z0, z1
+**     usra    z0\.s, z2\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_u32_untied, svuint32_t,
+               z0 = svsra_n_u32 (z1, z2, 1),
+               z0 = svsra (z1, z2, 1))
+
+/*
+** sra_2_u32_tied1:
+**     usra    z0\.s, z1\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_u32_tied1, svuint32_t,
+               z0 = svsra_n_u32 (z0, z1, 2),
+               z0 = svsra (z0, z1, 2))
+
+/*
+** sra_2_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     usra    z0\.s, \1\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_u32_tied2, svuint32_t,
+               z0 = svsra_n_u32 (z1, z0, 2),
+               z0 = svsra (z1, z0, 2))
+
+/*
+** sra_2_u32_untied:
+**     movprfx z0, z1
+**     usra    z0\.s, z2\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_u32_untied, svuint32_t,
+               z0 = svsra_n_u32 (z1, z2, 2),
+               z0 = svsra (z1, z2, 2))
+
+/*
+** sra_32_u32_tied1:
+**     usra    z0\.s, z1\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (sra_32_u32_tied1, svuint32_t,
+               z0 = svsra_n_u32 (z0, z1, 32),
+               z0 = svsra (z0, z1, 32))
+
+/*
+** sra_32_u32_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     usra    z0\.s, \1\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (sra_32_u32_tied2, svuint32_t,
+               z0 = svsra_n_u32 (z1, z0, 32),
+               z0 = svsra (z1, z0, 32))
+
+/*
+** sra_32_u32_untied:
+**     movprfx z0, z1
+**     usra    z0\.s, z2\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (sra_32_u32_untied, svuint32_t,
+               z0 = svsra_n_u32 (z1, z2, 32),
+               z0 = svsra (z1, z2, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_u64.c
new file mode 100644 (file)
index 0000000..ff21c36
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sra_1_u64_tied1:
+**     usra    z0\.d, z1\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_u64_tied1, svuint64_t,
+               z0 = svsra_n_u64 (z0, z1, 1),
+               z0 = svsra (z0, z1, 1))
+
+/*
+** sra_1_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     usra    z0\.d, \1, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_u64_tied2, svuint64_t,
+               z0 = svsra_n_u64 (z1, z0, 1),
+               z0 = svsra (z1, z0, 1))
+
+/*
+** sra_1_u64_untied:
+**     movprfx z0, z1
+**     usra    z0\.d, z2\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_u64_untied, svuint64_t,
+               z0 = svsra_n_u64 (z1, z2, 1),
+               z0 = svsra (z1, z2, 1))
+
+/*
+** sra_2_u64_tied1:
+**     usra    z0\.d, z1\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_u64_tied1, svuint64_t,
+               z0 = svsra_n_u64 (z0, z1, 2),
+               z0 = svsra (z0, z1, 2))
+
+/*
+** sra_2_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     usra    z0\.d, \1, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_u64_tied2, svuint64_t,
+               z0 = svsra_n_u64 (z1, z0, 2),
+               z0 = svsra (z1, z0, 2))
+
+/*
+** sra_2_u64_untied:
+**     movprfx z0, z1
+**     usra    z0\.d, z2\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_u64_untied, svuint64_t,
+               z0 = svsra_n_u64 (z1, z2, 2),
+               z0 = svsra (z1, z2, 2))
+
+/*
+** sra_64_u64_tied1:
+**     usra    z0\.d, z1\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (sra_64_u64_tied1, svuint64_t,
+               z0 = svsra_n_u64 (z0, z1, 64),
+               z0 = svsra (z0, z1, 64))
+
+/*
+** sra_64_u64_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z1
+**     usra    z0\.d, \1, #64
+**     ret
+*/
+TEST_UNIFORM_Z (sra_64_u64_tied2, svuint64_t,
+               z0 = svsra_n_u64 (z1, z0, 64),
+               z0 = svsra (z1, z0, 64))
+
+/*
+** sra_64_u64_untied:
+**     movprfx z0, z1
+**     usra    z0\.d, z2\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (sra_64_u64_untied, svuint64_t,
+               z0 = svsra_n_u64 (z1, z2, 64),
+               z0 = svsra (z1, z2, 64))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sra_u8.c
new file mode 100644 (file)
index 0000000..d2ae12a
--- /dev/null
@@ -0,0 +1,93 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sra_1_u8_tied1:
+**     usra    z0\.b, z1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_u8_tied1, svuint8_t,
+               z0 = svsra_n_u8 (z0, z1, 1),
+               z0 = svsra (z0, z1, 1))
+
+/*
+** sra_1_u8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     usra    z0\.b, \1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_u8_tied2, svuint8_t,
+               z0 = svsra_n_u8 (z1, z0, 1),
+               z0 = svsra (z1, z0, 1))
+
+/*
+** sra_1_u8_untied:
+**     movprfx z0, z1
+**     usra    z0\.b, z2\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sra_1_u8_untied, svuint8_t,
+               z0 = svsra_n_u8 (z1, z2, 1),
+               z0 = svsra (z1, z2, 1))
+
+/*
+** sra_2_u8_tied1:
+**     usra    z0\.b, z1\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_u8_tied1, svuint8_t,
+               z0 = svsra_n_u8 (z0, z1, 2),
+               z0 = svsra (z0, z1, 2))
+
+/*
+** sra_2_u8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     usra    z0\.b, \1\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_u8_tied2, svuint8_t,
+               z0 = svsra_n_u8 (z1, z0, 2),
+               z0 = svsra (z1, z0, 2))
+
+/*
+** sra_2_u8_untied:
+**     movprfx z0, z1
+**     usra    z0\.b, z2\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sra_2_u8_untied, svuint8_t,
+               z0 = svsra_n_u8 (z1, z2, 2),
+               z0 = svsra (z1, z2, 2))
+
+/*
+** sra_8_u8_tied1:
+**     usra    z0\.b, z1\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (sra_8_u8_tied1, svuint8_t,
+               z0 = svsra_n_u8 (z0, z1, 8),
+               z0 = svsra (z0, z1, 8))
+
+/*
+** sra_8_u8_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z1
+**     usra    z0\.b, \1\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (sra_8_u8_tied2, svuint8_t,
+               z0 = svsra_n_u8 (z1, z0, 8),
+               z0 = svsra (z1, z0, 8))
+
+/*
+** sra_8_u8_untied:
+**     movprfx z0, z1
+**     usra    z0\.b, z2\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (sra_8_u8_untied, svuint8_t,
+               z0 = svsra_n_u8 (z1, z2, 8),
+               z0 = svsra (z1, z2, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_s16.c
new file mode 100644 (file)
index 0000000..177fbb2
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sri_1_s16_tied1:
+**     sri     z0\.h, z1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sri_1_s16_tied1, svint16_t,
+               z0 = svsri_n_s16 (z0, z1, 1),
+               z0 = svsri (z0, z1, 1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_1_s16_tied2, svint16_t,
+               z0 = svsri_n_s16 (z1, z0, 1),
+               z0 = svsri (z1, z0, 1))
+
+/*
+** sri_1_s16_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.h, z2\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sri_1_s16_untied, svint16_t,
+               z0 = svsri_n_s16 (z1, z2, 1),
+               z0 = svsri (z1, z2, 1))
+
+/*
+** sri_2_s16_tied1:
+**     sri     z0\.h, z1\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sri_2_s16_tied1, svint16_t,
+               z0 = svsri_n_s16 (z0, z1, 2),
+               z0 = svsri (z0, z1, 2))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_2_s16_tied2, svint16_t,
+               z0 = svsri_n_s16 (z1, z0, 2),
+               z0 = svsri (z1, z0, 2))
+
+/*
+** sri_2_s16_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.h, z2\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sri_2_s16_untied, svint16_t,
+               z0 = svsri_n_s16 (z1, z2, 2),
+               z0 = svsri (z1, z2, 2))
+
+/*
+** sri_16_s16_tied1:
+**     sri     z0\.h, z1\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (sri_16_s16_tied1, svint16_t,
+               z0 = svsri_n_s16 (z0, z1, 16),
+               z0 = svsri (z0, z1, 16))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_16_s16_tied2, svint16_t,
+               z0 = svsri_n_s16 (z1, z0, 16),
+               z0 = svsri (z1, z0, 16))
+
+/*
+** sri_16_s16_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.h, z2\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (sri_16_s16_untied, svint16_t,
+               z0 = svsri_n_s16 (z1, z2, 16),
+               z0 = svsri (z1, z2, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_s32.c
new file mode 100644 (file)
index 0000000..27d6c99
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sri_1_s32_tied1:
+**     sri     z0\.s, z1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sri_1_s32_tied1, svint32_t,
+               z0 = svsri_n_s32 (z0, z1, 1),
+               z0 = svsri (z0, z1, 1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_1_s32_tied2, svint32_t,
+               z0 = svsri_n_s32 (z1, z0, 1),
+               z0 = svsri (z1, z0, 1))
+
+/*
+** sri_1_s32_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.s, z2\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sri_1_s32_untied, svint32_t,
+               z0 = svsri_n_s32 (z1, z2, 1),
+               z0 = svsri (z1, z2, 1))
+
+/*
+** sri_2_s32_tied1:
+**     sri     z0\.s, z1\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sri_2_s32_tied1, svint32_t,
+               z0 = svsri_n_s32 (z0, z1, 2),
+               z0 = svsri (z0, z1, 2))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_2_s32_tied2, svint32_t,
+               z0 = svsri_n_s32 (z1, z0, 2),
+               z0 = svsri (z1, z0, 2))
+
+/*
+** sri_2_s32_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.s, z2\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sri_2_s32_untied, svint32_t,
+               z0 = svsri_n_s32 (z1, z2, 2),
+               z0 = svsri (z1, z2, 2))
+
+/*
+** sri_32_s32_tied1:
+**     sri     z0\.s, z1\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (sri_32_s32_tied1, svint32_t,
+               z0 = svsri_n_s32 (z0, z1, 32),
+               z0 = svsri (z0, z1, 32))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_32_s32_tied2, svint32_t,
+               z0 = svsri_n_s32 (z1, z0, 32),
+               z0 = svsri (z1, z0, 32))
+
+/*
+** sri_32_s32_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.s, z2\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (sri_32_s32_untied, svint32_t,
+               z0 = svsri_n_s32 (z1, z2, 32),
+               z0 = svsri (z1, z2, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_s64.c
new file mode 100644 (file)
index 0000000..021613d
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sri_1_s64_tied1:
+**     sri     z0\.d, z1\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sri_1_s64_tied1, svint64_t,
+               z0 = svsri_n_s64 (z0, z1, 1),
+               z0 = svsri (z0, z1, 1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_1_s64_tied2, svint64_t,
+               z0 = svsri_n_s64 (z1, z0, 1),
+               z0 = svsri (z1, z0, 1))
+
+/*
+** sri_1_s64_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.d, z2\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sri_1_s64_untied, svint64_t,
+               z0 = svsri_n_s64 (z1, z2, 1),
+               z0 = svsri (z1, z2, 1))
+
+/*
+** sri_2_s64_tied1:
+**     sri     z0\.d, z1\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sri_2_s64_tied1, svint64_t,
+               z0 = svsri_n_s64 (z0, z1, 2),
+               z0 = svsri (z0, z1, 2))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_2_s64_tied2, svint64_t,
+               z0 = svsri_n_s64 (z1, z0, 2),
+               z0 = svsri (z1, z0, 2))
+
+/*
+** sri_2_s64_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.d, z2\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sri_2_s64_untied, svint64_t,
+               z0 = svsri_n_s64 (z1, z2, 2),
+               z0 = svsri (z1, z2, 2))
+
+/*
+** sri_64_s64_tied1:
+**     sri     z0\.d, z1\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (sri_64_s64_tied1, svint64_t,
+               z0 = svsri_n_s64 (z0, z1, 64),
+               z0 = svsri (z0, z1, 64))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_64_s64_tied2, svint64_t,
+               z0 = svsri_n_s64 (z1, z0, 64),
+               z0 = svsri (z1, z0, 64))
+
+/*
+** sri_64_s64_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.d, z2\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (sri_64_s64_untied, svint64_t,
+               z0 = svsri_n_s64 (z1, z2, 64),
+               z0 = svsri (z1, z2, 64))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_s8.c
new file mode 100644 (file)
index 0000000..0bfa267
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sri_1_s8_tied1:
+**     sri     z0\.b, z1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sri_1_s8_tied1, svint8_t,
+               z0 = svsri_n_s8 (z0, z1, 1),
+               z0 = svsri (z0, z1, 1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_1_s8_tied2, svint8_t,
+               z0 = svsri_n_s8 (z1, z0, 1),
+               z0 = svsri (z1, z0, 1))
+
+/*
+** sri_1_s8_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.b, z2\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sri_1_s8_untied, svint8_t,
+               z0 = svsri_n_s8 (z1, z2, 1),
+               z0 = svsri (z1, z2, 1))
+
+/*
+** sri_2_s8_tied1:
+**     sri     z0\.b, z1\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sri_2_s8_tied1, svint8_t,
+               z0 = svsri_n_s8 (z0, z1, 2),
+               z0 = svsri (z0, z1, 2))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_2_s8_tied2, svint8_t,
+               z0 = svsri_n_s8 (z1, z0, 2),
+               z0 = svsri (z1, z0, 2))
+
+/*
+** sri_2_s8_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.b, z2\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sri_2_s8_untied, svint8_t,
+               z0 = svsri_n_s8 (z1, z2, 2),
+               z0 = svsri (z1, z2, 2))
+
+/*
+** sri_8_s8_tied1:
+**     sri     z0\.b, z1\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (sri_8_s8_tied1, svint8_t,
+               z0 = svsri_n_s8 (z0, z1, 8),
+               z0 = svsri (z0, z1, 8))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_8_s8_tied2, svint8_t,
+               z0 = svsri_n_s8 (z1, z0, 8),
+               z0 = svsri (z1, z0, 8))
+
+/*
+** sri_8_s8_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.b, z2\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (sri_8_s8_untied, svint8_t,
+               z0 = svsri_n_s8 (z1, z2, 8),
+               z0 = svsri (z1, z2, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_u16.c
new file mode 100644 (file)
index 0000000..2f12dc9
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sri_1_u16_tied1:
+**     sri     z0\.h, z1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sri_1_u16_tied1, svuint16_t,
+               z0 = svsri_n_u16 (z0, z1, 1),
+               z0 = svsri (z0, z1, 1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_1_u16_tied2, svuint16_t,
+               z0 = svsri_n_u16 (z1, z0, 1),
+               z0 = svsri (z1, z0, 1))
+
+/*
+** sri_1_u16_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.h, z2\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sri_1_u16_untied, svuint16_t,
+               z0 = svsri_n_u16 (z1, z2, 1),
+               z0 = svsri (z1, z2, 1))
+
+/*
+** sri_2_u16_tied1:
+**     sri     z0\.h, z1\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sri_2_u16_tied1, svuint16_t,
+               z0 = svsri_n_u16 (z0, z1, 2),
+               z0 = svsri (z0, z1, 2))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_2_u16_tied2, svuint16_t,
+               z0 = svsri_n_u16 (z1, z0, 2),
+               z0 = svsri (z1, z0, 2))
+
+/*
+** sri_2_u16_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.h, z2\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sri_2_u16_untied, svuint16_t,
+               z0 = svsri_n_u16 (z1, z2, 2),
+               z0 = svsri (z1, z2, 2))
+
+/*
+** sri_16_u16_tied1:
+**     sri     z0\.h, z1\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (sri_16_u16_tied1, svuint16_t,
+               z0 = svsri_n_u16 (z0, z1, 16),
+               z0 = svsri (z0, z1, 16))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_16_u16_tied2, svuint16_t,
+               z0 = svsri_n_u16 (z1, z0, 16),
+               z0 = svsri (z1, z0, 16))
+
+/*
+** sri_16_u16_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.h, z2\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (sri_16_u16_untied, svuint16_t,
+               z0 = svsri_n_u16 (z1, z2, 16),
+               z0 = svsri (z1, z2, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_u32.c
new file mode 100644 (file)
index 0000000..d4d107f
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sri_1_u32_tied1:
+**     sri     z0\.s, z1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sri_1_u32_tied1, svuint32_t,
+               z0 = svsri_n_u32 (z0, z1, 1),
+               z0 = svsri (z0, z1, 1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_1_u32_tied2, svuint32_t,
+               z0 = svsri_n_u32 (z1, z0, 1),
+               z0 = svsri (z1, z0, 1))
+
+/*
+** sri_1_u32_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.s, z2\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sri_1_u32_untied, svuint32_t,
+               z0 = svsri_n_u32 (z1, z2, 1),
+               z0 = svsri (z1, z2, 1))
+
+/*
+** sri_2_u32_tied1:
+**     sri     z0\.s, z1\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sri_2_u32_tied1, svuint32_t,
+               z0 = svsri_n_u32 (z0, z1, 2),
+               z0 = svsri (z0, z1, 2))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_2_u32_tied2, svuint32_t,
+               z0 = svsri_n_u32 (z1, z0, 2),
+               z0 = svsri (z1, z0, 2))
+
+/*
+** sri_2_u32_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.s, z2\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sri_2_u32_untied, svuint32_t,
+               z0 = svsri_n_u32 (z1, z2, 2),
+               z0 = svsri (z1, z2, 2))
+
+/*
+** sri_32_u32_tied1:
+**     sri     z0\.s, z1\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (sri_32_u32_tied1, svuint32_t,
+               z0 = svsri_n_u32 (z0, z1, 32),
+               z0 = svsri (z0, z1, 32))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_32_u32_tied2, svuint32_t,
+               z0 = svsri_n_u32 (z1, z0, 32),
+               z0 = svsri (z1, z0, 32))
+
+/*
+** sri_32_u32_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.s, z2\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (sri_32_u32_untied, svuint32_t,
+               z0 = svsri_n_u32 (z1, z2, 32),
+               z0 = svsri (z1, z2, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_u64.c
new file mode 100644 (file)
index 0000000..41d6734
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sri_1_u64_tied1:
+**     sri     z0\.d, z1\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sri_1_u64_tied1, svuint64_t,
+               z0 = svsri_n_u64 (z0, z1, 1),
+               z0 = svsri (z0, z1, 1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_1_u64_tied2, svuint64_t,
+               z0 = svsri_n_u64 (z1, z0, 1),
+               z0 = svsri (z1, z0, 1))
+
+/*
+** sri_1_u64_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.d, z2\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sri_1_u64_untied, svuint64_t,
+               z0 = svsri_n_u64 (z1, z2, 1),
+               z0 = svsri (z1, z2, 1))
+
+/*
+** sri_2_u64_tied1:
+**     sri     z0\.d, z1\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sri_2_u64_tied1, svuint64_t,
+               z0 = svsri_n_u64 (z0, z1, 2),
+               z0 = svsri (z0, z1, 2))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_2_u64_tied2, svuint64_t,
+               z0 = svsri_n_u64 (z1, z0, 2),
+               z0 = svsri (z1, z0, 2))
+
+/*
+** sri_2_u64_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.d, z2\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sri_2_u64_untied, svuint64_t,
+               z0 = svsri_n_u64 (z1, z2, 2),
+               z0 = svsri (z1, z2, 2))
+
+/*
+** sri_64_u64_tied1:
+**     sri     z0\.d, z1\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (sri_64_u64_tied1, svuint64_t,
+               z0 = svsri_n_u64 (z0, z1, 64),
+               z0 = svsri (z0, z1, 64))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_64_u64_tied2, svuint64_t,
+               z0 = svsri_n_u64 (z1, z0, 64),
+               z0 = svsri (z1, z0, 64))
+
+/*
+** sri_64_u64_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.d, z2\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (sri_64_u64_untied, svuint64_t,
+               z0 = svsri_n_u64 (z1, z2, 64),
+               z0 = svsri (z1, z2, 64))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sri_u8.c
new file mode 100644 (file)
index 0000000..0aa6a54
--- /dev/null
@@ -0,0 +1,75 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sri_1_u8_tied1:
+**     sri     z0\.b, z1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sri_1_u8_tied1, svuint8_t,
+               z0 = svsri_n_u8 (z0, z1, 1),
+               z0 = svsri (z0, z1, 1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_1_u8_tied2, svuint8_t,
+               z0 = svsri_n_u8 (z1, z0, 1),
+               z0 = svsri (z1, z0, 1))
+
+/*
+** sri_1_u8_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.b, z2\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (sri_1_u8_untied, svuint8_t,
+               z0 = svsri_n_u8 (z1, z2, 1),
+               z0 = svsri (z1, z2, 1))
+
+/*
+** sri_2_u8_tied1:
+**     sri     z0\.b, z1\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sri_2_u8_tied1, svuint8_t,
+               z0 = svsri_n_u8 (z0, z1, 2),
+               z0 = svsri (z0, z1, 2))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_2_u8_tied2, svuint8_t,
+               z0 = svsri_n_u8 (z1, z0, 2),
+               z0 = svsri (z1, z0, 2))
+
+/*
+** sri_2_u8_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.b, z2\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (sri_2_u8_untied, svuint8_t,
+               z0 = svsri_n_u8 (z1, z2, 2),
+               z0 = svsri (z1, z2, 2))
+
+/*
+** sri_8_u8_tied1:
+**     sri     z0\.b, z1\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (sri_8_u8_tied1, svuint8_t,
+               z0 = svsri_n_u8 (z0, z1, 8),
+               z0 = svsri (z0, z1, 8))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_UNIFORM_Z (sri_8_u8_tied2, svuint8_t,
+               z0 = svsri_n_u8 (z1, z0, 8),
+               z0 = svsri (z1, z0, 8))
+
+/*
+** sri_8_u8_untied:
+**     mov     z0\.d, z1\.d
+**     sri     z0\.b, z2\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (sri_8_u8_untied, svuint8_t,
+               z0 = svsri_n_u8 (z1, z2, 8),
+               z0 = svsri (z1, z2, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1_scatter_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1_scatter_f32.c
new file mode 100644 (file)
index 0000000..ba9b5af
--- /dev/null
@@ -0,0 +1,177 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** stnt1_scatter_f32:
+**     stnt1w  z0\.s, p0, \[z1\.s\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_f32, svfloat32_t, svuint32_t,
+                      svstnt1_scatter_u32base_f32 (p0, z1, z0),
+                      svstnt1_scatter (p0, z1, z0))
+
+/*
+** stnt1_scatter_x0_f32_offset:
+**     stnt1w  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_x0_f32_offset, svfloat32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_f32 (p0, z1, x0, z0),
+                      svstnt1_scatter_offset (p0, z1, x0, z0))
+
+/*
+** stnt1_scatter_m4_f32_offset:
+**     mov     (x[0-9]+), #?-4
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_m4_f32_offset, svfloat32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_f32 (p0, z1, -4, z0),
+                      svstnt1_scatter_offset (p0, z1, -4, z0))
+
+/*
+** stnt1_scatter_0_f32_offset:
+**     stnt1w  z0\.s, p0, \[z1\.s\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_0_f32_offset, svfloat32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_f32 (p0, z1, 0, z0),
+                      svstnt1_scatter_offset (p0, z1, 0, z0))
+
+/*
+** stnt1_scatter_5_f32_offset:
+**     mov     (x[0-9]+), #?5
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_5_f32_offset, svfloat32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_f32 (p0, z1, 5, z0),
+                      svstnt1_scatter_offset (p0, z1, 5, z0))
+
+/*
+** stnt1_scatter_6_f32_offset:
+**     mov     (x[0-9]+), #?6
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_6_f32_offset, svfloat32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_f32 (p0, z1, 6, z0),
+                      svstnt1_scatter_offset (p0, z1, 6, z0))
+
+/*
+** stnt1_scatter_7_f32_offset:
+**     mov     (x[0-9]+), #?7
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_7_f32_offset, svfloat32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_f32 (p0, z1, 7, z0),
+                      svstnt1_scatter_offset (p0, z1, 7, z0))
+
+/*
+** stnt1_scatter_8_f32_offset:
+**     mov     (x[0-9]+), #?8
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_8_f32_offset, svfloat32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_f32 (p0, z1, 8, z0),
+                      svstnt1_scatter_offset (p0, z1, 8, z0))
+
+/*
+** stnt1_scatter_124_f32_offset:
+**     mov     (x[0-9]+), #?124
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_124_f32_offset, svfloat32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_f32 (p0, z1, 124, z0),
+                      svstnt1_scatter_offset (p0, z1, 124, z0))
+
+/*
+** stnt1_scatter_128_f32_offset:
+**     mov     (x[0-9]+), #?128
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_128_f32_offset, svfloat32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_f32 (p0, z1, 128, z0),
+                      svstnt1_scatter_offset (p0, z1, 128, z0))
+
+/*
+** stnt1_scatter_x0_f32_index:
+**     lsl     (x[0-9]+), x0, #?2
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_x0_f32_index, svfloat32_t, svuint32_t,
+                      svstnt1_scatter_u32base_index_f32 (p0, z1, x0, z0),
+                      svstnt1_scatter_index (p0, z1, x0, z0))
+
+/*
+** stnt1_scatter_m1_f32_index:
+**     mov     (x[0-9]+), #?-4
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_m1_f32_index, svfloat32_t, svuint32_t,
+                      svstnt1_scatter_u32base_index_f32 (p0, z1, -1, z0),
+                      svstnt1_scatter_index (p0, z1, -1, z0))
+
+/*
+** stnt1_scatter_0_f32_index:
+**     stnt1w  z0\.s, p0, \[z1\.s\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_0_f32_index, svfloat32_t, svuint32_t,
+                      svstnt1_scatter_u32base_index_f32 (p0, z1, 0, z0),
+                      svstnt1_scatter_index (p0, z1, 0, z0))
+
+/*
+** stnt1_scatter_5_f32_index:
+**     mov     (x[0-9]+), #?20
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_5_f32_index, svfloat32_t, svuint32_t,
+                      svstnt1_scatter_u32base_index_f32 (p0, z1, 5, z0),
+                      svstnt1_scatter_index (p0, z1, 5, z0))
+
+/*
+** stnt1_scatter_31_f32_index:
+**     mov     (x[0-9]+), #?124
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_31_f32_index, svfloat32_t, svuint32_t,
+                      svstnt1_scatter_u32base_index_f32 (p0, z1, 31, z0),
+                      svstnt1_scatter_index (p0, z1, 31, z0))
+
+/*
+** stnt1_scatter_32_f32_index:
+**     mov     (x[0-9]+), #?128
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_32_f32_index, svfloat32_t, svuint32_t,
+                      svstnt1_scatter_u32base_index_f32 (p0, z1, 32, z0),
+                      svstnt1_scatter_index (p0, z1, 32, z0))
+
+/*
+** stnt1_scatter_x0_f32_u32offset:
+**     stnt1w  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_x0_f32_u32offset, svfloat32_t, float32_t, svuint32_t,
+                      svstnt1_scatter_u32offset_f32 (p0, x0, z1, z0),
+                      svstnt1_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_f32_u32offset:
+**     stnt1w  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_f32_u32offset, svfloat32_t, float32_t, svuint32_t,
+                      svstnt1_scatter_u32offset_f32 (p0, x0, z1, z0),
+                      svstnt1_scatter_offset (p0, x0, z1, z0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1_scatter_f64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1_scatter_f64.c
new file mode 100644 (file)
index 0000000..55c2346
--- /dev/null
@@ -0,0 +1,275 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** stnt1_scatter_f64:
+**     stnt1d  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_f64, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_f64 (p0, z1, z0),
+                      svstnt1_scatter (p0, z1, z0))
+
+/*
+** stnt1_scatter_x0_f64_offset:
+**     stnt1d  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_x0_f64_offset, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_f64 (p0, z1, x0, z0),
+                      svstnt1_scatter_offset (p0, z1, x0, z0))
+
+/*
+** stnt1_scatter_m8_f64_offset:
+**     mov     (x[0-9]+), #?-8
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_m8_f64_offset, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_f64 (p0, z1, -8, z0),
+                      svstnt1_scatter_offset (p0, z1, -8, z0))
+
+/*
+** stnt1_scatter_0_f64_offset:
+**     stnt1d  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_0_f64_offset, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_f64 (p0, z1, 0, z0),
+                      svstnt1_scatter_offset (p0, z1, 0, z0))
+
+/*
+** stnt1_scatter_9_f64_offset:
+**     mov     (x[0-9]+), #?9
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_9_f64_offset, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_f64 (p0, z1, 9, z0),
+                      svstnt1_scatter_offset (p0, z1, 9, z0))
+
+/*
+** stnt1_scatter_10_f64_offset:
+**     mov     (x[0-9]+), #?10
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_10_f64_offset, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_f64 (p0, z1, 10, z0),
+                      svstnt1_scatter_offset (p0, z1, 10, z0))
+
+/*
+** stnt1_scatter_11_f64_offset:
+**     mov     (x[0-9]+), #?11
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_11_f64_offset, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_f64 (p0, z1, 11, z0),
+                      svstnt1_scatter_offset (p0, z1, 11, z0))
+
+/*
+** stnt1_scatter_12_f64_offset:
+**     mov     (x[0-9]+), #?12
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_12_f64_offset, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_f64 (p0, z1, 12, z0),
+                      svstnt1_scatter_offset (p0, z1, 12, z0))
+
+/*
+** stnt1_scatter_13_f64_offset:
+**     mov     (x[0-9]+), #?13
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_13_f64_offset, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_f64 (p0, z1, 13, z0),
+                      svstnt1_scatter_offset (p0, z1, 13, z0))
+
+/*
+** stnt1_scatter_14_f64_offset:
+**     mov     (x[0-9]+), #?14
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_14_f64_offset, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_f64 (p0, z1, 14, z0),
+                      svstnt1_scatter_offset (p0, z1, 14, z0))
+
+/*
+** stnt1_scatter_15_f64_offset:
+**     mov     (x[0-9]+), #?15
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_15_f64_offset, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_f64 (p0, z1, 15, z0),
+                      svstnt1_scatter_offset (p0, z1, 15, z0))
+
+/*
+** stnt1_scatter_16_f64_offset:
+**     mov     (x[0-9]+), #?16
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_16_f64_offset, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_f64 (p0, z1, 16, z0),
+                      svstnt1_scatter_offset (p0, z1, 16, z0))
+
+/*
+** stnt1_scatter_248_f64_offset:
+**     mov     (x[0-9]+), #?248
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_248_f64_offset, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_f64 (p0, z1, 248, z0),
+                      svstnt1_scatter_offset (p0, z1, 248, z0))
+
+/*
+** stnt1_scatter_256_f64_offset:
+**     mov     (x[0-9]+), #?256
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_256_f64_offset, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_f64 (p0, z1, 256, z0),
+                      svstnt1_scatter_offset (p0, z1, 256, z0))
+
+/*
+** stnt1_scatter_x0_f64_index:
+**     lsl     (x[0-9]+), x0, #?3
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_x0_f64_index, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_index_f64 (p0, z1, x0, z0),
+                      svstnt1_scatter_index (p0, z1, x0, z0))
+
+/*
+** stnt1_scatter_m1_f64_index:
+**     mov     (x[0-9]+), #?-8
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_m1_f64_index, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_index_f64 (p0, z1, -1, z0),
+                      svstnt1_scatter_index (p0, z1, -1, z0))
+
+/*
+** stnt1_scatter_0_f64_index:
+**     stnt1d  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_0_f64_index, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_index_f64 (p0, z1, 0, z0),
+                      svstnt1_scatter_index (p0, z1, 0, z0))
+
+/*
+** stnt1_scatter_5_f64_index:
+**     mov     (x[0-9]+), #?40
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_5_f64_index, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_index_f64 (p0, z1, 5, z0),
+                      svstnt1_scatter_index (p0, z1, 5, z0))
+
+/*
+** stnt1_scatter_31_f64_index:
+**     mov     (x[0-9]+), #?248
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_31_f64_index, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_index_f64 (p0, z1, 31, z0),
+                      svstnt1_scatter_index (p0, z1, 31, z0))
+
+/*
+** stnt1_scatter_32_f64_index:
+**     mov     (x[0-9]+), #?256
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_32_f64_index, svfloat64_t, svuint64_t,
+                      svstnt1_scatter_u64base_index_f64 (p0, z1, 32, z0),
+                      svstnt1_scatter_index (p0, z1, 32, z0))
+
+/*
+** stnt1_scatter_x0_f64_s64offset:
+**     stnt1d  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_x0_f64_s64offset, svfloat64_t, float64_t, svint64_t,
+                      svstnt1_scatter_s64offset_f64 (p0, x0, z1, z0),
+                      svstnt1_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_f64_s64offset:
+**     stnt1d  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_f64_s64offset, svfloat64_t, float64_t, svint64_t,
+                      svstnt1_scatter_s64offset_f64 (p0, x0, z1, z0),
+                      svstnt1_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_x0_f64_u64offset:
+**     stnt1d  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_x0_f64_u64offset, svfloat64_t, float64_t, svuint64_t,
+                      svstnt1_scatter_u64offset_f64 (p0, x0, z1, z0),
+                      svstnt1_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_f64_u64offset:
+**     stnt1d  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_f64_u64offset, svfloat64_t, float64_t, svuint64_t,
+                      svstnt1_scatter_u64offset_f64 (p0, x0, z1, z0),
+                      svstnt1_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_x0_f64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #3
+**     stnt1d  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_x0_f64_s64index, svfloat64_t, float64_t, svint64_t,
+                      svstnt1_scatter_s64index_f64 (p0, x0, z1, z0),
+                      svstnt1_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_f64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #3
+**     stnt1d  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_f64_s64index, svfloat64_t, float64_t, svint64_t,
+                      svstnt1_scatter_s64index_f64 (p0, x0, z1, z0),
+                      svstnt1_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_x0_f64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #3
+**     stnt1d  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_x0_f64_u64index, svfloat64_t, float64_t, svuint64_t,
+                      svstnt1_scatter_u64index_f64 (p0, x0, z1, z0),
+                      svstnt1_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_f64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #3
+**     stnt1d  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_f64_u64index, svfloat64_t, float64_t, svuint64_t,
+                      svstnt1_scatter_u64index_f64 (p0, x0, z1, z0),
+                      svstnt1_scatter_index (p0, x0, z1, z0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1_scatter_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1_scatter_s32.c
new file mode 100644 (file)
index 0000000..8bc40f1
--- /dev/null
@@ -0,0 +1,177 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** stnt1_scatter_s32:
+**     stnt1w  z0\.s, p0, \[z1\.s\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_s32, svint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_s32 (p0, z1, z0),
+                      svstnt1_scatter (p0, z1, z0))
+
+/*
+** stnt1_scatter_x0_s32_offset:
+**     stnt1w  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_x0_s32_offset, svint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_s32 (p0, z1, x0, z0),
+                      svstnt1_scatter_offset (p0, z1, x0, z0))
+
+/*
+** stnt1_scatter_m4_s32_offset:
+**     mov     (x[0-9]+), #?-4
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_m4_s32_offset, svint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_s32 (p0, z1, -4, z0),
+                      svstnt1_scatter_offset (p0, z1, -4, z0))
+
+/*
+** stnt1_scatter_0_s32_offset:
+**     stnt1w  z0\.s, p0, \[z1\.s\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_0_s32_offset, svint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_s32 (p0, z1, 0, z0),
+                      svstnt1_scatter_offset (p0, z1, 0, z0))
+
+/*
+** stnt1_scatter_5_s32_offset:
+**     mov     (x[0-9]+), #?5
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_5_s32_offset, svint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_s32 (p0, z1, 5, z0),
+                      svstnt1_scatter_offset (p0, z1, 5, z0))
+
+/*
+** stnt1_scatter_6_s32_offset:
+**     mov     (x[0-9]+), #?6
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_6_s32_offset, svint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_s32 (p0, z1, 6, z0),
+                      svstnt1_scatter_offset (p0, z1, 6, z0))
+
+/*
+** stnt1_scatter_7_s32_offset:
+**     mov     (x[0-9]+), #?7
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_7_s32_offset, svint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_s32 (p0, z1, 7, z0),
+                      svstnt1_scatter_offset (p0, z1, 7, z0))
+
+/*
+** stnt1_scatter_8_s32_offset:
+**     mov     (x[0-9]+), #?8
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_8_s32_offset, svint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_s32 (p0, z1, 8, z0),
+                      svstnt1_scatter_offset (p0, z1, 8, z0))
+
+/*
+** stnt1_scatter_124_s32_offset:
+**     mov     (x[0-9]+), #?124
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_124_s32_offset, svint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_s32 (p0, z1, 124, z0),
+                      svstnt1_scatter_offset (p0, z1, 124, z0))
+
+/*
+** stnt1_scatter_128_s32_offset:
+**     mov     (x[0-9]+), #?128
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_128_s32_offset, svint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_s32 (p0, z1, 128, z0),
+                      svstnt1_scatter_offset (p0, z1, 128, z0))
+
+/*
+** stnt1_scatter_x0_s32_index:
+**     lsl     (x[0-9]+), x0, #?2
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_x0_s32_index, svint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_index_s32 (p0, z1, x0, z0),
+                      svstnt1_scatter_index (p0, z1, x0, z0))
+
+/*
+** stnt1_scatter_m1_s32_index:
+**     mov     (x[0-9]+), #?-4
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_m1_s32_index, svint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_index_s32 (p0, z1, -1, z0),
+                      svstnt1_scatter_index (p0, z1, -1, z0))
+
+/*
+** stnt1_scatter_0_s32_index:
+**     stnt1w  z0\.s, p0, \[z1\.s\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_0_s32_index, svint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_index_s32 (p0, z1, 0, z0),
+                      svstnt1_scatter_index (p0, z1, 0, z0))
+
+/*
+** stnt1_scatter_5_s32_index:
+**     mov     (x[0-9]+), #?20
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_5_s32_index, svint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_index_s32 (p0, z1, 5, z0),
+                      svstnt1_scatter_index (p0, z1, 5, z0))
+
+/*
+** stnt1_scatter_31_s32_index:
+**     mov     (x[0-9]+), #?124
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_31_s32_index, svint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_index_s32 (p0, z1, 31, z0),
+                      svstnt1_scatter_index (p0, z1, 31, z0))
+
+/*
+** stnt1_scatter_32_s32_index:
+**     mov     (x[0-9]+), #?128
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_32_s32_index, svint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_index_s32 (p0, z1, 32, z0),
+                      svstnt1_scatter_index (p0, z1, 32, z0))
+
+/*
+** stnt1_scatter_x0_s32_u32offset:
+**     stnt1w  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_x0_s32_u32offset, svint32_t, int32_t, svuint32_t,
+                      svstnt1_scatter_u32offset_s32 (p0, x0, z1, z0),
+                      svstnt1_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_s32_u32offset:
+**     stnt1w  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_s32_u32offset, svint32_t, int32_t, svuint32_t,
+                      svstnt1_scatter_u32offset_s32 (p0, x0, z1, z0),
+                      svstnt1_scatter_offset (p0, x0, z1, z0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1_scatter_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1_scatter_s64.c
new file mode 100644 (file)
index 0000000..5f23b82
--- /dev/null
@@ -0,0 +1,275 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** stnt1_scatter_s64:
+**     stnt1d  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_s64, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_s64 (p0, z1, z0),
+                      svstnt1_scatter (p0, z1, z0))
+
+/*
+** stnt1_scatter_x0_s64_offset:
+**     stnt1d  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_x0_s64_offset, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_s64 (p0, z1, x0, z0),
+                      svstnt1_scatter_offset (p0, z1, x0, z0))
+
+/*
+** stnt1_scatter_m8_s64_offset:
+**     mov     (x[0-9]+), #?-8
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_m8_s64_offset, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_s64 (p0, z1, -8, z0),
+                      svstnt1_scatter_offset (p0, z1, -8, z0))
+
+/*
+** stnt1_scatter_0_s64_offset:
+**     stnt1d  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_0_s64_offset, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_s64 (p0, z1, 0, z0),
+                      svstnt1_scatter_offset (p0, z1, 0, z0))
+
+/*
+** stnt1_scatter_9_s64_offset:
+**     mov     (x[0-9]+), #?9
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_9_s64_offset, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_s64 (p0, z1, 9, z0),
+                      svstnt1_scatter_offset (p0, z1, 9, z0))
+
+/*
+** stnt1_scatter_10_s64_offset:
+**     mov     (x[0-9]+), #?10
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_10_s64_offset, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_s64 (p0, z1, 10, z0),
+                      svstnt1_scatter_offset (p0, z1, 10, z0))
+
+/*
+** stnt1_scatter_11_s64_offset:
+**     mov     (x[0-9]+), #?11
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_11_s64_offset, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_s64 (p0, z1, 11, z0),
+                      svstnt1_scatter_offset (p0, z1, 11, z0))
+
+/*
+** stnt1_scatter_12_s64_offset:
+**     mov     (x[0-9]+), #?12
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_12_s64_offset, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_s64 (p0, z1, 12, z0),
+                      svstnt1_scatter_offset (p0, z1, 12, z0))
+
+/*
+** stnt1_scatter_13_s64_offset:
+**     mov     (x[0-9]+), #?13
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_13_s64_offset, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_s64 (p0, z1, 13, z0),
+                      svstnt1_scatter_offset (p0, z1, 13, z0))
+
+/*
+** stnt1_scatter_14_s64_offset:
+**     mov     (x[0-9]+), #?14
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_14_s64_offset, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_s64 (p0, z1, 14, z0),
+                      svstnt1_scatter_offset (p0, z1, 14, z0))
+
+/*
+** stnt1_scatter_15_s64_offset:
+**     mov     (x[0-9]+), #?15
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_15_s64_offset, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_s64 (p0, z1, 15, z0),
+                      svstnt1_scatter_offset (p0, z1, 15, z0))
+
+/*
+** stnt1_scatter_16_s64_offset:
+**     mov     (x[0-9]+), #?16
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_16_s64_offset, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_s64 (p0, z1, 16, z0),
+                      svstnt1_scatter_offset (p0, z1, 16, z0))
+
+/*
+** stnt1_scatter_248_s64_offset:
+**     mov     (x[0-9]+), #?248
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_248_s64_offset, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_s64 (p0, z1, 248, z0),
+                      svstnt1_scatter_offset (p0, z1, 248, z0))
+
+/*
+** stnt1_scatter_256_s64_offset:
+**     mov     (x[0-9]+), #?256
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_256_s64_offset, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_s64 (p0, z1, 256, z0),
+                      svstnt1_scatter_offset (p0, z1, 256, z0))
+
+/*
+** stnt1_scatter_x0_s64_index:
+**     lsl     (x[0-9]+), x0, #?3
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_x0_s64_index, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_index_s64 (p0, z1, x0, z0),
+                      svstnt1_scatter_index (p0, z1, x0, z0))
+
+/*
+** stnt1_scatter_m1_s64_index:
+**     mov     (x[0-9]+), #?-8
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_m1_s64_index, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_index_s64 (p0, z1, -1, z0),
+                      svstnt1_scatter_index (p0, z1, -1, z0))
+
+/*
+** stnt1_scatter_0_s64_index:
+**     stnt1d  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_0_s64_index, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_index_s64 (p0, z1, 0, z0),
+                      svstnt1_scatter_index (p0, z1, 0, z0))
+
+/*
+** stnt1_scatter_5_s64_index:
+**     mov     (x[0-9]+), #?40
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_5_s64_index, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_index_s64 (p0, z1, 5, z0),
+                      svstnt1_scatter_index (p0, z1, 5, z0))
+
+/*
+** stnt1_scatter_31_s64_index:
+**     mov     (x[0-9]+), #?248
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_31_s64_index, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_index_s64 (p0, z1, 31, z0),
+                      svstnt1_scatter_index (p0, z1, 31, z0))
+
+/*
+** stnt1_scatter_32_s64_index:
+**     mov     (x[0-9]+), #?256
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_32_s64_index, svint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_index_s64 (p0, z1, 32, z0),
+                      svstnt1_scatter_index (p0, z1, 32, z0))
+
+/*
+** stnt1_scatter_x0_s64_s64offset:
+**     stnt1d  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_x0_s64_s64offset, svint64_t, int64_t, svint64_t,
+                      svstnt1_scatter_s64offset_s64 (p0, x0, z1, z0),
+                      svstnt1_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_s64_s64offset:
+**     stnt1d  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_s64_s64offset, svint64_t, int64_t, svint64_t,
+                      svstnt1_scatter_s64offset_s64 (p0, x0, z1, z0),
+                      svstnt1_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_x0_s64_u64offset:
+**     stnt1d  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_x0_s64_u64offset, svint64_t, int64_t, svuint64_t,
+                      svstnt1_scatter_u64offset_s64 (p0, x0, z1, z0),
+                      svstnt1_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_s64_u64offset:
+**     stnt1d  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_s64_u64offset, svint64_t, int64_t, svuint64_t,
+                      svstnt1_scatter_u64offset_s64 (p0, x0, z1, z0),
+                      svstnt1_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_x0_s64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #3
+**     stnt1d  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_x0_s64_s64index, svint64_t, int64_t, svint64_t,
+                      svstnt1_scatter_s64index_s64 (p0, x0, z1, z0),
+                      svstnt1_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_s64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #3
+**     stnt1d  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_s64_s64index, svint64_t, int64_t, svint64_t,
+                      svstnt1_scatter_s64index_s64 (p0, x0, z1, z0),
+                      svstnt1_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_x0_s64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #3
+**     stnt1d  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_x0_s64_u64index, svint64_t, int64_t, svuint64_t,
+                      svstnt1_scatter_u64index_s64 (p0, x0, z1, z0),
+                      svstnt1_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_s64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #3
+**     stnt1d  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_s64_u64index, svint64_t, int64_t, svuint64_t,
+                      svstnt1_scatter_u64index_s64 (p0, x0, z1, z0),
+                      svstnt1_scatter_index (p0, x0, z1, z0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1_scatter_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1_scatter_u32.c
new file mode 100644 (file)
index 0000000..cae2a25
--- /dev/null
@@ -0,0 +1,177 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** stnt1_scatter_u32:
+**     stnt1w  z0\.s, p0, \[z1\.s\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_u32, svuint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_u32 (p0, z1, z0),
+                      svstnt1_scatter (p0, z1, z0))
+
+/*
+** stnt1_scatter_x0_u32_offset:
+**     stnt1w  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_x0_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_u32 (p0, z1, x0, z0),
+                      svstnt1_scatter_offset (p0, z1, x0, z0))
+
+/*
+** stnt1_scatter_m4_u32_offset:
+**     mov     (x[0-9]+), #?-4
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_m4_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_u32 (p0, z1, -4, z0),
+                      svstnt1_scatter_offset (p0, z1, -4, z0))
+
+/*
+** stnt1_scatter_0_u32_offset:
+**     stnt1w  z0\.s, p0, \[z1\.s\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_0_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_u32 (p0, z1, 0, z0),
+                      svstnt1_scatter_offset (p0, z1, 0, z0))
+
+/*
+** stnt1_scatter_5_u32_offset:
+**     mov     (x[0-9]+), #?5
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_5_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_u32 (p0, z1, 5, z0),
+                      svstnt1_scatter_offset (p0, z1, 5, z0))
+
+/*
+** stnt1_scatter_6_u32_offset:
+**     mov     (x[0-9]+), #?6
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_6_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_u32 (p0, z1, 6, z0),
+                      svstnt1_scatter_offset (p0, z1, 6, z0))
+
+/*
+** stnt1_scatter_7_u32_offset:
+**     mov     (x[0-9]+), #?7
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_7_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_u32 (p0, z1, 7, z0),
+                      svstnt1_scatter_offset (p0, z1, 7, z0))
+
+/*
+** stnt1_scatter_8_u32_offset:
+**     mov     (x[0-9]+), #?8
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_8_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_u32 (p0, z1, 8, z0),
+                      svstnt1_scatter_offset (p0, z1, 8, z0))
+
+/*
+** stnt1_scatter_124_u32_offset:
+**     mov     (x[0-9]+), #?124
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_124_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_u32 (p0, z1, 124, z0),
+                      svstnt1_scatter_offset (p0, z1, 124, z0))
+
+/*
+** stnt1_scatter_128_u32_offset:
+**     mov     (x[0-9]+), #?128
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_128_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_offset_u32 (p0, z1, 128, z0),
+                      svstnt1_scatter_offset (p0, z1, 128, z0))
+
+/*
+** stnt1_scatter_x0_u32_index:
+**     lsl     (x[0-9]+), x0, #?2
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_x0_u32_index, svuint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_index_u32 (p0, z1, x0, z0),
+                      svstnt1_scatter_index (p0, z1, x0, z0))
+
+/*
+** stnt1_scatter_m1_u32_index:
+**     mov     (x[0-9]+), #?-4
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_m1_u32_index, svuint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_index_u32 (p0, z1, -1, z0),
+                      svstnt1_scatter_index (p0, z1, -1, z0))
+
+/*
+** stnt1_scatter_0_u32_index:
+**     stnt1w  z0\.s, p0, \[z1\.s\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_0_u32_index, svuint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_index_u32 (p0, z1, 0, z0),
+                      svstnt1_scatter_index (p0, z1, 0, z0))
+
+/*
+** stnt1_scatter_5_u32_index:
+**     mov     (x[0-9]+), #?20
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_5_u32_index, svuint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_index_u32 (p0, z1, 5, z0),
+                      svstnt1_scatter_index (p0, z1, 5, z0))
+
+/*
+** stnt1_scatter_31_u32_index:
+**     mov     (x[0-9]+), #?124
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_31_u32_index, svuint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_index_u32 (p0, z1, 31, z0),
+                      svstnt1_scatter_index (p0, z1, 31, z0))
+
+/*
+** stnt1_scatter_32_u32_index:
+**     mov     (x[0-9]+), #?128
+**     stnt1w  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_32_u32_index, svuint32_t, svuint32_t,
+                      svstnt1_scatter_u32base_index_u32 (p0, z1, 32, z0),
+                      svstnt1_scatter_index (p0, z1, 32, z0))
+
+/*
+** stnt1_scatter_x0_u32_u32offset:
+**     stnt1w  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_x0_u32_u32offset, svuint32_t, uint32_t, svuint32_t,
+                      svstnt1_scatter_u32offset_u32 (p0, x0, z1, z0),
+                      svstnt1_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_u32_u32offset:
+**     stnt1w  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_u32_u32offset, svuint32_t, uint32_t, svuint32_t,
+                      svstnt1_scatter_u32offset_u32 (p0, x0, z1, z0),
+                      svstnt1_scatter_offset (p0, x0, z1, z0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1_scatter_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1_scatter_u64.c
new file mode 100644 (file)
index 0000000..855f1c5
--- /dev/null
@@ -0,0 +1,275 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** stnt1_scatter_u64:
+**     stnt1d  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_u64, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_u64 (p0, z1, z0),
+                      svstnt1_scatter (p0, z1, z0))
+
+/*
+** stnt1_scatter_x0_u64_offset:
+**     stnt1d  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_x0_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_u64 (p0, z1, x0, z0),
+                      svstnt1_scatter_offset (p0, z1, x0, z0))
+
+/*
+** stnt1_scatter_m8_u64_offset:
+**     mov     (x[0-9]+), #?-8
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_m8_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_u64 (p0, z1, -8, z0),
+                      svstnt1_scatter_offset (p0, z1, -8, z0))
+
+/*
+** stnt1_scatter_0_u64_offset:
+**     stnt1d  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_0_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_u64 (p0, z1, 0, z0),
+                      svstnt1_scatter_offset (p0, z1, 0, z0))
+
+/*
+** stnt1_scatter_9_u64_offset:
+**     mov     (x[0-9]+), #?9
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_9_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_u64 (p0, z1, 9, z0),
+                      svstnt1_scatter_offset (p0, z1, 9, z0))
+
+/*
+** stnt1_scatter_10_u64_offset:
+**     mov     (x[0-9]+), #?10
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_10_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_u64 (p0, z1, 10, z0),
+                      svstnt1_scatter_offset (p0, z1, 10, z0))
+
+/*
+** stnt1_scatter_11_u64_offset:
+**     mov     (x[0-9]+), #?11
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_11_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_u64 (p0, z1, 11, z0),
+                      svstnt1_scatter_offset (p0, z1, 11, z0))
+
+/*
+** stnt1_scatter_12_u64_offset:
+**     mov     (x[0-9]+), #?12
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_12_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_u64 (p0, z1, 12, z0),
+                      svstnt1_scatter_offset (p0, z1, 12, z0))
+
+/*
+** stnt1_scatter_13_u64_offset:
+**     mov     (x[0-9]+), #?13
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_13_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_u64 (p0, z1, 13, z0),
+                      svstnt1_scatter_offset (p0, z1, 13, z0))
+
+/*
+** stnt1_scatter_14_u64_offset:
+**     mov     (x[0-9]+), #?14
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_14_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_u64 (p0, z1, 14, z0),
+                      svstnt1_scatter_offset (p0, z1, 14, z0))
+
+/*
+** stnt1_scatter_15_u64_offset:
+**     mov     (x[0-9]+), #?15
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_15_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_u64 (p0, z1, 15, z0),
+                      svstnt1_scatter_offset (p0, z1, 15, z0))
+
+/*
+** stnt1_scatter_16_u64_offset:
+**     mov     (x[0-9]+), #?16
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_16_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_u64 (p0, z1, 16, z0),
+                      svstnt1_scatter_offset (p0, z1, 16, z0))
+
+/*
+** stnt1_scatter_248_u64_offset:
+**     mov     (x[0-9]+), #?248
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_248_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_u64 (p0, z1, 248, z0),
+                      svstnt1_scatter_offset (p0, z1, 248, z0))
+
+/*
+** stnt1_scatter_256_u64_offset:
+**     mov     (x[0-9]+), #?256
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_256_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_offset_u64 (p0, z1, 256, z0),
+                      svstnt1_scatter_offset (p0, z1, 256, z0))
+
+/*
+** stnt1_scatter_x0_u64_index:
+**     lsl     (x[0-9]+), x0, #?3
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_x0_u64_index, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_index_u64 (p0, z1, x0, z0),
+                      svstnt1_scatter_index (p0, z1, x0, z0))
+
+/*
+** stnt1_scatter_m1_u64_index:
+**     mov     (x[0-9]+), #?-8
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_m1_u64_index, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_index_u64 (p0, z1, -1, z0),
+                      svstnt1_scatter_index (p0, z1, -1, z0))
+
+/*
+** stnt1_scatter_0_u64_index:
+**     stnt1d  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_0_u64_index, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_index_u64 (p0, z1, 0, z0),
+                      svstnt1_scatter_index (p0, z1, 0, z0))
+
+/*
+** stnt1_scatter_5_u64_index:
+**     mov     (x[0-9]+), #?40
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_5_u64_index, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_index_u64 (p0, z1, 5, z0),
+                      svstnt1_scatter_index (p0, z1, 5, z0))
+
+/*
+** stnt1_scatter_31_u64_index:
+**     mov     (x[0-9]+), #?248
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_31_u64_index, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_index_u64 (p0, z1, 31, z0),
+                      svstnt1_scatter_index (p0, z1, 31, z0))
+
+/*
+** stnt1_scatter_32_u64_index:
+**     mov     (x[0-9]+), #?256
+**     stnt1d  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1_scatter_32_u64_index, svuint64_t, svuint64_t,
+                      svstnt1_scatter_u64base_index_u64 (p0, z1, 32, z0),
+                      svstnt1_scatter_index (p0, z1, 32, z0))
+
+/*
+** stnt1_scatter_x0_u64_s64offset:
+**     stnt1d  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_x0_u64_s64offset, svuint64_t, uint64_t, svint64_t,
+                      svstnt1_scatter_s64offset_u64 (p0, x0, z1, z0),
+                      svstnt1_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_u64_s64offset:
+**     stnt1d  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_u64_s64offset, svuint64_t, uint64_t, svint64_t,
+                      svstnt1_scatter_s64offset_u64 (p0, x0, z1, z0),
+                      svstnt1_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_x0_u64_u64offset:
+**     stnt1d  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_x0_u64_u64offset, svuint64_t, uint64_t, svuint64_t,
+                      svstnt1_scatter_u64offset_u64 (p0, x0, z1, z0),
+                      svstnt1_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_u64_u64offset:
+**     stnt1d  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_u64_u64offset, svuint64_t, uint64_t, svuint64_t,
+                      svstnt1_scatter_u64offset_u64 (p0, x0, z1, z0),
+                      svstnt1_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_x0_u64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #3
+**     stnt1d  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_x0_u64_s64index, svuint64_t, uint64_t, svint64_t,
+                      svstnt1_scatter_s64index_u64 (p0, x0, z1, z0),
+                      svstnt1_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_u64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #3
+**     stnt1d  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_u64_s64index, svuint64_t, uint64_t, svint64_t,
+                      svstnt1_scatter_s64index_u64 (p0, x0, z1, z0),
+                      svstnt1_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_x0_u64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #3
+**     stnt1d  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_x0_u64_u64index, svuint64_t, uint64_t, svuint64_t,
+                      svstnt1_scatter_u64index_u64 (p0, x0, z1, z0),
+                      svstnt1_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1_scatter_u64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #3
+**     stnt1d  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1_scatter_u64_u64index, svuint64_t, uint64_t, svuint64_t,
+                      svstnt1_scatter_u64index_u64 (p0, x0, z1, z0),
+                      svstnt1_scatter_index (p0, x0, z1, z0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1b_scatter_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1b_scatter_s32.c
new file mode 100644 (file)
index 0000000..d481459
--- /dev/null
@@ -0,0 +1,88 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** stnt1b_scatter_s32:
+**     stnt1b  z0\.s, p0, \[z1\.s\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_s32, svint32_t, svuint32_t,
+                      svstnt1b_scatter_u32base_s32 (p0, z1, z0),
+                      svstnt1b_scatter (p0, z1, z0))
+
+/*
+** stnt1b_scatter_x0_s32_offset:
+**     stnt1b  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_x0_s32_offset, svint32_t, svuint32_t,
+                      svstnt1b_scatter_u32base_offset_s32 (p0, z1, x0, z0),
+                      svstnt1b_scatter_offset (p0, z1, x0, z0))
+
+/*
+** stnt1b_scatter_m1_s32_offset:
+**     mov     (x[0-9]+), #?-1
+**     stnt1b  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_m1_s32_offset, svint32_t, svuint32_t,
+                      svstnt1b_scatter_u32base_offset_s32 (p0, z1, -1, z0),
+                      svstnt1b_scatter_offset (p0, z1, -1, z0))
+
+/*
+** stnt1b_scatter_0_s32_offset:
+**     stnt1b  z0\.s, p0, \[z1\.s\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_0_s32_offset, svint32_t, svuint32_t,
+                      svstnt1b_scatter_u32base_offset_s32 (p0, z1, 0, z0),
+                      svstnt1b_scatter_offset (p0, z1, 0, z0))
+
+/*
+** stnt1b_scatter_5_s32_offset:
+**     mov     (x[0-9]+), #?5
+**     stnt1b  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_5_s32_offset, svint32_t, svuint32_t,
+                      svstnt1b_scatter_u32base_offset_s32 (p0, z1, 5, z0),
+                      svstnt1b_scatter_offset (p0, z1, 5, z0))
+
+/*
+** stnt1b_scatter_31_s32_offset:
+**     mov     (x[0-9]+), #?31
+**     stnt1b  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_31_s32_offset, svint32_t, svuint32_t,
+                      svstnt1b_scatter_u32base_offset_s32 (p0, z1, 31, z0),
+                      svstnt1b_scatter_offset (p0, z1, 31, z0))
+
+/*
+** stnt1b_scatter_32_s32_offset:
+**     mov     (x[0-9]+), #?32
+**     stnt1b  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_32_s32_offset, svint32_t, svuint32_t,
+                      svstnt1b_scatter_u32base_offset_s32 (p0, z1, 32, z0),
+                      svstnt1b_scatter_offset (p0, z1, 32, z0))
+
+/*
+** stnt1b_scatter_x0_s32_u32offset:
+**     stnt1b  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1b_scatter_x0_s32_u32offset, svint32_t, int8_t, svuint32_t,
+                      svstnt1b_scatter_u32offset_s32 (p0, x0, z1, z0),
+                      svstnt1b_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1b_scatter_s32_u32offset:
+**     stnt1b  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1b_scatter_s32_u32offset, svint32_t, int8_t, svuint32_t,
+                      svstnt1b_scatter_u32offset_s32 (p0, x0, z1, z0),
+                      svstnt1b_scatter_offset (p0, x0, z1, z0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1b_scatter_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1b_scatter_s64.c
new file mode 100644 (file)
index 0000000..b655a9f
--- /dev/null
@@ -0,0 +1,106 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** stnt1b_scatter_s64:
+**     stnt1b  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_s64, svint64_t, svuint64_t,
+                      svstnt1b_scatter_u64base_s64 (p0, z1, z0),
+                      svstnt1b_scatter (p0, z1, z0))
+
+/*
+** stnt1b_scatter_x0_s64_offset:
+**     stnt1b  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_x0_s64_offset, svint64_t, svuint64_t,
+                      svstnt1b_scatter_u64base_offset_s64 (p0, z1, x0, z0),
+                      svstnt1b_scatter_offset (p0, z1, x0, z0))
+
+/*
+** stnt1b_scatter_m1_s64_offset:
+**     mov     (x[0-9]+), #?-1
+**     stnt1b  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_m1_s64_offset, svint64_t, svuint64_t,
+                      svstnt1b_scatter_u64base_offset_s64 (p0, z1, -1, z0),
+                      svstnt1b_scatter_offset (p0, z1, -1, z0))
+
+/*
+** stnt1b_scatter_0_s64_offset:
+**     stnt1b  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_0_s64_offset, svint64_t, svuint64_t,
+                      svstnt1b_scatter_u64base_offset_s64 (p0, z1, 0, z0),
+                      svstnt1b_scatter_offset (p0, z1, 0, z0))
+
+/*
+** stnt1b_scatter_5_s64_offset:
+**     mov     (x[0-9]+), #?5
+**     stnt1b  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_5_s64_offset, svint64_t, svuint64_t,
+                      svstnt1b_scatter_u64base_offset_s64 (p0, z1, 5, z0),
+                      svstnt1b_scatter_offset (p0, z1, 5, z0))
+
+/*
+** stnt1b_scatter_31_s64_offset:
+**     mov     (x[0-9]+), #?31
+**     stnt1b  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_31_s64_offset, svint64_t, svuint64_t,
+                      svstnt1b_scatter_u64base_offset_s64 (p0, z1, 31, z0),
+                      svstnt1b_scatter_offset (p0, z1, 31, z0))
+
+/*
+** stnt1b_scatter_32_s64_offset:
+**     mov     (x[0-9]+), #?32
+**     stnt1b  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_32_s64_offset, svint64_t, svuint64_t,
+                      svstnt1b_scatter_u64base_offset_s64 (p0, z1, 32, z0),
+                      svstnt1b_scatter_offset (p0, z1, 32, z0))
+
+/*
+** stnt1b_scatter_x0_s64_s64offset:
+**     stnt1b  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1b_scatter_x0_s64_s64offset, svint64_t, int8_t, svint64_t,
+                      svstnt1b_scatter_s64offset_s64 (p0, x0, z1, z0),
+                      svstnt1b_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1b_scatter_s64_s64offset:
+**     stnt1b  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1b_scatter_s64_s64offset, svint64_t, int8_t, svint64_t,
+                      svstnt1b_scatter_s64offset_s64 (p0, x0, z1, z0),
+                      svstnt1b_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1b_scatter_x0_s64_u64offset:
+**     stnt1b  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1b_scatter_x0_s64_u64offset, svint64_t, int8_t, svuint64_t,
+                      svstnt1b_scatter_u64offset_s64 (p0, x0, z1, z0),
+                      svstnt1b_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1b_scatter_s64_u64offset:
+**     stnt1b  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1b_scatter_s64_u64offset, svint64_t, int8_t, svuint64_t,
+                      svstnt1b_scatter_u64offset_s64 (p0, x0, z1, z0),
+                      svstnt1b_scatter_offset (p0, x0, z1, z0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1b_scatter_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1b_scatter_u32.c
new file mode 100644 (file)
index 0000000..ff65f28
--- /dev/null
@@ -0,0 +1,88 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** stnt1b_scatter_u32:
+**     stnt1b  z0\.s, p0, \[z1\.s\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_u32, svuint32_t, svuint32_t,
+                      svstnt1b_scatter_u32base_u32 (p0, z1, z0),
+                      svstnt1b_scatter (p0, z1, z0))
+
+/*
+** stnt1b_scatter_x0_u32_offset:
+**     stnt1b  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_x0_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1b_scatter_u32base_offset_u32 (p0, z1, x0, z0),
+                      svstnt1b_scatter_offset (p0, z1, x0, z0))
+
+/*
+** stnt1b_scatter_m1_u32_offset:
+**     mov     (x[0-9]+), #?-1
+**     stnt1b  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_m1_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1b_scatter_u32base_offset_u32 (p0, z1, -1, z0),
+                      svstnt1b_scatter_offset (p0, z1, -1, z0))
+
+/*
+** stnt1b_scatter_0_u32_offset:
+**     stnt1b  z0\.s, p0, \[z1\.s\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_0_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1b_scatter_u32base_offset_u32 (p0, z1, 0, z0),
+                      svstnt1b_scatter_offset (p0, z1, 0, z0))
+
+/*
+** stnt1b_scatter_5_u32_offset:
+**     mov     (x[0-9]+), #?5
+**     stnt1b  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_5_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1b_scatter_u32base_offset_u32 (p0, z1, 5, z0),
+                      svstnt1b_scatter_offset (p0, z1, 5, z0))
+
+/*
+** stnt1b_scatter_31_u32_offset:
+**     mov     (x[0-9]+), #?31
+**     stnt1b  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_31_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1b_scatter_u32base_offset_u32 (p0, z1, 31, z0),
+                      svstnt1b_scatter_offset (p0, z1, 31, z0))
+
+/*
+** stnt1b_scatter_32_u32_offset:
+**     mov     (x[0-9]+), #?32
+**     stnt1b  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_32_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1b_scatter_u32base_offset_u32 (p0, z1, 32, z0),
+                      svstnt1b_scatter_offset (p0, z1, 32, z0))
+
+/*
+** stnt1b_scatter_x0_u32_u32offset:
+**     stnt1b  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1b_scatter_x0_u32_u32offset, svuint32_t, uint8_t, svuint32_t,
+                      svstnt1b_scatter_u32offset_u32 (p0, x0, z1, z0),
+                      svstnt1b_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1b_scatter_u32_u32offset:
+**     stnt1b  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1b_scatter_u32_u32offset, svuint32_t, uint8_t, svuint32_t,
+                      svstnt1b_scatter_u32offset_u32 (p0, x0, z1, z0),
+                      svstnt1b_scatter_offset (p0, x0, z1, z0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1b_scatter_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1b_scatter_u64.c
new file mode 100644 (file)
index 0000000..aba416e
--- /dev/null
@@ -0,0 +1,106 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** stnt1b_scatter_u64:
+**     stnt1b  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_u64, svuint64_t, svuint64_t,
+                      svstnt1b_scatter_u64base_u64 (p0, z1, z0),
+                      svstnt1b_scatter (p0, z1, z0))
+
+/*
+** stnt1b_scatter_x0_u64_offset:
+**     stnt1b  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_x0_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1b_scatter_u64base_offset_u64 (p0, z1, x0, z0),
+                      svstnt1b_scatter_offset (p0, z1, x0, z0))
+
+/*
+** stnt1b_scatter_m1_u64_offset:
+**     mov     (x[0-9]+), #?-1
+**     stnt1b  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_m1_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1b_scatter_u64base_offset_u64 (p0, z1, -1, z0),
+                      svstnt1b_scatter_offset (p0, z1, -1, z0))
+
+/*
+** stnt1b_scatter_0_u64_offset:
+**     stnt1b  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_0_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1b_scatter_u64base_offset_u64 (p0, z1, 0, z0),
+                      svstnt1b_scatter_offset (p0, z1, 0, z0))
+
+/*
+** stnt1b_scatter_5_u64_offset:
+**     mov     (x[0-9]+), #?5
+**     stnt1b  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_5_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1b_scatter_u64base_offset_u64 (p0, z1, 5, z0),
+                      svstnt1b_scatter_offset (p0, z1, 5, z0))
+
+/*
+** stnt1b_scatter_31_u64_offset:
+**     mov     (x[0-9]+), #?31
+**     stnt1b  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_31_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1b_scatter_u64base_offset_u64 (p0, z1, 31, z0),
+                      svstnt1b_scatter_offset (p0, z1, 31, z0))
+
+/*
+** stnt1b_scatter_32_u64_offset:
+**     mov     (x[0-9]+), #?32
+**     stnt1b  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1b_scatter_32_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1b_scatter_u64base_offset_u64 (p0, z1, 32, z0),
+                      svstnt1b_scatter_offset (p0, z1, 32, z0))
+
+/*
+** stnt1b_scatter_x0_u64_s64offset:
+**     stnt1b  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1b_scatter_x0_u64_s64offset, svuint64_t, uint8_t, svint64_t,
+                      svstnt1b_scatter_s64offset_u64 (p0, x0, z1, z0),
+                      svstnt1b_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1b_scatter_u64_s64offset:
+**     stnt1b  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1b_scatter_u64_s64offset, svuint64_t, uint8_t, svint64_t,
+                      svstnt1b_scatter_s64offset_u64 (p0, x0, z1, z0),
+                      svstnt1b_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1b_scatter_x0_u64_u64offset:
+**     stnt1b  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1b_scatter_x0_u64_u64offset, svuint64_t, uint8_t, svuint64_t,
+                      svstnt1b_scatter_u64offset_u64 (p0, x0, z1, z0),
+                      svstnt1b_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1b_scatter_u64_u64offset:
+**     stnt1b  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1b_scatter_u64_u64offset, svuint64_t, uint8_t, svuint64_t,
+                      svstnt1b_scatter_u64offset_u64 (p0, x0, z1, z0),
+                      svstnt1b_scatter_offset (p0, x0, z1, z0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1h_scatter_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1h_scatter_s32.c
new file mode 100644 (file)
index 0000000..b9c3d83
--- /dev/null
@@ -0,0 +1,157 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** stnt1h_scatter_s32:
+**     stnt1h  z0\.s, p0, \[z1\.s\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_s32, svint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_s32 (p0, z1, z0),
+                      svstnt1h_scatter (p0, z1, z0))
+
+/*
+** stnt1h_scatter_x0_s32_offset:
+**     stnt1h  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_x0_s32_offset, svint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_offset_s32 (p0, z1, x0, z0),
+                      svstnt1h_scatter_offset (p0, z1, x0, z0))
+
+/*
+** stnt1h_scatter_m2_s32_offset:
+**     mov     (x[0-9]+), #?-2
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_m2_s32_offset, svint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_offset_s32 (p0, z1, -2, z0),
+                      svstnt1h_scatter_offset (p0, z1, -2, z0))
+
+/*
+** stnt1h_scatter_0_s32_offset:
+**     stnt1h  z0\.s, p0, \[z1\.s\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_0_s32_offset, svint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_offset_s32 (p0, z1, 0, z0),
+                      svstnt1h_scatter_offset (p0, z1, 0, z0))
+
+/*
+** stnt1h_scatter_5_s32_offset:
+**     mov     (x[0-9]+), #?5
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_5_s32_offset, svint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_offset_s32 (p0, z1, 5, z0),
+                      svstnt1h_scatter_offset (p0, z1, 5, z0))
+
+/*
+** stnt1h_scatter_6_s32_offset:
+**     mov     (x[0-9]+), #?6
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_6_s32_offset, svint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_offset_s32 (p0, z1, 6, z0),
+                      svstnt1h_scatter_offset (p0, z1, 6, z0))
+
+/*
+** stnt1h_scatter_62_s32_offset:
+**     mov     (x[0-9]+), #?62
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_62_s32_offset, svint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_offset_s32 (p0, z1, 62, z0),
+                      svstnt1h_scatter_offset (p0, z1, 62, z0))
+
+/*
+** stnt1h_scatter_64_s32_offset:
+**     mov     (x[0-9]+), #?64
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_64_s32_offset, svint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_offset_s32 (p0, z1, 64, z0),
+                      svstnt1h_scatter_offset (p0, z1, 64, z0))
+
+/*
+** stnt1h_scatter_x0_s32_index:
+**     lsl     (x[0-9]+), x0, #?1
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_x0_s32_index, svint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_index_s32 (p0, z1, x0, z0),
+                      svstnt1h_scatter_index (p0, z1, x0, z0))
+
+/*
+** stnt1h_scatter_m1_s32_index:
+**     mov     (x[0-9]+), #?-2
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_m1_s32_index, svint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_index_s32 (p0, z1, -1, z0),
+                      svstnt1h_scatter_index (p0, z1, -1, z0))
+
+/*
+** stnt1h_scatter_0_s32_index:
+**     stnt1h  z0\.s, p0, \[z1\.s\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_0_s32_index, svint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_index_s32 (p0, z1, 0, z0),
+                      svstnt1h_scatter_index (p0, z1, 0, z0))
+
+/*
+** stnt1h_scatter_5_s32_index:
+**     mov     (x[0-9]+), #?10
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_5_s32_index, svint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_index_s32 (p0, z1, 5, z0),
+                      svstnt1h_scatter_index (p0, z1, 5, z0))
+
+/*
+** stnt1h_scatter_31_s32_index:
+**     mov     (x[0-9]+), #?62
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_31_s32_index, svint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_index_s32 (p0, z1, 31, z0),
+                      svstnt1h_scatter_index (p0, z1, 31, z0))
+
+/*
+** stnt1h_scatter_32_s32_index:
+**     mov     (x[0-9]+), #?64
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_32_s32_index, svint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_index_s32 (p0, z1, 32, z0),
+                      svstnt1h_scatter_index (p0, z1, 32, z0))
+
+/*
+** stnt1h_scatter_x0_s32_u32offset:
+**     stnt1h  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_x0_s32_u32offset, svint32_t, int16_t, svuint32_t,
+                      svstnt1h_scatter_u32offset_s32 (p0, x0, z1, z0),
+                      svstnt1h_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1h_scatter_s32_u32offset:
+**     stnt1h  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_s32_u32offset, svint32_t, int16_t, svuint32_t,
+                      svstnt1h_scatter_u32offset_s32 (p0, x0, z1, z0),
+                      svstnt1h_scatter_offset (p0, x0, z1, z0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1h_scatter_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1h_scatter_s64.c
new file mode 100644 (file)
index 0000000..3033566
--- /dev/null
@@ -0,0 +1,215 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** stnt1h_scatter_s64:
+**     stnt1h  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_s64, svint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_s64 (p0, z1, z0),
+                      svstnt1h_scatter (p0, z1, z0))
+
+/*
+** stnt1h_scatter_x0_s64_offset:
+**     stnt1h  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_x0_s64_offset, svint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_offset_s64 (p0, z1, x0, z0),
+                      svstnt1h_scatter_offset (p0, z1, x0, z0))
+
+/*
+** stnt1h_scatter_m2_s64_offset:
+**     mov     (x[0-9]+), #?-2
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_m2_s64_offset, svint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_offset_s64 (p0, z1, -2, z0),
+                      svstnt1h_scatter_offset (p0, z1, -2, z0))
+
+/*
+** stnt1h_scatter_0_s64_offset:
+**     stnt1h  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_0_s64_offset, svint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_offset_s64 (p0, z1, 0, z0),
+                      svstnt1h_scatter_offset (p0, z1, 0, z0))
+
+/*
+** stnt1h_scatter_5_s64_offset:
+**     mov     (x[0-9]+), #?5
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_5_s64_offset, svint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_offset_s64 (p0, z1, 5, z0),
+                      svstnt1h_scatter_offset (p0, z1, 5, z0))
+
+/*
+** stnt1h_scatter_6_s64_offset:
+**     mov     (x[0-9]+), #?6
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_6_s64_offset, svint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_offset_s64 (p0, z1, 6, z0),
+                      svstnt1h_scatter_offset (p0, z1, 6, z0))
+
+/*
+** stnt1h_scatter_62_s64_offset:
+**     mov     (x[0-9]+), #?62
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_62_s64_offset, svint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_offset_s64 (p0, z1, 62, z0),
+                      svstnt1h_scatter_offset (p0, z1, 62, z0))
+
+/*
+** stnt1h_scatter_64_s64_offset:
+**     mov     (x[0-9]+), #?64
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_64_s64_offset, svint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_offset_s64 (p0, z1, 64, z0),
+                      svstnt1h_scatter_offset (p0, z1, 64, z0))
+
+/*
+** stnt1h_scatter_x0_s64_index:
+**     lsl     (x[0-9]+), x0, #?1
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_x0_s64_index, svint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_index_s64 (p0, z1, x0, z0),
+                      svstnt1h_scatter_index (p0, z1, x0, z0))
+
+/*
+** stnt1h_scatter_m1_s64_index:
+**     mov     (x[0-9]+), #?-2
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_m1_s64_index, svint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_index_s64 (p0, z1, -1, z0),
+                      svstnt1h_scatter_index (p0, z1, -1, z0))
+
+/*
+** stnt1h_scatter_0_s64_index:
+**     stnt1h  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_0_s64_index, svint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_index_s64 (p0, z1, 0, z0),
+                      svstnt1h_scatter_index (p0, z1, 0, z0))
+
+/*
+** stnt1h_scatter_5_s64_index:
+**     mov     (x[0-9]+), #?10
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_5_s64_index, svint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_index_s64 (p0, z1, 5, z0),
+                      svstnt1h_scatter_index (p0, z1, 5, z0))
+
+/*
+** stnt1h_scatter_31_s64_index:
+**     mov     (x[0-9]+), #?62
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_31_s64_index, svint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_index_s64 (p0, z1, 31, z0),
+                      svstnt1h_scatter_index (p0, z1, 31, z0))
+
+/*
+** stnt1h_scatter_32_s64_index:
+**     mov     (x[0-9]+), #?64
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_32_s64_index, svint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_index_s64 (p0, z1, 32, z0),
+                      svstnt1h_scatter_index (p0, z1, 32, z0))
+
+/*
+** stnt1h_scatter_x0_s64_s64offset:
+**     stnt1h  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_x0_s64_s64offset, svint64_t, int16_t, svint64_t,
+                      svstnt1h_scatter_s64offset_s64 (p0, x0, z1, z0),
+                      svstnt1h_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1h_scatter_s64_s64offset:
+**     stnt1h  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_s64_s64offset, svint64_t, int16_t, svint64_t,
+                      svstnt1h_scatter_s64offset_s64 (p0, x0, z1, z0),
+                      svstnt1h_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1h_scatter_x0_s64_u64offset:
+**     stnt1h  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_x0_s64_u64offset, svint64_t, int16_t, svuint64_t,
+                      svstnt1h_scatter_u64offset_s64 (p0, x0, z1, z0),
+                      svstnt1h_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1h_scatter_s64_u64offset:
+**     stnt1h  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_s64_u64offset, svint64_t, int16_t, svuint64_t,
+                      svstnt1h_scatter_u64offset_s64 (p0, x0, z1, z0),
+                      svstnt1h_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1h_scatter_x0_s64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #1
+**     stnt1h  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_x0_s64_s64index, svint64_t, int16_t, svint64_t,
+                      svstnt1h_scatter_s64index_s64 (p0, x0, z1, z0),
+                      svstnt1h_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1h_scatter_s64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #1
+**     stnt1h  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_s64_s64index, svint64_t, int16_t, svint64_t,
+                      svstnt1h_scatter_s64index_s64 (p0, x0, z1, z0),
+                      svstnt1h_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1h_scatter_x0_s64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #1
+**     stnt1h  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_x0_s64_u64index, svint64_t, int16_t, svuint64_t,
+                      svstnt1h_scatter_u64index_s64 (p0, x0, z1, z0),
+                      svstnt1h_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1h_scatter_s64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #1
+**     stnt1h  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_s64_u64index, svint64_t, int16_t, svuint64_t,
+                      svstnt1h_scatter_u64index_s64 (p0, x0, z1, z0),
+                      svstnt1h_scatter_index (p0, x0, z1, z0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1h_scatter_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1h_scatter_u32.c
new file mode 100644 (file)
index 0000000..31da9f4
--- /dev/null
@@ -0,0 +1,157 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** stnt1h_scatter_u32:
+**     stnt1h  z0\.s, p0, \[z1\.s\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_u32, svuint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_u32 (p0, z1, z0),
+                      svstnt1h_scatter (p0, z1, z0))
+
+/*
+** stnt1h_scatter_x0_u32_offset:
+**     stnt1h  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_x0_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_offset_u32 (p0, z1, x0, z0),
+                      svstnt1h_scatter_offset (p0, z1, x0, z0))
+
+/*
+** stnt1h_scatter_m2_u32_offset:
+**     mov     (x[0-9]+), #?-2
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_m2_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_offset_u32 (p0, z1, -2, z0),
+                      svstnt1h_scatter_offset (p0, z1, -2, z0))
+
+/*
+** stnt1h_scatter_0_u32_offset:
+**     stnt1h  z0\.s, p0, \[z1\.s\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_0_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_offset_u32 (p0, z1, 0, z0),
+                      svstnt1h_scatter_offset (p0, z1, 0, z0))
+
+/*
+** stnt1h_scatter_5_u32_offset:
+**     mov     (x[0-9]+), #?5
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_5_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_offset_u32 (p0, z1, 5, z0),
+                      svstnt1h_scatter_offset (p0, z1, 5, z0))
+
+/*
+** stnt1h_scatter_6_u32_offset:
+**     mov     (x[0-9]+), #?6
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_6_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_offset_u32 (p0, z1, 6, z0),
+                      svstnt1h_scatter_offset (p0, z1, 6, z0))
+
+/*
+** stnt1h_scatter_62_u32_offset:
+**     mov     (x[0-9]+), #?62
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_62_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_offset_u32 (p0, z1, 62, z0),
+                      svstnt1h_scatter_offset (p0, z1, 62, z0))
+
+/*
+** stnt1h_scatter_64_u32_offset:
+**     mov     (x[0-9]+), #?64
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_64_u32_offset, svuint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_offset_u32 (p0, z1, 64, z0),
+                      svstnt1h_scatter_offset (p0, z1, 64, z0))
+
+/*
+** stnt1h_scatter_x0_u32_index:
+**     lsl     (x[0-9]+), x0, #?1
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_x0_u32_index, svuint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_index_u32 (p0, z1, x0, z0),
+                      svstnt1h_scatter_index (p0, z1, x0, z0))
+
+/*
+** stnt1h_scatter_m1_u32_index:
+**     mov     (x[0-9]+), #?-2
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_m1_u32_index, svuint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_index_u32 (p0, z1, -1, z0),
+                      svstnt1h_scatter_index (p0, z1, -1, z0))
+
+/*
+** stnt1h_scatter_0_u32_index:
+**     stnt1h  z0\.s, p0, \[z1\.s\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_0_u32_index, svuint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_index_u32 (p0, z1, 0, z0),
+                      svstnt1h_scatter_index (p0, z1, 0, z0))
+
+/*
+** stnt1h_scatter_5_u32_index:
+**     mov     (x[0-9]+), #?10
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_5_u32_index, svuint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_index_u32 (p0, z1, 5, z0),
+                      svstnt1h_scatter_index (p0, z1, 5, z0))
+
+/*
+** stnt1h_scatter_31_u32_index:
+**     mov     (x[0-9]+), #?62
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_31_u32_index, svuint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_index_u32 (p0, z1, 31, z0),
+                      svstnt1h_scatter_index (p0, z1, 31, z0))
+
+/*
+** stnt1h_scatter_32_u32_index:
+**     mov     (x[0-9]+), #?64
+**     stnt1h  z0\.s, p0, \[z1\.s, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_32_u32_index, svuint32_t, svuint32_t,
+                      svstnt1h_scatter_u32base_index_u32 (p0, z1, 32, z0),
+                      svstnt1h_scatter_index (p0, z1, 32, z0))
+
+/*
+** stnt1h_scatter_x0_u32_u32offset:
+**     stnt1h  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_x0_u32_u32offset, svuint32_t, uint16_t, svuint32_t,
+                      svstnt1h_scatter_u32offset_u32 (p0, x0, z1, z0),
+                      svstnt1h_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1h_scatter_u32_u32offset:
+**     stnt1h  z0\.s, p0, \[z1\.s, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_u32_u32offset, svuint32_t, uint16_t, svuint32_t,
+                      svstnt1h_scatter_u32offset_u32 (p0, x0, z1, z0),
+                      svstnt1h_scatter_offset (p0, x0, z1, z0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1h_scatter_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1h_scatter_u64.c
new file mode 100644 (file)
index 0000000..f6fca9d
--- /dev/null
@@ -0,0 +1,215 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** stnt1h_scatter_u64:
+**     stnt1h  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_u64, svuint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_u64 (p0, z1, z0),
+                      svstnt1h_scatter (p0, z1, z0))
+
+/*
+** stnt1h_scatter_x0_u64_offset:
+**     stnt1h  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_x0_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_offset_u64 (p0, z1, x0, z0),
+                      svstnt1h_scatter_offset (p0, z1, x0, z0))
+
+/*
+** stnt1h_scatter_m2_u64_offset:
+**     mov     (x[0-9]+), #?-2
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_m2_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_offset_u64 (p0, z1, -2, z0),
+                      svstnt1h_scatter_offset (p0, z1, -2, z0))
+
+/*
+** stnt1h_scatter_0_u64_offset:
+**     stnt1h  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_0_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_offset_u64 (p0, z1, 0, z0),
+                      svstnt1h_scatter_offset (p0, z1, 0, z0))
+
+/*
+** stnt1h_scatter_5_u64_offset:
+**     mov     (x[0-9]+), #?5
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_5_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_offset_u64 (p0, z1, 5, z0),
+                      svstnt1h_scatter_offset (p0, z1, 5, z0))
+
+/*
+** stnt1h_scatter_6_u64_offset:
+**     mov     (x[0-9]+), #?6
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_6_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_offset_u64 (p0, z1, 6, z0),
+                      svstnt1h_scatter_offset (p0, z1, 6, z0))
+
+/*
+** stnt1h_scatter_62_u64_offset:
+**     mov     (x[0-9]+), #?62
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_62_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_offset_u64 (p0, z1, 62, z0),
+                      svstnt1h_scatter_offset (p0, z1, 62, z0))
+
+/*
+** stnt1h_scatter_64_u64_offset:
+**     mov     (x[0-9]+), #?64
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_64_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_offset_u64 (p0, z1, 64, z0),
+                      svstnt1h_scatter_offset (p0, z1, 64, z0))
+
+/*
+** stnt1h_scatter_x0_u64_index:
+**     lsl     (x[0-9]+), x0, #?1
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_x0_u64_index, svuint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_index_u64 (p0, z1, x0, z0),
+                      svstnt1h_scatter_index (p0, z1, x0, z0))
+
+/*
+** stnt1h_scatter_m1_u64_index:
+**     mov     (x[0-9]+), #?-2
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_m1_u64_index, svuint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_index_u64 (p0, z1, -1, z0),
+                      svstnt1h_scatter_index (p0, z1, -1, z0))
+
+/*
+** stnt1h_scatter_0_u64_index:
+**     stnt1h  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_0_u64_index, svuint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_index_u64 (p0, z1, 0, z0),
+                      svstnt1h_scatter_index (p0, z1, 0, z0))
+
+/*
+** stnt1h_scatter_5_u64_index:
+**     mov     (x[0-9]+), #?10
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_5_u64_index, svuint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_index_u64 (p0, z1, 5, z0),
+                      svstnt1h_scatter_index (p0, z1, 5, z0))
+
+/*
+** stnt1h_scatter_31_u64_index:
+**     mov     (x[0-9]+), #?62
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_31_u64_index, svuint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_index_u64 (p0, z1, 31, z0),
+                      svstnt1h_scatter_index (p0, z1, 31, z0))
+
+/*
+** stnt1h_scatter_32_u64_index:
+**     mov     (x[0-9]+), #?64
+**     stnt1h  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1h_scatter_32_u64_index, svuint64_t, svuint64_t,
+                      svstnt1h_scatter_u64base_index_u64 (p0, z1, 32, z0),
+                      svstnt1h_scatter_index (p0, z1, 32, z0))
+
+/*
+** stnt1h_scatter_x0_u64_s64offset:
+**     stnt1h  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_x0_u64_s64offset, svuint64_t, uint16_t, svint64_t,
+                      svstnt1h_scatter_s64offset_u64 (p0, x0, z1, z0),
+                      svstnt1h_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1h_scatter_u64_s64offset:
+**     stnt1h  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_u64_s64offset, svuint64_t, uint16_t, svint64_t,
+                      svstnt1h_scatter_s64offset_u64 (p0, x0, z1, z0),
+                      svstnt1h_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1h_scatter_x0_u64_u64offset:
+**     stnt1h  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_x0_u64_u64offset, svuint64_t, uint16_t, svuint64_t,
+                      svstnt1h_scatter_u64offset_u64 (p0, x0, z1, z0),
+                      svstnt1h_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1h_scatter_u64_u64offset:
+**     stnt1h  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_u64_u64offset, svuint64_t, uint16_t, svuint64_t,
+                      svstnt1h_scatter_u64offset_u64 (p0, x0, z1, z0),
+                      svstnt1h_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1h_scatter_x0_u64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #1
+**     stnt1h  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_x0_u64_s64index, svuint64_t, uint16_t, svint64_t,
+                      svstnt1h_scatter_s64index_u64 (p0, x0, z1, z0),
+                      svstnt1h_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1h_scatter_u64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #1
+**     stnt1h  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_u64_s64index, svuint64_t, uint16_t, svint64_t,
+                      svstnt1h_scatter_s64index_u64 (p0, x0, z1, z0),
+                      svstnt1h_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1h_scatter_x0_u64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #1
+**     stnt1h  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_x0_u64_u64index, svuint64_t, uint16_t, svuint64_t,
+                      svstnt1h_scatter_u64index_u64 (p0, x0, z1, z0),
+                      svstnt1h_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1h_scatter_u64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #1
+**     stnt1h  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1h_scatter_u64_u64index, svuint64_t, uint16_t, svuint64_t,
+                      svstnt1h_scatter_u64index_u64 (p0, x0, z1, z0),
+                      svstnt1h_scatter_index (p0, x0, z1, z0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1w_scatter_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1w_scatter_s64.c
new file mode 100644 (file)
index 0000000..e86ea31
--- /dev/null
@@ -0,0 +1,235 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** stnt1w_scatter_s64:
+**     stnt1w  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_s64, svint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_s64 (p0, z1, z0),
+                      svstnt1w_scatter (p0, z1, z0))
+
+/*
+** stnt1w_scatter_x0_s64_offset:
+**     stnt1w  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_x0_s64_offset, svint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_offset_s64 (p0, z1, x0, z0),
+                      svstnt1w_scatter_offset (p0, z1, x0, z0))
+
+/*
+** stnt1w_scatter_m4_s64_offset:
+**     mov     (x[0-9]+), #?-4
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_m4_s64_offset, svint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_offset_s64 (p0, z1, -4, z0),
+                      svstnt1w_scatter_offset (p0, z1, -4, z0))
+
+/*
+** stnt1w_scatter_0_s64_offset:
+**     stnt1w  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_0_s64_offset, svint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_offset_s64 (p0, z1, 0, z0),
+                      svstnt1w_scatter_offset (p0, z1, 0, z0))
+
+/*
+** stnt1w_scatter_5_s64_offset:
+**     mov     (x[0-9]+), #?5
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_5_s64_offset, svint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_offset_s64 (p0, z1, 5, z0),
+                      svstnt1w_scatter_offset (p0, z1, 5, z0))
+
+/*
+** stnt1w_scatter_6_s64_offset:
+**     mov     (x[0-9]+), #?6
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_6_s64_offset, svint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_offset_s64 (p0, z1, 6, z0),
+                      svstnt1w_scatter_offset (p0, z1, 6, z0))
+
+/*
+** stnt1w_scatter_7_s64_offset:
+**     mov     (x[0-9]+), #?7
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_7_s64_offset, svint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_offset_s64 (p0, z1, 7, z0),
+                      svstnt1w_scatter_offset (p0, z1, 7, z0))
+
+/*
+** stnt1w_scatter_8_s64_offset:
+**     mov     (x[0-9]+), #?8
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_8_s64_offset, svint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_offset_s64 (p0, z1, 8, z0),
+                      svstnt1w_scatter_offset (p0, z1, 8, z0))
+
+/*
+** stnt1w_scatter_124_s64_offset:
+**     mov     (x[0-9]+), #?124
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_124_s64_offset, svint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_offset_s64 (p0, z1, 124, z0),
+                      svstnt1w_scatter_offset (p0, z1, 124, z0))
+
+/*
+** stnt1w_scatter_128_s64_offset:
+**     mov     (x[0-9]+), #?128
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_128_s64_offset, svint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_offset_s64 (p0, z1, 128, z0),
+                      svstnt1w_scatter_offset (p0, z1, 128, z0))
+
+/*
+** stnt1w_scatter_x0_s64_index:
+**     lsl     (x[0-9]+), x0, #?2
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_x0_s64_index, svint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_index_s64 (p0, z1, x0, z0),
+                      svstnt1w_scatter_index (p0, z1, x0, z0))
+
+/*
+** stnt1w_scatter_m1_s64_index:
+**     mov     (x[0-9]+), #?-4
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_m1_s64_index, svint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_index_s64 (p0, z1, -1, z0),
+                      svstnt1w_scatter_index (p0, z1, -1, z0))
+
+/*
+** stnt1w_scatter_0_s64_index:
+**     stnt1w  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_0_s64_index, svint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_index_s64 (p0, z1, 0, z0),
+                      svstnt1w_scatter_index (p0, z1, 0, z0))
+
+/*
+** stnt1w_scatter_5_s64_index:
+**     mov     (x[0-9]+), #?20
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_5_s64_index, svint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_index_s64 (p0, z1, 5, z0),
+                      svstnt1w_scatter_index (p0, z1, 5, z0))
+
+/*
+** stnt1w_scatter_31_s64_index:
+**     mov     (x[0-9]+), #?124
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_31_s64_index, svint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_index_s64 (p0, z1, 31, z0),
+                      svstnt1w_scatter_index (p0, z1, 31, z0))
+
+/*
+** stnt1w_scatter_32_s64_index:
+**     mov     (x[0-9]+), #?128
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_32_s64_index, svint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_index_s64 (p0, z1, 32, z0),
+                      svstnt1w_scatter_index (p0, z1, 32, z0))
+
+/*
+** stnt1w_scatter_x0_s64_s64offset:
+**     stnt1w  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1w_scatter_x0_s64_s64offset, svint64_t, int32_t, svint64_t,
+                      svstnt1w_scatter_s64offset_s64 (p0, x0, z1, z0),
+                      svstnt1w_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1w_scatter_s64_s64offset:
+**     stnt1w  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1w_scatter_s64_s64offset, svint64_t, int32_t, svint64_t,
+                      svstnt1w_scatter_s64offset_s64 (p0, x0, z1, z0),
+                      svstnt1w_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1w_scatter_x0_s64_u64offset:
+**     stnt1w  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1w_scatter_x0_s64_u64offset, svint64_t, int32_t, svuint64_t,
+                      svstnt1w_scatter_u64offset_s64 (p0, x0, z1, z0),
+                      svstnt1w_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1w_scatter_s64_u64offset:
+**     stnt1w  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1w_scatter_s64_u64offset, svint64_t, int32_t, svuint64_t,
+                      svstnt1w_scatter_u64offset_s64 (p0, x0, z1, z0),
+                      svstnt1w_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1w_scatter_x0_s64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #2
+**     stnt1w  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1w_scatter_x0_s64_s64index, svint64_t, int32_t, svint64_t,
+                      svstnt1w_scatter_s64index_s64 (p0, x0, z1, z0),
+                      svstnt1w_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1w_scatter_s64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #2
+**     stnt1w  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1w_scatter_s64_s64index, svint64_t, int32_t, svint64_t,
+                      svstnt1w_scatter_s64index_s64 (p0, x0, z1, z0),
+                      svstnt1w_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1w_scatter_x0_s64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #2
+**     stnt1w  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1w_scatter_x0_s64_u64index, svint64_t, int32_t, svuint64_t,
+                      svstnt1w_scatter_u64index_s64 (p0, x0, z1, z0),
+                      svstnt1w_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1w_scatter_s64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #2
+**     stnt1w  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1w_scatter_s64_u64index, svint64_t, int32_t, svuint64_t,
+                      svstnt1w_scatter_u64index_s64 (p0, x0, z1, z0),
+                      svstnt1w_scatter_index (p0, x0, z1, z0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1w_scatter_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/stnt1w_scatter_u64.c
new file mode 100644 (file)
index 0000000..be8c5d6
--- /dev/null
@@ -0,0 +1,235 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** stnt1w_scatter_u64:
+**     stnt1w  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_u64, svuint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_u64 (p0, z1, z0),
+                      svstnt1w_scatter (p0, z1, z0))
+
+/*
+** stnt1w_scatter_x0_u64_offset:
+**     stnt1w  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_x0_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_offset_u64 (p0, z1, x0, z0),
+                      svstnt1w_scatter_offset (p0, z1, x0, z0))
+
+/*
+** stnt1w_scatter_m4_u64_offset:
+**     mov     (x[0-9]+), #?-4
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_m4_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_offset_u64 (p0, z1, -4, z0),
+                      svstnt1w_scatter_offset (p0, z1, -4, z0))
+
+/*
+** stnt1w_scatter_0_u64_offset:
+**     stnt1w  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_0_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_offset_u64 (p0, z1, 0, z0),
+                      svstnt1w_scatter_offset (p0, z1, 0, z0))
+
+/*
+** stnt1w_scatter_5_u64_offset:
+**     mov     (x[0-9]+), #?5
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_5_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_offset_u64 (p0, z1, 5, z0),
+                      svstnt1w_scatter_offset (p0, z1, 5, z0))
+
+/*
+** stnt1w_scatter_6_u64_offset:
+**     mov     (x[0-9]+), #?6
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_6_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_offset_u64 (p0, z1, 6, z0),
+                      svstnt1w_scatter_offset (p0, z1, 6, z0))
+
+/*
+** stnt1w_scatter_7_u64_offset:
+**     mov     (x[0-9]+), #?7
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_7_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_offset_u64 (p0, z1, 7, z0),
+                      svstnt1w_scatter_offset (p0, z1, 7, z0))
+
+/*
+** stnt1w_scatter_8_u64_offset:
+**     mov     (x[0-9]+), #?8
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_8_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_offset_u64 (p0, z1, 8, z0),
+                      svstnt1w_scatter_offset (p0, z1, 8, z0))
+
+/*
+** stnt1w_scatter_124_u64_offset:
+**     mov     (x[0-9]+), #?124
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_124_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_offset_u64 (p0, z1, 124, z0),
+                      svstnt1w_scatter_offset (p0, z1, 124, z0))
+
+/*
+** stnt1w_scatter_128_u64_offset:
+**     mov     (x[0-9]+), #?128
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_128_u64_offset, svuint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_offset_u64 (p0, z1, 128, z0),
+                      svstnt1w_scatter_offset (p0, z1, 128, z0))
+
+/*
+** stnt1w_scatter_x0_u64_index:
+**     lsl     (x[0-9]+), x0, #?2
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_x0_u64_index, svuint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_index_u64 (p0, z1, x0, z0),
+                      svstnt1w_scatter_index (p0, z1, x0, z0))
+
+/*
+** stnt1w_scatter_m1_u64_index:
+**     mov     (x[0-9]+), #?-4
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_m1_u64_index, svuint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_index_u64 (p0, z1, -1, z0),
+                      svstnt1w_scatter_index (p0, z1, -1, z0))
+
+/*
+** stnt1w_scatter_0_u64_index:
+**     stnt1w  z0\.d, p0, \[z1\.d\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_0_u64_index, svuint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_index_u64 (p0, z1, 0, z0),
+                      svstnt1w_scatter_index (p0, z1, 0, z0))
+
+/*
+** stnt1w_scatter_5_u64_index:
+**     mov     (x[0-9]+), #?20
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_5_u64_index, svuint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_index_u64 (p0, z1, 5, z0),
+                      svstnt1w_scatter_index (p0, z1, 5, z0))
+
+/*
+** stnt1w_scatter_31_u64_index:
+**     mov     (x[0-9]+), #?124
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_31_u64_index, svuint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_index_u64 (p0, z1, 31, z0),
+                      svstnt1w_scatter_index (p0, z1, 31, z0))
+
+/*
+** stnt1w_scatter_32_u64_index:
+**     mov     (x[0-9]+), #?128
+**     stnt1w  z0\.d, p0, \[z1\.d, \1\]
+**     ret
+*/
+TEST_STORE_SCATTER_ZS (stnt1w_scatter_32_u64_index, svuint64_t, svuint64_t,
+                      svstnt1w_scatter_u64base_index_u64 (p0, z1, 32, z0),
+                      svstnt1w_scatter_index (p0, z1, 32, z0))
+
+/*
+** stnt1w_scatter_x0_u64_s64offset:
+**     stnt1w  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1w_scatter_x0_u64_s64offset, svuint64_t, uint32_t, svint64_t,
+                      svstnt1w_scatter_s64offset_u64 (p0, x0, z1, z0),
+                      svstnt1w_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1w_scatter_u64_s64offset:
+**     stnt1w  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1w_scatter_u64_s64offset, svuint64_t, uint32_t, svint64_t,
+                      svstnt1w_scatter_s64offset_u64 (p0, x0, z1, z0),
+                      svstnt1w_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1w_scatter_x0_u64_u64offset:
+**     stnt1w  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1w_scatter_x0_u64_u64offset, svuint64_t, uint32_t, svuint64_t,
+                      svstnt1w_scatter_u64offset_u64 (p0, x0, z1, z0),
+                      svstnt1w_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1w_scatter_u64_u64offset:
+**     stnt1w  z0\.d, p0, \[z1\.d, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1w_scatter_u64_u64offset, svuint64_t, uint32_t, svuint64_t,
+                      svstnt1w_scatter_u64offset_u64 (p0, x0, z1, z0),
+                      svstnt1w_scatter_offset (p0, x0, z1, z0))
+
+/*
+** stnt1w_scatter_x0_u64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #2
+**     stnt1w  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1w_scatter_x0_u64_s64index, svuint64_t, uint32_t, svint64_t,
+                      svstnt1w_scatter_s64index_u64 (p0, x0, z1, z0),
+                      svstnt1w_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1w_scatter_u64_s64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #2
+**     stnt1w  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1w_scatter_u64_s64index, svuint64_t, uint32_t, svint64_t,
+                      svstnt1w_scatter_s64index_u64 (p0, x0, z1, z0),
+                      svstnt1w_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1w_scatter_x0_u64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #2
+**     stnt1w  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1w_scatter_x0_u64_u64index, svuint64_t, uint32_t, svuint64_t,
+                      svstnt1w_scatter_u64index_u64 (p0, x0, z1, z0),
+                      svstnt1w_scatter_index (p0, x0, z1, z0))
+
+/*
+** stnt1w_scatter_u64_u64index:
+**     lsl     (z[0-9]+\.d), z1\.d, #2
+**     stnt1w  z0\.d, p0, \[\1, x0\]
+**     ret
+*/
+TEST_STORE_SCATTER_SZ (stnt1w_scatter_u64_u64index, svuint64_t, uint32_t, svuint64_t,
+                      svstnt1w_scatter_u64index_u64 (p0, x0, z1, z0),
+                      svstnt1w_scatter_index (p0, x0, z1, z0))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnb_s16.c
new file mode 100644 (file)
index 0000000..46bd714
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subhnb_s16_tied1:
+**     subhnb  z0\.b, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_s16_tied1, svint8_t, svint16_t,
+                   z0_res = svsubhnb_s16 (z0, z1),
+                   z0_res = svsubhnb (z0, z1))
+
+/*
+** subhnb_s16_tied2:
+**     subhnb  z0\.b, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_s16_tied2, svint8_t, svint16_t,
+                   z0_res = svsubhnb_s16 (z1, z0),
+                   z0_res = svsubhnb (z1, z0))
+
+/*
+** subhnb_s16_untied:
+**     subhnb  z0\.b, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_s16_untied, svint8_t, svint16_t,
+                   z0_res = svsubhnb_s16 (z1, z2),
+                   z0_res = svsubhnb (z1, z2))
+
+/*
+** subhnb_w0_s16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     subhnb  z0\.b, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (subhnb_w0_s16_tied1, svint8_t, svint16_t, int16_t,
+                    z0_res = svsubhnb_n_s16 (z0, x0),
+                    z0_res = svsubhnb (z0, x0))
+
+/*
+** subhnb_w0_s16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     subhnb  z0\.b, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (subhnb_w0_s16_untied, svint8_t, svint16_t, int16_t,
+                    z0_res = svsubhnb_n_s16 (z1, x0),
+                    z0_res = svsubhnb (z1, x0))
+
+/*
+** subhnb_11_s16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     subhnb  z0\.b, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_11_s16_tied1, svint8_t, svint16_t,
+                   z0_res = svsubhnb_n_s16 (z0, 11),
+                   z0_res = svsubhnb (z0, 11))
+
+/*
+** subhnb_11_s16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     subhnb  z0\.b, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_11_s16_untied, svint8_t, svint16_t,
+                   z0_res = svsubhnb_n_s16 (z1, 11),
+                   z0_res = svsubhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnb_s32.c
new file mode 100644 (file)
index 0000000..1ac62f8
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subhnb_s32_tied1:
+**     subhnb  z0\.h, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_s32_tied1, svint16_t, svint32_t,
+                   z0_res = svsubhnb_s32 (z0, z1),
+                   z0_res = svsubhnb (z0, z1))
+
+/*
+** subhnb_s32_tied2:
+**     subhnb  z0\.h, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_s32_tied2, svint16_t, svint32_t,
+                   z0_res = svsubhnb_s32 (z1, z0),
+                   z0_res = svsubhnb (z1, z0))
+
+/*
+** subhnb_s32_untied:
+**     subhnb  z0\.h, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_s32_untied, svint16_t, svint32_t,
+                   z0_res = svsubhnb_s32 (z1, z2),
+                   z0_res = svsubhnb (z1, z2))
+
+/*
+** subhnb_w0_s32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     subhnb  z0\.h, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (subhnb_w0_s32_tied1, svint16_t, svint32_t, int32_t,
+                    z0_res = svsubhnb_n_s32 (z0, x0),
+                    z0_res = svsubhnb (z0, x0))
+
+/*
+** subhnb_w0_s32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     subhnb  z0\.h, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (subhnb_w0_s32_untied, svint16_t, svint32_t, int32_t,
+                    z0_res = svsubhnb_n_s32 (z1, x0),
+                    z0_res = svsubhnb (z1, x0))
+
+/*
+** subhnb_11_s32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     subhnb  z0\.h, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_11_s32_tied1, svint16_t, svint32_t,
+                   z0_res = svsubhnb_n_s32 (z0, 11),
+                   z0_res = svsubhnb (z0, 11))
+
+/*
+** subhnb_11_s32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     subhnb  z0\.h, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_11_s32_untied, svint16_t, svint32_t,
+                   z0_res = svsubhnb_n_s32 (z1, 11),
+                   z0_res = svsubhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnb_s64.c
new file mode 100644 (file)
index 0000000..d746c57
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subhnb_s64_tied1:
+**     subhnb  z0\.s, z0\.d, z1\.d
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_s64_tied1, svint32_t, svint64_t,
+                   z0_res = svsubhnb_s64 (z0, z1),
+                   z0_res = svsubhnb (z0, z1))
+
+/*
+** subhnb_s64_tied2:
+**     subhnb  z0\.s, z1\.d, z0\.d
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_s64_tied2, svint32_t, svint64_t,
+                   z0_res = svsubhnb_s64 (z1, z0),
+                   z0_res = svsubhnb (z1, z0))
+
+/*
+** subhnb_s64_untied:
+**     subhnb  z0\.s, z1\.d, z2\.d
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_s64_untied, svint32_t, svint64_t,
+                   z0_res = svsubhnb_s64 (z1, z2),
+                   z0_res = svsubhnb (z1, z2))
+
+/*
+** subhnb_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     subhnb  z0\.s, z0\.d, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (subhnb_x0_s64_tied1, svint32_t, svint64_t, int64_t,
+                    z0_res = svsubhnb_n_s64 (z0, x0),
+                    z0_res = svsubhnb (z0, x0))
+
+/*
+** subhnb_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     subhnb  z0\.s, z1\.d, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (subhnb_x0_s64_untied, svint32_t, svint64_t, int64_t,
+                    z0_res = svsubhnb_n_s64 (z1, x0),
+                    z0_res = svsubhnb (z1, x0))
+
+/*
+** subhnb_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     subhnb  z0\.s, z0\.d, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_11_s64_tied1, svint32_t, svint64_t,
+                   z0_res = svsubhnb_n_s64 (z0, 11),
+                   z0_res = svsubhnb (z0, 11))
+
+/*
+** subhnb_11_s64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     subhnb  z0\.s, z1\.d, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_11_s64_untied, svint32_t, svint64_t,
+                   z0_res = svsubhnb_n_s64 (z1, 11),
+                   z0_res = svsubhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnb_u16.c
new file mode 100644 (file)
index 0000000..29b25c3
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subhnb_u16_tied1:
+**     subhnb  z0\.b, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_u16_tied1, svuint8_t, svuint16_t,
+                   z0_res = svsubhnb_u16 (z0, z1),
+                   z0_res = svsubhnb (z0, z1))
+
+/*
+** subhnb_u16_tied2:
+**     subhnb  z0\.b, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_u16_tied2, svuint8_t, svuint16_t,
+                   z0_res = svsubhnb_u16 (z1, z0),
+                   z0_res = svsubhnb (z1, z0))
+
+/*
+** subhnb_u16_untied:
+**     subhnb  z0\.b, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_u16_untied, svuint8_t, svuint16_t,
+                   z0_res = svsubhnb_u16 (z1, z2),
+                   z0_res = svsubhnb (z1, z2))
+
+/*
+** subhnb_w0_u16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     subhnb  z0\.b, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (subhnb_w0_u16_tied1, svuint8_t, svuint16_t, uint16_t,
+                    z0_res = svsubhnb_n_u16 (z0, x0),
+                    z0_res = svsubhnb (z0, x0))
+
+/*
+** subhnb_w0_u16_untied:
+**     mov     (z[0-9]+\.h), w0
+**     subhnb  z0\.b, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (subhnb_w0_u16_untied, svuint8_t, svuint16_t, uint16_t,
+                    z0_res = svsubhnb_n_u16 (z1, x0),
+                    z0_res = svsubhnb (z1, x0))
+
+/*
+** subhnb_11_u16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     subhnb  z0\.b, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_11_u16_tied1, svuint8_t, svuint16_t,
+                   z0_res = svsubhnb_n_u16 (z0, 11),
+                   z0_res = svsubhnb (z0, 11))
+
+/*
+** subhnb_11_u16_untied:
+**     mov     (z[0-9]+\.h), #11
+**     subhnb  z0\.b, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_11_u16_untied, svuint8_t, svuint16_t,
+                   z0_res = svsubhnb_n_u16 (z1, 11),
+                   z0_res = svsubhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnb_u32.c
new file mode 100644 (file)
index 0000000..a798ee5
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subhnb_u32_tied1:
+**     subhnb  z0\.h, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_u32_tied1, svuint16_t, svuint32_t,
+                   z0_res = svsubhnb_u32 (z0, z1),
+                   z0_res = svsubhnb (z0, z1))
+
+/*
+** subhnb_u32_tied2:
+**     subhnb  z0\.h, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_u32_tied2, svuint16_t, svuint32_t,
+                   z0_res = svsubhnb_u32 (z1, z0),
+                   z0_res = svsubhnb (z1, z0))
+
+/*
+** subhnb_u32_untied:
+**     subhnb  z0\.h, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_u32_untied, svuint16_t, svuint32_t,
+                   z0_res = svsubhnb_u32 (z1, z2),
+                   z0_res = svsubhnb (z1, z2))
+
+/*
+** subhnb_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     subhnb  z0\.h, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (subhnb_w0_u32_tied1, svuint16_t, svuint32_t, uint32_t,
+                    z0_res = svsubhnb_n_u32 (z0, x0),
+                    z0_res = svsubhnb (z0, x0))
+
+/*
+** subhnb_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+**     subhnb  z0\.h, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (subhnb_w0_u32_untied, svuint16_t, svuint32_t, uint32_t,
+                    z0_res = svsubhnb_n_u32 (z1, x0),
+                    z0_res = svsubhnb (z1, x0))
+
+/*
+** subhnb_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     subhnb  z0\.h, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_11_u32_tied1, svuint16_t, svuint32_t,
+                   z0_res = svsubhnb_n_u32 (z0, 11),
+                   z0_res = svsubhnb (z0, 11))
+
+/*
+** subhnb_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+**     subhnb  z0\.h, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_11_u32_untied, svuint16_t, svuint32_t,
+                   z0_res = svsubhnb_n_u32 (z1, 11),
+                   z0_res = svsubhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnb_u64.c
new file mode 100644 (file)
index 0000000..5c426b8
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subhnb_u64_tied1:
+**     subhnb  z0\.s, z0\.d, z1\.d
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_u64_tied1, svuint32_t, svuint64_t,
+                   z0_res = svsubhnb_u64 (z0, z1),
+                   z0_res = svsubhnb (z0, z1))
+
+/*
+** subhnb_u64_tied2:
+**     subhnb  z0\.s, z1\.d, z0\.d
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_u64_tied2, svuint32_t, svuint64_t,
+                   z0_res = svsubhnb_u64 (z1, z0),
+                   z0_res = svsubhnb (z1, z0))
+
+/*
+** subhnb_u64_untied:
+**     subhnb  z0\.s, z1\.d, z2\.d
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_u64_untied, svuint32_t, svuint64_t,
+                   z0_res = svsubhnb_u64 (z1, z2),
+                   z0_res = svsubhnb (z1, z2))
+
+/*
+** subhnb_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     subhnb  z0\.s, z0\.d, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (subhnb_x0_u64_tied1, svuint32_t, svuint64_t, uint64_t,
+                    z0_res = svsubhnb_n_u64 (z0, x0),
+                    z0_res = svsubhnb (z0, x0))
+
+/*
+** subhnb_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+**     subhnb  z0\.s, z1\.d, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (subhnb_x0_u64_untied, svuint32_t, svuint64_t, uint64_t,
+                    z0_res = svsubhnb_n_u64 (z1, x0),
+                    z0_res = svsubhnb (z1, x0))
+
+/*
+** subhnb_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     subhnb  z0\.s, z0\.d, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_11_u64_tied1, svuint32_t, svuint64_t,
+                   z0_res = svsubhnb_n_u64 (z0, 11),
+                   z0_res = svsubhnb (z0, 11))
+
+/*
+** subhnb_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+**     subhnb  z0\.s, z1\.d, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subhnb_11_u64_untied, svuint32_t, svuint64_t,
+                   z0_res = svsubhnb_n_u64 (z1, 11),
+                   z0_res = svsubhnb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnt_s16.c
new file mode 100644 (file)
index 0000000..2481beb
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subhnt_s16_tied1:
+**     subhnt  z0\.b, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (subhnt_s16_tied1, svint8_t, svint16_t,
+            z0 = svsubhnt_s16 (z0, z4, z5),
+            z0 = svsubhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (subhnt_s16_tied2, svint8_t, svint16_t,
+                z0_res = svsubhnt_s16 (z4, z0, z1),
+                z0_res = svsubhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (subhnt_s16_tied3, svint8_t, svint16_t,
+                z0_res = svsubhnt_s16 (z4, z1, z0),
+                z0_res = svsubhnt (z4, z1, z0))
+
+/*
+** subhnt_s16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     subhnt  z0\.b, z4\.h, z5\.h
+** |
+**     subhnt  z1\.b, z4\.h, z5\.h
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (subhnt_s16_untied, svint8_t, svint16_t,
+            z0 = svsubhnt_s16 (z1, z4, z5),
+            z0 = svsubhnt (z1, z4, z5))
+
+/*
+** subhnt_w0_s16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     subhnt  z0\.b, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (subhnt_w0_s16_tied1, svint8_t, svint16_t, int16_t,
+             z0 = svsubhnt_n_s16 (z0, z4, x0),
+             z0 = svsubhnt (z0, z4, x0))
+
+/*
+** subhnt_w0_s16_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     mov     z0\.d, z1\.d
+**     subhnt  z0\.b, z4\.h, \1
+** |
+**     subhnt  z1\.b, z4\.h, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (subhnt_w0_s16_untied, svint8_t, svint16_t, int16_t,
+             z0 = svsubhnt_n_s16 (z1, z4, x0),
+             z0 = svsubhnt (z1, z4, x0))
+
+/*
+** subhnt_11_s16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     subhnt  z0\.b, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (subhnt_11_s16_tied1, svint8_t, svint16_t,
+            z0 = svsubhnt_n_s16 (z0, z4, 11),
+            z0 = svsubhnt (z0, z4, 11))
+
+/*
+** subhnt_11_s16_untied:
+**     mov     (z[0-9]+\.h), #11
+** (
+**     mov     z0\.d, z1\.d
+**     subhnt  z0\.b, z4\.h, \1
+** |
+**     subhnt  z1\.b, z4\.h, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (subhnt_11_s16_untied, svint8_t, svint16_t,
+            z0 = svsubhnt_n_s16 (z1, z4, 11),
+            z0 = svsubhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnt_s32.c
new file mode 100644 (file)
index 0000000..3ccb84c
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subhnt_s32_tied1:
+**     subhnt  z0\.h, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (subhnt_s32_tied1, svint16_t, svint32_t,
+            z0 = svsubhnt_s32 (z0, z4, z5),
+            z0 = svsubhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (subhnt_s32_tied2, svint16_t, svint32_t,
+                z0_res = svsubhnt_s32 (z4, z0, z1),
+                z0_res = svsubhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (subhnt_s32_tied3, svint16_t, svint32_t,
+                z0_res = svsubhnt_s32 (z4, z1, z0),
+                z0_res = svsubhnt (z4, z1, z0))
+
+/*
+** subhnt_s32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     subhnt  z0\.h, z4\.s, z5\.s
+** |
+**     subhnt  z1\.h, z4\.s, z5\.s
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (subhnt_s32_untied, svint16_t, svint32_t,
+            z0 = svsubhnt_s32 (z1, z4, z5),
+            z0 = svsubhnt (z1, z4, z5))
+
+/*
+** subhnt_w0_s32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     subhnt  z0\.h, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (subhnt_w0_s32_tied1, svint16_t, svint32_t, int32_t,
+             z0 = svsubhnt_n_s32 (z0, z4, x0),
+             z0 = svsubhnt (z0, z4, x0))
+
+/*
+** subhnt_w0_s32_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     mov     z0\.d, z1\.d
+**     subhnt  z0\.h, z4\.s, \1
+** |
+**     subhnt  z1\.h, z4\.s, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (subhnt_w0_s32_untied, svint16_t, svint32_t, int32_t,
+             z0 = svsubhnt_n_s32 (z1, z4, x0),
+             z0 = svsubhnt (z1, z4, x0))
+
+/*
+** subhnt_11_s32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     subhnt  z0\.h, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (subhnt_11_s32_tied1, svint16_t, svint32_t,
+            z0 = svsubhnt_n_s32 (z0, z4, 11),
+            z0 = svsubhnt (z0, z4, 11))
+
+/*
+** subhnt_11_s32_untied:
+**     mov     (z[0-9]+\.s), #11
+** (
+**     mov     z0\.d, z1\.d
+**     subhnt  z0\.h, z4\.s, \1
+** |
+**     subhnt  z1\.h, z4\.s, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (subhnt_11_s32_untied, svint16_t, svint32_t,
+            z0 = svsubhnt_n_s32 (z1, z4, 11),
+            z0 = svsubhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnt_s64.c
new file mode 100644 (file)
index 0000000..8daab64
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subhnt_s64_tied1:
+**     subhnt  z0\.s, z4\.d, z5\.d
+**     ret
+*/
+TEST_DUAL_Z (subhnt_s64_tied1, svint32_t, svint64_t,
+            z0 = svsubhnt_s64 (z0, z4, z5),
+            z0 = svsubhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (subhnt_s64_tied2, svint32_t, svint64_t,
+                z0_res = svsubhnt_s64 (z4, z0, z1),
+                z0_res = svsubhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (subhnt_s64_tied3, svint32_t, svint64_t,
+                z0_res = svsubhnt_s64 (z4, z1, z0),
+                z0_res = svsubhnt (z4, z1, z0))
+
+/*
+** subhnt_s64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     subhnt  z0\.s, z4\.d, z5\.d
+** |
+**     subhnt  z1\.s, z4\.d, z5\.d
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (subhnt_s64_untied, svint32_t, svint64_t,
+            z0 = svsubhnt_s64 (z1, z4, z5),
+            z0 = svsubhnt (z1, z4, z5))
+
+/*
+** subhnt_x0_s64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     subhnt  z0\.s, z4\.d, \1
+**     ret
+*/
+TEST_DUAL_ZX (subhnt_x0_s64_tied1, svint32_t, svint64_t, int64_t,
+             z0 = svsubhnt_n_s64 (z0, z4, x0),
+             z0 = svsubhnt (z0, z4, x0))
+
+/*
+** subhnt_x0_s64_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     mov     z0\.d, z1\.d
+**     subhnt  z0\.s, z4\.d, \1
+** |
+**     subhnt  z1\.s, z4\.d, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (subhnt_x0_s64_untied, svint32_t, svint64_t, int64_t,
+             z0 = svsubhnt_n_s64 (z1, z4, x0),
+             z0 = svsubhnt (z1, z4, x0))
+
+/*
+** subhnt_11_s64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     subhnt  z0\.s, z4\.d, \1
+**     ret
+*/
+TEST_DUAL_Z (subhnt_11_s64_tied1, svint32_t, svint64_t,
+            z0 = svsubhnt_n_s64 (z0, z4, 11),
+            z0 = svsubhnt (z0, z4, 11))
+
+/*
+** subhnt_11_s64_untied:
+**     mov     (z[0-9]+\.d), #11
+** (
+**     mov     z0\.d, z1\.d
+**     subhnt  z0\.s, z4\.d, \1
+** |
+**     subhnt  z1\.s, z4\.d, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (subhnt_11_s64_untied, svint32_t, svint64_t,
+            z0 = svsubhnt_n_s64 (z1, z4, 11),
+            z0 = svsubhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnt_u16.c
new file mode 100644 (file)
index 0000000..7c972b1
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subhnt_u16_tied1:
+**     subhnt  z0\.b, z4\.h, z5\.h
+**     ret
+*/
+TEST_DUAL_Z (subhnt_u16_tied1, svuint8_t, svuint16_t,
+            z0 = svsubhnt_u16 (z0, z4, z5),
+            z0 = svsubhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (subhnt_u16_tied2, svuint8_t, svuint16_t,
+                z0_res = svsubhnt_u16 (z4, z0, z1),
+                z0_res = svsubhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (subhnt_u16_tied3, svuint8_t, svuint16_t,
+                z0_res = svsubhnt_u16 (z4, z1, z0),
+                z0_res = svsubhnt (z4, z1, z0))
+
+/*
+** subhnt_u16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     subhnt  z0\.b, z4\.h, z5\.h
+** |
+**     subhnt  z1\.b, z4\.h, z5\.h
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (subhnt_u16_untied, svuint8_t, svuint16_t,
+            z0 = svsubhnt_u16 (z1, z4, z5),
+            z0 = svsubhnt (z1, z4, z5))
+
+/*
+** subhnt_w0_u16_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     subhnt  z0\.b, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_ZX (subhnt_w0_u16_tied1, svuint8_t, svuint16_t, uint16_t,
+             z0 = svsubhnt_n_u16 (z0, z4, x0),
+             z0 = svsubhnt (z0, z4, x0))
+
+/*
+** subhnt_w0_u16_untied:
+**     mov     (z[0-9]+\.h), w0
+** (
+**     mov     z0\.d, z1\.d
+**     subhnt  z0\.b, z4\.h, \1
+** |
+**     subhnt  z1\.b, z4\.h, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (subhnt_w0_u16_untied, svuint8_t, svuint16_t, uint16_t,
+             z0 = svsubhnt_n_u16 (z1, z4, x0),
+             z0 = svsubhnt (z1, z4, x0))
+
+/*
+** subhnt_11_u16_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     subhnt  z0\.b, z4\.h, \1
+**     ret
+*/
+TEST_DUAL_Z (subhnt_11_u16_tied1, svuint8_t, svuint16_t,
+            z0 = svsubhnt_n_u16 (z0, z4, 11),
+            z0 = svsubhnt (z0, z4, 11))
+
+/*
+** subhnt_11_u16_untied:
+**     mov     (z[0-9]+\.h), #11
+** (
+**     mov     z0\.d, z1\.d
+**     subhnt  z0\.b, z4\.h, \1
+** |
+**     subhnt  z1\.b, z4\.h, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (subhnt_11_u16_untied, svuint8_t, svuint16_t,
+            z0 = svsubhnt_n_u16 (z1, z4, 11),
+            z0 = svsubhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnt_u32.c
new file mode 100644 (file)
index 0000000..a395654
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subhnt_u32_tied1:
+**     subhnt  z0\.h, z4\.s, z5\.s
+**     ret
+*/
+TEST_DUAL_Z (subhnt_u32_tied1, svuint16_t, svuint32_t,
+            z0 = svsubhnt_u32 (z0, z4, z5),
+            z0 = svsubhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (subhnt_u32_tied2, svuint16_t, svuint32_t,
+                z0_res = svsubhnt_u32 (z4, z0, z1),
+                z0_res = svsubhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (subhnt_u32_tied3, svuint16_t, svuint32_t,
+                z0_res = svsubhnt_u32 (z4, z1, z0),
+                z0_res = svsubhnt (z4, z1, z0))
+
+/*
+** subhnt_u32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     subhnt  z0\.h, z4\.s, z5\.s
+** |
+**     subhnt  z1\.h, z4\.s, z5\.s
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (subhnt_u32_untied, svuint16_t, svuint32_t,
+            z0 = svsubhnt_u32 (z1, z4, z5),
+            z0 = svsubhnt (z1, z4, z5))
+
+/*
+** subhnt_w0_u32_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     subhnt  z0\.h, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_ZX (subhnt_w0_u32_tied1, svuint16_t, svuint32_t, uint32_t,
+             z0 = svsubhnt_n_u32 (z0, z4, x0),
+             z0 = svsubhnt (z0, z4, x0))
+
+/*
+** subhnt_w0_u32_untied:
+**     mov     (z[0-9]+\.s), w0
+** (
+**     mov     z0\.d, z1\.d
+**     subhnt  z0\.h, z4\.s, \1
+** |
+**     subhnt  z1\.h, z4\.s, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (subhnt_w0_u32_untied, svuint16_t, svuint32_t, uint32_t,
+             z0 = svsubhnt_n_u32 (z1, z4, x0),
+             z0 = svsubhnt (z1, z4, x0))
+
+/*
+** subhnt_11_u32_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     subhnt  z0\.h, z4\.s, \1
+**     ret
+*/
+TEST_DUAL_Z (subhnt_11_u32_tied1, svuint16_t, svuint32_t,
+            z0 = svsubhnt_n_u32 (z0, z4, 11),
+            z0 = svsubhnt (z0, z4, 11))
+
+/*
+** subhnt_11_u32_untied:
+**     mov     (z[0-9]+\.s), #11
+** (
+**     mov     z0\.d, z1\.d
+**     subhnt  z0\.h, z4\.s, \1
+** |
+**     subhnt  z1\.h, z4\.s, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (subhnt_11_u32_untied, svuint16_t, svuint32_t,
+            z0 = svsubhnt_n_u32 (z1, z4, 11),
+            z0 = svsubhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subhnt_u64.c
new file mode 100644 (file)
index 0000000..e0206d0
--- /dev/null
@@ -0,0 +1,89 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subhnt_u64_tied1:
+**     subhnt  z0\.s, z4\.d, z5\.d
+**     ret
+*/
+TEST_DUAL_Z (subhnt_u64_tied1, svuint32_t, svuint64_t,
+            z0 = svsubhnt_u64 (z0, z4, z5),
+            z0 = svsubhnt (z0, z4, z5))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (subhnt_u64_tied2, svuint32_t, svuint64_t,
+                z0_res = svsubhnt_u64 (z4, z0, z1),
+                z0_res = svsubhnt (z4, z0, z1))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (subhnt_u64_tied3, svuint32_t, svuint64_t,
+                z0_res = svsubhnt_u64 (z4, z1, z0),
+                z0_res = svsubhnt (z4, z1, z0))
+
+/*
+** subhnt_u64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     subhnt  z0\.s, z4\.d, z5\.d
+** |
+**     subhnt  z1\.s, z4\.d, z5\.d
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (subhnt_u64_untied, svuint32_t, svuint64_t,
+            z0 = svsubhnt_u64 (z1, z4, z5),
+            z0 = svsubhnt (z1, z4, z5))
+
+/*
+** subhnt_x0_u64_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     subhnt  z0\.s, z4\.d, \1
+**     ret
+*/
+TEST_DUAL_ZX (subhnt_x0_u64_tied1, svuint32_t, svuint64_t, uint64_t,
+             z0 = svsubhnt_n_u64 (z0, z4, x0),
+             z0 = svsubhnt (z0, z4, x0))
+
+/*
+** subhnt_x0_u64_untied:
+**     mov     (z[0-9]+\.d), x0
+** (
+**     mov     z0\.d, z1\.d
+**     subhnt  z0\.s, z4\.d, \1
+** |
+**     subhnt  z1\.s, z4\.d, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_ZX (subhnt_x0_u64_untied, svuint32_t, svuint64_t, uint64_t,
+             z0 = svsubhnt_n_u64 (z1, z4, x0),
+             z0 = svsubhnt (z1, z4, x0))
+
+/*
+** subhnt_11_u64_tied1:
+**     mov     (z[0-9]+\.d), #11
+**     subhnt  z0\.s, z4\.d, \1
+**     ret
+*/
+TEST_DUAL_Z (subhnt_11_u64_tied1, svuint32_t, svuint64_t,
+            z0 = svsubhnt_n_u64 (z0, z4, 11),
+            z0 = svsubhnt (z0, z4, 11))
+
+/*
+** subhnt_11_u64_untied:
+**     mov     (z[0-9]+\.d), #11
+** (
+**     mov     z0\.d, z1\.d
+**     subhnt  z0\.s, z4\.d, \1
+** |
+**     subhnt  z1\.s, z4\.d, \1
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (subhnt_11_u64_untied, svuint32_t, svuint64_t,
+            z0 = svsubhnt_n_u64 (z1, z4, 11),
+            z0 = svsubhnt (z1, z4, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublb_s16.c
new file mode 100644 (file)
index 0000000..a355802
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sublb_s16_tied1:
+**     ssublb  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svsublb_s16 (z0, z1),
+                   z0_res = svsublb (z0, z1))
+
+/*
+** sublb_s16_tied2:
+**     ssublb  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_s16_tied2, svint16_t, svint8_t,
+                   z0_res = svsublb_s16 (z1, z0),
+                   z0_res = svsublb (z1, z0))
+
+/*
+** sublb_s16_untied:
+**     ssublb  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_s16_untied, svint16_t, svint8_t,
+                   z0_res = svsublb_s16 (z1, z2),
+                   z0_res = svsublb (z1, z2))
+
+/*
+** sublb_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     ssublb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublb_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+                    z0_res = svsublb_n_s16 (z0, x0),
+                    z0_res = svsublb (z0, x0))
+
+/*
+** sublb_w0_s16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     ssublb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublb_w0_s16_untied, svint16_t, svint8_t, int8_t,
+                    z0_res = svsublb_n_s16 (z1, x0),
+                    z0_res = svsublb (z1, x0))
+
+/*
+** sublb_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     ssublb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_11_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svsublb_n_s16 (z0, 11),
+                   z0_res = svsublb (z0, 11))
+
+/*
+** sublb_11_s16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     ssublb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_11_s16_untied, svint16_t, svint8_t,
+                   z0_res = svsublb_n_s16 (z1, 11),
+                   z0_res = svsublb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublb_s32.c
new file mode 100644 (file)
index 0000000..302d489
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sublb_s32_tied1:
+**     ssublb  z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svsublb_s32 (z0, z1),
+                   z0_res = svsublb (z0, z1))
+
+/*
+** sublb_s32_tied2:
+**     ssublb  z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_s32_tied2, svint32_t, svint16_t,
+                   z0_res = svsublb_s32 (z1, z0),
+                   z0_res = svsublb (z1, z0))
+
+/*
+** sublb_s32_untied:
+**     ssublb  z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_s32_untied, svint32_t, svint16_t,
+                   z0_res = svsublb_s32 (z1, z2),
+                   z0_res = svsublb (z1, z2))
+
+/*
+** sublb_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     ssublb  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublb_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+                    z0_res = svsublb_n_s32 (z0, x0),
+                    z0_res = svsublb (z0, x0))
+
+/*
+** sublb_w0_s32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     ssublb  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublb_w0_s32_untied, svint32_t, svint16_t, int16_t,
+                    z0_res = svsublb_n_s32 (z1, x0),
+                    z0_res = svsublb (z1, x0))
+
+/*
+** sublb_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     ssublb  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_11_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svsublb_n_s32 (z0, 11),
+                   z0_res = svsublb (z0, 11))
+
+/*
+** sublb_11_s32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     ssublb  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_11_s32_untied, svint32_t, svint16_t,
+                   z0_res = svsublb_n_s32 (z1, 11),
+                   z0_res = svsublb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublb_s64.c
new file mode 100644 (file)
index 0000000..939de73
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sublb_s64_tied1:
+**     ssublb  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svsublb_s64 (z0, z1),
+                   z0_res = svsublb (z0, z1))
+
+/*
+** sublb_s64_tied2:
+**     ssublb  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_s64_tied2, svint64_t, svint32_t,
+                   z0_res = svsublb_s64 (z1, z0),
+                   z0_res = svsublb (z1, z0))
+
+/*
+** sublb_s64_untied:
+**     ssublb  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_s64_untied, svint64_t, svint32_t,
+                   z0_res = svsublb_s64 (z1, z2),
+                   z0_res = svsublb (z1, z2))
+
+/*
+** sublb_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     ssublb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublb_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+                    z0_res = svsublb_n_s64 (z0, x0),
+                    z0_res = svsublb (z0, x0))
+
+/*
+** sublb_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     ssublb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublb_w0_s64_untied, svint64_t, svint32_t, int32_t,
+                    z0_res = svsublb_n_s64 (z1, x0),
+                    z0_res = svsublb (z1, x0))
+
+/*
+** sublb_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     ssublb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_11_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svsublb_n_s64 (z0, 11),
+                   z0_res = svsublb (z0, 11))
+
+/*
+** sublb_11_s64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     ssublb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_11_s64_untied, svint64_t, svint32_t,
+                   z0_res = svsublb_n_s64 (z1, 11),
+                   z0_res = svsublb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublb_u16.c
new file mode 100644 (file)
index 0000000..c96bd5e
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sublb_u16_tied1:
+**     usublb  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svsublb_u16 (z0, z1),
+                   z0_res = svsublb (z0, z1))
+
+/*
+** sublb_u16_tied2:
+**     usublb  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_u16_tied2, svuint16_t, svuint8_t,
+                   z0_res = svsublb_u16 (z1, z0),
+                   z0_res = svsublb (z1, z0))
+
+/*
+** sublb_u16_untied:
+**     usublb  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svsublb_u16 (z1, z2),
+                   z0_res = svsublb (z1, z2))
+
+/*
+** sublb_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     usublb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublb_w0_u16_tied1, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svsublb_n_u16 (z0, x0),
+                    z0_res = svsublb (z0, x0))
+
+/*
+** sublb_w0_u16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     usublb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublb_w0_u16_untied, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svsublb_n_u16 (z1, x0),
+                    z0_res = svsublb (z1, x0))
+
+/*
+** sublb_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     usublb  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_11_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svsublb_n_u16 (z0, 11),
+                   z0_res = svsublb (z0, 11))
+
+/*
+** sublb_11_u16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     usublb  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_11_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svsublb_n_u16 (z1, 11),
+                   z0_res = svsublb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublb_u32.c
new file mode 100644 (file)
index 0000000..101c293
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sublb_u32_tied1:
+**     usublb  z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svsublb_u32 (z0, z1),
+                   z0_res = svsublb (z0, z1))
+
+/*
+** sublb_u32_tied2:
+**     usublb  z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_u32_tied2, svuint32_t, svuint16_t,
+                   z0_res = svsublb_u32 (z1, z0),
+                   z0_res = svsublb (z1, z0))
+
+/*
+** sublb_u32_untied:
+**     usublb  z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svsublb_u32 (z1, z2),
+                   z0_res = svsublb (z1, z2))
+
+/*
+** sublb_w0_u32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     usublb  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublb_w0_u32_tied1, svuint32_t, svuint16_t, uint16_t,
+                    z0_res = svsublb_n_u32 (z0, x0),
+                    z0_res = svsublb (z0, x0))
+
+/*
+** sublb_w0_u32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     usublb  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublb_w0_u32_untied, svuint32_t, svuint16_t, uint16_t,
+                    z0_res = svsublb_n_u32 (z1, x0),
+                    z0_res = svsublb (z1, x0))
+
+/*
+** sublb_11_u32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     usublb  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_11_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svsublb_n_u32 (z0, 11),
+                   z0_res = svsublb (z0, 11))
+
+/*
+** sublb_11_u32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     usublb  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_11_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svsublb_n_u32 (z1, 11),
+                   z0_res = svsublb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublb_u64.c
new file mode 100644 (file)
index 0000000..98371e9
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sublb_u64_tied1:
+**     usublb  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svsublb_u64 (z0, z1),
+                   z0_res = svsublb (z0, z1))
+
+/*
+** sublb_u64_tied2:
+**     usublb  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_u64_tied2, svuint64_t, svuint32_t,
+                   z0_res = svsublb_u64 (z1, z0),
+                   z0_res = svsublb (z1, z0))
+
+/*
+** sublb_u64_untied:
+**     usublb  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svsublb_u64 (z1, z2),
+                   z0_res = svsublb (z1, z2))
+
+/*
+** sublb_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     usublb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublb_w0_u64_tied1, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svsublb_n_u64 (z0, x0),
+                    z0_res = svsublb (z0, x0))
+
+/*
+** sublb_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     usublb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublb_w0_u64_untied, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svsublb_n_u64 (z1, x0),
+                    z0_res = svsublb (z1, x0))
+
+/*
+** sublb_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     usublb  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_11_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svsublb_n_u64 (z0, 11),
+                   z0_res = svsublb (z0, 11))
+
+/*
+** sublb_11_u64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     usublb  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublb_11_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svsublb_n_u64 (z1, 11),
+                   z0_res = svsublb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublbt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublbt_s16.c
new file mode 100644 (file)
index 0000000..95215bd
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sublbt_s16_tied1:
+**     ssublbt z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublbt_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svsublbt_s16 (z0, z1),
+                   z0_res = svsublbt (z0, z1))
+
+/*
+** sublbt_s16_tied2:
+**     ssublbt z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublbt_s16_tied2, svint16_t, svint8_t,
+                   z0_res = svsublbt_s16 (z1, z0),
+                   z0_res = svsublbt (z1, z0))
+
+/*
+** sublbt_s16_untied:
+**     ssublbt z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublbt_s16_untied, svint16_t, svint8_t,
+                   z0_res = svsublbt_s16 (z1, z2),
+                   z0_res = svsublbt (z1, z2))
+
+/*
+** sublbt_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     ssublbt z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublbt_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+                    z0_res = svsublbt_n_s16 (z0, x0),
+                    z0_res = svsublbt (z0, x0))
+
+/*
+** sublbt_w0_s16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     ssublbt z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublbt_w0_s16_untied, svint16_t, svint8_t, int8_t,
+                    z0_res = svsublbt_n_s16 (z1, x0),
+                    z0_res = svsublbt (z1, x0))
+
+/*
+** sublbt_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     ssublbt z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublbt_11_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svsublbt_n_s16 (z0, 11),
+                   z0_res = svsublbt (z0, 11))
+
+/*
+** sublbt_11_s16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     ssublbt z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublbt_11_s16_untied, svint16_t, svint8_t,
+                   z0_res = svsublbt_n_s16 (z1, 11),
+                   z0_res = svsublbt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublbt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublbt_s32.c
new file mode 100644 (file)
index 0000000..289e748
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sublbt_s32_tied1:
+**     ssublbt z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublbt_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svsublbt_s32 (z0, z1),
+                   z0_res = svsublbt (z0, z1))
+
+/*
+** sublbt_s32_tied2:
+**     ssublbt z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublbt_s32_tied2, svint32_t, svint16_t,
+                   z0_res = svsublbt_s32 (z1, z0),
+                   z0_res = svsublbt (z1, z0))
+
+/*
+** sublbt_s32_untied:
+**     ssublbt z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublbt_s32_untied, svint32_t, svint16_t,
+                   z0_res = svsublbt_s32 (z1, z2),
+                   z0_res = svsublbt (z1, z2))
+
+/*
+** sublbt_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     ssublbt z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublbt_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+                    z0_res = svsublbt_n_s32 (z0, x0),
+                    z0_res = svsublbt (z0, x0))
+
+/*
+** sublbt_w0_s32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     ssublbt z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublbt_w0_s32_untied, svint32_t, svint16_t, int16_t,
+                    z0_res = svsublbt_n_s32 (z1, x0),
+                    z0_res = svsublbt (z1, x0))
+
+/*
+** sublbt_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     ssublbt z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublbt_11_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svsublbt_n_s32 (z0, 11),
+                   z0_res = svsublbt (z0, 11))
+
+/*
+** sublbt_11_s32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     ssublbt z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublbt_11_s32_untied, svint32_t, svint16_t,
+                   z0_res = svsublbt_n_s32 (z1, 11),
+                   z0_res = svsublbt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublbt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublbt_s64.c
new file mode 100644 (file)
index 0000000..18ede1f
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sublbt_s64_tied1:
+**     ssublbt z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublbt_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svsublbt_s64 (z0, z1),
+                   z0_res = svsublbt (z0, z1))
+
+/*
+** sublbt_s64_tied2:
+**     ssublbt z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublbt_s64_tied2, svint64_t, svint32_t,
+                   z0_res = svsublbt_s64 (z1, z0),
+                   z0_res = svsublbt (z1, z0))
+
+/*
+** sublbt_s64_untied:
+**     ssublbt z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublbt_s64_untied, svint64_t, svint32_t,
+                   z0_res = svsublbt_s64 (z1, z2),
+                   z0_res = svsublbt (z1, z2))
+
+/*
+** sublbt_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     ssublbt z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublbt_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+                    z0_res = svsublbt_n_s64 (z0, x0),
+                    z0_res = svsublbt (z0, x0))
+
+/*
+** sublbt_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     ssublbt z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublbt_w0_s64_untied, svint64_t, svint32_t, int32_t,
+                    z0_res = svsublbt_n_s64 (z1, x0),
+                    z0_res = svsublbt (z1, x0))
+
+/*
+** sublbt_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     ssublbt z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublbt_11_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svsublbt_n_s64 (z0, 11),
+                   z0_res = svsublbt (z0, 11))
+
+/*
+** sublbt_11_s64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     ssublbt z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublbt_11_s64_untied, svint64_t, svint32_t,
+                   z0_res = svsublbt_n_s64 (z1, 11),
+                   z0_res = svsublbt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublt_s16.c
new file mode 100644 (file)
index 0000000..f79e32f
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sublt_s16_tied1:
+**     ssublt  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svsublt_s16 (z0, z1),
+                   z0_res = svsublt (z0, z1))
+
+/*
+** sublt_s16_tied2:
+**     ssublt  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_s16_tied2, svint16_t, svint8_t,
+                   z0_res = svsublt_s16 (z1, z0),
+                   z0_res = svsublt (z1, z0))
+
+/*
+** sublt_s16_untied:
+**     ssublt  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_s16_untied, svint16_t, svint8_t,
+                   z0_res = svsublt_s16 (z1, z2),
+                   z0_res = svsublt (z1, z2))
+
+/*
+** sublt_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     ssublt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublt_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+                    z0_res = svsublt_n_s16 (z0, x0),
+                    z0_res = svsublt (z0, x0))
+
+/*
+** sublt_w0_s16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     ssublt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublt_w0_s16_untied, svint16_t, svint8_t, int8_t,
+                    z0_res = svsublt_n_s16 (z1, x0),
+                    z0_res = svsublt (z1, x0))
+
+/*
+** sublt_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     ssublt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_11_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svsublt_n_s16 (z0, 11),
+                   z0_res = svsublt (z0, 11))
+
+/*
+** sublt_11_s16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     ssublt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_11_s16_untied, svint16_t, svint8_t,
+                   z0_res = svsublt_n_s16 (z1, 11),
+                   z0_res = svsublt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublt_s32.c
new file mode 100644 (file)
index 0000000..707cb57
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sublt_s32_tied1:
+**     ssublt  z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svsublt_s32 (z0, z1),
+                   z0_res = svsublt (z0, z1))
+
+/*
+** sublt_s32_tied2:
+**     ssublt  z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_s32_tied2, svint32_t, svint16_t,
+                   z0_res = svsublt_s32 (z1, z0),
+                   z0_res = svsublt (z1, z0))
+
+/*
+** sublt_s32_untied:
+**     ssublt  z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_s32_untied, svint32_t, svint16_t,
+                   z0_res = svsublt_s32 (z1, z2),
+                   z0_res = svsublt (z1, z2))
+
+/*
+** sublt_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     ssublt  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublt_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+                    z0_res = svsublt_n_s32 (z0, x0),
+                    z0_res = svsublt (z0, x0))
+
+/*
+** sublt_w0_s32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     ssublt  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublt_w0_s32_untied, svint32_t, svint16_t, int16_t,
+                    z0_res = svsublt_n_s32 (z1, x0),
+                    z0_res = svsublt (z1, x0))
+
+/*
+** sublt_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     ssublt  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_11_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svsublt_n_s32 (z0, 11),
+                   z0_res = svsublt (z0, 11))
+
+/*
+** sublt_11_s32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     ssublt  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_11_s32_untied, svint32_t, svint16_t,
+                   z0_res = svsublt_n_s32 (z1, 11),
+                   z0_res = svsublt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublt_s64.c
new file mode 100644 (file)
index 0000000..b21b784
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sublt_s64_tied1:
+**     ssublt  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svsublt_s64 (z0, z1),
+                   z0_res = svsublt (z0, z1))
+
+/*
+** sublt_s64_tied2:
+**     ssublt  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_s64_tied2, svint64_t, svint32_t,
+                   z0_res = svsublt_s64 (z1, z0),
+                   z0_res = svsublt (z1, z0))
+
+/*
+** sublt_s64_untied:
+**     ssublt  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_s64_untied, svint64_t, svint32_t,
+                   z0_res = svsublt_s64 (z1, z2),
+                   z0_res = svsublt (z1, z2))
+
+/*
+** sublt_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     ssublt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublt_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+                    z0_res = svsublt_n_s64 (z0, x0),
+                    z0_res = svsublt (z0, x0))
+
+/*
+** sublt_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     ssublt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublt_w0_s64_untied, svint64_t, svint32_t, int32_t,
+                    z0_res = svsublt_n_s64 (z1, x0),
+                    z0_res = svsublt (z1, x0))
+
+/*
+** sublt_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     ssublt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_11_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svsublt_n_s64 (z0, 11),
+                   z0_res = svsublt (z0, 11))
+
+/*
+** sublt_11_s64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     ssublt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_11_s64_untied, svint64_t, svint32_t,
+                   z0_res = svsublt_n_s64 (z1, 11),
+                   z0_res = svsublt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublt_u16.c
new file mode 100644 (file)
index 0000000..429ff73
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sublt_u16_tied1:
+**     usublt  z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svsublt_u16 (z0, z1),
+                   z0_res = svsublt (z0, z1))
+
+/*
+** sublt_u16_tied2:
+**     usublt  z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_u16_tied2, svuint16_t, svuint8_t,
+                   z0_res = svsublt_u16 (z1, z0),
+                   z0_res = svsublt (z1, z0))
+
+/*
+** sublt_u16_untied:
+**     usublt  z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svsublt_u16 (z1, z2),
+                   z0_res = svsublt (z1, z2))
+
+/*
+** sublt_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     usublt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublt_w0_u16_tied1, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svsublt_n_u16 (z0, x0),
+                    z0_res = svsublt (z0, x0))
+
+/*
+** sublt_w0_u16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     usublt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublt_w0_u16_untied, svuint16_t, svuint8_t, uint8_t,
+                    z0_res = svsublt_n_u16 (z1, x0),
+                    z0_res = svsublt (z1, x0))
+
+/*
+** sublt_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     usublt  z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_11_u16_tied1, svuint16_t, svuint8_t,
+                   z0_res = svsublt_n_u16 (z0, 11),
+                   z0_res = svsublt (z0, 11))
+
+/*
+** sublt_11_u16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     usublt  z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_11_u16_untied, svuint16_t, svuint8_t,
+                   z0_res = svsublt_n_u16 (z1, 11),
+                   z0_res = svsublt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublt_u32.c
new file mode 100644 (file)
index 0000000..c899e1f
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sublt_u32_tied1:
+**     usublt  z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svsublt_u32 (z0, z1),
+                   z0_res = svsublt (z0, z1))
+
+/*
+** sublt_u32_tied2:
+**     usublt  z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_u32_tied2, svuint32_t, svuint16_t,
+                   z0_res = svsublt_u32 (z1, z0),
+                   z0_res = svsublt (z1, z0))
+
+/*
+** sublt_u32_untied:
+**     usublt  z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svsublt_u32 (z1, z2),
+                   z0_res = svsublt (z1, z2))
+
+/*
+** sublt_w0_u32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     usublt  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublt_w0_u32_tied1, svuint32_t, svuint16_t, uint16_t,
+                    z0_res = svsublt_n_u32 (z0, x0),
+                    z0_res = svsublt (z0, x0))
+
+/*
+** sublt_w0_u32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     usublt  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublt_w0_u32_untied, svuint32_t, svuint16_t, uint16_t,
+                    z0_res = svsublt_n_u32 (z1, x0),
+                    z0_res = svsublt (z1, x0))
+
+/*
+** sublt_11_u32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     usublt  z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_11_u32_tied1, svuint32_t, svuint16_t,
+                   z0_res = svsublt_n_u32 (z0, 11),
+                   z0_res = svsublt (z0, 11))
+
+/*
+** sublt_11_u32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     usublt  z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_11_u32_untied, svuint32_t, svuint16_t,
+                   z0_res = svsublt_n_u32 (z1, 11),
+                   z0_res = svsublt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/sublt_u64.c
new file mode 100644 (file)
index 0000000..f3cf8fa
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** sublt_u64_tied1:
+**     usublt  z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svsublt_u64 (z0, z1),
+                   z0_res = svsublt (z0, z1))
+
+/*
+** sublt_u64_tied2:
+**     usublt  z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_u64_tied2, svuint64_t, svuint32_t,
+                   z0_res = svsublt_u64 (z1, z0),
+                   z0_res = svsublt (z1, z0))
+
+/*
+** sublt_u64_untied:
+**     usublt  z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svsublt_u64 (z1, z2),
+                   z0_res = svsublt (z1, z2))
+
+/*
+** sublt_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     usublt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublt_w0_u64_tied1, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svsublt_n_u64 (z0, x0),
+                    z0_res = svsublt (z0, x0))
+
+/*
+** sublt_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     usublt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (sublt_w0_u64_untied, svuint64_t, svuint32_t, uint32_t,
+                    z0_res = svsublt_n_u64 (z1, x0),
+                    z0_res = svsublt (z1, x0))
+
+/*
+** sublt_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     usublt  z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_11_u64_tied1, svuint64_t, svuint32_t,
+                   z0_res = svsublt_n_u64 (z0, 11),
+                   z0_res = svsublt (z0, 11))
+
+/*
+** sublt_11_u64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     usublt  z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (sublt_11_u64_untied, svuint64_t, svuint32_t,
+                   z0_res = svsublt_n_u64 (z1, 11),
+                   z0_res = svsublt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subltb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subltb_s16.c
new file mode 100644 (file)
index 0000000..f7704dd
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subltb_s16_tied1:
+**     ssubltb z0\.h, z0\.b, z1\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subltb_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svsubltb_s16 (z0, z1),
+                   z0_res = svsubltb (z0, z1))
+
+/*
+** subltb_s16_tied2:
+**     ssubltb z0\.h, z1\.b, z0\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subltb_s16_tied2, svint16_t, svint8_t,
+                   z0_res = svsubltb_s16 (z1, z0),
+                   z0_res = svsubltb (z1, z0))
+
+/*
+** subltb_s16_untied:
+**     ssubltb z0\.h, z1\.b, z2\.b
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subltb_s16_untied, svint16_t, svint8_t,
+                   z0_res = svsubltb_s16 (z1, z2),
+                   z0_res = svsubltb (z1, z2))
+
+/*
+** subltb_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     ssubltb z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (subltb_w0_s16_tied1, svint16_t, svint8_t, int8_t,
+                    z0_res = svsubltb_n_s16 (z0, x0),
+                    z0_res = svsubltb (z0, x0))
+
+/*
+** subltb_w0_s16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     ssubltb z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (subltb_w0_s16_untied, svint16_t, svint8_t, int8_t,
+                    z0_res = svsubltb_n_s16 (z1, x0),
+                    z0_res = svsubltb (z1, x0))
+
+/*
+** subltb_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     ssubltb z0\.h, z0\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subltb_11_s16_tied1, svint16_t, svint8_t,
+                   z0_res = svsubltb_n_s16 (z0, 11),
+                   z0_res = svsubltb (z0, 11))
+
+/*
+** subltb_11_s16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     ssubltb z0\.h, z1\.b, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subltb_11_s16_untied, svint16_t, svint8_t,
+                   z0_res = svsubltb_n_s16 (z1, 11),
+                   z0_res = svsubltb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subltb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subltb_s32.c
new file mode 100644 (file)
index 0000000..394b1e7
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subltb_s32_tied1:
+**     ssubltb z0\.s, z0\.h, z1\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subltb_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svsubltb_s32 (z0, z1),
+                   z0_res = svsubltb (z0, z1))
+
+/*
+** subltb_s32_tied2:
+**     ssubltb z0\.s, z1\.h, z0\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subltb_s32_tied2, svint32_t, svint16_t,
+                   z0_res = svsubltb_s32 (z1, z0),
+                   z0_res = svsubltb (z1, z0))
+
+/*
+** subltb_s32_untied:
+**     ssubltb z0\.s, z1\.h, z2\.h
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subltb_s32_untied, svint32_t, svint16_t,
+                   z0_res = svsubltb_s32 (z1, z2),
+                   z0_res = svsubltb (z1, z2))
+
+/*
+** subltb_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     ssubltb z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (subltb_w0_s32_tied1, svint32_t, svint16_t, int16_t,
+                    z0_res = svsubltb_n_s32 (z0, x0),
+                    z0_res = svsubltb (z0, x0))
+
+/*
+** subltb_w0_s32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     ssubltb z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (subltb_w0_s32_untied, svint32_t, svint16_t, int16_t,
+                    z0_res = svsubltb_n_s32 (z1, x0),
+                    z0_res = svsubltb (z1, x0))
+
+/*
+** subltb_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     ssubltb z0\.s, z0\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subltb_11_s32_tied1, svint32_t, svint16_t,
+                   z0_res = svsubltb_n_s32 (z0, 11),
+                   z0_res = svsubltb (z0, 11))
+
+/*
+** subltb_11_s32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     ssubltb z0\.s, z1\.h, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subltb_11_s32_untied, svint32_t, svint16_t,
+                   z0_res = svsubltb_n_s32 (z1, 11),
+                   z0_res = svsubltb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subltb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subltb_s64.c
new file mode 100644 (file)
index 0000000..d258f82
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subltb_s64_tied1:
+**     ssubltb z0\.d, z0\.s, z1\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subltb_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svsubltb_s64 (z0, z1),
+                   z0_res = svsubltb (z0, z1))
+
+/*
+** subltb_s64_tied2:
+**     ssubltb z0\.d, z1\.s, z0\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subltb_s64_tied2, svint64_t, svint32_t,
+                   z0_res = svsubltb_s64 (z1, z0),
+                   z0_res = svsubltb (z1, z0))
+
+/*
+** subltb_s64_untied:
+**     ssubltb z0\.d, z1\.s, z2\.s
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subltb_s64_untied, svint64_t, svint32_t,
+                   z0_res = svsubltb_s64 (z1, z2),
+                   z0_res = svsubltb (z1, z2))
+
+/*
+** subltb_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     ssubltb z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (subltb_w0_s64_tied1, svint64_t, svint32_t, int32_t,
+                    z0_res = svsubltb_n_s64 (z0, x0),
+                    z0_res = svsubltb (z0, x0))
+
+/*
+** subltb_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     ssubltb z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_ZX (subltb_w0_s64_untied, svint64_t, svint32_t, int32_t,
+                    z0_res = svsubltb_n_s64 (z1, x0),
+                    z0_res = svsubltb (z1, x0))
+
+/*
+** subltb_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     ssubltb z0\.d, z0\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subltb_11_s64_tied1, svint64_t, svint32_t,
+                   z0_res = svsubltb_n_s64 (z0, 11),
+                   z0_res = svsubltb (z0, 11))
+
+/*
+** subltb_11_s64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     ssubltb z0\.d, z1\.s, \1
+**     ret
+*/
+TEST_TYPE_CHANGE_Z (subltb_11_s64_untied, svint64_t, svint32_t,
+                   z0_res = svsubltb_n_s64 (z1, 11),
+                   z0_res = svsubltb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwb_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwb_s16.c
new file mode 100644 (file)
index 0000000..d2829e3
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subwb_s16_tied1:
+**     ssubwb  z0\.h, z0\.h, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (subwb_s16_tied1, svint16_t, svint8_t,
+            z0 = svsubwb_s16 (z0, z4),
+            z0 = svsubwb (z0, z4))
+
+/*
+** subwb_s16_tied2:
+**     ssubwb  z0\.h, z4\.h, z0\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (subwb_s16_tied2, svint16_t, svint8_t,
+                z0_res = svsubwb_s16 (z4, z0),
+                z0_res = svsubwb (z4, z0))
+
+/*
+** subwb_s16_untied:
+**     ssubwb  z0\.h, z1\.h, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (subwb_s16_untied, svint16_t, svint8_t,
+            z0 = svsubwb_s16 (z1, z4),
+            z0 = svsubwb (z1, z4))
+
+/*
+** subwb_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     ssubwb  z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwb_w0_s16_tied1, svint16_t, int8_t,
+                z0 = svsubwb_n_s16 (z0, x0),
+                z0 = svsubwb (z0, x0))
+
+/*
+** subwb_w0_s16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     ssubwb  z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwb_w0_s16_untied, svint16_t, int8_t,
+                z0 = svsubwb_n_s16 (z1, x0),
+                z0 = svsubwb (z1, x0))
+
+/*
+** subwb_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     ssubwb  z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwb_11_s16_tied1, svint16_t,
+               z0 = svsubwb_n_s16 (z0, 11),
+               z0 = svsubwb (z0, 11))
+
+/*
+** subwb_11_s16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     ssubwb  z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwb_11_s16_untied, svint16_t,
+               z0 = svsubwb_n_s16 (z1, 11),
+               z0 = svsubwb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwb_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwb_s32.c
new file mode 100644 (file)
index 0000000..d6851cc
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subwb_s32_tied1:
+**     ssubwb  z0\.s, z0\.s, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (subwb_s32_tied1, svint32_t, svint16_t,
+            z0 = svsubwb_s32 (z0, z4),
+            z0 = svsubwb (z0, z4))
+
+/*
+** subwb_s32_tied2:
+**     ssubwb  z0\.s, z4\.s, z0\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (subwb_s32_tied2, svint32_t, svint16_t,
+                z0_res = svsubwb_s32 (z4, z0),
+                z0_res = svsubwb (z4, z0))
+
+/*
+** subwb_s32_untied:
+**     ssubwb  z0\.s, z1\.s, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (subwb_s32_untied, svint32_t, svint16_t,
+            z0 = svsubwb_s32 (z1, z4),
+            z0 = svsubwb (z1, z4))
+
+/*
+** subwb_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     ssubwb  z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwb_w0_s32_tied1, svint32_t, int16_t,
+                z0 = svsubwb_n_s32 (z0, x0),
+                z0 = svsubwb (z0, x0))
+
+/*
+** subwb_w0_s32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     ssubwb  z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwb_w0_s32_untied, svint32_t, int16_t,
+                z0 = svsubwb_n_s32 (z1, x0),
+                z0 = svsubwb (z1, x0))
+
+/*
+** subwb_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     ssubwb  z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwb_11_s32_tied1, svint32_t,
+               z0 = svsubwb_n_s32 (z0, 11),
+               z0 = svsubwb (z0, 11))
+
+/*
+** subwb_11_s32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     ssubwb  z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwb_11_s32_untied, svint32_t,
+               z0 = svsubwb_n_s32 (z1, 11),
+               z0 = svsubwb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwb_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwb_s64.c
new file mode 100644 (file)
index 0000000..2b767fa
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subwb_s64_tied1:
+**     ssubwb  z0\.d, z0\.d, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (subwb_s64_tied1, svint64_t, svint32_t,
+            z0 = svsubwb_s64 (z0, z4),
+            z0 = svsubwb (z0, z4))
+
+/*
+** subwb_s64_tied2:
+**     ssubwb  z0\.d, z4\.d, z0\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (subwb_s64_tied2, svint64_t, svint32_t,
+                z0_res = svsubwb_s64 (z4, z0),
+                z0_res = svsubwb (z4, z0))
+
+/*
+** subwb_s64_untied:
+**     ssubwb  z0\.d, z1\.d, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (subwb_s64_untied, svint64_t, svint32_t,
+            z0 = svsubwb_s64 (z1, z4),
+            z0 = svsubwb (z1, z4))
+
+/*
+** subwb_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     ssubwb  z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwb_w0_s64_tied1, svint64_t, int32_t,
+                z0 = svsubwb_n_s64 (z0, x0),
+                z0 = svsubwb (z0, x0))
+
+/*
+** subwb_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     ssubwb  z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwb_w0_s64_untied, svint64_t, int32_t,
+                z0 = svsubwb_n_s64 (z1, x0),
+                z0 = svsubwb (z1, x0))
+
+/*
+** subwb_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     ssubwb  z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwb_11_s64_tied1, svint64_t,
+               z0 = svsubwb_n_s64 (z0, 11),
+               z0 = svsubwb (z0, 11))
+
+/*
+** subwb_11_s64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     ssubwb  z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwb_11_s64_untied, svint64_t,
+               z0 = svsubwb_n_s64 (z1, 11),
+               z0 = svsubwb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwb_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwb_u16.c
new file mode 100644 (file)
index 0000000..e7f2c5d
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subwb_u16_tied1:
+**     usubwb  z0\.h, z0\.h, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (subwb_u16_tied1, svuint16_t, svuint8_t,
+            z0 = svsubwb_u16 (z0, z4),
+            z0 = svsubwb (z0, z4))
+
+/*
+** subwb_u16_tied2:
+**     usubwb  z0\.h, z4\.h, z0\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (subwb_u16_tied2, svuint16_t, svuint8_t,
+                z0_res = svsubwb_u16 (z4, z0),
+                z0_res = svsubwb (z4, z0))
+
+/*
+** subwb_u16_untied:
+**     usubwb  z0\.h, z1\.h, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (subwb_u16_untied, svuint16_t, svuint8_t,
+            z0 = svsubwb_u16 (z1, z4),
+            z0 = svsubwb (z1, z4))
+
+/*
+** subwb_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     usubwb  z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwb_w0_u16_tied1, svuint16_t, uint8_t,
+                z0 = svsubwb_n_u16 (z0, x0),
+                z0 = svsubwb (z0, x0))
+
+/*
+** subwb_w0_u16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     usubwb  z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwb_w0_u16_untied, svuint16_t, uint8_t,
+                z0 = svsubwb_n_u16 (z1, x0),
+                z0 = svsubwb (z1, x0))
+
+/*
+** subwb_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     usubwb  z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwb_11_u16_tied1, svuint16_t,
+               z0 = svsubwb_n_u16 (z0, 11),
+               z0 = svsubwb (z0, 11))
+
+/*
+** subwb_11_u16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     usubwb  z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwb_11_u16_untied, svuint16_t,
+               z0 = svsubwb_n_u16 (z1, 11),
+               z0 = svsubwb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwb_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwb_u32.c
new file mode 100644 (file)
index 0000000..833f262
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subwb_u32_tied1:
+**     usubwb  z0\.s, z0\.s, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (subwb_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svsubwb_u32 (z0, z4),
+            z0 = svsubwb (z0, z4))
+
+/*
+** subwb_u32_tied2:
+**     usubwb  z0\.s, z4\.s, z0\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (subwb_u32_tied2, svuint32_t, svuint16_t,
+                z0_res = svsubwb_u32 (z4, z0),
+                z0_res = svsubwb (z4, z0))
+
+/*
+** subwb_u32_untied:
+**     usubwb  z0\.s, z1\.s, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (subwb_u32_untied, svuint32_t, svuint16_t,
+            z0 = svsubwb_u32 (z1, z4),
+            z0 = svsubwb (z1, z4))
+
+/*
+** subwb_w0_u32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     usubwb  z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwb_w0_u32_tied1, svuint32_t, uint16_t,
+                z0 = svsubwb_n_u32 (z0, x0),
+                z0 = svsubwb (z0, x0))
+
+/*
+** subwb_w0_u32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     usubwb  z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwb_w0_u32_untied, svuint32_t, uint16_t,
+                z0 = svsubwb_n_u32 (z1, x0),
+                z0 = svsubwb (z1, x0))
+
+/*
+** subwb_11_u32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     usubwb  z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwb_11_u32_tied1, svuint32_t,
+               z0 = svsubwb_n_u32 (z0, 11),
+               z0 = svsubwb (z0, 11))
+
+/*
+** subwb_11_u32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     usubwb  z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwb_11_u32_untied, svuint32_t,
+               z0 = svsubwb_n_u32 (z1, 11),
+               z0 = svsubwb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwb_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwb_u64.c
new file mode 100644 (file)
index 0000000..3702e41
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subwb_u64_tied1:
+**     usubwb  z0\.d, z0\.d, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (subwb_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svsubwb_u64 (z0, z4),
+            z0 = svsubwb (z0, z4))
+
+/*
+** subwb_u64_tied2:
+**     usubwb  z0\.d, z4\.d, z0\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (subwb_u64_tied2, svuint64_t, svuint32_t,
+                z0_res = svsubwb_u64 (z4, z0),
+                z0_res = svsubwb (z4, z0))
+
+/*
+** subwb_u64_untied:
+**     usubwb  z0\.d, z1\.d, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (subwb_u64_untied, svuint64_t, svuint32_t,
+            z0 = svsubwb_u64 (z1, z4),
+            z0 = svsubwb (z1, z4))
+
+/*
+** subwb_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     usubwb  z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwb_w0_u64_tied1, svuint64_t, uint32_t,
+                z0 = svsubwb_n_u64 (z0, x0),
+                z0 = svsubwb (z0, x0))
+
+/*
+** subwb_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     usubwb  z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwb_w0_u64_untied, svuint64_t, uint32_t,
+                z0 = svsubwb_n_u64 (z1, x0),
+                z0 = svsubwb (z1, x0))
+
+/*
+** subwb_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     usubwb  z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwb_11_u64_tied1, svuint64_t,
+               z0 = svsubwb_n_u64 (z0, 11),
+               z0 = svsubwb (z0, 11))
+
+/*
+** subwb_11_u64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     usubwb  z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwb_11_u64_untied, svuint64_t,
+               z0 = svsubwb_n_u64 (z1, 11),
+               z0 = svsubwb (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwt_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwt_s16.c
new file mode 100644 (file)
index 0000000..55547cd
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subwt_s16_tied1:
+**     ssubwt  z0\.h, z0\.h, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (subwt_s16_tied1, svint16_t, svint8_t,
+            z0 = svsubwt_s16 (z0, z4),
+            z0 = svsubwt (z0, z4))
+
+/*
+** subwt_s16_tied2:
+**     ssubwt  z0\.h, z4\.h, z0\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (subwt_s16_tied2, svint16_t, svint8_t,
+                z0_res = svsubwt_s16 (z4, z0),
+                z0_res = svsubwt (z4, z0))
+
+/*
+** subwt_s16_untied:
+**     ssubwt  z0\.h, z1\.h, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (subwt_s16_untied, svint16_t, svint8_t,
+            z0 = svsubwt_s16 (z1, z4),
+            z0 = svsubwt (z1, z4))
+
+/*
+** subwt_w0_s16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     ssubwt  z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwt_w0_s16_tied1, svint16_t, int8_t,
+                z0 = svsubwt_n_s16 (z0, x0),
+                z0 = svsubwt (z0, x0))
+
+/*
+** subwt_w0_s16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     ssubwt  z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwt_w0_s16_untied, svint16_t, int8_t,
+                z0 = svsubwt_n_s16 (z1, x0),
+                z0 = svsubwt (z1, x0))
+
+/*
+** subwt_11_s16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     ssubwt  z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwt_11_s16_tied1, svint16_t,
+               z0 = svsubwt_n_s16 (z0, 11),
+               z0 = svsubwt (z0, 11))
+
+/*
+** subwt_11_s16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     ssubwt  z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwt_11_s16_untied, svint16_t,
+               z0 = svsubwt_n_s16 (z1, 11),
+               z0 = svsubwt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwt_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwt_s32.c
new file mode 100644 (file)
index 0000000..ef93306
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subwt_s32_tied1:
+**     ssubwt  z0\.s, z0\.s, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (subwt_s32_tied1, svint32_t, svint16_t,
+            z0 = svsubwt_s32 (z0, z4),
+            z0 = svsubwt (z0, z4))
+
+/*
+** subwt_s32_tied2:
+**     ssubwt  z0\.s, z4\.s, z0\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (subwt_s32_tied2, svint32_t, svint16_t,
+                z0_res = svsubwt_s32 (z4, z0),
+                z0_res = svsubwt (z4, z0))
+
+/*
+** subwt_s32_untied:
+**     ssubwt  z0\.s, z1\.s, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (subwt_s32_untied, svint32_t, svint16_t,
+            z0 = svsubwt_s32 (z1, z4),
+            z0 = svsubwt (z1, z4))
+
+/*
+** subwt_w0_s32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     ssubwt  z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwt_w0_s32_tied1, svint32_t, int16_t,
+                z0 = svsubwt_n_s32 (z0, x0),
+                z0 = svsubwt (z0, x0))
+
+/*
+** subwt_w0_s32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     ssubwt  z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwt_w0_s32_untied, svint32_t, int16_t,
+                z0 = svsubwt_n_s32 (z1, x0),
+                z0 = svsubwt (z1, x0))
+
+/*
+** subwt_11_s32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     ssubwt  z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwt_11_s32_tied1, svint32_t,
+               z0 = svsubwt_n_s32 (z0, 11),
+               z0 = svsubwt (z0, 11))
+
+/*
+** subwt_11_s32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     ssubwt  z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwt_11_s32_untied, svint32_t,
+               z0 = svsubwt_n_s32 (z1, 11),
+               z0 = svsubwt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwt_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwt_s64.c
new file mode 100644 (file)
index 0000000..f0076cf
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subwt_s64_tied1:
+**     ssubwt  z0\.d, z0\.d, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (subwt_s64_tied1, svint64_t, svint32_t,
+            z0 = svsubwt_s64 (z0, z4),
+            z0 = svsubwt (z0, z4))
+
+/*
+** subwt_s64_tied2:
+**     ssubwt  z0\.d, z4\.d, z0\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (subwt_s64_tied2, svint64_t, svint32_t,
+                z0_res = svsubwt_s64 (z4, z0),
+                z0_res = svsubwt (z4, z0))
+
+/*
+** subwt_s64_untied:
+**     ssubwt  z0\.d, z1\.d, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (subwt_s64_untied, svint64_t, svint32_t,
+            z0 = svsubwt_s64 (z1, z4),
+            z0 = svsubwt (z1, z4))
+
+/*
+** subwt_w0_s64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     ssubwt  z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwt_w0_s64_tied1, svint64_t, int32_t,
+                z0 = svsubwt_n_s64 (z0, x0),
+                z0 = svsubwt (z0, x0))
+
+/*
+** subwt_w0_s64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     ssubwt  z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwt_w0_s64_untied, svint64_t, int32_t,
+                z0 = svsubwt_n_s64 (z1, x0),
+                z0 = svsubwt (z1, x0))
+
+/*
+** subwt_11_s64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     ssubwt  z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwt_11_s64_tied1, svint64_t,
+               z0 = svsubwt_n_s64 (z0, 11),
+               z0 = svsubwt (z0, 11))
+
+/*
+** subwt_11_s64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     ssubwt  z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwt_11_s64_untied, svint64_t,
+               z0 = svsubwt_n_s64 (z1, 11),
+               z0 = svsubwt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwt_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwt_u16.c
new file mode 100644 (file)
index 0000000..c2958fb
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subwt_u16_tied1:
+**     usubwt  z0\.h, z0\.h, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (subwt_u16_tied1, svuint16_t, svuint8_t,
+            z0 = svsubwt_u16 (z0, z4),
+            z0 = svsubwt (z0, z4))
+
+/*
+** subwt_u16_tied2:
+**     usubwt  z0\.h, z4\.h, z0\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (subwt_u16_tied2, svuint16_t, svuint8_t,
+                z0_res = svsubwt_u16 (z4, z0),
+                z0_res = svsubwt (z4, z0))
+
+/*
+** subwt_u16_untied:
+**     usubwt  z0\.h, z1\.h, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (subwt_u16_untied, svuint16_t, svuint8_t,
+            z0 = svsubwt_u16 (z1, z4),
+            z0 = svsubwt (z1, z4))
+
+/*
+** subwt_w0_u16_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     usubwt  z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwt_w0_u16_tied1, svuint16_t, uint8_t,
+                z0 = svsubwt_n_u16 (z0, x0),
+                z0 = svsubwt (z0, x0))
+
+/*
+** subwt_w0_u16_untied:
+**     mov     (z[0-9]+\.b), w0
+**     usubwt  z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwt_w0_u16_untied, svuint16_t, uint8_t,
+                z0 = svsubwt_n_u16 (z1, x0),
+                z0 = svsubwt (z1, x0))
+
+/*
+** subwt_11_u16_tied1:
+**     mov     (z[0-9]+\.b), #11
+**     usubwt  z0\.h, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwt_11_u16_tied1, svuint16_t,
+               z0 = svsubwt_n_u16 (z0, 11),
+               z0 = svsubwt (z0, 11))
+
+/*
+** subwt_11_u16_untied:
+**     mov     (z[0-9]+\.b), #11
+**     usubwt  z0\.h, z1\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwt_11_u16_untied, svuint16_t,
+               z0 = svsubwt_n_u16 (z1, 11),
+               z0 = svsubwt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwt_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwt_u32.c
new file mode 100644 (file)
index 0000000..906b240
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subwt_u32_tied1:
+**     usubwt  z0\.s, z0\.s, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (subwt_u32_tied1, svuint32_t, svuint16_t,
+            z0 = svsubwt_u32 (z0, z4),
+            z0 = svsubwt (z0, z4))
+
+/*
+** subwt_u32_tied2:
+**     usubwt  z0\.s, z4\.s, z0\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (subwt_u32_tied2, svuint32_t, svuint16_t,
+                z0_res = svsubwt_u32 (z4, z0),
+                z0_res = svsubwt (z4, z0))
+
+/*
+** subwt_u32_untied:
+**     usubwt  z0\.s, z1\.s, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (subwt_u32_untied, svuint32_t, svuint16_t,
+            z0 = svsubwt_u32 (z1, z4),
+            z0 = svsubwt (z1, z4))
+
+/*
+** subwt_w0_u32_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     usubwt  z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwt_w0_u32_tied1, svuint32_t, uint16_t,
+                z0 = svsubwt_n_u32 (z0, x0),
+                z0 = svsubwt (z0, x0))
+
+/*
+** subwt_w0_u32_untied:
+**     mov     (z[0-9]+\.h), w0
+**     usubwt  z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwt_w0_u32_untied, svuint32_t, uint16_t,
+                z0 = svsubwt_n_u32 (z1, x0),
+                z0 = svsubwt (z1, x0))
+
+/*
+** subwt_11_u32_tied1:
+**     mov     (z[0-9]+\.h), #11
+**     usubwt  z0\.s, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwt_11_u32_tied1, svuint32_t,
+               z0 = svsubwt_n_u32 (z0, 11),
+               z0 = svsubwt (z0, 11))
+
+/*
+** subwt_11_u32_untied:
+**     mov     (z[0-9]+\.h), #11
+**     usubwt  z0\.s, z1\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwt_11_u32_untied, svuint32_t,
+               z0 = svsubwt_n_u32 (z1, 11),
+               z0 = svsubwt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwt_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/subwt_u64.c
new file mode 100644 (file)
index 0000000..ac06b5c
--- /dev/null
@@ -0,0 +1,70 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** subwt_u64_tied1:
+**     usubwt  z0\.d, z0\.d, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (subwt_u64_tied1, svuint64_t, svuint32_t,
+            z0 = svsubwt_u64 (z0, z4),
+            z0 = svsubwt (z0, z4))
+
+/*
+** subwt_u64_tied2:
+**     usubwt  z0\.d, z4\.d, z0\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (subwt_u64_tied2, svuint64_t, svuint32_t,
+                z0_res = svsubwt_u64 (z4, z0),
+                z0_res = svsubwt (z4, z0))
+
+/*
+** subwt_u64_untied:
+**     usubwt  z0\.d, z1\.d, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (subwt_u64_untied, svuint64_t, svuint32_t,
+            z0 = svsubwt_u64 (z1, z4),
+            z0 = svsubwt (z1, z4))
+
+/*
+** subwt_w0_u64_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     usubwt  z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwt_w0_u64_tied1, svuint64_t, uint32_t,
+                z0 = svsubwt_n_u64 (z0, x0),
+                z0 = svsubwt (z0, x0))
+
+/*
+** subwt_w0_u64_untied:
+**     mov     (z[0-9]+\.s), w0
+**     usubwt  z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (subwt_w0_u64_untied, svuint64_t, uint32_t,
+                z0 = svsubwt_n_u64 (z1, x0),
+                z0 = svsubwt (z1, x0))
+
+/*
+** subwt_11_u64_tied1:
+**     mov     (z[0-9]+\.s), #11
+**     usubwt  z0\.d, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwt_11_u64_tied1, svuint64_t,
+               z0 = svsubwt_n_u64 (z0, 11),
+               z0 = svsubwt (z0, 11))
+
+/*
+** subwt_11_u64_untied:
+**     mov     (z[0-9]+\.s), #11
+**     usubwt  z0\.d, z1\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (subwt_11_u64_untied, svuint64_t,
+               z0 = svsubwt_n_u64 (z1, 11),
+               z0 = svsubwt (z1, 11))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_f16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_f16.c
new file mode 100644 (file)
index 0000000..d3f0ea5
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbl2_f16_tied1:
+**     tbl     z0\.h, {z0\.h(?:, | - )z1\.h}, z4\.h
+**     ret
+*/
+TEST_TBL2 (tbl2_f16_tied1, svfloat16x2_t, svfloat16_t, svuint16_t,
+          z0_res = svtbl2_f16 (z0, z4),
+          z0_res = svtbl2 (z0, z4))
+
+/*
+** tbl2_f16_tied2:
+**     tbl     z0\.h, {z1\.h(?:, | - )z2\.h}, z0\.h
+**     ret
+*/
+TEST_TBL2_REV (tbl2_f16_tied2, svfloat16x2_t, svfloat16_t, svuint16_t,
+              z0_res = svtbl2_f16 (z1, z0),
+              z0_res = svtbl2 (z1, z0))
+
+/*
+** tbl2_f16_untied:
+**     tbl     z0\.h, {z2\.h(?:, | - )z3\.h}, z4\.h
+**     ret
+*/
+TEST_TBL2 (tbl2_f16_untied, svfloat16x2_t, svfloat16_t, svuint16_t,
+          z0_res = svtbl2_f16 (z2, z4),
+          z0_res = svtbl2 (z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_f32.c
new file mode 100644 (file)
index 0000000..3b8054b
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbl2_f32_tied1:
+**     tbl     z0\.s, {z0\.s(?:, | - )z1\.s}, z4\.s
+**     ret
+*/
+TEST_TBL2 (tbl2_f32_tied1, svfloat32x2_t, svfloat32_t, svuint32_t,
+          z0_res = svtbl2_f32 (z0, z4),
+          z0_res = svtbl2 (z0, z4))
+
+/*
+** tbl2_f32_tied2:
+**     tbl     z0\.s, {z1\.s(?:, | - )z2\.s}, z0\.s
+**     ret
+*/
+TEST_TBL2_REV (tbl2_f32_tied2, svfloat32x2_t, svfloat32_t, svuint32_t,
+              z0_res = svtbl2_f32 (z1, z0),
+              z0_res = svtbl2 (z1, z0))
+
+/*
+** tbl2_f32_untied:
+**     tbl     z0\.s, {z2\.s(?:, | - )z3\.s}, z4\.s
+**     ret
+*/
+TEST_TBL2 (tbl2_f32_untied, svfloat32x2_t, svfloat32_t, svuint32_t,
+          z0_res = svtbl2_f32 (z2, z4),
+          z0_res = svtbl2 (z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_f64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_f64.c
new file mode 100644 (file)
index 0000000..6455edc
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbl2_f64_tied1:
+**     tbl     z0\.d, {z0\.d(?:, | - )z1\.d}, z4\.d
+**     ret
+*/
+TEST_TBL2 (tbl2_f64_tied1, svfloat64x2_t, svfloat64_t, svuint64_t,
+          z0_res = svtbl2_f64 (z0, z4),
+          z0_res = svtbl2 (z0, z4))
+
+/*
+** tbl2_f64_tied2:
+**     tbl     z0\.d, {z1\.d(?:, | - )z2\.d}, z0\.d
+**     ret
+*/
+TEST_TBL2_REV (tbl2_f64_tied2, svfloat64x2_t, svfloat64_t, svuint64_t,
+              z0_res = svtbl2_f64 (z1, z0),
+              z0_res = svtbl2 (z1, z0))
+
+/*
+** tbl2_f64_untied:
+**     tbl     z0\.d, {z2\.d(?:, | - )z3\.d}, z4\.d
+**     ret
+*/
+TEST_TBL2 (tbl2_f64_untied, svfloat64x2_t, svfloat64_t, svuint64_t,
+          z0_res = svtbl2_f64 (z2, z4),
+          z0_res = svtbl2 (z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_s16.c
new file mode 100644 (file)
index 0000000..cc70ea8
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbl2_s16_tied1:
+**     tbl     z0\.h, {z0\.h(?:, | - )z1\.h}, z4\.h
+**     ret
+*/
+TEST_TBL2 (tbl2_s16_tied1, svint16x2_t, svint16_t, svuint16_t,
+          z0_res = svtbl2_s16 (z0, z4),
+          z0_res = svtbl2 (z0, z4))
+
+/*
+** tbl2_s16_tied2:
+**     tbl     z0\.h, {z1\.h(?:, | - )z2\.h}, z0\.h
+**     ret
+*/
+TEST_TBL2_REV (tbl2_s16_tied2, svint16x2_t, svint16_t, svuint16_t,
+              z0_res = svtbl2_s16 (z1, z0),
+              z0_res = svtbl2 (z1, z0))
+
+/*
+** tbl2_s16_untied:
+**     tbl     z0\.h, {z2\.h(?:, | - )z3\.h}, z4\.h
+**     ret
+*/
+TEST_TBL2 (tbl2_s16_untied, svint16x2_t, svint16_t, svuint16_t,
+          z0_res = svtbl2_s16 (z2, z4),
+          z0_res = svtbl2 (z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_s32.c
new file mode 100644 (file)
index 0000000..4838f54
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbl2_s32_tied1:
+**     tbl     z0\.s, {z0\.s(?:, | - )z1\.s}, z4\.s
+**     ret
+*/
+TEST_TBL2 (tbl2_s32_tied1, svint32x2_t, svint32_t, svuint32_t,
+          z0_res = svtbl2_s32 (z0, z4),
+          z0_res = svtbl2 (z0, z4))
+
+/*
+** tbl2_s32_tied2:
+**     tbl     z0\.s, {z1\.s(?:, | - )z2\.s}, z0\.s
+**     ret
+*/
+TEST_TBL2_REV (tbl2_s32_tied2, svint32x2_t, svint32_t, svuint32_t,
+              z0_res = svtbl2_s32 (z1, z0),
+              z0_res = svtbl2 (z1, z0))
+
+/*
+** tbl2_s32_untied:
+**     tbl     z0\.s, {z2\.s(?:, | - )z3\.s}, z4\.s
+**     ret
+*/
+TEST_TBL2 (tbl2_s32_untied, svint32x2_t, svint32_t, svuint32_t,
+          z0_res = svtbl2_s32 (z2, z4),
+          z0_res = svtbl2 (z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_s64.c
new file mode 100644 (file)
index 0000000..85c83e2
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbl2_s64_tied1:
+**     tbl     z0\.d, {z0\.d(?:, | - )z1\.d}, z4\.d
+**     ret
+*/
+TEST_TBL2 (tbl2_s64_tied1, svint64x2_t, svint64_t, svuint64_t,
+          z0_res = svtbl2_s64 (z0, z4),
+          z0_res = svtbl2 (z0, z4))
+
+/*
+** tbl2_s64_tied2:
+**     tbl     z0\.d, {z1\.d(?:, | - )z2\.d}, z0\.d
+**     ret
+*/
+TEST_TBL2_REV (tbl2_s64_tied2, svint64x2_t, svint64_t, svuint64_t,
+              z0_res = svtbl2_s64 (z1, z0),
+              z0_res = svtbl2 (z1, z0))
+
+/*
+** tbl2_s64_untied:
+**     tbl     z0\.d, {z2\.d(?:, | - )z3\.d}, z4\.d
+**     ret
+*/
+TEST_TBL2 (tbl2_s64_untied, svint64x2_t, svint64_t, svuint64_t,
+          z0_res = svtbl2_s64 (z2, z4),
+          z0_res = svtbl2 (z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_s8.c
new file mode 100644 (file)
index 0000000..d62d93d
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbl2_s8_tied1:
+**     tbl     z0\.b, {z0\.b(?:, | - )z1\.b}, z4\.b
+**     ret
+*/
+TEST_TBL2 (tbl2_s8_tied1, svint8x2_t, svint8_t, svuint8_t,
+          z0_res = svtbl2_s8 (z0, z4),
+          z0_res = svtbl2 (z0, z4))
+
+/*
+** tbl2_s8_tied2:
+**     tbl     z0\.b, {z1\.b(?:, | - )z2\.b}, z0\.b
+**     ret
+*/
+TEST_TBL2_REV (tbl2_s8_tied2, svint8x2_t, svint8_t, svuint8_t,
+              z0_res = svtbl2_s8 (z1, z0),
+              z0_res = svtbl2 (z1, z0))
+
+/*
+** tbl2_s8_untied:
+**     tbl     z0\.b, {z2\.b(?:, | - )z3\.b}, z4\.b
+**     ret
+*/
+TEST_TBL2 (tbl2_s8_untied, svint8x2_t, svint8_t, svuint8_t,
+          z0_res = svtbl2_s8 (z2, z4),
+          z0_res = svtbl2 (z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_u16.c
new file mode 100644 (file)
index 0000000..5eb0006
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbl2_u16_tied1:
+**     tbl     z0\.h, {z0\.h(?:, | - )z1\.h}, z4\.h
+**     ret
+*/
+TEST_TBL2 (tbl2_u16_tied1, svuint16x2_t, svuint16_t, svuint16_t,
+          z0_res = svtbl2_u16 (z0, z4),
+          z0_res = svtbl2 (z0, z4))
+
+/*
+** tbl2_u16_tied2:
+**     tbl     z0\.h, {z1\.h(?:, | - )z2\.h}, z0\.h
+**     ret
+*/
+TEST_TBL2_REV (tbl2_u16_tied2, svuint16x2_t, svuint16_t, svuint16_t,
+              z0_res = svtbl2_u16 (z1, z0),
+              z0_res = svtbl2 (z1, z0))
+
+/*
+** tbl2_u16_untied:
+**     tbl     z0\.h, {z2\.h(?:, | - )z3\.h}, z4\.h
+**     ret
+*/
+TEST_TBL2 (tbl2_u16_untied, svuint16x2_t, svuint16_t, svuint16_t,
+          z0_res = svtbl2_u16 (z2, z4),
+          z0_res = svtbl2 (z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_u32.c
new file mode 100644 (file)
index 0000000..b240088
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbl2_u32_tied1:
+**     tbl     z0\.s, {z0\.s(?:, | - )z1\.s}, z4\.s
+**     ret
+*/
+TEST_TBL2 (tbl2_u32_tied1, svuint32x2_t, svuint32_t, svuint32_t,
+          z0_res = svtbl2_u32 (z0, z4),
+          z0_res = svtbl2 (z0, z4))
+
+/*
+** tbl2_u32_tied2:
+**     tbl     z0\.s, {z1\.s(?:, | - )z2\.s}, z0\.s
+**     ret
+*/
+TEST_TBL2_REV (tbl2_u32_tied2, svuint32x2_t, svuint32_t, svuint32_t,
+              z0_res = svtbl2_u32 (z1, z0),
+              z0_res = svtbl2 (z1, z0))
+
+/*
+** tbl2_u32_untied:
+**     tbl     z0\.s, {z2\.s(?:, | - )z3\.s}, z4\.s
+**     ret
+*/
+TEST_TBL2 (tbl2_u32_untied, svuint32x2_t, svuint32_t, svuint32_t,
+          z0_res = svtbl2_u32 (z2, z4),
+          z0_res = svtbl2 (z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_u64.c
new file mode 100644 (file)
index 0000000..d0ea068
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbl2_u64_tied1:
+**     tbl     z0\.d, {z0\.d(?:, | - )z1\.d}, z4\.d
+**     ret
+*/
+TEST_TBL2 (tbl2_u64_tied1, svuint64x2_t, svuint64_t, svuint64_t,
+          z0_res = svtbl2_u64 (z0, z4),
+          z0_res = svtbl2 (z0, z4))
+
+/*
+** tbl2_u64_tied2:
+**     tbl     z0\.d, {z1\.d(?:, | - )z2\.d}, z0\.d
+**     ret
+*/
+TEST_TBL2_REV (tbl2_u64_tied2, svuint64x2_t, svuint64_t, svuint64_t,
+              z0_res = svtbl2_u64 (z1, z0),
+              z0_res = svtbl2 (z1, z0))
+
+/*
+** tbl2_u64_untied:
+**     tbl     z0\.d, {z2\.d(?:, | - )z3\.d}, z4\.d
+**     ret
+*/
+TEST_TBL2 (tbl2_u64_untied, svuint64x2_t, svuint64_t, svuint64_t,
+          z0_res = svtbl2_u64 (z2, z4),
+          z0_res = svtbl2 (z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbl2_u8.c
new file mode 100644 (file)
index 0000000..d66ba71
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbl2_u8_tied1:
+**     tbl     z0\.b, {z0\.b(?:, | - )z1\.b}, z4\.b
+**     ret
+*/
+TEST_TBL2 (tbl2_u8_tied1, svuint8x2_t, svuint8_t, svuint8_t,
+          z0_res = svtbl2_u8 (z0, z4),
+          z0_res = svtbl2 (z0, z4))
+
+/*
+** tbl2_u8_tied2:
+**     tbl     z0\.b, {z1\.b(?:, | - )z2\.b}, z0\.b
+**     ret
+*/
+TEST_TBL2_REV (tbl2_u8_tied2, svuint8x2_t, svuint8_t, svuint8_t,
+              z0_res = svtbl2_u8 (z1, z0),
+              z0_res = svtbl2 (z1, z0))
+
+/*
+** tbl2_u8_untied:
+**     tbl     z0\.b, {z2\.b(?:, | - )z3\.b}, z4\.b
+**     ret
+*/
+TEST_TBL2 (tbl2_u8_untied, svuint8x2_t, svuint8_t, svuint8_t,
+          z0_res = svtbl2_u8 (z2, z4),
+          z0_res = svtbl2 (z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_f16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_f16.c
new file mode 100644 (file)
index 0000000..65ff83a
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbx_f16_tied1:
+**     tbx     z0\.h, z1\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (tbx_f16_tied1, svfloat16_t, svuint16_t,
+            z0 = svtbx_f16 (z0, z1, z4),
+            z0 = svtbx (z0, z1, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z (tbx_f16_tied2, svfloat16_t, svuint16_t,
+            z0 = svtbx_f16 (z1, z0, z4),
+            z0 = svtbx (z1, z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (tbx_f16_tied3, svfloat16_t, svuint16_t,
+                z0_res = svtbx_f16 (z4, z5, z0),
+                z0_res = svtbx (z4, z5, z0))
+
+/*
+** tbx_f16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     tbx     z0\.h, z2\.h, z4\.h
+** |
+**     tbx     z1\.h, z2\.h, z4\.h
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (tbx_f16_untied, svfloat16_t, svuint16_t,
+            z0 = svtbx_f16 (z1, z2, z4),
+            z0 = svtbx (z1, z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_f32.c
new file mode 100644 (file)
index 0000000..fb31707
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbx_f32_tied1:
+**     tbx     z0\.s, z1\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (tbx_f32_tied1, svfloat32_t, svuint32_t,
+            z0 = svtbx_f32 (z0, z1, z4),
+            z0 = svtbx (z0, z1, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z (tbx_f32_tied2, svfloat32_t, svuint32_t,
+            z0 = svtbx_f32 (z1, z0, z4),
+            z0 = svtbx (z1, z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (tbx_f32_tied3, svfloat32_t, svuint32_t,
+                z0_res = svtbx_f32 (z4, z5, z0),
+                z0_res = svtbx (z4, z5, z0))
+
+/*
+** tbx_f32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     tbx     z0\.s, z2\.s, z4\.s
+** |
+**     tbx     z1\.s, z2\.s, z4\.s
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (tbx_f32_untied, svfloat32_t, svuint32_t,
+            z0 = svtbx_f32 (z1, z2, z4),
+            z0 = svtbx (z1, z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_f64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_f64.c
new file mode 100644 (file)
index 0000000..fbc0006
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbx_f64_tied1:
+**     tbx     z0\.d, z1\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (tbx_f64_tied1, svfloat64_t, svuint64_t,
+            z0 = svtbx_f64 (z0, z1, z4),
+            z0 = svtbx (z0, z1, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z (tbx_f64_tied2, svfloat64_t, svuint64_t,
+            z0 = svtbx_f64 (z1, z0, z4),
+            z0 = svtbx (z1, z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (tbx_f64_tied3, svfloat64_t, svuint64_t,
+                z0_res = svtbx_f64 (z4, z5, z0),
+                z0_res = svtbx (z4, z5, z0))
+
+/*
+** tbx_f64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     tbx     z0\.d, z2\.d, z4\.d
+** |
+**     tbx     z1\.d, z2\.d, z4\.d
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (tbx_f64_untied, svfloat64_t, svuint64_t,
+            z0 = svtbx_f64 (z1, z2, z4),
+            z0 = svtbx (z1, z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_s16.c
new file mode 100644 (file)
index 0000000..0de1b38
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbx_s16_tied1:
+**     tbx     z0\.h, z1\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (tbx_s16_tied1, svint16_t, svuint16_t,
+            z0 = svtbx_s16 (z0, z1, z4),
+            z0 = svtbx (z0, z1, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z (tbx_s16_tied2, svint16_t, svuint16_t,
+            z0 = svtbx_s16 (z1, z0, z4),
+            z0 = svtbx (z1, z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (tbx_s16_tied3, svint16_t, svuint16_t,
+                z0_res = svtbx_s16 (z4, z5, z0),
+                z0_res = svtbx (z4, z5, z0))
+
+/*
+** tbx_s16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     tbx     z0\.h, z2\.h, z4\.h
+** |
+**     tbx     z1\.h, z2\.h, z4\.h
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (tbx_s16_untied, svint16_t, svuint16_t,
+            z0 = svtbx_s16 (z1, z2, z4),
+            z0 = svtbx (z1, z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_s32.c
new file mode 100644 (file)
index 0000000..7d1b492
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbx_s32_tied1:
+**     tbx     z0\.s, z1\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (tbx_s32_tied1, svint32_t, svuint32_t,
+            z0 = svtbx_s32 (z0, z1, z4),
+            z0 = svtbx (z0, z1, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z (tbx_s32_tied2, svint32_t, svuint32_t,
+            z0 = svtbx_s32 (z1, z0, z4),
+            z0 = svtbx (z1, z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (tbx_s32_tied3, svint32_t, svuint32_t,
+                z0_res = svtbx_s32 (z4, z5, z0),
+                z0_res = svtbx (z4, z5, z0))
+
+/*
+** tbx_s32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     tbx     z0\.s, z2\.s, z4\.s
+** |
+**     tbx     z1\.s, z2\.s, z4\.s
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (tbx_s32_untied, svint32_t, svuint32_t,
+            z0 = svtbx_s32 (z1, z2, z4),
+            z0 = svtbx (z1, z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_s64.c
new file mode 100644 (file)
index 0000000..4f8f659
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbx_s64_tied1:
+**     tbx     z0\.d, z1\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (tbx_s64_tied1, svint64_t, svuint64_t,
+            z0 = svtbx_s64 (z0, z1, z4),
+            z0 = svtbx (z0, z1, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z (tbx_s64_tied2, svint64_t, svuint64_t,
+            z0 = svtbx_s64 (z1, z0, z4),
+            z0 = svtbx (z1, z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (tbx_s64_tied3, svint64_t, svuint64_t,
+                z0_res = svtbx_s64 (z4, z5, z0),
+                z0_res = svtbx (z4, z5, z0))
+
+/*
+** tbx_s64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     tbx     z0\.d, z2\.d, z4\.d
+** |
+**     tbx     z1\.d, z2\.d, z4\.d
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (tbx_s64_untied, svint64_t, svuint64_t,
+            z0 = svtbx_s64 (z1, z2, z4),
+            z0 = svtbx (z1, z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_s8.c
new file mode 100644 (file)
index 0000000..4e63dee
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbx_s8_tied1:
+**     tbx     z0\.b, z1\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (tbx_s8_tied1, svint8_t, svuint8_t,
+            z0 = svtbx_s8 (z0, z1, z4),
+            z0 = svtbx (z0, z1, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z (tbx_s8_tied2, svint8_t, svuint8_t,
+            z0 = svtbx_s8 (z1, z0, z4),
+            z0 = svtbx (z1, z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (tbx_s8_tied3, svint8_t, svuint8_t,
+                z0_res = svtbx_s8 (z4, z5, z0),
+                z0_res = svtbx (z4, z5, z0))
+
+/*
+** tbx_s8_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     tbx     z0\.b, z2\.b, z4\.b
+** |
+**     tbx     z1\.b, z2\.b, z4\.b
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (tbx_s8_untied, svint8_t, svuint8_t,
+            z0 = svtbx_s8 (z1, z2, z4),
+            z0 = svtbx (z1, z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_u16.c
new file mode 100644 (file)
index 0000000..e99a591
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbx_u16_tied1:
+**     tbx     z0\.h, z1\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (tbx_u16_tied1, svuint16_t, svuint16_t,
+            z0 = svtbx_u16 (z0, z1, z4),
+            z0 = svtbx (z0, z1, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z (tbx_u16_tied2, svuint16_t, svuint16_t,
+            z0 = svtbx_u16 (z1, z0, z4),
+            z0 = svtbx (z1, z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (tbx_u16_tied3, svuint16_t, svuint16_t,
+                z0_res = svtbx_u16 (z4, z5, z0),
+                z0_res = svtbx (z4, z5, z0))
+
+/*
+** tbx_u16_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     tbx     z0\.h, z2\.h, z4\.h
+** |
+**     tbx     z1\.h, z2\.h, z4\.h
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (tbx_u16_untied, svuint16_t, svuint16_t,
+            z0 = svtbx_u16 (z1, z2, z4),
+            z0 = svtbx (z1, z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_u32.c
new file mode 100644 (file)
index 0000000..98c875e
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbx_u32_tied1:
+**     tbx     z0\.s, z1\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (tbx_u32_tied1, svuint32_t, svuint32_t,
+            z0 = svtbx_u32 (z0, z1, z4),
+            z0 = svtbx (z0, z1, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z (tbx_u32_tied2, svuint32_t, svuint32_t,
+            z0 = svtbx_u32 (z1, z0, z4),
+            z0 = svtbx (z1, z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (tbx_u32_tied3, svuint32_t, svuint32_t,
+                z0_res = svtbx_u32 (z4, z5, z0),
+                z0_res = svtbx (z4, z5, z0))
+
+/*
+** tbx_u32_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     tbx     z0\.s, z2\.s, z4\.s
+** |
+**     tbx     z1\.s, z2\.s, z4\.s
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (tbx_u32_untied, svuint32_t, svuint32_t,
+            z0 = svtbx_u32 (z1, z2, z4),
+            z0 = svtbx (z1, z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_u64.c
new file mode 100644 (file)
index 0000000..d03eedf
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbx_u64_tied1:
+**     tbx     z0\.d, z1\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (tbx_u64_tied1, svuint64_t, svuint64_t,
+            z0 = svtbx_u64 (z0, z1, z4),
+            z0 = svtbx (z0, z1, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z (tbx_u64_tied2, svuint64_t, svuint64_t,
+            z0 = svtbx_u64 (z1, z0, z4),
+            z0 = svtbx (z1, z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (tbx_u64_tied3, svuint64_t, svuint64_t,
+                z0_res = svtbx_u64 (z4, z5, z0),
+                z0_res = svtbx (z4, z5, z0))
+
+/*
+** tbx_u64_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     tbx     z0\.d, z2\.d, z4\.d
+** |
+**     tbx     z1\.d, z2\.d, z4\.d
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (tbx_u64_untied, svuint64_t, svuint64_t,
+            z0 = svtbx_u64 (z1, z2, z4),
+            z0 = svtbx (z1, z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/tbx_u8.c
new file mode 100644 (file)
index 0000000..750b9db
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** tbx_u8_tied1:
+**     tbx     z0\.b, z1\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (tbx_u8_tied1, svuint8_t, svuint8_t,
+            z0 = svtbx_u8 (z0, z1, z4),
+            z0 = svtbx (z0, z1, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z (tbx_u8_tied2, svuint8_t, svuint8_t,
+            z0 = svtbx_u8 (z1, z0, z4),
+            z0 = svtbx (z1, z0, z4))
+
+/* Bad RA choice: no preferred output sequence.  */
+TEST_DUAL_Z_REV (tbx_u8_tied3, svuint8_t, svuint8_t,
+                z0_res = svtbx_u8 (z4, z5, z0),
+                z0_res = svtbx (z4, z5, z0))
+
+/*
+** tbx_u8_untied:
+** (
+**     mov     z0\.d, z1\.d
+**     tbx     z0\.b, z2\.b, z4\.b
+** |
+**     tbx     z1\.b, z2\.b, z4\.b
+**     mov     z0\.d, z1\.d
+** )
+**     ret
+*/
+TEST_DUAL_Z (tbx_u8_untied, svuint8_t, svuint8_t,
+            z0 = svtbx_u8 (z1, z2, z4),
+            z0 = svtbx (z1, z2, z4))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/test_sve_acle.h b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/test_sve_acle.h
new file mode 100644 (file)
index 0000000..77590e1
--- /dev/null
@@ -0,0 +1 @@
+#include "../../../sve/acle/asm/test_sve_acle.h"
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/uqadd_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/uqadd_s16.c
new file mode 100644 (file)
index 0000000..756d394
--- /dev/null
@@ -0,0 +1,403 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** uqadd_s16_m_tied1:
+**     suqadd  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s16_m_tied1, svint16_t, svuint16_t,
+            z0 = svuqadd_s16_m (p0, z0, z4),
+            z0 = svuqadd_m (p0, z0, z4))
+
+/*
+** uqadd_s16_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     suqadd  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (uqadd_s16_m_tied2, svint16_t, svuint16_t,
+                z0_res = svuqadd_s16_m (p0, z4, z0),
+                z0_res = svuqadd_m (p0, z4, z0))
+
+/*
+** uqadd_s16_m_untied:
+**     movprfx z0, z1
+**     suqadd  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s16_m_untied, svint16_t, svuint16_t,
+            z0 = svuqadd_s16_m (p0, z1, z4),
+            z0 = svuqadd_m (p0, z1, z4))
+
+/*
+** uqadd_w0_s16_m_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_w0_s16_m_tied1, svint16_t, uint16_t,
+                z0 = svuqadd_n_s16_m (p0, z0, x0),
+                z0 = svuqadd_m (p0, z0, x0))
+
+/*
+** uqadd_w0_s16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_w0_s16_m_untied, svint16_t, uint16_t,
+                z0 = svuqadd_n_s16_m (p0, z1, x0),
+                z0 = svuqadd_m (p0, z1, x0))
+
+/*
+** uqadd_1_s16_m_tied1:
+**     mov     (z[0-9]+\.h), #1
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s16_m_tied1, svint16_t,
+               z0 = svuqadd_n_s16_m (p0, z0, 1),
+               z0 = svuqadd_m (p0, z0, 1))
+
+/*
+** uqadd_1_s16_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #1
+**     movprfx z0, z1
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s16_m_untied, svint16_t,
+               z0 = svuqadd_n_s16_m (p0, z1, 1),
+               z0 = svuqadd_m (p0, z1, 1))
+
+/*
+** uqadd_127_s16_m:
+**     mov     (z[0-9]+\.h), #127
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_127_s16_m, svint16_t,
+               z0 = svuqadd_n_s16_m (p0, z0, 127),
+               z0 = svuqadd_m (p0, z0, 127))
+
+/*
+** uqadd_128_s16_m:
+**     mov     (z[0-9]+\.h), #128
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_128_s16_m, svint16_t,
+               z0 = svuqadd_n_s16_m (p0, z0, 128),
+               z0 = svuqadd_m (p0, z0, 128))
+
+/*
+** uqadd_255_s16_m:
+**     mov     (z[0-9]+\.h), #255
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_255_s16_m, svint16_t,
+               z0 = svuqadd_n_s16_m (p0, z0, 255),
+               z0 = svuqadd_m (p0, z0, 255))
+
+/*
+** uqadd_m1_s16_m:
+**     mov     (z[0-9]+)\.b, #-1
+**     suqadd  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m1_s16_m, svint16_t,
+               z0 = svuqadd_n_s16_m (p0, z0, -1),
+               z0 = svuqadd_m (p0, z0, -1))
+
+/*
+** uqadd_m127_s16_m:
+**     mov     (z[0-9]+\.h), #-127
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m127_s16_m, svint16_t,
+               z0 = svuqadd_n_s16_m (p0, z0, -127),
+               z0 = svuqadd_m (p0, z0, -127))
+
+/*
+** uqadd_m128_s16_m:
+**     mov     (z[0-9]+\.h), #-128
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m128_s16_m, svint16_t,
+               z0 = svuqadd_n_s16_m (p0, z0, -128),
+               z0 = svuqadd_m (p0, z0, -128))
+
+/*
+** uqadd_s16_z_tied1:
+**     movprfx z0\.h, p0/z, z0\.h
+**     suqadd  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s16_z_tied1, svint16_t, svuint16_t,
+            z0 = svuqadd_s16_z (p0, z0, z4),
+            z0 = svuqadd_z (p0, z0, z4))
+
+/*
+** uqadd_s16_z_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.h, p0/z, z4\.h
+**     suqadd  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (uqadd_s16_z_tied2, svint16_t, svuint16_t,
+                z0_res = svuqadd_s16_z (p0, z4, z0),
+                z0_res = svuqadd_z (p0, z4, z0))
+
+/*
+** uqadd_s16_z_untied:
+**     movprfx z0\.h, p0/z, z1\.h
+**     suqadd  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s16_z_untied, svint16_t, svuint16_t,
+            z0 = svuqadd_s16_z (p0, z1, z4),
+            z0 = svuqadd_z (p0, z1, z4))
+
+/*
+** uqadd_w0_s16_z_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z0\.h
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_w0_s16_z_tied1, svint16_t, uint16_t,
+                z0 = svuqadd_n_s16_z (p0, z0, x0),
+                z0 = svuqadd_z (p0, z0, x0))
+
+/*
+** uqadd_w0_s16_z_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0\.h, p0/z, z1\.h
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_w0_s16_z_untied, svint16_t, uint16_t,
+                z0 = svuqadd_n_s16_z (p0, z1, x0),
+                z0 = svuqadd_z (p0, z1, x0))
+
+/*
+** uqadd_1_s16_z_tied1:
+**     mov     (z[0-9]+\.h), #1
+**     movprfx z0\.h, p0/z, z0\.h
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s16_z_tied1, svint16_t,
+               z0 = svuqadd_n_s16_z (p0, z0, 1),
+               z0 = svuqadd_z (p0, z0, 1))
+
+/*
+** uqadd_1_s16_z_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), #1
+**     movprfx z0\.h, p0/z, z1\.h
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s16_z_untied, svint16_t,
+               z0 = svuqadd_n_s16_z (p0, z1, 1),
+               z0 = svuqadd_z (p0, z1, 1))
+
+/*
+** uqadd_127_s16_z:
+**     mov     (z[0-9]+\.h), #127
+**     movprfx z0\.h, p0/z, z0\.h
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_127_s16_z, svint16_t,
+               z0 = svuqadd_n_s16_z (p0, z0, 127),
+               z0 = svuqadd_z (p0, z0, 127))
+
+/*
+** uqadd_128_s16_z:
+**     mov     (z[0-9]+\.h), #128
+**     movprfx z0\.h, p0/z, z0\.h
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_128_s16_z, svint16_t,
+               z0 = svuqadd_n_s16_z (p0, z0, 128),
+               z0 = svuqadd_z (p0, z0, 128))
+
+/*
+** uqadd_255_s16_z:
+**     mov     (z[0-9]+\.h), #255
+**     movprfx z0\.h, p0/z, z0\.h
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_255_s16_z, svint16_t,
+               z0 = svuqadd_n_s16_z (p0, z0, 255),
+               z0 = svuqadd_z (p0, z0, 255))
+
+/*
+** uqadd_m1_s16_z:
+**     mov     (z[0-9]+)\.b, #-1
+**     movprfx z0\.h, p0/z, z0\.h
+**     suqadd  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m1_s16_z, svint16_t,
+               z0 = svuqadd_n_s16_z (p0, z0, -1),
+               z0 = svuqadd_z (p0, z0, -1))
+
+/*
+** uqadd_m127_s16_z:
+**     mov     (z[0-9]+\.h), #-127
+**     movprfx z0\.h, p0/z, z0\.h
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m127_s16_z, svint16_t,
+               z0 = svuqadd_n_s16_z (p0, z0, -127),
+               z0 = svuqadd_z (p0, z0, -127))
+
+/*
+** uqadd_m128_s16_z:
+**     mov     (z[0-9]+\.h), #-128
+**     movprfx z0\.h, p0/z, z0\.h
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m128_s16_z, svint16_t,
+               z0 = svuqadd_n_s16_z (p0, z0, -128),
+               z0 = svuqadd_z (p0, z0, -128))
+
+/*
+** uqadd_s16_x_tied1:
+**     suqadd  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s16_x_tied1, svint16_t, svuint16_t,
+            z0 = svuqadd_s16_x (p0, z0, z4),
+            z0 = svuqadd_x (p0, z0, z4))
+
+/*
+** uqadd_s16_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     suqadd  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_DUAL_Z_REV (uqadd_s16_x_tied2, svint16_t, svuint16_t,
+                z0_res = svuqadd_s16_x (p0, z4, z0),
+                z0_res = svuqadd_x (p0, z4, z0))
+
+/*
+** uqadd_s16_x_untied:
+**     movprfx z0, z1
+**     suqadd  z0\.h, p0/m, z0\.h, z4\.h
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s16_x_untied, svint16_t, svuint16_t,
+            z0 = svuqadd_s16_x (p0, z1, z4),
+            z0 = svuqadd_x (p0, z1, z4))
+
+/*
+** uqadd_w0_s16_x_tied1:
+**     mov     (z[0-9]+\.h), w0
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_w0_s16_x_tied1, svint16_t, uint16_t,
+                z0 = svuqadd_n_s16_x (p0, z0, x0),
+                z0 = svuqadd_x (p0, z0, x0))
+
+/*
+** uqadd_w0_s16_x_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.h), w0
+**     movprfx z0, z1
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_w0_s16_x_untied, svint16_t, uint16_t,
+                z0 = svuqadd_n_s16_x (p0, z1, x0),
+                z0 = svuqadd_x (p0, z1, x0))
+
+/*
+** uqadd_1_s16_x_tied1:
+**     sqadd   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s16_x_tied1, svint16_t,
+               z0 = svuqadd_n_s16_x (p0, z0, 1),
+               z0 = svuqadd_x (p0, z0, 1))
+
+/*
+** uqadd_1_s16_x_untied:
+**     movprfx z0, z1
+**     sqadd   z0\.h, z0\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s16_x_untied, svint16_t,
+               z0 = svuqadd_n_s16_x (p0, z1, 1),
+               z0 = svuqadd_x (p0, z1, 1))
+
+/*
+** uqadd_127_s16_x:
+**     sqadd   z0\.h, z0\.h, #127
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_127_s16_x, svint16_t,
+               z0 = svuqadd_n_s16_x (p0, z0, 127),
+               z0 = svuqadd_x (p0, z0, 127))
+
+/*
+** uqadd_128_s16_x:
+**     sqadd   z0\.h, z0\.h, #128
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_128_s16_x, svint16_t,
+               z0 = svuqadd_n_s16_x (p0, z0, 128),
+               z0 = svuqadd_x (p0, z0, 128))
+
+/*
+** uqadd_255_s16_x:
+**     sqadd   z0\.h, z0\.h, #255
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_255_s16_x, svint16_t,
+               z0 = svuqadd_n_s16_x (p0, z0, 255),
+               z0 = svuqadd_x (p0, z0, 255))
+
+/*
+** uqadd_m1_s16_x:
+**     mov     (z[0-9]+)\.b, #-1
+**     suqadd  z0\.h, p0/m, z0\.h, \1\.h
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m1_s16_x, svint16_t,
+               z0 = svuqadd_n_s16_x (p0, z0, -1),
+               z0 = svuqadd_x (p0, z0, -1))
+
+/*
+** uqadd_m127_s16_x:
+**     mov     (z[0-9]+\.h), #-127
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m127_s16_x, svint16_t,
+               z0 = svuqadd_n_s16_x (p0, z0, -127),
+               z0 = svuqadd_x (p0, z0, -127))
+
+/*
+** uqadd_m128_s16_x:
+**     mov     (z[0-9]+\.h), #-128
+**     suqadd  z0\.h, p0/m, z0\.h, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m128_s16_x, svint16_t,
+               z0 = svuqadd_n_s16_x (p0, z0, -128),
+               z0 = svuqadd_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/uqadd_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/uqadd_s32.c
new file mode 100644 (file)
index 0000000..22ed583
--- /dev/null
@@ -0,0 +1,403 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** uqadd_s32_m_tied1:
+**     suqadd  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s32_m_tied1, svint32_t, svuint32_t,
+            z0 = svuqadd_s32_m (p0, z0, z4),
+            z0 = svuqadd_m (p0, z0, z4))
+
+/*
+** uqadd_s32_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     suqadd  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (uqadd_s32_m_tied2, svint32_t, svuint32_t,
+                z0_res = svuqadd_s32_m (p0, z4, z0),
+                z0_res = svuqadd_m (p0, z4, z0))
+
+/*
+** uqadd_s32_m_untied:
+**     movprfx z0, z1
+**     suqadd  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s32_m_untied, svint32_t, svuint32_t,
+            z0 = svuqadd_s32_m (p0, z1, z4),
+            z0 = svuqadd_m (p0, z1, z4))
+
+/*
+** uqadd_w0_s32_m_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_w0_s32_m_tied1, svint32_t, uint32_t,
+                z0 = svuqadd_n_s32_m (p0, z0, x0),
+                z0 = svuqadd_m (p0, z0, x0))
+
+/*
+** uqadd_w0_s32_m_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_w0_s32_m_untied, svint32_t, uint32_t,
+                z0 = svuqadd_n_s32_m (p0, z1, x0),
+                z0 = svuqadd_m (p0, z1, x0))
+
+/*
+** uqadd_1_s32_m_tied1:
+**     mov     (z[0-9]+\.s), #1
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s32_m_tied1, svint32_t,
+               z0 = svuqadd_n_s32_m (p0, z0, 1),
+               z0 = svuqadd_m (p0, z0, 1))
+
+/*
+** uqadd_1_s32_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #1
+**     movprfx z0, z1
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s32_m_untied, svint32_t,
+               z0 = svuqadd_n_s32_m (p0, z1, 1),
+               z0 = svuqadd_m (p0, z1, 1))
+
+/*
+** uqadd_127_s32_m:
+**     mov     (z[0-9]+\.s), #127
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_127_s32_m, svint32_t,
+               z0 = svuqadd_n_s32_m (p0, z0, 127),
+               z0 = svuqadd_m (p0, z0, 127))
+
+/*
+** uqadd_128_s32_m:
+**     mov     (z[0-9]+\.s), #128
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_128_s32_m, svint32_t,
+               z0 = svuqadd_n_s32_m (p0, z0, 128),
+               z0 = svuqadd_m (p0, z0, 128))
+
+/*
+** uqadd_255_s32_m:
+**     mov     (z[0-9]+\.s), #255
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_255_s32_m, svint32_t,
+               z0 = svuqadd_n_s32_m (p0, z0, 255),
+               z0 = svuqadd_m (p0, z0, 255))
+
+/*
+** uqadd_m1_s32_m:
+**     mov     (z[0-9]+)\.b, #-1
+**     suqadd  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m1_s32_m, svint32_t,
+               z0 = svuqadd_n_s32_m (p0, z0, -1),
+               z0 = svuqadd_m (p0, z0, -1))
+
+/*
+** uqadd_m127_s32_m:
+**     mov     (z[0-9]+\.s), #-127
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m127_s32_m, svint32_t,
+               z0 = svuqadd_n_s32_m (p0, z0, -127),
+               z0 = svuqadd_m (p0, z0, -127))
+
+/*
+** uqadd_m128_s32_m:
+**     mov     (z[0-9]+\.s), #-128
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m128_s32_m, svint32_t,
+               z0 = svuqadd_n_s32_m (p0, z0, -128),
+               z0 = svuqadd_m (p0, z0, -128))
+
+/*
+** uqadd_s32_z_tied1:
+**     movprfx z0\.s, p0/z, z0\.s
+**     suqadd  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s32_z_tied1, svint32_t, svuint32_t,
+            z0 = svuqadd_s32_z (p0, z0, z4),
+            z0 = svuqadd_z (p0, z0, z4))
+
+/*
+** uqadd_s32_z_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.s, p0/z, z4\.s
+**     suqadd  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (uqadd_s32_z_tied2, svint32_t, svuint32_t,
+                z0_res = svuqadd_s32_z (p0, z4, z0),
+                z0_res = svuqadd_z (p0, z4, z0))
+
+/*
+** uqadd_s32_z_untied:
+**     movprfx z0\.s, p0/z, z1\.s
+**     suqadd  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s32_z_untied, svint32_t, svuint32_t,
+            z0 = svuqadd_s32_z (p0, z1, z4),
+            z0 = svuqadd_z (p0, z1, z4))
+
+/*
+** uqadd_w0_s32_z_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z0\.s
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_w0_s32_z_tied1, svint32_t, uint32_t,
+                z0 = svuqadd_n_s32_z (p0, z0, x0),
+                z0 = svuqadd_z (p0, z0, x0))
+
+/*
+** uqadd_w0_s32_z_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0\.s, p0/z, z1\.s
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_w0_s32_z_untied, svint32_t, uint32_t,
+                z0 = svuqadd_n_s32_z (p0, z1, x0),
+                z0 = svuqadd_z (p0, z1, x0))
+
+/*
+** uqadd_1_s32_z_tied1:
+**     mov     (z[0-9]+\.s), #1
+**     movprfx z0\.s, p0/z, z0\.s
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s32_z_tied1, svint32_t,
+               z0 = svuqadd_n_s32_z (p0, z0, 1),
+               z0 = svuqadd_z (p0, z0, 1))
+
+/*
+** uqadd_1_s32_z_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.s), #1
+**     movprfx z0\.s, p0/z, z1\.s
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s32_z_untied, svint32_t,
+               z0 = svuqadd_n_s32_z (p0, z1, 1),
+               z0 = svuqadd_z (p0, z1, 1))
+
+/*
+** uqadd_127_s32_z:
+**     mov     (z[0-9]+\.s), #127
+**     movprfx z0\.s, p0/z, z0\.s
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_127_s32_z, svint32_t,
+               z0 = svuqadd_n_s32_z (p0, z0, 127),
+               z0 = svuqadd_z (p0, z0, 127))
+
+/*
+** uqadd_128_s32_z:
+**     mov     (z[0-9]+\.s), #128
+**     movprfx z0\.s, p0/z, z0\.s
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_128_s32_z, svint32_t,
+               z0 = svuqadd_n_s32_z (p0, z0, 128),
+               z0 = svuqadd_z (p0, z0, 128))
+
+/*
+** uqadd_255_s32_z:
+**     mov     (z[0-9]+\.s), #255
+**     movprfx z0\.s, p0/z, z0\.s
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_255_s32_z, svint32_t,
+               z0 = svuqadd_n_s32_z (p0, z0, 255),
+               z0 = svuqadd_z (p0, z0, 255))
+
+/*
+** uqadd_m1_s32_z:
+**     mov     (z[0-9]+)\.b, #-1
+**     movprfx z0\.s, p0/z, z0\.s
+**     suqadd  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m1_s32_z, svint32_t,
+               z0 = svuqadd_n_s32_z (p0, z0, -1),
+               z0 = svuqadd_z (p0, z0, -1))
+
+/*
+** uqadd_m127_s32_z:
+**     mov     (z[0-9]+\.s), #-127
+**     movprfx z0\.s, p0/z, z0\.s
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m127_s32_z, svint32_t,
+               z0 = svuqadd_n_s32_z (p0, z0, -127),
+               z0 = svuqadd_z (p0, z0, -127))
+
+/*
+** uqadd_m128_s32_z:
+**     mov     (z[0-9]+\.s), #-128
+**     movprfx z0\.s, p0/z, z0\.s
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m128_s32_z, svint32_t,
+               z0 = svuqadd_n_s32_z (p0, z0, -128),
+               z0 = svuqadd_z (p0, z0, -128))
+
+/*
+** uqadd_s32_x_tied1:
+**     suqadd  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s32_x_tied1, svint32_t, svuint32_t,
+            z0 = svuqadd_s32_x (p0, z0, z4),
+            z0 = svuqadd_x (p0, z0, z4))
+
+/*
+** uqadd_s32_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     suqadd  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_DUAL_Z_REV (uqadd_s32_x_tied2, svint32_t, svuint32_t,
+                z0_res = svuqadd_s32_x (p0, z4, z0),
+                z0_res = svuqadd_x (p0, z4, z0))
+
+/*
+** uqadd_s32_x_untied:
+**     movprfx z0, z1
+**     suqadd  z0\.s, p0/m, z0\.s, z4\.s
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s32_x_untied, svint32_t, svuint32_t,
+            z0 = svuqadd_s32_x (p0, z1, z4),
+            z0 = svuqadd_x (p0, z1, z4))
+
+/*
+** uqadd_w0_s32_x_tied1:
+**     mov     (z[0-9]+\.s), w0
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_w0_s32_x_tied1, svint32_t, uint32_t,
+                z0 = svuqadd_n_s32_x (p0, z0, x0),
+                z0 = svuqadd_x (p0, z0, x0))
+
+/*
+** uqadd_w0_s32_x_untied:
+**     mov     (z[0-9]+\.s), w0
+**     movprfx z0, z1
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_w0_s32_x_untied, svint32_t, uint32_t,
+                z0 = svuqadd_n_s32_x (p0, z1, x0),
+                z0 = svuqadd_x (p0, z1, x0))
+
+/*
+** uqadd_1_s32_x_tied1:
+**     sqadd   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s32_x_tied1, svint32_t,
+               z0 = svuqadd_n_s32_x (p0, z0, 1),
+               z0 = svuqadd_x (p0, z0, 1))
+
+/*
+** uqadd_1_s32_x_untied:
+**     movprfx z0, z1
+**     sqadd   z0\.s, z0\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s32_x_untied, svint32_t,
+               z0 = svuqadd_n_s32_x (p0, z1, 1),
+               z0 = svuqadd_x (p0, z1, 1))
+
+/*
+** uqadd_127_s32_x:
+**     sqadd   z0\.s, z0\.s, #127
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_127_s32_x, svint32_t,
+               z0 = svuqadd_n_s32_x (p0, z0, 127),
+               z0 = svuqadd_x (p0, z0, 127))
+
+/*
+** uqadd_128_s32_x:
+**     sqadd   z0\.s, z0\.s, #128
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_128_s32_x, svint32_t,
+               z0 = svuqadd_n_s32_x (p0, z0, 128),
+               z0 = svuqadd_x (p0, z0, 128))
+
+/*
+** uqadd_255_s32_x:
+**     sqadd   z0\.s, z0\.s, #255
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_255_s32_x, svint32_t,
+               z0 = svuqadd_n_s32_x (p0, z0, 255),
+               z0 = svuqadd_x (p0, z0, 255))
+
+/*
+** uqadd_m1_s32_x:
+**     mov     (z[0-9]+)\.b, #-1
+**     suqadd  z0\.s, p0/m, z0\.s, \1\.s
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m1_s32_x, svint32_t,
+               z0 = svuqadd_n_s32_x (p0, z0, -1),
+               z0 = svuqadd_x (p0, z0, -1))
+
+/*
+** uqadd_m127_s32_x:
+**     mov     (z[0-9]+\.s), #-127
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m127_s32_x, svint32_t,
+               z0 = svuqadd_n_s32_x (p0, z0, -127),
+               z0 = svuqadd_x (p0, z0, -127))
+
+/*
+** uqadd_m128_s32_x:
+**     mov     (z[0-9]+\.s), #-128
+**     suqadd  z0\.s, p0/m, z0\.s, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m128_s32_x, svint32_t,
+               z0 = svuqadd_n_s32_x (p0, z0, -128),
+               z0 = svuqadd_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/uqadd_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/uqadd_s64.c
new file mode 100644 (file)
index 0000000..1128341
--- /dev/null
@@ -0,0 +1,403 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** uqadd_s64_m_tied1:
+**     suqadd  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s64_m_tied1, svint64_t, svuint64_t,
+            z0 = svuqadd_s64_m (p0, z0, z4),
+            z0 = svuqadd_m (p0, z0, z4))
+
+/*
+** uqadd_s64_m_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z4
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_DUAL_Z_REV (uqadd_s64_m_tied2, svint64_t, svuint64_t,
+                z0_res = svuqadd_s64_m (p0, z4, z0),
+                z0_res = svuqadd_m (p0, z4, z0))
+
+/*
+** uqadd_s64_m_untied:
+**     movprfx z0, z1
+**     suqadd  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s64_m_untied, svint64_t, svuint64_t,
+            z0 = svuqadd_s64_m (p0, z1, z4),
+            z0 = svuqadd_m (p0, z1, z4))
+
+/*
+** uqadd_x0_s64_m_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_x0_s64_m_tied1, svint64_t, uint64_t,
+                z0 = svuqadd_n_s64_m (p0, z0, x0),
+                z0 = svuqadd_m (p0, z0, x0))
+
+/*
+** uqadd_x0_s64_m_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_x0_s64_m_untied, svint64_t, uint64_t,
+                z0 = svuqadd_n_s64_m (p0, z1, x0),
+                z0 = svuqadd_m (p0, z1, x0))
+
+/*
+** uqadd_1_s64_m_tied1:
+**     mov     (z[0-9]+\.d), #1
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s64_m_tied1, svint64_t,
+               z0 = svuqadd_n_s64_m (p0, z0, 1),
+               z0 = svuqadd_m (p0, z0, 1))
+
+/*
+** uqadd_1_s64_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.d), #1
+**     movprfx z0, z1
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s64_m_untied, svint64_t,
+               z0 = svuqadd_n_s64_m (p0, z1, 1),
+               z0 = svuqadd_m (p0, z1, 1))
+
+/*
+** uqadd_127_s64_m:
+**     mov     (z[0-9]+\.d), #127
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_127_s64_m, svint64_t,
+               z0 = svuqadd_n_s64_m (p0, z0, 127),
+               z0 = svuqadd_m (p0, z0, 127))
+
+/*
+** uqadd_128_s64_m:
+**     mov     (z[0-9]+\.d), #128
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_128_s64_m, svint64_t,
+               z0 = svuqadd_n_s64_m (p0, z0, 128),
+               z0 = svuqadd_m (p0, z0, 128))
+
+/*
+** uqadd_255_s64_m:
+**     mov     (z[0-9]+\.d), #255
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_255_s64_m, svint64_t,
+               z0 = svuqadd_n_s64_m (p0, z0, 255),
+               z0 = svuqadd_m (p0, z0, 255))
+
+/*
+** uqadd_m1_s64_m:
+**     mov     (z[0-9]+)\.b, #-1
+**     suqadd  z0\.d, p0/m, z0\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m1_s64_m, svint64_t,
+               z0 = svuqadd_n_s64_m (p0, z0, -1),
+               z0 = svuqadd_m (p0, z0, -1))
+
+/*
+** uqadd_m127_s64_m:
+**     mov     (z[0-9]+\.d), #-127
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m127_s64_m, svint64_t,
+               z0 = svuqadd_n_s64_m (p0, z0, -127),
+               z0 = svuqadd_m (p0, z0, -127))
+
+/*
+** uqadd_m128_s64_m:
+**     mov     (z[0-9]+\.d), #-128
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m128_s64_m, svint64_t,
+               z0 = svuqadd_n_s64_m (p0, z0, -128),
+               z0 = svuqadd_m (p0, z0, -128))
+
+/*
+** uqadd_s64_z_tied1:
+**     movprfx z0\.d, p0/z, z0\.d
+**     suqadd  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s64_z_tied1, svint64_t, svuint64_t,
+            z0 = svuqadd_s64_z (p0, z0, z4),
+            z0 = svuqadd_z (p0, z0, z4))
+
+/*
+** uqadd_s64_z_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0\.d, p0/z, z4\.d
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_DUAL_Z_REV (uqadd_s64_z_tied2, svint64_t, svuint64_t,
+                z0_res = svuqadd_s64_z (p0, z4, z0),
+                z0_res = svuqadd_z (p0, z4, z0))
+
+/*
+** uqadd_s64_z_untied:
+**     movprfx z0\.d, p0/z, z1\.d
+**     suqadd  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s64_z_untied, svint64_t, svuint64_t,
+            z0 = svuqadd_s64_z (p0, z1, z4),
+            z0 = svuqadd_z (p0, z1, z4))
+
+/*
+** uqadd_x0_s64_z_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z0\.d
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_x0_s64_z_tied1, svint64_t, uint64_t,
+                z0 = svuqadd_n_s64_z (p0, z0, x0),
+                z0 = svuqadd_z (p0, z0, x0))
+
+/*
+** uqadd_x0_s64_z_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0\.d, p0/z, z1\.d
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_x0_s64_z_untied, svint64_t, uint64_t,
+                z0 = svuqadd_n_s64_z (p0, z1, x0),
+                z0 = svuqadd_z (p0, z1, x0))
+
+/*
+** uqadd_1_s64_z_tied1:
+**     mov     (z[0-9]+\.d), #1
+**     movprfx z0\.d, p0/z, z0\.d
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s64_z_tied1, svint64_t,
+               z0 = svuqadd_n_s64_z (p0, z0, 1),
+               z0 = svuqadd_z (p0, z0, 1))
+
+/*
+** uqadd_1_s64_z_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.d), #1
+**     movprfx z0\.d, p0/z, z1\.d
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s64_z_untied, svint64_t,
+               z0 = svuqadd_n_s64_z (p0, z1, 1),
+               z0 = svuqadd_z (p0, z1, 1))
+
+/*
+** uqadd_127_s64_z:
+**     mov     (z[0-9]+\.d), #127
+**     movprfx z0\.d, p0/z, z0\.d
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_127_s64_z, svint64_t,
+               z0 = svuqadd_n_s64_z (p0, z0, 127),
+               z0 = svuqadd_z (p0, z0, 127))
+
+/*
+** uqadd_128_s64_z:
+**     mov     (z[0-9]+\.d), #128
+**     movprfx z0\.d, p0/z, z0\.d
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_128_s64_z, svint64_t,
+               z0 = svuqadd_n_s64_z (p0, z0, 128),
+               z0 = svuqadd_z (p0, z0, 128))
+
+/*
+** uqadd_255_s64_z:
+**     mov     (z[0-9]+\.d), #255
+**     movprfx z0\.d, p0/z, z0\.d
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_255_s64_z, svint64_t,
+               z0 = svuqadd_n_s64_z (p0, z0, 255),
+               z0 = svuqadd_z (p0, z0, 255))
+
+/*
+** uqadd_m1_s64_z:
+**     mov     (z[0-9]+)\.b, #-1
+**     movprfx z0\.d, p0/z, z0\.d
+**     suqadd  z0\.d, p0/m, z0\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m1_s64_z, svint64_t,
+               z0 = svuqadd_n_s64_z (p0, z0, -1),
+               z0 = svuqadd_z (p0, z0, -1))
+
+/*
+** uqadd_m127_s64_z:
+**     mov     (z[0-9]+\.d), #-127
+**     movprfx z0\.d, p0/z, z0\.d
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m127_s64_z, svint64_t,
+               z0 = svuqadd_n_s64_z (p0, z0, -127),
+               z0 = svuqadd_z (p0, z0, -127))
+
+/*
+** uqadd_m128_s64_z:
+**     mov     (z[0-9]+\.d), #-128
+**     movprfx z0\.d, p0/z, z0\.d
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m128_s64_z, svint64_t,
+               z0 = svuqadd_n_s64_z (p0, z0, -128),
+               z0 = svuqadd_z (p0, z0, -128))
+
+/*
+** uqadd_s64_x_tied1:
+**     suqadd  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s64_x_tied1, svint64_t, svuint64_t,
+            z0 = svuqadd_s64_x (p0, z0, z4),
+            z0 = svuqadd_x (p0, z0, z4))
+
+/*
+** uqadd_s64_x_tied2:
+**     mov     (z[0-9]+\.d), z0\.d
+**     movprfx z0, z4
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_DUAL_Z_REV (uqadd_s64_x_tied2, svint64_t, svuint64_t,
+                z0_res = svuqadd_s64_x (p0, z4, z0),
+                z0_res = svuqadd_x (p0, z4, z0))
+
+/*
+** uqadd_s64_x_untied:
+**     movprfx z0, z1
+**     suqadd  z0\.d, p0/m, z0\.d, z4\.d
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s64_x_untied, svint64_t, svuint64_t,
+            z0 = svuqadd_s64_x (p0, z1, z4),
+            z0 = svuqadd_x (p0, z1, z4))
+
+/*
+** uqadd_x0_s64_x_tied1:
+**     mov     (z[0-9]+\.d), x0
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_x0_s64_x_tied1, svint64_t, uint64_t,
+                z0 = svuqadd_n_s64_x (p0, z0, x0),
+                z0 = svuqadd_x (p0, z0, x0))
+
+/*
+** uqadd_x0_s64_x_untied:
+**     mov     (z[0-9]+\.d), x0
+**     movprfx z0, z1
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_x0_s64_x_untied, svint64_t, uint64_t,
+                z0 = svuqadd_n_s64_x (p0, z1, x0),
+                z0 = svuqadd_x (p0, z1, x0))
+
+/*
+** uqadd_1_s64_x_tied1:
+**     sqadd   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s64_x_tied1, svint64_t,
+               z0 = svuqadd_n_s64_x (p0, z0, 1),
+               z0 = svuqadd_x (p0, z0, 1))
+
+/*
+** uqadd_1_s64_x_untied:
+**     movprfx z0, z1
+**     sqadd   z0\.d, z0\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s64_x_untied, svint64_t,
+               z0 = svuqadd_n_s64_x (p0, z1, 1),
+               z0 = svuqadd_x (p0, z1, 1))
+
+/*
+** uqadd_127_s64_x:
+**     sqadd   z0\.d, z0\.d, #127
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_127_s64_x, svint64_t,
+               z0 = svuqadd_n_s64_x (p0, z0, 127),
+               z0 = svuqadd_x (p0, z0, 127))
+
+/*
+** uqadd_128_s64_x:
+**     sqadd   z0\.d, z0\.d, #128
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_128_s64_x, svint64_t,
+               z0 = svuqadd_n_s64_x (p0, z0, 128),
+               z0 = svuqadd_x (p0, z0, 128))
+
+/*
+** uqadd_255_s64_x:
+**     sqadd   z0\.d, z0\.d, #255
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_255_s64_x, svint64_t,
+               z0 = svuqadd_n_s64_x (p0, z0, 255),
+               z0 = svuqadd_x (p0, z0, 255))
+
+/*
+** uqadd_m1_s64_x:
+**     mov     (z[0-9]+)\.b, #-1
+**     suqadd  z0\.d, p0/m, z0\.d, \1\.d
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m1_s64_x, svint64_t,
+               z0 = svuqadd_n_s64_x (p0, z0, -1),
+               z0 = svuqadd_x (p0, z0, -1))
+
+/*
+** uqadd_m127_s64_x:
+**     mov     (z[0-9]+\.d), #-127
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m127_s64_x, svint64_t,
+               z0 = svuqadd_n_s64_x (p0, z0, -127),
+               z0 = svuqadd_x (p0, z0, -127))
+
+/*
+** uqadd_m128_s64_x:
+**     mov     (z[0-9]+\.d), #-128
+**     suqadd  z0\.d, p0/m, z0\.d, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m128_s64_x, svint64_t,
+               z0 = svuqadd_n_s64_x (p0, z0, -128),
+               z0 = svuqadd_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/uqadd_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/uqadd_s8.c
new file mode 100644 (file)
index 0000000..25cbe8b
--- /dev/null
@@ -0,0 +1,400 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** uqadd_s8_m_tied1:
+**     suqadd  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s8_m_tied1, svint8_t, svuint8_t,
+            z0 = svuqadd_s8_m (p0, z0, z4),
+            z0 = svuqadd_m (p0, z0, z4))
+
+/*
+** uqadd_s8_m_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     suqadd  z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (uqadd_s8_m_tied2, svint8_t, svuint8_t,
+                z0_res = svuqadd_s8_m (p0, z4, z0),
+                z0_res = svuqadd_m (p0, z4, z0))
+
+/*
+** uqadd_s8_m_untied:
+**     movprfx z0, z1
+**     suqadd  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s8_m_untied, svint8_t, svuint8_t,
+            z0 = svuqadd_s8_m (p0, z1, z4),
+            z0 = svuqadd_m (p0, z1, z4))
+
+/*
+** uqadd_w0_s8_m_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_w0_s8_m_tied1, svint8_t, uint8_t,
+                z0 = svuqadd_n_s8_m (p0, z0, x0),
+                z0 = svuqadd_m (p0, z0, x0))
+
+/*
+** uqadd_w0_s8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_w0_s8_m_untied, svint8_t, uint8_t,
+                z0 = svuqadd_n_s8_m (p0, z1, x0),
+                z0 = svuqadd_m (p0, z1, x0))
+
+/*
+** uqadd_1_s8_m_tied1:
+**     mov     (z[0-9]+\.b), #1
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s8_m_tied1, svint8_t,
+               z0 = svuqadd_n_s8_m (p0, z0, 1),
+               z0 = svuqadd_m (p0, z0, 1))
+
+/*
+** uqadd_1_s8_m_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #1
+**     movprfx z0, z1
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s8_m_untied, svint8_t,
+               z0 = svuqadd_n_s8_m (p0, z1, 1),
+               z0 = svuqadd_m (p0, z1, 1))
+
+/*
+** uqadd_127_s8_m:
+**     mov     (z[0-9]+\.b), #127
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_127_s8_m, svint8_t,
+               z0 = svuqadd_n_s8_m (p0, z0, 127),
+               z0 = svuqadd_m (p0, z0, 127))
+
+/*
+** uqadd_128_s8_m:
+**     mov     (z[0-9]+\.b), #-128
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_128_s8_m, svint8_t,
+               z0 = svuqadd_n_s8_m (p0, z0, 128),
+               z0 = svuqadd_m (p0, z0, 128))
+
+/*
+** uqadd_255_s8_m:
+**     mov     (z[0-9]+\.b), #-1
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_255_s8_m, svint8_t,
+               z0 = svuqadd_n_s8_m (p0, z0, 255),
+               z0 = svuqadd_m (p0, z0, 255))
+
+/*
+** uqadd_m1_s8_m:
+**     mov     (z[0-9]+\.b), #-1
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m1_s8_m, svint8_t,
+               z0 = svuqadd_n_s8_m (p0, z0, -1),
+               z0 = svuqadd_m (p0, z0, -1))
+
+/*
+** uqadd_m127_s8_m:
+**     mov     (z[0-9]+\.b), #-127
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m127_s8_m, svint8_t,
+               z0 = svuqadd_n_s8_m (p0, z0, -127),
+               z0 = svuqadd_m (p0, z0, -127))
+
+/*
+** uqadd_m128_s8_m:
+**     mov     (z[0-9]+\.b), #-128
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m128_s8_m, svint8_t,
+               z0 = svuqadd_n_s8_m (p0, z0, -128),
+               z0 = svuqadd_m (p0, z0, -128))
+
+/*
+** uqadd_s8_z_tied1:
+**     movprfx z0\.b, p0/z, z0\.b
+**     suqadd  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s8_z_tied1, svint8_t, svuint8_t,
+            z0 = svuqadd_s8_z (p0, z0, z4),
+            z0 = svuqadd_z (p0, z0, z4))
+
+/*
+** uqadd_s8_z_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0\.b, p0/z, z4\.b
+**     suqadd  z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (uqadd_s8_z_tied2, svint8_t, svuint8_t,
+                z0_res = svuqadd_s8_z (p0, z4, z0),
+                z0_res = svuqadd_z (p0, z4, z0))
+
+/*
+** uqadd_s8_z_untied:
+**     movprfx z0\.b, p0/z, z1\.b
+**     suqadd  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s8_z_untied, svint8_t, svuint8_t,
+            z0 = svuqadd_s8_z (p0, z1, z4),
+            z0 = svuqadd_z (p0, z1, z4))
+
+/*
+** uqadd_w0_s8_z_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z0\.b
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_w0_s8_z_tied1, svint8_t, uint8_t,
+                z0 = svuqadd_n_s8_z (p0, z0, x0),
+                z0 = svuqadd_z (p0, z0, x0))
+
+/*
+** uqadd_w0_s8_z_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0\.b, p0/z, z1\.b
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_w0_s8_z_untied, svint8_t, uint8_t,
+                z0 = svuqadd_n_s8_z (p0, z1, x0),
+                z0 = svuqadd_z (p0, z1, x0))
+
+/*
+** uqadd_1_s8_z_tied1:
+**     mov     (z[0-9]+\.b), #1
+**     movprfx z0\.b, p0/z, z0\.b
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s8_z_tied1, svint8_t,
+               z0 = svuqadd_n_s8_z (p0, z0, 1),
+               z0 = svuqadd_z (p0, z0, 1))
+
+/*
+** uqadd_1_s8_z_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), #1
+**     movprfx z0\.b, p0/z, z1\.b
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s8_z_untied, svint8_t,
+               z0 = svuqadd_n_s8_z (p0, z1, 1),
+               z0 = svuqadd_z (p0, z1, 1))
+
+/*
+** uqadd_127_s8_z:
+**     mov     (z[0-9]+\.b), #127
+**     movprfx z0\.b, p0/z, z0\.b
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_127_s8_z, svint8_t,
+               z0 = svuqadd_n_s8_z (p0, z0, 127),
+               z0 = svuqadd_z (p0, z0, 127))
+
+/*
+** uqadd_128_s8_z:
+**     mov     (z[0-9]+\.b), #-128
+**     movprfx z0\.b, p0/z, z0\.b
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_128_s8_z, svint8_t,
+               z0 = svuqadd_n_s8_z (p0, z0, 128),
+               z0 = svuqadd_z (p0, z0, 128))
+
+/*
+** uqadd_255_s8_z:
+**     mov     (z[0-9]+\.b), #-1
+**     movprfx z0\.b, p0/z, z0\.b
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_255_s8_z, svint8_t,
+               z0 = svuqadd_n_s8_z (p0, z0, 255),
+               z0 = svuqadd_z (p0, z0, 255))
+
+/*
+** uqadd_m1_s8_z:
+**     mov     (z[0-9]+\.b), #-1
+**     movprfx z0\.b, p0/z, z0\.b
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m1_s8_z, svint8_t,
+               z0 = svuqadd_n_s8_z (p0, z0, -1),
+               z0 = svuqadd_z (p0, z0, -1))
+
+/*
+** uqadd_m127_s8_z:
+**     mov     (z[0-9]+\.b), #-127
+**     movprfx z0\.b, p0/z, z0\.b
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m127_s8_z, svint8_t,
+               z0 = svuqadd_n_s8_z (p0, z0, -127),
+               z0 = svuqadd_z (p0, z0, -127))
+
+/*
+** uqadd_m128_s8_z:
+**     mov     (z[0-9]+\.b), #-128
+**     movprfx z0\.b, p0/z, z0\.b
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m128_s8_z, svint8_t,
+               z0 = svuqadd_n_s8_z (p0, z0, -128),
+               z0 = svuqadd_z (p0, z0, -128))
+
+/*
+** uqadd_s8_x_tied1:
+**     suqadd  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s8_x_tied1, svint8_t, svuint8_t,
+            z0 = svuqadd_s8_x (p0, z0, z4),
+            z0 = svuqadd_x (p0, z0, z4))
+
+/*
+** uqadd_s8_x_tied2:
+**     mov     (z[0-9]+)\.d, z0\.d
+**     movprfx z0, z4
+**     suqadd  z0\.b, p0/m, z0\.b, \1\.b
+**     ret
+*/
+TEST_DUAL_Z_REV (uqadd_s8_x_tied2, svint8_t, svuint8_t,
+                z0_res = svuqadd_s8_x (p0, z4, z0),
+                z0_res = svuqadd_x (p0, z4, z0))
+
+/*
+** uqadd_s8_x_untied:
+**     movprfx z0, z1
+**     suqadd  z0\.b, p0/m, z0\.b, z4\.b
+**     ret
+*/
+TEST_DUAL_Z (uqadd_s8_x_untied, svint8_t, svuint8_t,
+            z0 = svuqadd_s8_x (p0, z1, z4),
+            z0 = svuqadd_x (p0, z1, z4))
+
+/*
+** uqadd_w0_s8_x_tied1:
+**     mov     (z[0-9]+\.b), w0
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_w0_s8_x_tied1, svint8_t, uint8_t,
+                z0 = svuqadd_n_s8_x (p0, z0, x0),
+                z0 = svuqadd_x (p0, z0, x0))
+
+/*
+** uqadd_w0_s8_x_untied:: { xfail *-*-*}
+**     mov     (z[0-9]+\.b), w0
+**     movprfx z0, z1
+**     suqadd  z0\.b, p0/m, z0\.b, \1
+**     ret
+*/
+TEST_UNIFORM_ZX (uqadd_w0_s8_x_untied, svint8_t, uint8_t,
+                z0 = svuqadd_n_s8_x (p0, z1, x0),
+                z0 = svuqadd_x (p0, z1, x0))
+
+/*
+** uqadd_1_s8_x_tied1:
+**     sqadd   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s8_x_tied1, svint8_t,
+               z0 = svuqadd_n_s8_x (p0, z0, 1),
+               z0 = svuqadd_x (p0, z0, 1))
+
+/*
+** uqadd_1_s8_x_untied:
+**     movprfx z0, z1
+**     sqadd   z0\.b, z0\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_1_s8_x_untied, svint8_t,
+               z0 = svuqadd_n_s8_x (p0, z1, 1),
+               z0 = svuqadd_x (p0, z1, 1))
+
+/*
+** uqadd_127_s8_x:
+**     sqadd   z0\.b, z0\.b, #127
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_127_s8_x, svint8_t,
+               z0 = svuqadd_n_s8_x (p0, z0, 127),
+               z0 = svuqadd_x (p0, z0, 127))
+
+/*
+** uqadd_128_s8_x:
+**     sqadd   z0\.b, z0\.b, #128
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_128_s8_x, svint8_t,
+               z0 = svuqadd_n_s8_x (p0, z0, 128),
+               z0 = svuqadd_x (p0, z0, 128))
+
+/*
+** uqadd_255_s8_x:
+**     sqadd   z0\.b, z0\.b, #255
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_255_s8_x, svint8_t,
+               z0 = svuqadd_n_s8_x (p0, z0, 255),
+               z0 = svuqadd_x (p0, z0, 255))
+
+/*
+** uqadd_m1_s8_x:
+**     sqadd   z0\.b, z0\.b, #255
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m1_s8_x, svint8_t,
+               z0 = svuqadd_n_s8_x (p0, z0, -1),
+               z0 = svuqadd_x (p0, z0, -1))
+
+/*
+** uqadd_m127_s8_x:
+**     sqadd   z0\.b, z0\.b, #129
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m127_s8_x, svint8_t,
+               z0 = svuqadd_n_s8_x (p0, z0, -127),
+               z0 = svuqadd_x (p0, z0, -127))
+
+/*
+** uqadd_m128_s8_x:
+**     sqadd   z0\.b, z0\.b, #128
+**     ret
+*/
+TEST_UNIFORM_Z (uqadd_m128_s8_x, svint8_t,
+               z0 = svuqadd_n_s8_x (p0, z0, -128),
+               z0 = svuqadd_x (p0, z0, -128))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilege_b16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilege_b16.c
new file mode 100644 (file)
index 0000000..f03012d
--- /dev/null
@@ -0,0 +1,173 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilege_rr_b16_s32:
+**     whilege p0\.h, w0, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_rr_b16_s32, int32_t,
+               p0 = svwhilege_b16_s32 (x0, x1),
+               p0 = svwhilege_b16 (x0, x1))
+
+/*
+** whilege_0r_b16_s32:
+**     whilege p0\.h, wzr, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_0r_b16_s32, int32_t,
+               p0 = svwhilege_b16_s32 (0, x1),
+               p0 = svwhilege_b16 (0, x1))
+
+/*
+** whilege_5r_b16_s32:
+**     mov     (w[0-9]+), #?5
+**     whilege p0\.h, \1, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_5r_b16_s32, int32_t,
+               p0 = svwhilege_b16_s32 (5, x1),
+               p0 = svwhilege_b16 (5, x1))
+
+/*
+** whilege_r0_b16_s32:
+**     whilege p0\.h, w0, wzr
+**     ret
+*/
+TEST_COMPARE_S (whilege_r0_b16_s32, int32_t,
+               p0 = svwhilege_b16_s32 (x0, 0),
+               p0 = svwhilege_b16 (x0, 0))
+
+/*
+** whilege_r5_b16_s32:
+**     mov     (w[0-9]+), #?5
+**     whilege p0\.h, w0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilege_r5_b16_s32, int32_t,
+               p0 = svwhilege_b16_s32 (x0, 5),
+               p0 = svwhilege_b16 (x0, 5))
+
+/*
+** whilege_rr_b16_s64:
+**     whilege p0\.h, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_rr_b16_s64, int64_t,
+               p0 = svwhilege_b16_s64 (x0, x1),
+               p0 = svwhilege_b16 (x0, x1))
+
+/*
+** whilege_0r_b16_s64:
+**     whilege p0\.h, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_0r_b16_s64, int64_t,
+               p0 = svwhilege_b16_s64 (0, x1),
+               p0 = svwhilege_b16 ((int64_t) 0, x1))
+
+/*
+** whilege_5r_b16_s64:
+**     mov     (x[0-9]+), #?5
+**     whilege p0\.h, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_5r_b16_s64, int64_t,
+               p0 = svwhilege_b16_s64 (5, x1),
+               p0 = svwhilege_b16 ((int64_t) 5, x1))
+
+/*
+** whilege_r0_b16_s64:
+**     whilege p0\.h, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilege_r0_b16_s64, int64_t,
+               p0 = svwhilege_b16_s64 (x0, 0),
+               p0 = svwhilege_b16 (x0, (int64_t) 0))
+
+/*
+** whilege_r5_b16_s64:
+**     mov     (x[0-9]+), #?5
+**     whilege p0\.h, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilege_r5_b16_s64, int64_t,
+               p0 = svwhilege_b16_s64 (x0, 5),
+               p0 = svwhilege_b16 (x0, (int64_t) 5))
+
+/*
+** whilege_rr_b16_u32:
+**     whilehs p0\.h, w0, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_rr_b16_u32, uint32_t,
+               p0 = svwhilege_b16_u32 (x0, x1),
+               p0 = svwhilege_b16 (x0, x1))
+
+/*
+** whilege_0r_b16_u32:
+**     whilehs p0\.h, wzr, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_0r_b16_u32, uint32_t,
+               p0 = svwhilege_b16_u32 (0, x1),
+               p0 = svwhilege_b16 ((uint32_t) 0, x1))
+
+/*
+** whilege_5r_b16_u32:
+**     mov     (w[0-9]+), #?5
+**     whilehs p0\.h, \1, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_5r_b16_u32, uint32_t,
+               p0 = svwhilege_b16_u32 (5, x1),
+               p0 = svwhilege_b16 ((uint32_t) 5, x1))
+
+/*
+** whilege_r5_b16_u32:
+**     mov     (w[0-9]+), #?5
+**     whilehs p0\.h, w0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilege_r5_b16_u32, uint32_t,
+               p0 = svwhilege_b16_u32 (x0, 5),
+               p0 = svwhilege_b16 (x0, (uint32_t) 5))
+
+/*
+** whilege_rr_b16_u64:
+**     whilehs p0\.h, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_rr_b16_u64, uint64_t,
+               p0 = svwhilege_b16_u64 (x0, x1),
+               p0 = svwhilege_b16 (x0, x1))
+
+/*
+** whilege_0r_b16_u64:
+**     whilehs p0\.h, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_0r_b16_u64, uint64_t,
+               p0 = svwhilege_b16_u64 (0, x1),
+               p0 = svwhilege_b16 ((uint64_t) 0, x1))
+
+/*
+** whilege_5r_b16_u64:
+**     mov     (x[0-9]+), #?5
+**     whilehs p0\.h, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_5r_b16_u64, uint64_t,
+               p0 = svwhilege_b16_u64 (5, x1),
+               p0 = svwhilege_b16 ((uint64_t) 5, x1))
+
+/*
+** whilege_r5_b16_u64:
+**     mov     (x[0-9]+), #?5
+**     whilehs p0\.h, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilege_r5_b16_u64, uint64_t,
+               p0 = svwhilege_b16_u64 (x0, 5),
+               p0 = svwhilege_b16 (x0, (uint64_t) 5))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilege_b32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilege_b32.c
new file mode 100644 (file)
index 0000000..02e5e79
--- /dev/null
@@ -0,0 +1,173 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilege_rr_b32_s32:
+**     whilege p0\.s, w0, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_rr_b32_s32, int32_t,
+               p0 = svwhilege_b32_s32 (x0, x1),
+               p0 = svwhilege_b32 (x0, x1))
+
+/*
+** whilege_0r_b32_s32:
+**     whilege p0\.s, wzr, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_0r_b32_s32, int32_t,
+               p0 = svwhilege_b32_s32 (0, x1),
+               p0 = svwhilege_b32 (0, x1))
+
+/*
+** whilege_5r_b32_s32:
+**     mov     (w[0-9]+), #?5
+**     whilege p0\.s, \1, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_5r_b32_s32, int32_t,
+               p0 = svwhilege_b32_s32 (5, x1),
+               p0 = svwhilege_b32 (5, x1))
+
+/*
+** whilege_r0_b32_s32:
+**     whilege p0\.s, w0, wzr
+**     ret
+*/
+TEST_COMPARE_S (whilege_r0_b32_s32, int32_t,
+               p0 = svwhilege_b32_s32 (x0, 0),
+               p0 = svwhilege_b32 (x0, 0))
+
+/*
+** whilege_r5_b32_s32:
+**     mov     (w[0-9]+), #?5
+**     whilege p0\.s, w0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilege_r5_b32_s32, int32_t,
+               p0 = svwhilege_b32_s32 (x0, 5),
+               p0 = svwhilege_b32 (x0, 5))
+
+/*
+** whilege_rr_b32_s64:
+**     whilege p0\.s, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_rr_b32_s64, int64_t,
+               p0 = svwhilege_b32_s64 (x0, x1),
+               p0 = svwhilege_b32 (x0, x1))
+
+/*
+** whilege_0r_b32_s64:
+**     whilege p0\.s, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_0r_b32_s64, int64_t,
+               p0 = svwhilege_b32_s64 (0, x1),
+               p0 = svwhilege_b32 ((int64_t) 0, x1))
+
+/*
+** whilege_5r_b32_s64:
+**     mov     (x[0-9]+), #?5
+**     whilege p0\.s, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_5r_b32_s64, int64_t,
+               p0 = svwhilege_b32_s64 (5, x1),
+               p0 = svwhilege_b32 ((int64_t) 5, x1))
+
+/*
+** whilege_r0_b32_s64:
+**     whilege p0\.s, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilege_r0_b32_s64, int64_t,
+               p0 = svwhilege_b32_s64 (x0, 0),
+               p0 = svwhilege_b32 (x0, (int64_t) 0))
+
+/*
+** whilege_r5_b32_s64:
+**     mov     (x[0-9]+), #?5
+**     whilege p0\.s, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilege_r5_b32_s64, int64_t,
+               p0 = svwhilege_b32_s64 (x0, 5),
+               p0 = svwhilege_b32 (x0, (int64_t) 5))
+
+/*
+** whilege_rr_b32_u32:
+**     whilehs p0\.s, w0, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_rr_b32_u32, uint32_t,
+               p0 = svwhilege_b32_u32 (x0, x1),
+               p0 = svwhilege_b32 (x0, x1))
+
+/*
+** whilege_0r_b32_u32:
+**     whilehs p0\.s, wzr, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_0r_b32_u32, uint32_t,
+               p0 = svwhilege_b32_u32 (0, x1),
+               p0 = svwhilege_b32 ((uint32_t) 0, x1))
+
+/*
+** whilege_5r_b32_u32:
+**     mov     (w[0-9]+), #?5
+**     whilehs p0\.s, \1, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_5r_b32_u32, uint32_t,
+               p0 = svwhilege_b32_u32 (5, x1),
+               p0 = svwhilege_b32 ((uint32_t) 5, x1))
+
+/*
+** whilege_r5_b32_u32:
+**     mov     (w[0-9]+), #?5
+**     whilehs p0\.s, w0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilege_r5_b32_u32, uint32_t,
+               p0 = svwhilege_b32_u32 (x0, 5),
+               p0 = svwhilege_b32 (x0, (uint32_t) 5))
+
+/*
+** whilege_rr_b32_u64:
+**     whilehs p0\.s, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_rr_b32_u64, uint64_t,
+               p0 = svwhilege_b32_u64 (x0, x1),
+               p0 = svwhilege_b32 (x0, x1))
+
+/*
+** whilege_0r_b32_u64:
+**     whilehs p0\.s, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_0r_b32_u64, uint64_t,
+               p0 = svwhilege_b32_u64 (0, x1),
+               p0 = svwhilege_b32 ((uint64_t) 0, x1))
+
+/*
+** whilege_5r_b32_u64:
+**     mov     (x[0-9]+), #?5
+**     whilehs p0\.s, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_5r_b32_u64, uint64_t,
+               p0 = svwhilege_b32_u64 (5, x1),
+               p0 = svwhilege_b32 ((uint64_t) 5, x1))
+
+/*
+** whilege_r5_b32_u64:
+**     mov     (x[0-9]+), #?5
+**     whilehs p0\.s, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilege_r5_b32_u64, uint64_t,
+               p0 = svwhilege_b32_u64 (x0, 5),
+               p0 = svwhilege_b32 (x0, (uint64_t) 5))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilege_b64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilege_b64.c
new file mode 100644 (file)
index 0000000..e838149
--- /dev/null
@@ -0,0 +1,173 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilege_rr_b64_s32:
+**     whilege p0\.d, w0, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_rr_b64_s32, int32_t,
+               p0 = svwhilege_b64_s32 (x0, x1),
+               p0 = svwhilege_b64 (x0, x1))
+
+/*
+** whilege_0r_b64_s32:
+**     whilege p0\.d, wzr, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_0r_b64_s32, int32_t,
+               p0 = svwhilege_b64_s32 (0, x1),
+               p0 = svwhilege_b64 (0, x1))
+
+/*
+** whilege_5r_b64_s32:
+**     mov     (w[0-9]+), #?5
+**     whilege p0\.d, \1, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_5r_b64_s32, int32_t,
+               p0 = svwhilege_b64_s32 (5, x1),
+               p0 = svwhilege_b64 (5, x1))
+
+/*
+** whilege_r0_b64_s32:
+**     whilege p0\.d, w0, wzr
+**     ret
+*/
+TEST_COMPARE_S (whilege_r0_b64_s32, int32_t,
+               p0 = svwhilege_b64_s32 (x0, 0),
+               p0 = svwhilege_b64 (x0, 0))
+
+/*
+** whilege_r5_b64_s32:
+**     mov     (w[0-9]+), #?5
+**     whilege p0\.d, w0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilege_r5_b64_s32, int32_t,
+               p0 = svwhilege_b64_s32 (x0, 5),
+               p0 = svwhilege_b64 (x0, 5))
+
+/*
+** whilege_rr_b64_s64:
+**     whilege p0\.d, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_rr_b64_s64, int64_t,
+               p0 = svwhilege_b64_s64 (x0, x1),
+               p0 = svwhilege_b64 (x0, x1))
+
+/*
+** whilege_0r_b64_s64:
+**     whilege p0\.d, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_0r_b64_s64, int64_t,
+               p0 = svwhilege_b64_s64 (0, x1),
+               p0 = svwhilege_b64 ((int64_t) 0, x1))
+
+/*
+** whilege_5r_b64_s64:
+**     mov     (x[0-9]+), #?5
+**     whilege p0\.d, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_5r_b64_s64, int64_t,
+               p0 = svwhilege_b64_s64 (5, x1),
+               p0 = svwhilege_b64 ((int64_t) 5, x1))
+
+/*
+** whilege_r0_b64_s64:
+**     whilege p0\.d, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilege_r0_b64_s64, int64_t,
+               p0 = svwhilege_b64_s64 (x0, 0),
+               p0 = svwhilege_b64 (x0, (int64_t) 0))
+
+/*
+** whilege_r5_b64_s64:
+**     mov     (x[0-9]+), #?5
+**     whilege p0\.d, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilege_r5_b64_s64, int64_t,
+               p0 = svwhilege_b64_s64 (x0, 5),
+               p0 = svwhilege_b64 (x0, (int64_t) 5))
+
+/*
+** whilege_rr_b64_u32:
+**     whilehs p0\.d, w0, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_rr_b64_u32, uint32_t,
+               p0 = svwhilege_b64_u32 (x0, x1),
+               p0 = svwhilege_b64 (x0, x1))
+
+/*
+** whilege_0r_b64_u32:
+**     whilehs p0\.d, wzr, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_0r_b64_u32, uint32_t,
+               p0 = svwhilege_b64_u32 (0, x1),
+               p0 = svwhilege_b64 ((uint32_t) 0, x1))
+
+/*
+** whilege_5r_b64_u32:
+**     mov     (w[0-9]+), #?5
+**     whilehs p0\.d, \1, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_5r_b64_u32, uint32_t,
+               p0 = svwhilege_b64_u32 (5, x1),
+               p0 = svwhilege_b64 ((uint32_t) 5, x1))
+
+/*
+** whilege_r5_b64_u32:
+**     mov     (w[0-9]+), #?5
+**     whilehs p0\.d, w0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilege_r5_b64_u32, uint32_t,
+               p0 = svwhilege_b64_u32 (x0, 5),
+               p0 = svwhilege_b64 (x0, (uint32_t) 5))
+
+/*
+** whilege_rr_b64_u64:
+**     whilehs p0\.d, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_rr_b64_u64, uint64_t,
+               p0 = svwhilege_b64_u64 (x0, x1),
+               p0 = svwhilege_b64 (x0, x1))
+
+/*
+** whilege_0r_b64_u64:
+**     whilehs p0\.d, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_0r_b64_u64, uint64_t,
+               p0 = svwhilege_b64_u64 (0, x1),
+               p0 = svwhilege_b64 ((uint64_t) 0, x1))
+
+/*
+** whilege_5r_b64_u64:
+**     mov     (x[0-9]+), #?5
+**     whilehs p0\.d, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_5r_b64_u64, uint64_t,
+               p0 = svwhilege_b64_u64 (5, x1),
+               p0 = svwhilege_b64 ((uint64_t) 5, x1))
+
+/*
+** whilege_r5_b64_u64:
+**     mov     (x[0-9]+), #?5
+**     whilehs p0\.d, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilege_r5_b64_u64, uint64_t,
+               p0 = svwhilege_b64_u64 (x0, 5),
+               p0 = svwhilege_b64 (x0, (uint64_t) 5))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilege_b8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilege_b8.c
new file mode 100644 (file)
index 0000000..3c5a8ed
--- /dev/null
@@ -0,0 +1,173 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilege_rr_b8_s32:
+**     whilege p0\.b, w0, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_rr_b8_s32, int32_t,
+               p0 = svwhilege_b8_s32 (x0, x1),
+               p0 = svwhilege_b8 (x0, x1))
+
+/*
+** whilege_0r_b8_s32:
+**     whilege p0\.b, wzr, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_0r_b8_s32, int32_t,
+               p0 = svwhilege_b8_s32 (0, x1),
+               p0 = svwhilege_b8 (0, x1))
+
+/*
+** whilege_5r_b8_s32:
+**     mov     (w[0-9]+), #?5
+**     whilege p0\.b, \1, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_5r_b8_s32, int32_t,
+               p0 = svwhilege_b8_s32 (5, x1),
+               p0 = svwhilege_b8 (5, x1))
+
+/*
+** whilege_r0_b8_s32:
+**     whilege p0\.b, w0, wzr
+**     ret
+*/
+TEST_COMPARE_S (whilege_r0_b8_s32, int32_t,
+               p0 = svwhilege_b8_s32 (x0, 0),
+               p0 = svwhilege_b8 (x0, 0))
+
+/*
+** whilege_r5_b8_s32:
+**     mov     (w[0-9]+), #?5
+**     whilege p0\.b, w0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilege_r5_b8_s32, int32_t,
+               p0 = svwhilege_b8_s32 (x0, 5),
+               p0 = svwhilege_b8 (x0, 5))
+
+/*
+** whilege_rr_b8_s64:
+**     whilege p0\.b, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_rr_b8_s64, int64_t,
+               p0 = svwhilege_b8_s64 (x0, x1),
+               p0 = svwhilege_b8 (x0, x1))
+
+/*
+** whilege_0r_b8_s64:
+**     whilege p0\.b, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_0r_b8_s64, int64_t,
+               p0 = svwhilege_b8_s64 (0, x1),
+               p0 = svwhilege_b8 ((int64_t) 0, x1))
+
+/*
+** whilege_5r_b8_s64:
+**     mov     (x[0-9]+), #?5
+**     whilege p0\.b, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_5r_b8_s64, int64_t,
+               p0 = svwhilege_b8_s64 (5, x1),
+               p0 = svwhilege_b8 ((int64_t) 5, x1))
+
+/*
+** whilege_r0_b8_s64:
+**     whilege p0\.b, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilege_r0_b8_s64, int64_t,
+               p0 = svwhilege_b8_s64 (x0, 0),
+               p0 = svwhilege_b8 (x0, (int64_t) 0))
+
+/*
+** whilege_r5_b8_s64:
+**     mov     (x[0-9]+), #?5
+**     whilege p0\.b, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilege_r5_b8_s64, int64_t,
+               p0 = svwhilege_b8_s64 (x0, 5),
+               p0 = svwhilege_b8 (x0, (int64_t) 5))
+
+/*
+** whilege_rr_b8_u32:
+**     whilehs p0\.b, w0, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_rr_b8_u32, uint32_t,
+               p0 = svwhilege_b8_u32 (x0, x1),
+               p0 = svwhilege_b8 (x0, x1))
+
+/*
+** whilege_0r_b8_u32:
+**     whilehs p0\.b, wzr, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_0r_b8_u32, uint32_t,
+               p0 = svwhilege_b8_u32 (0, x1),
+               p0 = svwhilege_b8 ((uint32_t) 0, x1))
+
+/*
+** whilege_5r_b8_u32:
+**     mov     (w[0-9]+), #?5
+**     whilehs p0\.b, \1, w1
+**     ret
+*/
+TEST_COMPARE_S (whilege_5r_b8_u32, uint32_t,
+               p0 = svwhilege_b8_u32 (5, x1),
+               p0 = svwhilege_b8 ((uint32_t) 5, x1))
+
+/*
+** whilege_r5_b8_u32:
+**     mov     (w[0-9]+), #?5
+**     whilehs p0\.b, w0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilege_r5_b8_u32, uint32_t,
+               p0 = svwhilege_b8_u32 (x0, 5),
+               p0 = svwhilege_b8 (x0, (uint32_t) 5))
+
+/*
+** whilege_rr_b8_u64:
+**     whilehs p0\.b, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_rr_b8_u64, uint64_t,
+               p0 = svwhilege_b8_u64 (x0, x1),
+               p0 = svwhilege_b8 (x0, x1))
+
+/*
+** whilege_0r_b8_u64:
+**     whilehs p0\.b, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_0r_b8_u64, uint64_t,
+               p0 = svwhilege_b8_u64 (0, x1),
+               p0 = svwhilege_b8 ((uint64_t) 0, x1))
+
+/*
+** whilege_5r_b8_u64:
+**     mov     (x[0-9]+), #?5
+**     whilehs p0\.b, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilege_5r_b8_u64, uint64_t,
+               p0 = svwhilege_b8_u64 (5, x1),
+               p0 = svwhilege_b8 ((uint64_t) 5, x1))
+
+/*
+** whilege_r5_b8_u64:
+**     mov     (x[0-9]+), #?5
+**     whilehs p0\.b, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilege_r5_b8_u64, uint64_t,
+               p0 = svwhilege_b8_u64 (x0, 5),
+               p0 = svwhilege_b8 (x0, (uint64_t) 5))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilegt_b16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilegt_b16.c
new file mode 100644 (file)
index 0000000..2297c5d
--- /dev/null
@@ -0,0 +1,173 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilegt_rr_b16_s32:
+**     whilegt p0\.h, w0, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_rr_b16_s32, int32_t,
+               p0 = svwhilegt_b16_s32 (x0, x1),
+               p0 = svwhilegt_b16 (x0, x1))
+
+/*
+** whilegt_0r_b16_s32:
+**     whilegt p0\.h, wzr, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_0r_b16_s32, int32_t,
+               p0 = svwhilegt_b16_s32 (0, x1),
+               p0 = svwhilegt_b16 (0, x1))
+
+/*
+** whilegt_5r_b16_s32:
+**     mov     (w[0-9]+), #?5
+**     whilegt p0\.h, \1, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_5r_b16_s32, int32_t,
+               p0 = svwhilegt_b16_s32 (5, x1),
+               p0 = svwhilegt_b16 (5, x1))
+
+/*
+** whilegt_r0_b16_s32:
+**     whilegt p0\.h, w0, wzr
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r0_b16_s32, int32_t,
+               p0 = svwhilegt_b16_s32 (x0, 0),
+               p0 = svwhilegt_b16 (x0, 0))
+
+/*
+** whilegt_r5_b16_s32:
+**     mov     (w[0-9]+), #?5
+**     whilegt p0\.h, w0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r5_b16_s32, int32_t,
+               p0 = svwhilegt_b16_s32 (x0, 5),
+               p0 = svwhilegt_b16 (x0, 5))
+
+/*
+** whilegt_rr_b16_s64:
+**     whilegt p0\.h, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_rr_b16_s64, int64_t,
+               p0 = svwhilegt_b16_s64 (x0, x1),
+               p0 = svwhilegt_b16 (x0, x1))
+
+/*
+** whilegt_0r_b16_s64:
+**     whilegt p0\.h, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_0r_b16_s64, int64_t,
+               p0 = svwhilegt_b16_s64 (0, x1),
+               p0 = svwhilegt_b16 ((int64_t) 0, x1))
+
+/*
+** whilegt_5r_b16_s64:
+**     mov     (x[0-9]+), #?5
+**     whilegt p0\.h, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_5r_b16_s64, int64_t,
+               p0 = svwhilegt_b16_s64 (5, x1),
+               p0 = svwhilegt_b16 ((int64_t) 5, x1))
+
+/*
+** whilegt_r0_b16_s64:
+**     whilegt p0\.h, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r0_b16_s64, int64_t,
+               p0 = svwhilegt_b16_s64 (x0, 0),
+               p0 = svwhilegt_b16 (x0, (int64_t) 0))
+
+/*
+** whilegt_r5_b16_s64:
+**     mov     (x[0-9]+), #?5
+**     whilegt p0\.h, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r5_b16_s64, int64_t,
+               p0 = svwhilegt_b16_s64 (x0, 5),
+               p0 = svwhilegt_b16 (x0, (int64_t) 5))
+
+/*
+** whilegt_rr_b16_u32:
+**     whilehi p0\.h, w0, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_rr_b16_u32, uint32_t,
+               p0 = svwhilegt_b16_u32 (x0, x1),
+               p0 = svwhilegt_b16 (x0, x1))
+
+/*
+** whilegt_0r_b16_u32:
+**     whilehi p0\.h, wzr, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_0r_b16_u32, uint32_t,
+               p0 = svwhilegt_b16_u32 (0, x1),
+               p0 = svwhilegt_b16 ((uint32_t) 0, x1))
+
+/*
+** whilegt_5r_b16_u32:
+**     mov     (w[0-9]+), #?5
+**     whilehi p0\.h, \1, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_5r_b16_u32, uint32_t,
+               p0 = svwhilegt_b16_u32 (5, x1),
+               p0 = svwhilegt_b16 ((uint32_t) 5, x1))
+
+/*
+** whilegt_r5_b16_u32:
+**     mov     (w[0-9]+), #?5
+**     whilehi p0\.h, w0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r5_b16_u32, uint32_t,
+               p0 = svwhilegt_b16_u32 (x0, 5),
+               p0 = svwhilegt_b16 (x0, (uint32_t) 5))
+
+/*
+** whilegt_rr_b16_u64:
+**     whilehi p0\.h, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_rr_b16_u64, uint64_t,
+               p0 = svwhilegt_b16_u64 (x0, x1),
+               p0 = svwhilegt_b16 (x0, x1))
+
+/*
+** whilegt_0r_b16_u64:
+**     whilehi p0\.h, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_0r_b16_u64, uint64_t,
+               p0 = svwhilegt_b16_u64 (0, x1),
+               p0 = svwhilegt_b16 ((uint64_t) 0, x1))
+
+/*
+** whilegt_5r_b16_u64:
+**     mov     (x[0-9]+), #?5
+**     whilehi p0\.h, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_5r_b16_u64, uint64_t,
+               p0 = svwhilegt_b16_u64 (5, x1),
+               p0 = svwhilegt_b16 ((uint64_t) 5, x1))
+
+/*
+** whilegt_r5_b16_u64:
+**     mov     (x[0-9]+), #?5
+**     whilehi p0\.h, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r5_b16_u64, uint64_t,
+               p0 = svwhilegt_b16_u64 (x0, 5),
+               p0 = svwhilegt_b16 (x0, (uint64_t) 5))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilegt_b32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilegt_b32.c
new file mode 100644 (file)
index 0000000..8ba0c85
--- /dev/null
@@ -0,0 +1,173 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilegt_rr_b32_s32:
+**     whilegt p0\.s, w0, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_rr_b32_s32, int32_t,
+               p0 = svwhilegt_b32_s32 (x0, x1),
+               p0 = svwhilegt_b32 (x0, x1))
+
+/*
+** whilegt_0r_b32_s32:
+**     whilegt p0\.s, wzr, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_0r_b32_s32, int32_t,
+               p0 = svwhilegt_b32_s32 (0, x1),
+               p0 = svwhilegt_b32 (0, x1))
+
+/*
+** whilegt_5r_b32_s32:
+**     mov     (w[0-9]+), #?5
+**     whilegt p0\.s, \1, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_5r_b32_s32, int32_t,
+               p0 = svwhilegt_b32_s32 (5, x1),
+               p0 = svwhilegt_b32 (5, x1))
+
+/*
+** whilegt_r0_b32_s32:
+**     whilegt p0\.s, w0, wzr
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r0_b32_s32, int32_t,
+               p0 = svwhilegt_b32_s32 (x0, 0),
+               p0 = svwhilegt_b32 (x0, 0))
+
+/*
+** whilegt_r5_b32_s32:
+**     mov     (w[0-9]+), #?5
+**     whilegt p0\.s, w0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r5_b32_s32, int32_t,
+               p0 = svwhilegt_b32_s32 (x0, 5),
+               p0 = svwhilegt_b32 (x0, 5))
+
+/*
+** whilegt_rr_b32_s64:
+**     whilegt p0\.s, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_rr_b32_s64, int64_t,
+               p0 = svwhilegt_b32_s64 (x0, x1),
+               p0 = svwhilegt_b32 (x0, x1))
+
+/*
+** whilegt_0r_b32_s64:
+**     whilegt p0\.s, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_0r_b32_s64, int64_t,
+               p0 = svwhilegt_b32_s64 (0, x1),
+               p0 = svwhilegt_b32 ((int64_t) 0, x1))
+
+/*
+** whilegt_5r_b32_s64:
+**     mov     (x[0-9]+), #?5
+**     whilegt p0\.s, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_5r_b32_s64, int64_t,
+               p0 = svwhilegt_b32_s64 (5, x1),
+               p0 = svwhilegt_b32 ((int64_t) 5, x1))
+
+/*
+** whilegt_r0_b32_s64:
+**     whilegt p0\.s, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r0_b32_s64, int64_t,
+               p0 = svwhilegt_b32_s64 (x0, 0),
+               p0 = svwhilegt_b32 (x0, (int64_t) 0))
+
+/*
+** whilegt_r5_b32_s64:
+**     mov     (x[0-9]+), #?5
+**     whilegt p0\.s, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r5_b32_s64, int64_t,
+               p0 = svwhilegt_b32_s64 (x0, 5),
+               p0 = svwhilegt_b32 (x0, (int64_t) 5))
+
+/*
+** whilegt_rr_b32_u32:
+**     whilehi p0\.s, w0, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_rr_b32_u32, uint32_t,
+               p0 = svwhilegt_b32_u32 (x0, x1),
+               p0 = svwhilegt_b32 (x0, x1))
+
+/*
+** whilegt_0r_b32_u32:
+**     whilehi p0\.s, wzr, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_0r_b32_u32, uint32_t,
+               p0 = svwhilegt_b32_u32 (0, x1),
+               p0 = svwhilegt_b32 ((uint32_t) 0, x1))
+
+/*
+** whilegt_5r_b32_u32:
+**     mov     (w[0-9]+), #?5
+**     whilehi p0\.s, \1, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_5r_b32_u32, uint32_t,
+               p0 = svwhilegt_b32_u32 (5, x1),
+               p0 = svwhilegt_b32 ((uint32_t) 5, x1))
+
+/*
+** whilegt_r5_b32_u32:
+**     mov     (w[0-9]+), #?5
+**     whilehi p0\.s, w0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r5_b32_u32, uint32_t,
+               p0 = svwhilegt_b32_u32 (x0, 5),
+               p0 = svwhilegt_b32 (x0, (uint32_t) 5))
+
+/*
+** whilegt_rr_b32_u64:
+**     whilehi p0\.s, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_rr_b32_u64, uint64_t,
+               p0 = svwhilegt_b32_u64 (x0, x1),
+               p0 = svwhilegt_b32 (x0, x1))
+
+/*
+** whilegt_0r_b32_u64:
+**     whilehi p0\.s, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_0r_b32_u64, uint64_t,
+               p0 = svwhilegt_b32_u64 (0, x1),
+               p0 = svwhilegt_b32 ((uint64_t) 0, x1))
+
+/*
+** whilegt_5r_b32_u64:
+**     mov     (x[0-9]+), #?5
+**     whilehi p0\.s, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_5r_b32_u64, uint64_t,
+               p0 = svwhilegt_b32_u64 (5, x1),
+               p0 = svwhilegt_b32 ((uint64_t) 5, x1))
+
+/*
+** whilegt_r5_b32_u64:
+**     mov     (x[0-9]+), #?5
+**     whilehi p0\.s, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r5_b32_u64, uint64_t,
+               p0 = svwhilegt_b32_u64 (x0, 5),
+               p0 = svwhilegt_b32 (x0, (uint64_t) 5))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilegt_b64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilegt_b64.c
new file mode 100644 (file)
index 0000000..b124724
--- /dev/null
@@ -0,0 +1,173 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilegt_rr_b64_s32:
+**     whilegt p0\.d, w0, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_rr_b64_s32, int32_t,
+               p0 = svwhilegt_b64_s32 (x0, x1),
+               p0 = svwhilegt_b64 (x0, x1))
+
+/*
+** whilegt_0r_b64_s32:
+**     whilegt p0\.d, wzr, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_0r_b64_s32, int32_t,
+               p0 = svwhilegt_b64_s32 (0, x1),
+               p0 = svwhilegt_b64 (0, x1))
+
+/*
+** whilegt_5r_b64_s32:
+**     mov     (w[0-9]+), #?5
+**     whilegt p0\.d, \1, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_5r_b64_s32, int32_t,
+               p0 = svwhilegt_b64_s32 (5, x1),
+               p0 = svwhilegt_b64 (5, x1))
+
+/*
+** whilegt_r0_b64_s32:
+**     whilegt p0\.d, w0, wzr
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r0_b64_s32, int32_t,
+               p0 = svwhilegt_b64_s32 (x0, 0),
+               p0 = svwhilegt_b64 (x0, 0))
+
+/*
+** whilegt_r5_b64_s32:
+**     mov     (w[0-9]+), #?5
+**     whilegt p0\.d, w0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r5_b64_s32, int32_t,
+               p0 = svwhilegt_b64_s32 (x0, 5),
+               p0 = svwhilegt_b64 (x0, 5))
+
+/*
+** whilegt_rr_b64_s64:
+**     whilegt p0\.d, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_rr_b64_s64, int64_t,
+               p0 = svwhilegt_b64_s64 (x0, x1),
+               p0 = svwhilegt_b64 (x0, x1))
+
+/*
+** whilegt_0r_b64_s64:
+**     whilegt p0\.d, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_0r_b64_s64, int64_t,
+               p0 = svwhilegt_b64_s64 (0, x1),
+               p0 = svwhilegt_b64 ((int64_t) 0, x1))
+
+/*
+** whilegt_5r_b64_s64:
+**     mov     (x[0-9]+), #?5
+**     whilegt p0\.d, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_5r_b64_s64, int64_t,
+               p0 = svwhilegt_b64_s64 (5, x1),
+               p0 = svwhilegt_b64 ((int64_t) 5, x1))
+
+/*
+** whilegt_r0_b64_s64:
+**     whilegt p0\.d, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r0_b64_s64, int64_t,
+               p0 = svwhilegt_b64_s64 (x0, 0),
+               p0 = svwhilegt_b64 (x0, (int64_t) 0))
+
+/*
+** whilegt_r5_b64_s64:
+**     mov     (x[0-9]+), #?5
+**     whilegt p0\.d, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r5_b64_s64, int64_t,
+               p0 = svwhilegt_b64_s64 (x0, 5),
+               p0 = svwhilegt_b64 (x0, (int64_t) 5))
+
+/*
+** whilegt_rr_b64_u32:
+**     whilehi p0\.d, w0, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_rr_b64_u32, uint32_t,
+               p0 = svwhilegt_b64_u32 (x0, x1),
+               p0 = svwhilegt_b64 (x0, x1))
+
+/*
+** whilegt_0r_b64_u32:
+**     whilehi p0\.d, wzr, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_0r_b64_u32, uint32_t,
+               p0 = svwhilegt_b64_u32 (0, x1),
+               p0 = svwhilegt_b64 ((uint32_t) 0, x1))
+
+/*
+** whilegt_5r_b64_u32:
+**     mov     (w[0-9]+), #?5
+**     whilehi p0\.d, \1, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_5r_b64_u32, uint32_t,
+               p0 = svwhilegt_b64_u32 (5, x1),
+               p0 = svwhilegt_b64 ((uint32_t) 5, x1))
+
+/*
+** whilegt_r5_b64_u32:
+**     mov     (w[0-9]+), #?5
+**     whilehi p0\.d, w0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r5_b64_u32, uint32_t,
+               p0 = svwhilegt_b64_u32 (x0, 5),
+               p0 = svwhilegt_b64 (x0, (uint32_t) 5))
+
+/*
+** whilegt_rr_b64_u64:
+**     whilehi p0\.d, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_rr_b64_u64, uint64_t,
+               p0 = svwhilegt_b64_u64 (x0, x1),
+               p0 = svwhilegt_b64 (x0, x1))
+
+/*
+** whilegt_0r_b64_u64:
+**     whilehi p0\.d, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_0r_b64_u64, uint64_t,
+               p0 = svwhilegt_b64_u64 (0, x1),
+               p0 = svwhilegt_b64 ((uint64_t) 0, x1))
+
+/*
+** whilegt_5r_b64_u64:
+**     mov     (x[0-9]+), #?5
+**     whilehi p0\.d, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_5r_b64_u64, uint64_t,
+               p0 = svwhilegt_b64_u64 (5, x1),
+               p0 = svwhilegt_b64 ((uint64_t) 5, x1))
+
+/*
+** whilegt_r5_b64_u64:
+**     mov     (x[0-9]+), #?5
+**     whilehi p0\.d, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r5_b64_u64, uint64_t,
+               p0 = svwhilegt_b64_u64 (x0, 5),
+               p0 = svwhilegt_b64 (x0, (uint64_t) 5))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilegt_b8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilegt_b8.c
new file mode 100644 (file)
index 0000000..e5362ca
--- /dev/null
@@ -0,0 +1,173 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilegt_rr_b8_s32:
+**     whilegt p0\.b, w0, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_rr_b8_s32, int32_t,
+               p0 = svwhilegt_b8_s32 (x0, x1),
+               p0 = svwhilegt_b8 (x0, x1))
+
+/*
+** whilegt_0r_b8_s32:
+**     whilegt p0\.b, wzr, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_0r_b8_s32, int32_t,
+               p0 = svwhilegt_b8_s32 (0, x1),
+               p0 = svwhilegt_b8 (0, x1))
+
+/*
+** whilegt_5r_b8_s32:
+**     mov     (w[0-9]+), #?5
+**     whilegt p0\.b, \1, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_5r_b8_s32, int32_t,
+               p0 = svwhilegt_b8_s32 (5, x1),
+               p0 = svwhilegt_b8 (5, x1))
+
+/*
+** whilegt_r0_b8_s32:
+**     whilegt p0\.b, w0, wzr
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r0_b8_s32, int32_t,
+               p0 = svwhilegt_b8_s32 (x0, 0),
+               p0 = svwhilegt_b8 (x0, 0))
+
+/*
+** whilegt_r5_b8_s32:
+**     mov     (w[0-9]+), #?5
+**     whilegt p0\.b, w0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r5_b8_s32, int32_t,
+               p0 = svwhilegt_b8_s32 (x0, 5),
+               p0 = svwhilegt_b8 (x0, 5))
+
+/*
+** whilegt_rr_b8_s64:
+**     whilegt p0\.b, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_rr_b8_s64, int64_t,
+               p0 = svwhilegt_b8_s64 (x0, x1),
+               p0 = svwhilegt_b8 (x0, x1))
+
+/*
+** whilegt_0r_b8_s64:
+**     whilegt p0\.b, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_0r_b8_s64, int64_t,
+               p0 = svwhilegt_b8_s64 (0, x1),
+               p0 = svwhilegt_b8 ((int64_t) 0, x1))
+
+/*
+** whilegt_5r_b8_s64:
+**     mov     (x[0-9]+), #?5
+**     whilegt p0\.b, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_5r_b8_s64, int64_t,
+               p0 = svwhilegt_b8_s64 (5, x1),
+               p0 = svwhilegt_b8 ((int64_t) 5, x1))
+
+/*
+** whilegt_r0_b8_s64:
+**     whilegt p0\.b, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r0_b8_s64, int64_t,
+               p0 = svwhilegt_b8_s64 (x0, 0),
+               p0 = svwhilegt_b8 (x0, (int64_t) 0))
+
+/*
+** whilegt_r5_b8_s64:
+**     mov     (x[0-9]+), #?5
+**     whilegt p0\.b, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r5_b8_s64, int64_t,
+               p0 = svwhilegt_b8_s64 (x0, 5),
+               p0 = svwhilegt_b8 (x0, (int64_t) 5))
+
+/*
+** whilegt_rr_b8_u32:
+**     whilehi p0\.b, w0, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_rr_b8_u32, uint32_t,
+               p0 = svwhilegt_b8_u32 (x0, x1),
+               p0 = svwhilegt_b8 (x0, x1))
+
+/*
+** whilegt_0r_b8_u32:
+**     whilehi p0\.b, wzr, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_0r_b8_u32, uint32_t,
+               p0 = svwhilegt_b8_u32 (0, x1),
+               p0 = svwhilegt_b8 ((uint32_t) 0, x1))
+
+/*
+** whilegt_5r_b8_u32:
+**     mov     (w[0-9]+), #?5
+**     whilehi p0\.b, \1, w1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_5r_b8_u32, uint32_t,
+               p0 = svwhilegt_b8_u32 (5, x1),
+               p0 = svwhilegt_b8 ((uint32_t) 5, x1))
+
+/*
+** whilegt_r5_b8_u32:
+**     mov     (w[0-9]+), #?5
+**     whilehi p0\.b, w0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r5_b8_u32, uint32_t,
+               p0 = svwhilegt_b8_u32 (x0, 5),
+               p0 = svwhilegt_b8 (x0, (uint32_t) 5))
+
+/*
+** whilegt_rr_b8_u64:
+**     whilehi p0\.b, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_rr_b8_u64, uint64_t,
+               p0 = svwhilegt_b8_u64 (x0, x1),
+               p0 = svwhilegt_b8 (x0, x1))
+
+/*
+** whilegt_0r_b8_u64:
+**     whilehi p0\.b, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_0r_b8_u64, uint64_t,
+               p0 = svwhilegt_b8_u64 (0, x1),
+               p0 = svwhilegt_b8 ((uint64_t) 0, x1))
+
+/*
+** whilegt_5r_b8_u64:
+**     mov     (x[0-9]+), #?5
+**     whilehi p0\.b, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_5r_b8_u64, uint64_t,
+               p0 = svwhilegt_b8_u64 (5, x1),
+               p0 = svwhilegt_b8 ((uint64_t) 5, x1))
+
+/*
+** whilegt_r5_b8_u64:
+**     mov     (x[0-9]+), #?5
+**     whilehi p0\.b, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilegt_r5_b8_u64, uint64_t,
+               p0 = svwhilegt_b8_u64 (x0, 5),
+               p0 = svwhilegt_b8 (x0, (uint64_t) 5))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_f16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_f16.c
new file mode 100644 (file)
index 0000000..423b706
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilerw_rr_f16:
+**     whilerw p0\.h, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rr_f16, const float16_t *,
+               p0 = svwhilerw_f16 (x0, x1),
+               p0 = svwhilerw (x0, x1))
+
+/*
+** whilerw_0r_f16:
+**     whilerw p0\.h, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_0r_f16, const float16_t *,
+               p0 = svwhilerw_f16 ((const float16_t *) 0, x1),
+               p0 = svwhilerw ((const float16_t *) 0, x1))
+
+/*
+** whilerw_cr_f16:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.h, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_cr_f16, const float16_t *,
+               p0 = svwhilerw_f16 ((const float16_t *) 1073741824, x1),
+               p0 = svwhilerw ((const float16_t *) 1073741824, x1))
+
+/*
+** whilerw_r0_f16:
+**     whilerw p0\.h, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilerw_r0_f16, const float16_t *,
+               p0 = svwhilerw_f16 (x0, (const float16_t *) 0),
+               p0 = svwhilerw (x0, (const float16_t *) 0))
+
+/*
+** whilerw_rc_f16:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.h, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rc_f16, const float16_t *,
+               p0 = svwhilerw_f16 (x0, (const float16_t *) 1073741824),
+               p0 = svwhilerw (x0, (const float16_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_f32.c
new file mode 100644 (file)
index 0000000..fc7c95b
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilerw_rr_f32:
+**     whilerw p0\.s, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rr_f32, const float32_t *,
+               p0 = svwhilerw_f32 (x0, x1),
+               p0 = svwhilerw (x0, x1))
+
+/*
+** whilerw_0r_f32:
+**     whilerw p0\.s, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_0r_f32, const float32_t *,
+               p0 = svwhilerw_f32 ((const float32_t *) 0, x1),
+               p0 = svwhilerw ((const float32_t *) 0, x1))
+
+/*
+** whilerw_cr_f32:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.s, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_cr_f32, const float32_t *,
+               p0 = svwhilerw_f32 ((const float32_t *) 1073741824, x1),
+               p0 = svwhilerw ((const float32_t *) 1073741824, x1))
+
+/*
+** whilerw_r0_f32:
+**     whilerw p0\.s, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilerw_r0_f32, const float32_t *,
+               p0 = svwhilerw_f32 (x0, (const float32_t *) 0),
+               p0 = svwhilerw (x0, (const float32_t *) 0))
+
+/*
+** whilerw_rc_f32:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.s, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rc_f32, const float32_t *,
+               p0 = svwhilerw_f32 (x0, (const float32_t *) 1073741824),
+               p0 = svwhilerw (x0, (const float32_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_f64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_f64.c
new file mode 100644 (file)
index 0000000..fb23d9b
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilerw_rr_f64:
+**     whilerw p0\.d, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rr_f64, const float64_t *,
+               p0 = svwhilerw_f64 (x0, x1),
+               p0 = svwhilerw (x0, x1))
+
+/*
+** whilerw_0r_f64:
+**     whilerw p0\.d, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_0r_f64, const float64_t *,
+               p0 = svwhilerw_f64 ((const float64_t *) 0, x1),
+               p0 = svwhilerw ((const float64_t *) 0, x1))
+
+/*
+** whilerw_cr_f64:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.d, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_cr_f64, const float64_t *,
+               p0 = svwhilerw_f64 ((const float64_t *) 1073741824, x1),
+               p0 = svwhilerw ((const float64_t *) 1073741824, x1))
+
+/*
+** whilerw_r0_f64:
+**     whilerw p0\.d, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilerw_r0_f64, const float64_t *,
+               p0 = svwhilerw_f64 (x0, (const float64_t *) 0),
+               p0 = svwhilerw (x0, (const float64_t *) 0))
+
+/*
+** whilerw_rc_f64:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.d, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rc_f64, const float64_t *,
+               p0 = svwhilerw_f64 (x0, (const float64_t *) 1073741824),
+               p0 = svwhilerw (x0, (const float64_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_s16.c
new file mode 100644 (file)
index 0000000..d49c0a1
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilerw_rr_s16:
+**     whilerw p0\.h, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rr_s16, const int16_t *,
+               p0 = svwhilerw_s16 (x0, x1),
+               p0 = svwhilerw (x0, x1))
+
+/*
+** whilerw_0r_s16:
+**     whilerw p0\.h, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_0r_s16, const int16_t *,
+               p0 = svwhilerw_s16 ((const int16_t *) 0, x1),
+               p0 = svwhilerw ((const int16_t *) 0, x1))
+
+/*
+** whilerw_cr_s16:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.h, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_cr_s16, const int16_t *,
+               p0 = svwhilerw_s16 ((const int16_t *) 1073741824, x1),
+               p0 = svwhilerw ((const int16_t *) 1073741824, x1))
+
+/*
+** whilerw_r0_s16:
+**     whilerw p0\.h, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilerw_r0_s16, const int16_t *,
+               p0 = svwhilerw_s16 (x0, (const int16_t *) 0),
+               p0 = svwhilerw (x0, (const int16_t *) 0))
+
+/*
+** whilerw_rc_s16:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.h, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rc_s16, const int16_t *,
+               p0 = svwhilerw_s16 (x0, (const int16_t *) 1073741824),
+               p0 = svwhilerw (x0, (const int16_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_s32.c
new file mode 100644 (file)
index 0000000..d0a47f0
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilerw_rr_s32:
+**     whilerw p0\.s, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rr_s32, const int32_t *,
+               p0 = svwhilerw_s32 (x0, x1),
+               p0 = svwhilerw (x0, x1))
+
+/*
+** whilerw_0r_s32:
+**     whilerw p0\.s, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_0r_s32, const int32_t *,
+               p0 = svwhilerw_s32 ((const int32_t *) 0, x1),
+               p0 = svwhilerw ((const int32_t *) 0, x1))
+
+/*
+** whilerw_cr_s32:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.s, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_cr_s32, const int32_t *,
+               p0 = svwhilerw_s32 ((const int32_t *) 1073741824, x1),
+               p0 = svwhilerw ((const int32_t *) 1073741824, x1))
+
+/*
+** whilerw_r0_s32:
+**     whilerw p0\.s, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilerw_r0_s32, const int32_t *,
+               p0 = svwhilerw_s32 (x0, (const int32_t *) 0),
+               p0 = svwhilerw (x0, (const int32_t *) 0))
+
+/*
+** whilerw_rc_s32:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.s, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rc_s32, const int32_t *,
+               p0 = svwhilerw_s32 (x0, (const int32_t *) 1073741824),
+               p0 = svwhilerw (x0, (const int32_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_s64.c
new file mode 100644 (file)
index 0000000..980de5f
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilerw_rr_s64:
+**     whilerw p0\.d, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rr_s64, const int64_t *,
+               p0 = svwhilerw_s64 (x0, x1),
+               p0 = svwhilerw (x0, x1))
+
+/*
+** whilerw_0r_s64:
+**     whilerw p0\.d, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_0r_s64, const int64_t *,
+               p0 = svwhilerw_s64 ((const int64_t *) 0, x1),
+               p0 = svwhilerw ((const int64_t *) 0, x1))
+
+/*
+** whilerw_cr_s64:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.d, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_cr_s64, const int64_t *,
+               p0 = svwhilerw_s64 ((const int64_t *) 1073741824, x1),
+               p0 = svwhilerw ((const int64_t *) 1073741824, x1))
+
+/*
+** whilerw_r0_s64:
+**     whilerw p0\.d, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilerw_r0_s64, const int64_t *,
+               p0 = svwhilerw_s64 (x0, (const int64_t *) 0),
+               p0 = svwhilerw (x0, (const int64_t *) 0))
+
+/*
+** whilerw_rc_s64:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.d, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rc_s64, const int64_t *,
+               p0 = svwhilerw_s64 (x0, (const int64_t *) 1073741824),
+               p0 = svwhilerw (x0, (const int64_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_s8.c
new file mode 100644 (file)
index 0000000..4fccf9f
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilerw_rr_s8:
+**     whilerw p0\.b, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rr_s8, const int8_t *,
+               p0 = svwhilerw_s8 (x0, x1),
+               p0 = svwhilerw (x0, x1))
+
+/*
+** whilerw_0r_s8:
+**     whilerw p0\.b, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_0r_s8, const int8_t *,
+               p0 = svwhilerw_s8 ((const int8_t *) 0, x1),
+               p0 = svwhilerw ((const int8_t *) 0, x1))
+
+/*
+** whilerw_cr_s8:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.b, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_cr_s8, const int8_t *,
+               p0 = svwhilerw_s8 ((const int8_t *) 1073741824, x1),
+               p0 = svwhilerw ((const int8_t *) 1073741824, x1))
+
+/*
+** whilerw_r0_s8:
+**     whilerw p0\.b, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilerw_r0_s8, const int8_t *,
+               p0 = svwhilerw_s8 (x0, (const int8_t *) 0),
+               p0 = svwhilerw (x0, (const int8_t *) 0))
+
+/*
+** whilerw_rc_s8:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.b, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rc_s8, const int8_t *,
+               p0 = svwhilerw_s8 (x0, (const int8_t *) 1073741824),
+               p0 = svwhilerw (x0, (const int8_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_u16.c
new file mode 100644 (file)
index 0000000..26c54ba
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilerw_rr_u16:
+**     whilerw p0\.h, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rr_u16, const uint16_t *,
+               p0 = svwhilerw_u16 (x0, x1),
+               p0 = svwhilerw (x0, x1))
+
+/*
+** whilerw_0r_u16:
+**     whilerw p0\.h, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_0r_u16, const uint16_t *,
+               p0 = svwhilerw_u16 ((const uint16_t *) 0, x1),
+               p0 = svwhilerw ((const uint16_t *) 0, x1))
+
+/*
+** whilerw_cr_u16:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.h, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_cr_u16, const uint16_t *,
+               p0 = svwhilerw_u16 ((const uint16_t *) 1073741824, x1),
+               p0 = svwhilerw ((const uint16_t *) 1073741824, x1))
+
+/*
+** whilerw_r0_u16:
+**     whilerw p0\.h, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilerw_r0_u16, const uint16_t *,
+               p0 = svwhilerw_u16 (x0, (const uint16_t *) 0),
+               p0 = svwhilerw (x0, (const uint16_t *) 0))
+
+/*
+** whilerw_rc_u16:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.h, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rc_u16, const uint16_t *,
+               p0 = svwhilerw_u16 (x0, (const uint16_t *) 1073741824),
+               p0 = svwhilerw (x0, (const uint16_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_u32.c
new file mode 100644 (file)
index 0000000..25f0c55
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilerw_rr_u32:
+**     whilerw p0\.s, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rr_u32, const uint32_t *,
+               p0 = svwhilerw_u32 (x0, x1),
+               p0 = svwhilerw (x0, x1))
+
+/*
+** whilerw_0r_u32:
+**     whilerw p0\.s, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_0r_u32, const uint32_t *,
+               p0 = svwhilerw_u32 ((const uint32_t *) 0, x1),
+               p0 = svwhilerw ((const uint32_t *) 0, x1))
+
+/*
+** whilerw_cr_u32:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.s, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_cr_u32, const uint32_t *,
+               p0 = svwhilerw_u32 ((const uint32_t *) 1073741824, x1),
+               p0 = svwhilerw ((const uint32_t *) 1073741824, x1))
+
+/*
+** whilerw_r0_u32:
+**     whilerw p0\.s, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilerw_r0_u32, const uint32_t *,
+               p0 = svwhilerw_u32 (x0, (const uint32_t *) 0),
+               p0 = svwhilerw (x0, (const uint32_t *) 0))
+
+/*
+** whilerw_rc_u32:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.s, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rc_u32, const uint32_t *,
+               p0 = svwhilerw_u32 (x0, (const uint32_t *) 1073741824),
+               p0 = svwhilerw (x0, (const uint32_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_u64.c
new file mode 100644 (file)
index 0000000..864b373
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilerw_rr_u64:
+**     whilerw p0\.d, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rr_u64, const uint64_t *,
+               p0 = svwhilerw_u64 (x0, x1),
+               p0 = svwhilerw (x0, x1))
+
+/*
+** whilerw_0r_u64:
+**     whilerw p0\.d, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_0r_u64, const uint64_t *,
+               p0 = svwhilerw_u64 ((const uint64_t *) 0, x1),
+               p0 = svwhilerw ((const uint64_t *) 0, x1))
+
+/*
+** whilerw_cr_u64:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.d, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_cr_u64, const uint64_t *,
+               p0 = svwhilerw_u64 ((const uint64_t *) 1073741824, x1),
+               p0 = svwhilerw ((const uint64_t *) 1073741824, x1))
+
+/*
+** whilerw_r0_u64:
+**     whilerw p0\.d, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilerw_r0_u64, const uint64_t *,
+               p0 = svwhilerw_u64 (x0, (const uint64_t *) 0),
+               p0 = svwhilerw (x0, (const uint64_t *) 0))
+
+/*
+** whilerw_rc_u64:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.d, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rc_u64, const uint64_t *,
+               p0 = svwhilerw_u64 (x0, (const uint64_t *) 1073741824),
+               p0 = svwhilerw (x0, (const uint64_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilerw_u8.c
new file mode 100644 (file)
index 0000000..bd008db
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilerw_rr_u8:
+**     whilerw p0\.b, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rr_u8, const uint8_t *,
+               p0 = svwhilerw_u8 (x0, x1),
+               p0 = svwhilerw (x0, x1))
+
+/*
+** whilerw_0r_u8:
+**     whilerw p0\.b, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_0r_u8, const uint8_t *,
+               p0 = svwhilerw_u8 ((const uint8_t *) 0, x1),
+               p0 = svwhilerw ((const uint8_t *) 0, x1))
+
+/*
+** whilerw_cr_u8:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.b, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_cr_u8, const uint8_t *,
+               p0 = svwhilerw_u8 ((const uint8_t *) 1073741824, x1),
+               p0 = svwhilerw ((const uint8_t *) 1073741824, x1))
+
+/*
+** whilerw_r0_u8:
+**     whilerw p0\.b, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilerw_r0_u8, const uint8_t *,
+               p0 = svwhilerw_u8 (x0, (const uint8_t *) 0),
+               p0 = svwhilerw (x0, (const uint8_t *) 0))
+
+/*
+** whilerw_rc_u8:
+**     mov     (x[0-9]+), #?1073741824
+**     whilerw p0\.b, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilerw_rc_u8, const uint8_t *,
+               p0 = svwhilerw_u8 (x0, (const uint8_t *) 1073741824),
+               p0 = svwhilerw (x0, (const uint8_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_f16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_f16.c
new file mode 100644 (file)
index 0000000..4823c5b
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilewr_rr_f16:
+**     whilewr p0\.h, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rr_f16, const float16_t *,
+               p0 = svwhilewr_f16 (x0, x1),
+               p0 = svwhilewr (x0, x1))
+
+/*
+** whilewr_0r_f16:
+**     whilewr p0\.h, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_0r_f16, const float16_t *,
+               p0 = svwhilewr_f16 ((const float16_t *) 0, x1),
+               p0 = svwhilewr ((const float16_t *) 0, x1))
+
+/*
+** whilewr_cr_f16:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.h, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_cr_f16, const float16_t *,
+               p0 = svwhilewr_f16 ((const float16_t *) 1073741824, x1),
+               p0 = svwhilewr ((const float16_t *) 1073741824, x1))
+
+/*
+** whilewr_r0_f16:
+**     whilewr p0\.h, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilewr_r0_f16, const float16_t *,
+               p0 = svwhilewr_f16 (x0, (const float16_t *) 0),
+               p0 = svwhilewr (x0, (const float16_t *) 0))
+
+/*
+** whilewr_rc_f16:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.h, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rc_f16, const float16_t *,
+               p0 = svwhilewr_f16 (x0, (const float16_t *) 1073741824),
+               p0 = svwhilewr (x0, (const float16_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_f32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_f32.c
new file mode 100644 (file)
index 0000000..63a4f4f
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilewr_rr_f32:
+**     whilewr p0\.s, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rr_f32, const float32_t *,
+               p0 = svwhilewr_f32 (x0, x1),
+               p0 = svwhilewr (x0, x1))
+
+/*
+** whilewr_0r_f32:
+**     whilewr p0\.s, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_0r_f32, const float32_t *,
+               p0 = svwhilewr_f32 ((const float32_t *) 0, x1),
+               p0 = svwhilewr ((const float32_t *) 0, x1))
+
+/*
+** whilewr_cr_f32:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.s, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_cr_f32, const float32_t *,
+               p0 = svwhilewr_f32 ((const float32_t *) 1073741824, x1),
+               p0 = svwhilewr ((const float32_t *) 1073741824, x1))
+
+/*
+** whilewr_r0_f32:
+**     whilewr p0\.s, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilewr_r0_f32, const float32_t *,
+               p0 = svwhilewr_f32 (x0, (const float32_t *) 0),
+               p0 = svwhilewr (x0, (const float32_t *) 0))
+
+/*
+** whilewr_rc_f32:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.s, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rc_f32, const float32_t *,
+               p0 = svwhilewr_f32 (x0, (const float32_t *) 1073741824),
+               p0 = svwhilewr (x0, (const float32_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_f64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_f64.c
new file mode 100644 (file)
index 0000000..1be1770
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilewr_rr_f64:
+**     whilewr p0\.d, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rr_f64, const float64_t *,
+               p0 = svwhilewr_f64 (x0, x1),
+               p0 = svwhilewr (x0, x1))
+
+/*
+** whilewr_0r_f64:
+**     whilewr p0\.d, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_0r_f64, const float64_t *,
+               p0 = svwhilewr_f64 ((const float64_t *) 0, x1),
+               p0 = svwhilewr ((const float64_t *) 0, x1))
+
+/*
+** whilewr_cr_f64:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.d, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_cr_f64, const float64_t *,
+               p0 = svwhilewr_f64 ((const float64_t *) 1073741824, x1),
+               p0 = svwhilewr ((const float64_t *) 1073741824, x1))
+
+/*
+** whilewr_r0_f64:
+**     whilewr p0\.d, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilewr_r0_f64, const float64_t *,
+               p0 = svwhilewr_f64 (x0, (const float64_t *) 0),
+               p0 = svwhilewr (x0, (const float64_t *) 0))
+
+/*
+** whilewr_rc_f64:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.d, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rc_f64, const float64_t *,
+               p0 = svwhilewr_f64 (x0, (const float64_t *) 1073741824),
+               p0 = svwhilewr (x0, (const float64_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_s16.c
new file mode 100644 (file)
index 0000000..a6bf594
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilewr_rr_s16:
+**     whilewr p0\.h, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rr_s16, const int16_t *,
+               p0 = svwhilewr_s16 (x0, x1),
+               p0 = svwhilewr (x0, x1))
+
+/*
+** whilewr_0r_s16:
+**     whilewr p0\.h, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_0r_s16, const int16_t *,
+               p0 = svwhilewr_s16 ((const int16_t *) 0, x1),
+               p0 = svwhilewr ((const int16_t *) 0, x1))
+
+/*
+** whilewr_cr_s16:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.h, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_cr_s16, const int16_t *,
+               p0 = svwhilewr_s16 ((const int16_t *) 1073741824, x1),
+               p0 = svwhilewr ((const int16_t *) 1073741824, x1))
+
+/*
+** whilewr_r0_s16:
+**     whilewr p0\.h, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilewr_r0_s16, const int16_t *,
+               p0 = svwhilewr_s16 (x0, (const int16_t *) 0),
+               p0 = svwhilewr (x0, (const int16_t *) 0))
+
+/*
+** whilewr_rc_s16:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.h, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rc_s16, const int16_t *,
+               p0 = svwhilewr_s16 (x0, (const int16_t *) 1073741824),
+               p0 = svwhilewr (x0, (const int16_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_s32.c
new file mode 100644 (file)
index 0000000..3b5b097
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilewr_rr_s32:
+**     whilewr p0\.s, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rr_s32, const int32_t *,
+               p0 = svwhilewr_s32 (x0, x1),
+               p0 = svwhilewr (x0, x1))
+
+/*
+** whilewr_0r_s32:
+**     whilewr p0\.s, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_0r_s32, const int32_t *,
+               p0 = svwhilewr_s32 ((const int32_t *) 0, x1),
+               p0 = svwhilewr ((const int32_t *) 0, x1))
+
+/*
+** whilewr_cr_s32:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.s, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_cr_s32, const int32_t *,
+               p0 = svwhilewr_s32 ((const int32_t *) 1073741824, x1),
+               p0 = svwhilewr ((const int32_t *) 1073741824, x1))
+
+/*
+** whilewr_r0_s32:
+**     whilewr p0\.s, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilewr_r0_s32, const int32_t *,
+               p0 = svwhilewr_s32 (x0, (const int32_t *) 0),
+               p0 = svwhilewr (x0, (const int32_t *) 0))
+
+/*
+** whilewr_rc_s32:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.s, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rc_s32, const int32_t *,
+               p0 = svwhilewr_s32 (x0, (const int32_t *) 1073741824),
+               p0 = svwhilewr (x0, (const int32_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_s64.c
new file mode 100644 (file)
index 0000000..5e72829
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilewr_rr_s64:
+**     whilewr p0\.d, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rr_s64, const int64_t *,
+               p0 = svwhilewr_s64 (x0, x1),
+               p0 = svwhilewr (x0, x1))
+
+/*
+** whilewr_0r_s64:
+**     whilewr p0\.d, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_0r_s64, const int64_t *,
+               p0 = svwhilewr_s64 ((const int64_t *) 0, x1),
+               p0 = svwhilewr ((const int64_t *) 0, x1))
+
+/*
+** whilewr_cr_s64:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.d, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_cr_s64, const int64_t *,
+               p0 = svwhilewr_s64 ((const int64_t *) 1073741824, x1),
+               p0 = svwhilewr ((const int64_t *) 1073741824, x1))
+
+/*
+** whilewr_r0_s64:
+**     whilewr p0\.d, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilewr_r0_s64, const int64_t *,
+               p0 = svwhilewr_s64 (x0, (const int64_t *) 0),
+               p0 = svwhilewr (x0, (const int64_t *) 0))
+
+/*
+** whilewr_rc_s64:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.d, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rc_s64, const int64_t *,
+               p0 = svwhilewr_s64 (x0, (const int64_t *) 1073741824),
+               p0 = svwhilewr (x0, (const int64_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_s8.c
new file mode 100644 (file)
index 0000000..170905d
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilewr_rr_s8:
+**     whilewr p0\.b, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rr_s8, const int8_t *,
+               p0 = svwhilewr_s8 (x0, x1),
+               p0 = svwhilewr (x0, x1))
+
+/*
+** whilewr_0r_s8:
+**     whilewr p0\.b, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_0r_s8, const int8_t *,
+               p0 = svwhilewr_s8 ((const int8_t *) 0, x1),
+               p0 = svwhilewr ((const int8_t *) 0, x1))
+
+/*
+** whilewr_cr_s8:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.b, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_cr_s8, const int8_t *,
+               p0 = svwhilewr_s8 ((const int8_t *) 1073741824, x1),
+               p0 = svwhilewr ((const int8_t *) 1073741824, x1))
+
+/*
+** whilewr_r0_s8:
+**     whilewr p0\.b, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilewr_r0_s8, const int8_t *,
+               p0 = svwhilewr_s8 (x0, (const int8_t *) 0),
+               p0 = svwhilewr (x0, (const int8_t *) 0))
+
+/*
+** whilewr_rc_s8:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.b, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rc_s8, const int8_t *,
+               p0 = svwhilewr_s8 (x0, (const int8_t *) 1073741824),
+               p0 = svwhilewr (x0, (const int8_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_u16.c
new file mode 100644 (file)
index 0000000..86153ea
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilewr_rr_u16:
+**     whilewr p0\.h, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rr_u16, const uint16_t *,
+               p0 = svwhilewr_u16 (x0, x1),
+               p0 = svwhilewr (x0, x1))
+
+/*
+** whilewr_0r_u16:
+**     whilewr p0\.h, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_0r_u16, const uint16_t *,
+               p0 = svwhilewr_u16 ((const uint16_t *) 0, x1),
+               p0 = svwhilewr ((const uint16_t *) 0, x1))
+
+/*
+** whilewr_cr_u16:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.h, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_cr_u16, const uint16_t *,
+               p0 = svwhilewr_u16 ((const uint16_t *) 1073741824, x1),
+               p0 = svwhilewr ((const uint16_t *) 1073741824, x1))
+
+/*
+** whilewr_r0_u16:
+**     whilewr p0\.h, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilewr_r0_u16, const uint16_t *,
+               p0 = svwhilewr_u16 (x0, (const uint16_t *) 0),
+               p0 = svwhilewr (x0, (const uint16_t *) 0))
+
+/*
+** whilewr_rc_u16:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.h, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rc_u16, const uint16_t *,
+               p0 = svwhilewr_u16 (x0, (const uint16_t *) 1073741824),
+               p0 = svwhilewr (x0, (const uint16_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_u32.c
new file mode 100644 (file)
index 0000000..d9a5f52
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilewr_rr_u32:
+**     whilewr p0\.s, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rr_u32, const uint32_t *,
+               p0 = svwhilewr_u32 (x0, x1),
+               p0 = svwhilewr (x0, x1))
+
+/*
+** whilewr_0r_u32:
+**     whilewr p0\.s, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_0r_u32, const uint32_t *,
+               p0 = svwhilewr_u32 ((const uint32_t *) 0, x1),
+               p0 = svwhilewr ((const uint32_t *) 0, x1))
+
+/*
+** whilewr_cr_u32:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.s, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_cr_u32, const uint32_t *,
+               p0 = svwhilewr_u32 ((const uint32_t *) 1073741824, x1),
+               p0 = svwhilewr ((const uint32_t *) 1073741824, x1))
+
+/*
+** whilewr_r0_u32:
+**     whilewr p0\.s, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilewr_r0_u32, const uint32_t *,
+               p0 = svwhilewr_u32 (x0, (const uint32_t *) 0),
+               p0 = svwhilewr (x0, (const uint32_t *) 0))
+
+/*
+** whilewr_rc_u32:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.s, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rc_u32, const uint32_t *,
+               p0 = svwhilewr_u32 (x0, (const uint32_t *) 1073741824),
+               p0 = svwhilewr (x0, (const uint32_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_u64.c
new file mode 100644 (file)
index 0000000..309ce33
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilewr_rr_u64:
+**     whilewr p0\.d, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rr_u64, const uint64_t *,
+               p0 = svwhilewr_u64 (x0, x1),
+               p0 = svwhilewr (x0, x1))
+
+/*
+** whilewr_0r_u64:
+**     whilewr p0\.d, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_0r_u64, const uint64_t *,
+               p0 = svwhilewr_u64 ((const uint64_t *) 0, x1),
+               p0 = svwhilewr ((const uint64_t *) 0, x1))
+
+/*
+** whilewr_cr_u64:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.d, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_cr_u64, const uint64_t *,
+               p0 = svwhilewr_u64 ((const uint64_t *) 1073741824, x1),
+               p0 = svwhilewr ((const uint64_t *) 1073741824, x1))
+
+/*
+** whilewr_r0_u64:
+**     whilewr p0\.d, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilewr_r0_u64, const uint64_t *,
+               p0 = svwhilewr_u64 (x0, (const uint64_t *) 0),
+               p0 = svwhilewr (x0, (const uint64_t *) 0))
+
+/*
+** whilewr_rc_u64:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.d, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rc_u64, const uint64_t *,
+               p0 = svwhilewr_u64 (x0, (const uint64_t *) 1073741824),
+               p0 = svwhilewr (x0, (const uint64_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/whilewr_u8.c
new file mode 100644 (file)
index 0000000..8ec0bd8
--- /dev/null
@@ -0,0 +1,50 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** whilewr_rr_u8:
+**     whilewr p0\.b, x0, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rr_u8, const uint8_t *,
+               p0 = svwhilewr_u8 (x0, x1),
+               p0 = svwhilewr (x0, x1))
+
+/*
+** whilewr_0r_u8:
+**     whilewr p0\.b, xzr, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_0r_u8, const uint8_t *,
+               p0 = svwhilewr_u8 ((const uint8_t *) 0, x1),
+               p0 = svwhilewr ((const uint8_t *) 0, x1))
+
+/*
+** whilewr_cr_u8:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.b, \1, x1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_cr_u8, const uint8_t *,
+               p0 = svwhilewr_u8 ((const uint8_t *) 1073741824, x1),
+               p0 = svwhilewr ((const uint8_t *) 1073741824, x1))
+
+/*
+** whilewr_r0_u8:
+**     whilewr p0\.b, x0, xzr
+**     ret
+*/
+TEST_COMPARE_S (whilewr_r0_u8, const uint8_t *,
+               p0 = svwhilewr_u8 (x0, (const uint8_t *) 0),
+               p0 = svwhilewr (x0, (const uint8_t *) 0))
+
+/*
+** whilewr_rc_u8:
+**     mov     (x[0-9]+), #?1073741824
+**     whilewr p0\.b, x0, \1
+**     ret
+*/
+TEST_COMPARE_S (whilewr_rc_u8, const uint8_t *,
+               p0 = svwhilewr_u8 (x0, (const uint8_t *) 1073741824),
+               p0 = svwhilewr (x0, (const uint8_t *) 1073741824))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_s16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_s16.c
new file mode 100644 (file)
index 0000000..34351d5
--- /dev/null
@@ -0,0 +1,102 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** xar_1_s16_tied1:
+**     xar     z0\.h, z0\.h, z1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_s16_tied1, svint16_t,
+               z0 = svxar_n_s16 (z0, z1, 1),
+               z0 = svxar (z0, z1, 1))
+
+/*
+** xar_1_s16_tied2:
+**     xar     z0\.h, z0\.h, z1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_s16_tied2, svint16_t,
+               z0 = svxar_n_s16 (z1, z0, 1),
+               z0 = svxar (z1, z0, 1))
+
+/*
+** xar_1_s16_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.h, z0\.h, z2\.h, #1
+** |
+**     movprfx z0, z2
+**     xar     z0\.h, z0\.h, z1\.h, #1
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_s16_untied, svint16_t,
+               z0 = svxar_n_s16 (z1, z2, 1),
+               z0 = svxar (z1, z2, 1))
+
+/*
+** xar_2_s16_tied1:
+**     xar     z0\.h, z0\.h, z1\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_s16_tied1, svint16_t,
+               z0 = svxar_n_s16 (z0, z1, 2),
+               z0 = svxar (z0, z1, 2))
+
+/*
+** xar_2_s16_tied2:
+**     xar     z0\.h, z0\.h, z1\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_s16_tied2, svint16_t,
+               z0 = svxar_n_s16 (z1, z0, 2),
+               z0 = svxar (z1, z0, 2))
+
+/*
+** xar_2_s16_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.h, z0\.h, z2\.h, #2
+** |
+**     movprfx z0, z2
+**     xar     z0\.h, z0\.h, z1\.h, #2
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_s16_untied, svint16_t,
+               z0 = svxar_n_s16 (z1, z2, 2),
+               z0 = svxar (z1, z2, 2))
+
+/*
+** xar_16_s16_tied1:
+**     xar     z0\.h, z0\.h, z1\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (xar_16_s16_tied1, svint16_t,
+               z0 = svxar_n_s16 (z0, z1, 16),
+               z0 = svxar (z0, z1, 16))
+
+/*
+** xar_16_s16_tied2:
+**     xar     z0\.h, z0\.h, z1\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (xar_16_s16_tied2, svint16_t,
+               z0 = svxar_n_s16 (z1, z0, 16),
+               z0 = svxar (z1, z0, 16))
+
+/*
+** xar_16_s16_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.h, z0\.h, z2\.h, #16
+** |
+**     movprfx z0, z2
+**     xar     z0\.h, z0\.h, z1\.h, #16
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_16_s16_untied, svint16_t,
+               z0 = svxar_n_s16 (z1, z2, 16),
+               z0 = svxar (z1, z2, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_s32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_s32.c
new file mode 100644 (file)
index 0000000..366a617
--- /dev/null
@@ -0,0 +1,102 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** xar_1_s32_tied1:
+**     xar     z0\.s, z0\.s, z1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_s32_tied1, svint32_t,
+               z0 = svxar_n_s32 (z0, z1, 1),
+               z0 = svxar (z0, z1, 1))
+
+/*
+** xar_1_s32_tied2:
+**     xar     z0\.s, z0\.s, z1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_s32_tied2, svint32_t,
+               z0 = svxar_n_s32 (z1, z0, 1),
+               z0 = svxar (z1, z0, 1))
+
+/*
+** xar_1_s32_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.s, z0\.s, z2\.s, #1
+** |
+**     movprfx z0, z2
+**     xar     z0\.s, z0\.s, z1\.s, #1
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_s32_untied, svint32_t,
+               z0 = svxar_n_s32 (z1, z2, 1),
+               z0 = svxar (z1, z2, 1))
+
+/*
+** xar_2_s32_tied1:
+**     xar     z0\.s, z0\.s, z1\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_s32_tied1, svint32_t,
+               z0 = svxar_n_s32 (z0, z1, 2),
+               z0 = svxar (z0, z1, 2))
+
+/*
+** xar_2_s32_tied2:
+**     xar     z0\.s, z0\.s, z1\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_s32_tied2, svint32_t,
+               z0 = svxar_n_s32 (z1, z0, 2),
+               z0 = svxar (z1, z0, 2))
+
+/*
+** xar_2_s32_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.s, z0\.s, z2\.s, #2
+** |
+**     movprfx z0, z2
+**     xar     z0\.s, z0\.s, z1\.s, #2
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_s32_untied, svint32_t,
+               z0 = svxar_n_s32 (z1, z2, 2),
+               z0 = svxar (z1, z2, 2))
+
+/*
+** xar_32_s32_tied1:
+**     xar     z0\.s, z0\.s, z1\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (xar_32_s32_tied1, svint32_t,
+               z0 = svxar_n_s32 (z0, z1, 32),
+               z0 = svxar (z0, z1, 32))
+
+/*
+** xar_32_s32_tied2:
+**     xar     z0\.s, z0\.s, z1\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (xar_32_s32_tied2, svint32_t,
+               z0 = svxar_n_s32 (z1, z0, 32),
+               z0 = svxar (z1, z0, 32))
+
+/*
+** xar_32_s32_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.s, z0\.s, z2\.s, #32
+** |
+**     movprfx z0, z2
+**     xar     z0\.s, z0\.s, z1\.s, #32
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_32_s32_untied, svint32_t,
+               z0 = svxar_n_s32 (z1, z2, 32),
+               z0 = svxar (z1, z2, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_s64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_s64.c
new file mode 100644 (file)
index 0000000..dedda2e
--- /dev/null
@@ -0,0 +1,102 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** xar_1_s64_tied1:
+**     xar     z0\.d, z0\.d, z1\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_s64_tied1, svint64_t,
+               z0 = svxar_n_s64 (z0, z1, 1),
+               z0 = svxar (z0, z1, 1))
+
+/*
+** xar_1_s64_tied2:
+**     xar     z0\.d, z0\.d, z1\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_s64_tied2, svint64_t,
+               z0 = svxar_n_s64 (z1, z0, 1),
+               z0 = svxar (z1, z0, 1))
+
+/*
+** xar_1_s64_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.d, z0\.d, z2\.d, #1
+** |
+**     movprfx z0, z2
+**     xar     z0\.d, z0\.d, z1\.d, #1
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_s64_untied, svint64_t,
+               z0 = svxar_n_s64 (z1, z2, 1),
+               z0 = svxar (z1, z2, 1))
+
+/*
+** xar_2_s64_tied1:
+**     xar     z0\.d, z0\.d, z1\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_s64_tied1, svint64_t,
+               z0 = svxar_n_s64 (z0, z1, 2),
+               z0 = svxar (z0, z1, 2))
+
+/*
+** xar_2_s64_tied2:
+**     xar     z0\.d, z0\.d, z1\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_s64_tied2, svint64_t,
+               z0 = svxar_n_s64 (z1, z0, 2),
+               z0 = svxar (z1, z0, 2))
+
+/*
+** xar_2_s64_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.d, z0\.d, z2\.d, #2
+** |
+**     movprfx z0, z2
+**     xar     z0\.d, z0\.d, z1\.d, #2
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_s64_untied, svint64_t,
+               z0 = svxar_n_s64 (z1, z2, 2),
+               z0 = svxar (z1, z2, 2))
+
+/*
+** xar_64_s64_tied1:
+**     xar     z0\.d, z0\.d, z1\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (xar_64_s64_tied1, svint64_t,
+               z0 = svxar_n_s64 (z0, z1, 64),
+               z0 = svxar (z0, z1, 64))
+
+/*
+** xar_64_s64_tied2:
+**     xar     z0\.d, z0\.d, z1\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (xar_64_s64_tied2, svint64_t,
+               z0 = svxar_n_s64 (z1, z0, 64),
+               z0 = svxar (z1, z0, 64))
+
+/*
+** xar_64_s64_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.d, z0\.d, z2\.d, #64
+** |
+**     movprfx z0, z2
+**     xar     z0\.d, z0\.d, z1\.d, #64
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_64_s64_untied, svint64_t,
+               z0 = svxar_n_s64 (z1, z2, 64),
+               z0 = svxar (z1, z2, 64))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_s8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_s8.c
new file mode 100644 (file)
index 0000000..904352b
--- /dev/null
@@ -0,0 +1,102 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** xar_1_s8_tied1:
+**     xar     z0\.b, z0\.b, z1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_s8_tied1, svint8_t,
+               z0 = svxar_n_s8 (z0, z1, 1),
+               z0 = svxar (z0, z1, 1))
+
+/*
+** xar_1_s8_tied2:
+**     xar     z0\.b, z0\.b, z1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_s8_tied2, svint8_t,
+               z0 = svxar_n_s8 (z1, z0, 1),
+               z0 = svxar (z1, z0, 1))
+
+/*
+** xar_1_s8_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.b, z0\.b, z2\.b, #1
+** |
+**     movprfx z0, z2
+**     xar     z0\.b, z0\.b, z1\.b, #1
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_s8_untied, svint8_t,
+               z0 = svxar_n_s8 (z1, z2, 1),
+               z0 = svxar (z1, z2, 1))
+
+/*
+** xar_2_s8_tied1:
+**     xar     z0\.b, z0\.b, z1\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_s8_tied1, svint8_t,
+               z0 = svxar_n_s8 (z0, z1, 2),
+               z0 = svxar (z0, z1, 2))
+
+/*
+** xar_2_s8_tied2:
+**     xar     z0\.b, z0\.b, z1\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_s8_tied2, svint8_t,
+               z0 = svxar_n_s8 (z1, z0, 2),
+               z0 = svxar (z1, z0, 2))
+
+/*
+** xar_2_s8_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.b, z0\.b, z2\.b, #2
+** |
+**     movprfx z0, z2
+**     xar     z0\.b, z0\.b, z1\.b, #2
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_s8_untied, svint8_t,
+               z0 = svxar_n_s8 (z1, z2, 2),
+               z0 = svxar (z1, z2, 2))
+
+/*
+** xar_8_s8_tied1:
+**     xar     z0\.b, z0\.b, z1\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (xar_8_s8_tied1, svint8_t,
+               z0 = svxar_n_s8 (z0, z1, 8),
+               z0 = svxar (z0, z1, 8))
+
+/*
+** xar_8_s8_tied2:
+**     xar     z0\.b, z0\.b, z1\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (xar_8_s8_tied2, svint8_t,
+               z0 = svxar_n_s8 (z1, z0, 8),
+               z0 = svxar (z1, z0, 8))
+
+/*
+** xar_8_s8_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.b, z0\.b, z2\.b, #8
+** |
+**     movprfx z0, z2
+**     xar     z0\.b, z0\.b, z1\.b, #8
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_8_s8_untied, svint8_t,
+               z0 = svxar_n_s8 (z1, z2, 8),
+               z0 = svxar (z1, z2, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_u16.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_u16.c
new file mode 100644 (file)
index 0000000..c7b9665
--- /dev/null
@@ -0,0 +1,102 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** xar_1_u16_tied1:
+**     xar     z0\.h, z0\.h, z1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_u16_tied1, svuint16_t,
+               z0 = svxar_n_u16 (z0, z1, 1),
+               z0 = svxar (z0, z1, 1))
+
+/*
+** xar_1_u16_tied2:
+**     xar     z0\.h, z0\.h, z1\.h, #1
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_u16_tied2, svuint16_t,
+               z0 = svxar_n_u16 (z1, z0, 1),
+               z0 = svxar (z1, z0, 1))
+
+/*
+** xar_1_u16_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.h, z0\.h, z2\.h, #1
+** |
+**     movprfx z0, z2
+**     xar     z0\.h, z0\.h, z1\.h, #1
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_u16_untied, svuint16_t,
+               z0 = svxar_n_u16 (z1, z2, 1),
+               z0 = svxar (z1, z2, 1))
+
+/*
+** xar_2_u16_tied1:
+**     xar     z0\.h, z0\.h, z1\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_u16_tied1, svuint16_t,
+               z0 = svxar_n_u16 (z0, z1, 2),
+               z0 = svxar (z0, z1, 2))
+
+/*
+** xar_2_u16_tied2:
+**     xar     z0\.h, z0\.h, z1\.h, #2
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_u16_tied2, svuint16_t,
+               z0 = svxar_n_u16 (z1, z0, 2),
+               z0 = svxar (z1, z0, 2))
+
+/*
+** xar_2_u16_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.h, z0\.h, z2\.h, #2
+** |
+**     movprfx z0, z2
+**     xar     z0\.h, z0\.h, z1\.h, #2
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_u16_untied, svuint16_t,
+               z0 = svxar_n_u16 (z1, z2, 2),
+               z0 = svxar (z1, z2, 2))
+
+/*
+** xar_16_u16_tied1:
+**     xar     z0\.h, z0\.h, z1\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (xar_16_u16_tied1, svuint16_t,
+               z0 = svxar_n_u16 (z0, z1, 16),
+               z0 = svxar (z0, z1, 16))
+
+/*
+** xar_16_u16_tied2:
+**     xar     z0\.h, z0\.h, z1\.h, #16
+**     ret
+*/
+TEST_UNIFORM_Z (xar_16_u16_tied2, svuint16_t,
+               z0 = svxar_n_u16 (z1, z0, 16),
+               z0 = svxar (z1, z0, 16))
+
+/*
+** xar_16_u16_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.h, z0\.h, z2\.h, #16
+** |
+**     movprfx z0, z2
+**     xar     z0\.h, z0\.h, z1\.h, #16
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_16_u16_untied, svuint16_t,
+               z0 = svxar_n_u16 (z1, z2, 16),
+               z0 = svxar (z1, z2, 16))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_u32.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_u32.c
new file mode 100644 (file)
index 0000000..115ead7
--- /dev/null
@@ -0,0 +1,102 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** xar_1_u32_tied1:
+**     xar     z0\.s, z0\.s, z1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_u32_tied1, svuint32_t,
+               z0 = svxar_n_u32 (z0, z1, 1),
+               z0 = svxar (z0, z1, 1))
+
+/*
+** xar_1_u32_tied2:
+**     xar     z0\.s, z0\.s, z1\.s, #1
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_u32_tied2, svuint32_t,
+               z0 = svxar_n_u32 (z1, z0, 1),
+               z0 = svxar (z1, z0, 1))
+
+/*
+** xar_1_u32_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.s, z0\.s, z2\.s, #1
+** |
+**     movprfx z0, z2
+**     xar     z0\.s, z0\.s, z1\.s, #1
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_u32_untied, svuint32_t,
+               z0 = svxar_n_u32 (z1, z2, 1),
+               z0 = svxar (z1, z2, 1))
+
+/*
+** xar_2_u32_tied1:
+**     xar     z0\.s, z0\.s, z1\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_u32_tied1, svuint32_t,
+               z0 = svxar_n_u32 (z0, z1, 2),
+               z0 = svxar (z0, z1, 2))
+
+/*
+** xar_2_u32_tied2:
+**     xar     z0\.s, z0\.s, z1\.s, #2
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_u32_tied2, svuint32_t,
+               z0 = svxar_n_u32 (z1, z0, 2),
+               z0 = svxar (z1, z0, 2))
+
+/*
+** xar_2_u32_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.s, z0\.s, z2\.s, #2
+** |
+**     movprfx z0, z2
+**     xar     z0\.s, z0\.s, z1\.s, #2
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_u32_untied, svuint32_t,
+               z0 = svxar_n_u32 (z1, z2, 2),
+               z0 = svxar (z1, z2, 2))
+
+/*
+** xar_32_u32_tied1:
+**     xar     z0\.s, z0\.s, z1\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (xar_32_u32_tied1, svuint32_t,
+               z0 = svxar_n_u32 (z0, z1, 32),
+               z0 = svxar (z0, z1, 32))
+
+/*
+** xar_32_u32_tied2:
+**     xar     z0\.s, z0\.s, z1\.s, #32
+**     ret
+*/
+TEST_UNIFORM_Z (xar_32_u32_tied2, svuint32_t,
+               z0 = svxar_n_u32 (z1, z0, 32),
+               z0 = svxar (z1, z0, 32))
+
+/*
+** xar_32_u32_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.s, z0\.s, z2\.s, #32
+** |
+**     movprfx z0, z2
+**     xar     z0\.s, z0\.s, z1\.s, #32
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_32_u32_untied, svuint32_t,
+               z0 = svxar_n_u32 (z1, z2, 32),
+               z0 = svxar (z1, z2, 32))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_u64.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_u64.c
new file mode 100644 (file)
index 0000000..1d0d90e
--- /dev/null
@@ -0,0 +1,102 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** xar_1_u64_tied1:
+**     xar     z0\.d, z0\.d, z1\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_u64_tied1, svuint64_t,
+               z0 = svxar_n_u64 (z0, z1, 1),
+               z0 = svxar (z0, z1, 1))
+
+/*
+** xar_1_u64_tied2:
+**     xar     z0\.d, z0\.d, z1\.d, #1
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_u64_tied2, svuint64_t,
+               z0 = svxar_n_u64 (z1, z0, 1),
+               z0 = svxar (z1, z0, 1))
+
+/*
+** xar_1_u64_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.d, z0\.d, z2\.d, #1
+** |
+**     movprfx z0, z2
+**     xar     z0\.d, z0\.d, z1\.d, #1
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_u64_untied, svuint64_t,
+               z0 = svxar_n_u64 (z1, z2, 1),
+               z0 = svxar (z1, z2, 1))
+
+/*
+** xar_2_u64_tied1:
+**     xar     z0\.d, z0\.d, z1\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_u64_tied1, svuint64_t,
+               z0 = svxar_n_u64 (z0, z1, 2),
+               z0 = svxar (z0, z1, 2))
+
+/*
+** xar_2_u64_tied2:
+**     xar     z0\.d, z0\.d, z1\.d, #2
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_u64_tied2, svuint64_t,
+               z0 = svxar_n_u64 (z1, z0, 2),
+               z0 = svxar (z1, z0, 2))
+
+/*
+** xar_2_u64_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.d, z0\.d, z2\.d, #2
+** |
+**     movprfx z0, z2
+**     xar     z0\.d, z0\.d, z1\.d, #2
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_u64_untied, svuint64_t,
+               z0 = svxar_n_u64 (z1, z2, 2),
+               z0 = svxar (z1, z2, 2))
+
+/*
+** xar_64_u64_tied1:
+**     xar     z0\.d, z0\.d, z1\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (xar_64_u64_tied1, svuint64_t,
+               z0 = svxar_n_u64 (z0, z1, 64),
+               z0 = svxar (z0, z1, 64))
+
+/*
+** xar_64_u64_tied2:
+**     xar     z0\.d, z0\.d, z1\.d, #64
+**     ret
+*/
+TEST_UNIFORM_Z (xar_64_u64_tied2, svuint64_t,
+               z0 = svxar_n_u64 (z1, z0, 64),
+               z0 = svxar (z1, z0, 64))
+
+/*
+** xar_64_u64_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.d, z0\.d, z2\.d, #64
+** |
+**     movprfx z0, z2
+**     xar     z0\.d, z0\.d, z1\.d, #64
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_64_u64_untied, svuint64_t,
+               z0 = svxar_n_u64 (z1, z2, 64),
+               z0 = svxar (z1, z2, 64))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_u8.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/asm/xar_u8.c
new file mode 100644 (file)
index 0000000..3b61617
--- /dev/null
@@ -0,0 +1,102 @@
+/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */
+
+#include "test_sve_acle.h"
+
+/*
+** xar_1_u8_tied1:
+**     xar     z0\.b, z0\.b, z1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_u8_tied1, svuint8_t,
+               z0 = svxar_n_u8 (z0, z1, 1),
+               z0 = svxar (z0, z1, 1))
+
+/*
+** xar_1_u8_tied2:
+**     xar     z0\.b, z0\.b, z1\.b, #1
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_u8_tied2, svuint8_t,
+               z0 = svxar_n_u8 (z1, z0, 1),
+               z0 = svxar (z1, z0, 1))
+
+/*
+** xar_1_u8_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.b, z0\.b, z2\.b, #1
+** |
+**     movprfx z0, z2
+**     xar     z0\.b, z0\.b, z1\.b, #1
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_1_u8_untied, svuint8_t,
+               z0 = svxar_n_u8 (z1, z2, 1),
+               z0 = svxar (z1, z2, 1))
+
+/*
+** xar_2_u8_tied1:
+**     xar     z0\.b, z0\.b, z1\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_u8_tied1, svuint8_t,
+               z0 = svxar_n_u8 (z0, z1, 2),
+               z0 = svxar (z0, z1, 2))
+
+/*
+** xar_2_u8_tied2:
+**     xar     z0\.b, z0\.b, z1\.b, #2
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_u8_tied2, svuint8_t,
+               z0 = svxar_n_u8 (z1, z0, 2),
+               z0 = svxar (z1, z0, 2))
+
+/*
+** xar_2_u8_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.b, z0\.b, z2\.b, #2
+** |
+**     movprfx z0, z2
+**     xar     z0\.b, z0\.b, z1\.b, #2
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_2_u8_untied, svuint8_t,
+               z0 = svxar_n_u8 (z1, z2, 2),
+               z0 = svxar (z1, z2, 2))
+
+/*
+** xar_8_u8_tied1:
+**     xar     z0\.b, z0\.b, z1\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (xar_8_u8_tied1, svuint8_t,
+               z0 = svxar_n_u8 (z0, z1, 8),
+               z0 = svxar (z0, z1, 8))
+
+/*
+** xar_8_u8_tied2:
+**     xar     z0\.b, z0\.b, z1\.b, #8
+**     ret
+*/
+TEST_UNIFORM_Z (xar_8_u8_tied2, svuint8_t,
+               z0 = svxar_n_u8 (z1, z0, 8),
+               z0 = svxar (z1, z0, 8))
+
+/*
+** xar_8_u8_untied:
+** (
+**     movprfx z0, z1
+**     xar     z0\.b, z0\.b, z2\.b, #8
+** |
+**     movprfx z0, z2
+**     xar     z0\.b, z0\.b, z1\.b, #8
+** )
+**     ret
+*/
+TEST_UNIFORM_Z (xar_8_u8_untied, svuint8_t,
+               z0 = svxar_n_u8 (z1, z2, 8),
+               z0 = svxar (z1, z2, 8))
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/match_1.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/match_1.c
new file mode 100644 (file)
index 0000000..0276b06
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#include <arm_sve.h>
+
+void
+test1 (svbool_t pg, svint8_t x, svint8_t y, int *any, svbool_t *ptr)
+{
+  svbool_t res = svmatch (pg, x, y);
+  *any = svptest_any (pg, res);
+  *ptr = res;
+}
+
+int
+test2 (svbool_t pg, svint8_t x, svint8_t y, int *any)
+{
+  svbool_t res = svmatch (pg, x, y);
+  return svptest_any (pg, res);
+}
+
+/* { dg-final { scan-assembler-times {\tmatch\t} 2 } } */
+/* { dg-final { scan-assembler-not {\tptest\t} } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/match_2.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/match_2.c
new file mode 100644 (file)
index 0000000..4b9b519
--- /dev/null
@@ -0,0 +1,37 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#include <arm_sve.h>
+
+void
+test1 (svint16_t x, svint16_t y, int *any, svbool_t *ptr)
+{
+  svbool_t res = svmatch (svptrue_b8 (), x, y);
+  *any = svptest_any (svptrue_b16 (), res);
+  *ptr = res;
+}
+
+int
+test2 (svint16_t x, svint16_t y, int *any)
+{
+  svbool_t res = svmatch (svptrue_b8 (), x, y);
+  return svptest_any (svptrue_b16 (), res);
+}
+
+void
+test3 (svint16_t x, svint16_t y, int *any, svbool_t *ptr)
+{
+  svbool_t res = svmatch (svptrue_b16 (), x, y);
+  *any = svptest_any (svptrue_b16 (), res);
+  *ptr = res;
+}
+
+int
+test4 (svint16_t x, svint16_t y, int *any)
+{
+  svbool_t res = svmatch (svptrue_b16 (), x, y);
+  return svptest_any (svptrue_b16 (), res);
+}
+
+/* { dg-final { scan-assembler-times {\tmatch\t} 4 } } */
+/* { dg-final { scan-assembler-not {\tptest\t} } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/match_3.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/match_3.c
new file mode 100644 (file)
index 0000000..a608708
--- /dev/null
@@ -0,0 +1,54 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#include <arm_sve.h>
+
+void
+test1 (svbool_t pg, svint16_t x, svint16_t y, int *any, svbool_t *ptr)
+{
+  svbool_t res = svmatch (pg, x, y);
+  *any = svptest_any (pg, res);
+  *ptr = res;
+}
+
+int
+test2 (svbool_t pg, svint16_t x, svint16_t y, int *any)
+{
+  svbool_t res = svmatch (pg, x, y);
+  return svptest_any (pg, res);
+}
+
+/* These four are always false, but we don't realize that yet.  */
+
+void
+test3 (svbool_t pg, svint16_t x, svint16_t y, int *any, svbool_t *ptr)
+{
+  svbool_t res = svmatch (svptrue_b8 (), x, y);
+  *any = svptest_last (svptrue_b8 (), res);
+  *ptr = res;
+}
+
+int
+test4 (svbool_t pg, svint16_t x, svint16_t y, int *any)
+{
+  svbool_t res = svmatch (svptrue_b8 (), x, y);
+  return svptest_last (svptrue_b8 (), res);
+}
+
+void
+test5 (svbool_t pg, svint16_t x, svint16_t y, int *any, svbool_t *ptr)
+{
+  svbool_t res = svmatch (svptrue_b16 (), x, y);
+  *any = svptest_last (svptrue_b8 (), res);
+  *ptr = res;
+}
+
+int
+test6 (svbool_t pg, svint16_t x, svint16_t y, int *any)
+{
+  svbool_t res = svmatch (svptrue_b16 (), x, y);
+  return svptest_last (svptrue_b8 (), res);
+}
+
+/* { dg-final { scan-assembler-times {\tmatch\t} 6 } } */
+/* { dg-final { scan-assembler-times {\tptest\t} 6 } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilerw_1.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilerw_1.c
new file mode 100644 (file)
index 0000000..956b064
--- /dev/null
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#include <arm_sve.h>
+
+void
+test1 (int8_t *x, int8_t *y, int *any, svbool_t *ptr)
+{
+  svbool_t res = svwhilerw (x, y);
+  *any = svptest_last (svptrue_b8 (), res);
+  *ptr = res;
+}
+
+int
+test2 (int8_t *x, int8_t *y)
+{
+  svbool_t res = svwhilerw (x, y);
+  return svptest_last (svptrue_b8 (), res);
+}
+
+/* { dg-final { scan-assembler-times {\twhilerw\t} 2 } } */
+/* { dg-final { scan-assembler-not {\tptrue\t} } } */
+/* { dg-final { scan-assembler-not {\tptest\t} } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilerw_2.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilerw_2.c
new file mode 100644 (file)
index 0000000..be9c484
--- /dev/null
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#include <arm_sve.h>
+
+void
+test1 (int16_t *x, int16_t *y, int *any, svbool_t *ptr)
+{
+  svbool_t res = svwhilerw (x, y);
+  *any = svptest_last (svptrue_b16 (), res);
+  *ptr = res;
+}
+
+int
+test2 (int16_t *x, int16_t *y)
+{
+  svbool_t res = svwhilerw (x, y);
+  return svptest_last (svptrue_b16 (), res);
+}
+
+/* { dg-final { scan-assembler-times {\twhilerw\t} 2 } } */
+/* { dg-final { scan-assembler-not {\tptrue\t} } } */
+/* { dg-final { scan-assembler-not {\tptest\t} } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilerw_3.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilerw_3.c
new file mode 100644 (file)
index 0000000..677bed1
--- /dev/null
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#include <arm_sve.h>
+
+void
+test1 (int32_t *x, int32_t *y, int *any, svbool_t *ptr)
+{
+  svbool_t res = svwhilerw (x, y);
+  *any = svptest_last (svptrue_b32 (), res);
+  *ptr = res;
+}
+
+int
+test2 (int32_t *x, int32_t *y)
+{
+  svbool_t res = svwhilerw (x, y);
+  return svptest_last (svptrue_b32 (), res);
+}
+
+/* { dg-final { scan-assembler-times {\twhilerw\t} 2 } } */
+/* { dg-final { scan-assembler-not {\tptrue\t} } } */
+/* { dg-final { scan-assembler-not {\tptest\t} } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilerw_4.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilerw_4.c
new file mode 100644 (file)
index 0000000..5143438
--- /dev/null
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#include <arm_sve.h>
+
+void
+test1 (int64_t *x, int64_t *y, int *any, svbool_t *ptr)
+{
+  svbool_t res = svwhilerw (x, y);
+  *any = svptest_last (svptrue_b64 (), res);
+  *ptr = res;
+}
+
+int
+test2 (int64_t *x, int64_t *y)
+{
+  svbool_t res = svwhilerw (x, y);
+  return svptest_last (svptrue_b64 (), res);
+}
+
+/* { dg-final { scan-assembler-times {\twhilerw\t} 2 } } */
+/* { dg-final { scan-assembler-not {\tptrue\t} } } */
+/* { dg-final { scan-assembler-not {\tptest\t} } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilewr_1.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilewr_1.c
new file mode 100644 (file)
index 0000000..cfe3710
--- /dev/null
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#include <arm_sve.h>
+
+void
+test1 (int8_t *x, int8_t *y, int *any, svbool_t *ptr)
+{
+  svbool_t res = svwhilewr (x, y);
+  *any = svptest_last (svptrue_b8 (), res);
+  *ptr = res;
+}
+
+int
+test2 (int8_t *x, int8_t *y)
+{
+  svbool_t res = svwhilewr (x, y);
+  return svptest_last (svptrue_b8 (), res);
+}
+
+/* { dg-final { scan-assembler-times {\twhilewr\t} 2 } } */
+/* { dg-final { scan-assembler-not {\tptrue\t} } } */
+/* { dg-final { scan-assembler-not {\tptest\t} } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilewr_2.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilewr_2.c
new file mode 100644 (file)
index 0000000..52e64cf
--- /dev/null
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#include <arm_sve.h>
+
+void
+test1 (int16_t *x, int16_t *y, int *any, svbool_t *ptr)
+{
+  svbool_t res = svwhilewr (x, y);
+  *any = svptest_last (svptrue_b16 (), res);
+  *ptr = res;
+}
+
+int
+test2 (int16_t *x, int16_t *y)
+{
+  svbool_t res = svwhilewr (x, y);
+  return svptest_last (svptrue_b16 (), res);
+}
+
+/* { dg-final { scan-assembler-times {\twhilewr\t} 2 } } */
+/* { dg-final { scan-assembler-not {\tptrue\t} } } */
+/* { dg-final { scan-assembler-not {\tptest\t} } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilewr_3.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilewr_3.c
new file mode 100644 (file)
index 0000000..b4456fe
--- /dev/null
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#include <arm_sve.h>
+
+void
+test1 (int32_t *x, int32_t *y, int *any, svbool_t *ptr)
+{
+  svbool_t res = svwhilewr (x, y);
+  *any = svptest_last (svptrue_b32 (), res);
+  *ptr = res;
+}
+
+int
+test2 (int32_t *x, int32_t *y)
+{
+  svbool_t res = svwhilewr (x, y);
+  return svptest_last (svptrue_b32 (), res);
+}
+
+/* { dg-final { scan-assembler-times {\twhilewr\t} 2 } } */
+/* { dg-final { scan-assembler-not {\tptrue\t} } } */
+/* { dg-final { scan-assembler-not {\tptest\t} } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilewr_4.c b/gcc/testsuite/gcc.target/aarch64/sve2/acle/general/whilewr_4.c
new file mode 100644 (file)
index 0000000..77ca53a
--- /dev/null
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+#include <arm_sve.h>
+
+void
+test1 (int64_t *x, int64_t *y, int *any, svbool_t *ptr)
+{
+  svbool_t res = svwhilewr (x, y);
+  *any = svptest_last (svptrue_b64 (), res);
+  *ptr = res;
+}
+
+int
+test2 (int64_t *x, int64_t *y)
+{
+  svbool_t res = svwhilewr (x, y);
+  return svptest_last (svptrue_b64 (), res);
+}
+
+/* { dg-final { scan-assembler-times {\twhilewr\t} 2 } } */
+/* { dg-final { scan-assembler-not {\tptrue\t} } } */
+/* { dg-final { scan-assembler-not {\tptest\t} } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/sve2/bcax_1.c b/gcc/testsuite/gcc.target/aarch64/sve2/bcax_1.c
new file mode 100644 (file)
index 0000000..4b0d5a9
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-vectorize -fdump-tree-vect-details --save-temps" } */
+
+#define OP(x,y,z) ((x) ^ ((y) & (z)))
+
+#include "bitsel_1.c"
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops in function" 4 "vect" } } */
+
+/* { dg-final { scan-assembler-not {\teor\tz[0-9]+\.[bhsd]} } } */
+
+/* { dg-final { scan-assembler-times {\tbcax\tz[0-9]+\.d, z[0-9]+\.d, z[0-9]+\.d, z[0-9]+\.d\n} 4 } } */