/* ACLE support for AArch64 SVE (__ARM_FEATURE_SVE intrinsics)
   Copyright (C) 2020-2022 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_arith, 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_arith, 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_arith, 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
