| /* ACLE support for AArch64 SVE (function shapes) |
| Copyright (C) 2018-2021 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_SHAPES_H |
| #define GCC_AARCH64_SVE_BUILTINS_SHAPES_H |
| |
| namespace aarch64_sve |
| { |
| /* The naming convention is: |
| |
| - to use the name of the function if the rules are very specific to |
| a particular function (e.g. svext, for which the range of the |
| final immediate value is in no way generic). |
| |
| - to use names like "unary" etc. if the rules are somewhat generic, |
| especially if there are no ranges involved. |
| |
| When using generic names, the handling of the final vector argument |
| can be modified as follows: |
| |
| - an "_n" suffix changes the argument from a vector to a scalar. |
| |
| - an "_opt_n" suffix says that there are two forms of each function: |
| one in which the argument is the usual vector, and one in which it |
| is replaced by a scalar. |
| |
| - "_int" and "_uint" replace the argument's element type with a |
| signed or unsigned integer of the same width. The suffixes above |
| then indicate whether this final argument is or might be a scalar. |
| |
| - "_int64" and "_uint64" similarly replace the argument's element type |
| with int64_t or uint64_t. |
| |
| - "_wide" replaces the argument's element type with a 64-bit integer |
| of the same signedness. This only makes sense for integer elements. |
| |
| - "_lane" indicates that the argument is indexed by a constant lane |
| number, provided as an immediately-following argument of type uint64_t. |
| |
| Also: |
| |
| - "inherent" means that the function takes no arguments. |
| |
| - "_rotate" means that the final argument is a rotation amount |
| (0, 90, 180 or 270). |
| |
| - "_scalar" indicates that all data arguments are scalars rather |
| than vectors. |
| |
| - in gather/scatter addresses, "sv" stands for "scalar base, |
| vector displacement" while "vs" stands for "vector base, |
| scalar displacement". |
| |
| - "_pred" indicates that the function takes an svbool_t argument |
| that does not act as a governing predicate.. */ |
| namespace shapes |
| { |
| extern const function_shape *const adr_index; |
| extern const function_shape *const adr_offset; |
| 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; |
| extern const function_shape *const count_pat; |
| extern const function_shape *const count_pred; |
| extern const function_shape *const count_vector; |
| extern const function_shape *const create; |
| extern const function_shape *const dupq; |
| extern const function_shape *const ext; |
| extern const function_shape *const fold_left; |
| extern const function_shape *const get; |
| extern const function_shape *const inc_dec; |
| extern const function_shape *const inc_dec_pat; |
| extern const function_shape *const inc_dec_pred; |
| extern const function_shape *const inc_dec_pred_scalar; |
| extern const function_shape *const inherent; |
| extern const function_shape *const inherent_b; |
| 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 mmla; |
| extern const function_shape *const pattern_pred; |
| extern const function_shape *const prefetch; |
| extern const function_shape *const prefetch_gather_index; |
| extern const function_shape *const prefetch_gather_offset; |
| extern const function_shape *const ptest; |
| extern const function_shape *const rdffr; |
| extern const function_shape *const reduction; |
| 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_bfloat; |
| extern const function_shape *const ternary_bfloat_lane; |
| extern const function_shape *const ternary_bfloat_lanex2; |
| extern const function_shape *const ternary_bfloat_opt_n; |
| extern const function_shape *const ternary_intq_uintq_lane; |
| extern const function_shape *const ternary_intq_uintq_opt_n; |
| 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 ternary_uintq_intq; |
| extern const function_shape *const ternary_uintq_intq_lane; |
| extern const function_shape *const ternary_uintq_intq_opt_n; |
| 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; |
| } |
| } |
| |
| #endif |