blob: af02397f1c42ecf7e3fa4f81a01407ef265f9fea [file] [log] [blame]
/* ACLE support for Arm MVE (__ARM_FEATURE_MVE intrinsics)
Copyright (C) 2023 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 "memmodel.h"
#include "insn-codes.h"
#include "optabs.h"
#include "expr.h"
#include "basic-block.h"
#include "function.h"
#include "gimple.h"
#include "arm-mve-builtins.h"
#include "arm-mve-builtins-shapes.h"
#include "arm-mve-builtins-base.h"
#include "arm-mve-builtins-functions.h"
using namespace arm_mve;
namespace {
/* Implements vreinterpretq_* intrinsics. */
class vreinterpretq_impl : public quiet<function_base>
{
gimple *
fold (gimple_folder &f) const override
{
/* We should punt to rtl if the effect of the reinterpret on
registers does not conform to GCC's endianness model like we do
on aarch64, but MVE intrinsics are not currently supported on
big-endian. For this, we'd need to handle big-endian properly
in the .md file, like we do on aarch64 with
define_insn_and_split "*aarch64_sve_reinterpret<mode>". */
gcc_assert (targetm.can_change_mode_class (f.vector_mode (0),
f.vector_mode (1),
VFP_REGS));
/* Otherwise vreinterpret corresponds directly to a VIEW_CONVERT_EXPR
reinterpretation. */
tree rhs = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (f.lhs),
gimple_call_arg (f.call, 0));
return gimple_build_assign (f.lhs, VIEW_CONVERT_EXPR, rhs);
}
rtx
expand (function_expander &e) const override
{
machine_mode mode = e.vector_mode (0);
return e.use_exact_insn (code_for_arm_mve_reinterpret (mode));
}
};
/* Implements vuninitializedq_* intrinsics. */
class vuninitializedq_impl : public quiet<function_base>
{
rtx
expand (function_expander &e) const override
{
rtx target = e.get_reg_target ();
emit_clobber (copy_rtx (target));
return target;
}
};
} /* end anonymous namespace */
namespace arm_mve {
/* Helper for builtins with RTX codes, _m predicated and _n overrides. */
#define FUNCTION_WITH_RTX_M_N(NAME, RTX, UNSPEC) FUNCTION \
(NAME, unspec_based_mve_function_exact_insn, \
(RTX, RTX, RTX, \
UNSPEC##_N_S, UNSPEC##_N_U, UNSPEC##_N_F, \
UNSPEC##_M_S, UNSPEC##_M_U, UNSPEC##_M_F, \
UNSPEC##_M_N_S, UNSPEC##_M_N_U, UNSPEC##_M_N_F))
/* Helper for builtins with RTX codes, and _m predicated overrides. */
#define FUNCTION_WITH_RTX_M(NAME, RTX, UNSPEC) FUNCTION \
(NAME, unspec_based_mve_function_exact_insn, \
(RTX, RTX, RTX, \
-1, -1, -1, \
UNSPEC##_M_S, UNSPEC##_M_U, UNSPEC##_M_F, \
-1, -1, -1))
/* Helper for builtins with RTX codes, _m predicated and _n
overrides, but no floating-point version. */
#define FUNCTION_WITH_RTX_M_N_NO_F(NAME, RTX, UNSPEC) FUNCTION \
(NAME, unspec_based_mve_function_exact_insn, \
(RTX, RTX, UNKNOWN, \
UNSPEC##_N_S, UNSPEC##_N_U, -1, \
UNSPEC##_M_S, UNSPEC##_M_U, -1, \
UNSPEC##_M_N_S, UNSPEC##_M_N_U, -1))
/* Helper for builtins with RTX codes, _m predicated and _n overrides. */
#define FUNCTION_WITH_RTX_M_N_NO_N_F(NAME, RTX, UNSPEC) FUNCTION \
(NAME, unspec_based_mve_function_exact_insn, \
(RTX, RTX, RTX, \
UNSPEC##_N_S, UNSPEC##_N_U, -1, \
UNSPEC##_M_S, UNSPEC##_M_U, UNSPEC##_M_F, \
UNSPEC##_M_N_S, UNSPEC##_M_N_U, -1))
/* Helper for builtins with RTX codes, _m predicated override, but
no floating-point versions. */
#define FUNCTION_WITH_RTX_M_NO_F(NAME, RTX_S, RTX_U, UNSPEC) FUNCTION \
(NAME, unspec_based_mve_function_exact_insn, \
(RTX_S, RTX_U, UNKNOWN, \
-1, -1, -1, \
UNSPEC##_M_S, UNSPEC##_M_U, -1, \
-1, -1, -1))
/* Helper for builtins without RTX codes, no _m predicated and no _n
overrides. */
#define FUNCTION_WITHOUT_M_N(NAME, UNSPEC) FUNCTION \
(NAME, unspec_mve_function_exact_insn, \
(UNSPEC##_S, UNSPEC##_U, UNSPEC##_F, \
-1, -1, -1, \
-1, -1, -1, \
-1, -1, -1))
/* Helper for builtins with only unspec codes, _m predicated and _n
overrides, but no floating-point version. */
#define FUNCTION_WITH_M_N_NO_F(NAME, UNSPEC) FUNCTION \
(NAME, unspec_mve_function_exact_insn, \
(UNSPEC##_S, UNSPEC##_U, -1, \
UNSPEC##_N_S, UNSPEC##_N_U, -1, \
UNSPEC##_M_S, UNSPEC##_M_U, -1, \
UNSPEC##_M_N_S, UNSPEC##_M_N_U, -1))
/* Helper for vshl builtins with only unspec codes, _m predicated
and _n and _r overrides. */
#define FUNCTION_WITH_M_N_R(NAME, UNSPEC) FUNCTION \
(NAME, unspec_mve_function_exact_insn_vshl, \
(UNSPEC##_S, UNSPEC##_U, \
UNSPEC##_N_S, UNSPEC##_N_U, \
UNSPEC##_M_S, UNSPEC##_M_U, \
UNSPEC##_M_N_S, UNSPEC##_M_N_U, \
UNSPEC##_M_R_S, UNSPEC##_M_R_U, \
UNSPEC##_R_S, UNSPEC##_R_U))
/* Helper for builtins with only unspec codes, _m predicated
overrides, no _n and no floating-point version. */
#define FUNCTION_WITHOUT_N_NO_F(NAME, UNSPEC) FUNCTION \
(NAME, unspec_mve_function_exact_insn, \
(UNSPEC##_S, UNSPEC##_U, -1, \
-1, -1, -1, \
UNSPEC##_M_S, UNSPEC##_M_U, -1, \
-1, -1, -1))
/* Helper for builtins with only unspec codes, _m predicated and _n
overrides, but no unsigned and floating-point versions. */
#define FUNCTION_WITH_M_N_NO_U_F(NAME, UNSPEC) FUNCTION \
(NAME, unspec_mve_function_exact_insn, \
(UNSPEC##_S, -1, -1, \
UNSPEC##_N_S, -1, -1, \
UNSPEC##_M_S, -1, -1, \
UNSPEC##_M_N_S, -1, -1))
/* Helper for builtins with only unspec codes, _m predicated
overrides, but no _n version. */
#define FUNCTION_WITHOUT_N(NAME, UNSPEC) FUNCTION \
(NAME, unspec_mve_function_exact_insn, \
(UNSPEC##_S, UNSPEC##_U, UNSPEC##_F, \
-1, -1, -1, \
UNSPEC##_M_S, UNSPEC##_M_U, UNSPEC##_M_F, \
-1, -1, -1))
/* Helper for builtins with only unspec codes, _m predicated
overrides, only _n version. */
#define FUNCTION_ONLY_N(NAME, UNSPEC) FUNCTION \
(NAME, unspec_mve_function_exact_insn, \
(-1, -1, -1, \
UNSPEC##_N_S, UNSPEC##_N_U, UNSPEC##_N_F, \
-1, -1, -1, \
UNSPEC##_M_N_S, UNSPEC##_M_N_U, UNSPEC##_M_N_F))
/* Helper for builtins with only unspec codes, _m predicated
overrides, only _n version, no floating-point. */
#define FUNCTION_ONLY_N_NO_F(NAME, UNSPEC) FUNCTION \
(NAME, unspec_mve_function_exact_insn, \
(-1, -1, -1, \
UNSPEC##_N_S, UNSPEC##_N_U, -1, \
-1, -1, -1, \
UNSPEC##_M_N_S, UNSPEC##_M_N_U, -1))
/* Helper for builtins with only unspec codes, _m predicated
overrides, only _n version, no unsigned, no floating-point. */
#define FUNCTION_ONLY_N_NO_U_F(NAME, UNSPEC) FUNCTION \
(NAME, unspec_mve_function_exact_insn, \
(-1, -1, -1, \
UNSPEC##_N_S, -1, -1, \
-1, -1, -1, \
UNSPEC##_M_N_S, -1, -1))
/* Helper for builtins with only unspec codes, _m predicated
overrides, but no _n version, no unsigned and no
floating-point. */
#define FUNCTION_WITHOUT_N_NO_U_F(NAME, UNSPEC) FUNCTION \
(NAME, unspec_mve_function_exact_insn, \
(UNSPEC##_S, -1, -1, \
-1, -1, -1, \
UNSPEC##_M_S, -1, -1, \
-1, -1, -1))
/* Helper for builtins with only unspec codes, _m predicated
overrides, only floating-point. */
#define FUNCTION_ONLY_F(NAME, UNSPEC) FUNCTION \
(NAME, unspec_mve_function_exact_insn, \
(-1, -1, UNSPEC##_F, \
-1, -1, -1, \
-1, -1, UNSPEC##_M_F, \
-1, -1, -1))
/* Helper for builtins without RTX codes, _S mode, _p predicated. */
#define FUNCTION_PRED_P_S(NAME, UNSPEC) FUNCTION \
(NAME, unspec_mve_function_exact_insn_pred_p, \
(UNSPEC##_S, -1, -1, \
UNSPEC##_P_S, -1, -1))
/* Helper for builtins without RTX codes, _S and _U modes, _p
predicated. */
#define FUNCTION_PRED_P_S_U(NAME, UNSPEC) FUNCTION \
(NAME, unspec_mve_function_exact_insn_pred_p, \
(UNSPEC##_S, UNSPEC##_U, -1, \
UNSPEC##_P_S, UNSPEC##_P_U, -1))
/* Helper for builtins without RTX codes, _F mode, _p predicated. */
#define FUNCTION_PRED_P_F(NAME, UNSPEC) FUNCTION \
(NAME, unspec_mve_function_exact_insn_pred_p, \
(-1, -1, UNSPEC##_F, \
-1, -1, UNSPEC##_P_F))
FUNCTION_PRED_P_S_U (vabavq, VABAVQ)
FUNCTION_WITHOUT_N (vabdq, VABDQ)
FUNCTION (vabsq, unspec_based_mve_function_exact_insn, (ABS, ABS, ABS, -1, -1, -1, VABSQ_M_S, -1, VABSQ_M_F, -1, -1, -1))
FUNCTION_WITH_RTX_M_N (vaddq, PLUS, VADDQ)
FUNCTION_PRED_P_S_U (vaddlvaq, VADDLVAQ)
FUNCTION_PRED_P_S_U (vaddlvq, VADDLVQ)
FUNCTION_PRED_P_S_U (vaddvq, VADDVQ)
FUNCTION_PRED_P_S_U (vaddvaq, VADDVAQ)
FUNCTION_WITH_RTX_M (vandq, AND, VANDQ)
FUNCTION_ONLY_N (vbrsrq, VBRSRQ)
FUNCTION_WITHOUT_N_NO_U_F (vclsq, VCLSQ)
FUNCTION (vclzq, unspec_based_mve_function_exact_insn, (CLZ, CLZ, CLZ, -1, -1, -1, VCLZQ_M_S, VCLZQ_M_U, -1, -1, -1 ,-1))
FUNCTION (vcmpeqq, unspec_based_mve_function_exact_insn_vcmp, (EQ, EQ, EQ, VCMPEQQ_M_S, VCMPEQQ_M_U, VCMPEQQ_M_F, VCMPEQQ_M_N_S, VCMPEQQ_M_N_U, VCMPEQQ_M_N_F))
FUNCTION (vcmpneq, unspec_based_mve_function_exact_insn_vcmp, (NE, NE, NE, VCMPNEQ_M_S, VCMPNEQ_M_U, VCMPNEQ_M_F, VCMPNEQ_M_N_S, VCMPNEQ_M_N_U, VCMPNEQ_M_N_F))
FUNCTION (vcmpgeq, unspec_based_mve_function_exact_insn_vcmp, (GE, UNKNOWN, GE, VCMPGEQ_M_S, UNKNOWN, VCMPGEQ_M_F, VCMPGEQ_M_N_S, UNKNOWN, VCMPGEQ_M_N_F))
FUNCTION (vcmpgtq, unspec_based_mve_function_exact_insn_vcmp, (GT, UNKNOWN, GT, VCMPGTQ_M_S, UNKNOWN, VCMPGTQ_M_F, VCMPGTQ_M_N_S, UNKNOWN, VCMPGTQ_M_N_F))
FUNCTION (vcmpleq, unspec_based_mve_function_exact_insn_vcmp, (LE, UNKNOWN, LE, VCMPLEQ_M_S, UNKNOWN, VCMPLEQ_M_F, VCMPLEQ_M_N_S, UNKNOWN, VCMPLEQ_M_N_F))
FUNCTION (vcmpltq, unspec_based_mve_function_exact_insn_vcmp, (LT, UNKNOWN, LT, VCMPLTQ_M_S, UNKNOWN, VCMPLTQ_M_F, VCMPLTQ_M_N_S, UNKNOWN, VCMPLTQ_M_N_F))
FUNCTION (vcmpcsq, unspec_based_mve_function_exact_insn_vcmp, (UNKNOWN, GEU, UNKNOWN, UNKNOWN, VCMPCSQ_M_U, UNKNOWN, UNKNOWN, VCMPCSQ_M_N_U, UNKNOWN))
FUNCTION (vcmphiq, unspec_based_mve_function_exact_insn_vcmp, (UNKNOWN, GTU, UNKNOWN, UNKNOWN, VCMPHIQ_M_U, UNKNOWN, UNKNOWN, VCMPHIQ_M_N_U, UNKNOWN))
FUNCTION_WITHOUT_M_N (vcreateq, VCREATEQ)
FUNCTION_ONLY_N (vdupq, VDUPQ)
FUNCTION_WITH_RTX_M (veorq, XOR, VEORQ)
FUNCTION (vfmaq, unspec_mve_function_exact_insn, (-1, -1, VFMAQ_F, -1, -1, VFMAQ_N_F, -1, -1, VFMAQ_M_F, -1, -1, VFMAQ_M_N_F))
FUNCTION (vfmasq, unspec_mve_function_exact_insn, (-1, -1, -1, -1, -1, VFMASQ_N_F, -1, -1, -1, -1, -1, VFMASQ_M_N_F))
FUNCTION (vfmsq, unspec_mve_function_exact_insn, (-1, -1, VFMSQ_F, -1, -1, -1, -1, -1, VFMSQ_M_F, -1, -1, -1))
FUNCTION_WITH_M_N_NO_F (vhaddq, VHADDQ)
FUNCTION_WITH_M_N_NO_F (vhsubq, VHSUBQ)
FUNCTION_PRED_P_S (vmaxavq, VMAXAVQ)
FUNCTION_WITHOUT_N_NO_U_F (vmaxaq, VMAXAQ)
FUNCTION_ONLY_F (vmaxnmaq, VMAXNMAQ)
FUNCTION_PRED_P_F (vmaxnmavq, VMAXNMAVQ)
FUNCTION (vmaxnmq, unspec_based_mve_function_exact_insn, (UNKNOWN, UNKNOWN, SMAX, -1, -1, -1, -1, -1, VMAXNMQ_M_F, -1, -1, -1))
FUNCTION_PRED_P_F (vmaxnmvq, VMAXNMVQ)
FUNCTION_WITH_RTX_M_NO_F (vmaxq, SMAX, UMAX, VMAXQ)
FUNCTION_PRED_P_S_U (vmaxvq, VMAXVQ)
FUNCTION_PRED_P_S (vminavq, VMINAVQ)
FUNCTION_WITHOUT_N_NO_U_F (vminaq, VMINAQ)
FUNCTION_ONLY_F (vminnmaq, VMINNMAQ)
FUNCTION_PRED_P_F (vminnmavq, VMINNMAVQ)
FUNCTION (vminnmq, unspec_based_mve_function_exact_insn, (UNKNOWN, UNKNOWN, SMIN, -1, -1, -1, -1, -1, VMINNMQ_M_F, -1, -1, -1))
FUNCTION_PRED_P_F (vminnmvq, VMINNMVQ)
FUNCTION_WITH_RTX_M_NO_F (vminq, SMIN, UMIN, VMINQ)
FUNCTION_PRED_P_S_U (vminvq, VMINVQ)
FUNCTION_PRED_P_S (vmladavaxq, VMLADAVAXQ)
FUNCTION_PRED_P_S_U (vmladavaq, VMLADAVAQ)
FUNCTION_PRED_P_S_U (vmladavq, VMLADAVQ)
FUNCTION_PRED_P_S (vmladavxq, VMLADAVXQ)
FUNCTION_PRED_P_S_U (vmlaldavaq, VMLALDAVAQ)
FUNCTION_PRED_P_S (vmlaldavaxq, VMLALDAVAXQ)
FUNCTION_PRED_P_S_U (vmlaldavq, VMLALDAVQ)
FUNCTION_PRED_P_S (vmlaldavxq, VMLALDAVXQ)
FUNCTION_ONLY_N_NO_F (vmlaq, VMLAQ)
FUNCTION_ONLY_N_NO_F (vmlasq, VMLASQ)
FUNCTION_PRED_P_S (vmlsdavaq, VMLSDAVAQ)
FUNCTION_PRED_P_S (vmlsdavaxq, VMLSDAVAXQ)
FUNCTION_PRED_P_S (vmlsdavq, VMLSDAVQ)
FUNCTION_PRED_P_S (vmlsdavxq, VMLSDAVXQ)
FUNCTION_PRED_P_S (vmlsldavaq, VMLSLDAVAQ)
FUNCTION_PRED_P_S (vmlsldavaxq, VMLSLDAVAXQ)
FUNCTION_PRED_P_S (vmlsldavq, VMLSLDAVQ)
FUNCTION_PRED_P_S (vmlsldavxq, VMLSLDAVXQ)
FUNCTION_WITHOUT_N_NO_F (vmovlbq, VMOVLBQ)
FUNCTION_WITHOUT_N_NO_F (vmovltq, VMOVLTQ)
FUNCTION_WITHOUT_N_NO_F (vmovnbq, VMOVNBQ)
FUNCTION_WITHOUT_N_NO_F (vmovntq, VMOVNTQ)
FUNCTION_WITHOUT_N_NO_F (vmulhq, VMULHQ)
FUNCTION_WITH_RTX_M_N (vmulq, MULT, VMULQ)
FUNCTION_WITH_RTX_M_N_NO_F (vmvnq, NOT, VMVNQ)
FUNCTION (vnegq, unspec_based_mve_function_exact_insn, (NEG, NEG, NEG, -1, -1, -1, VNEGQ_M_S, -1, VNEGQ_M_F, -1, -1, -1))
FUNCTION_WITHOUT_M_N (vpselq, VPSELQ)
FUNCTION_WITH_RTX_M_N_NO_N_F (vorrq, IOR, VORRQ)
FUNCTION_WITHOUT_N_NO_U_F (vqabsq, VQABSQ)
FUNCTION_WITH_M_N_NO_F (vqaddq, VQADDQ)
FUNCTION_WITHOUT_N_NO_F (vqmovnbq, VQMOVNBQ)
FUNCTION_WITHOUT_N_NO_F (vqmovntq, VQMOVNTQ)
FUNCTION_WITHOUT_N_NO_U_F (vqmovunbq, VQMOVUNBQ)
FUNCTION_WITHOUT_N_NO_U_F (vqmovuntq, VQMOVUNTQ)
FUNCTION_WITHOUT_N_NO_U_F (vqdmladhq, VQDMLADHQ)
FUNCTION_WITHOUT_N_NO_U_F (vqdmladhxq, VQDMLADHXQ)
FUNCTION_ONLY_N_NO_U_F (vqdmlahq, VQDMLAHQ)
FUNCTION_ONLY_N_NO_U_F (vqdmlashq, VQDMLASHQ)
FUNCTION_WITHOUT_N_NO_U_F (vqdmlsdhq, VQDMLSDHQ)
FUNCTION_WITHOUT_N_NO_U_F (vqdmlsdhxq, VQDMLSDHXQ)
FUNCTION_WITH_M_N_NO_U_F (vqdmulhq, VQDMULHQ)
FUNCTION_WITH_M_N_NO_U_F (vqdmullbq, VQDMULLBQ)
FUNCTION_WITH_M_N_NO_U_F (vqdmulltq, VQDMULLTQ)
FUNCTION_WITHOUT_N_NO_U_F (vqrdmladhq, VQRDMLADHQ)
FUNCTION_WITHOUT_N_NO_U_F (vqrdmladhxq, VQRDMLADHXQ)
FUNCTION_ONLY_N_NO_U_F (vqrdmlahq, VQRDMLAHQ)
FUNCTION_ONLY_N_NO_U_F (vqrdmlashq, VQRDMLASHQ)
FUNCTION_WITHOUT_N_NO_U_F (vqrdmlsdhq, VQRDMLSDHQ)
FUNCTION_WITHOUT_N_NO_U_F (vqrdmlsdhxq, VQRDMLSDHXQ)
FUNCTION_WITHOUT_N_NO_U_F (vqnegq, VQNEGQ)
FUNCTION_WITH_M_N_NO_F (vqrshlq, VQRSHLQ)
FUNCTION_WITH_M_N_NO_U_F (vqrdmulhq, VQRDMULHQ)
FUNCTION_WITH_M_N_R (vqshlq, VQSHLQ)
FUNCTION_ONLY_N_NO_U_F (vqshluq, VQSHLUQ)
FUNCTION_ONLY_N_NO_F (vqrshrnbq, VQRSHRNBQ)
FUNCTION_ONLY_N_NO_F (vqrshrntq, VQRSHRNTQ)
FUNCTION_ONLY_N_NO_U_F (vqrshrunbq, VQRSHRUNBQ)
FUNCTION_ONLY_N_NO_U_F (vqrshruntq, VQRSHRUNTQ)
FUNCTION_ONLY_N_NO_F (vqshrnbq, VQSHRNBQ)
FUNCTION_ONLY_N_NO_F (vqshrntq, VQSHRNTQ)
FUNCTION_ONLY_N_NO_U_F (vqshrunbq, VQSHRUNBQ)
FUNCTION_ONLY_N_NO_U_F (vqshruntq, VQSHRUNTQ)
FUNCTION_WITH_M_N_NO_F (vqsubq, VQSUBQ)
FUNCTION (vreinterpretq, vreinterpretq_impl,)
FUNCTION_WITHOUT_N_NO_F (vrev16q, VREV16Q)
FUNCTION_WITHOUT_N (vrev32q, VREV32Q)
FUNCTION_WITHOUT_N (vrev64q, VREV64Q)
FUNCTION_WITHOUT_N_NO_F (vrhaddq, VRHADDQ)
FUNCTION_PRED_P_S_U (vrmlaldavhaq, VRMLALDAVHAQ)
FUNCTION_PRED_P_S (vrmlaldavhaxq, VRMLALDAVHAXQ)
FUNCTION_PRED_P_S_U (vrmlaldavhq, VRMLALDAVHQ)
FUNCTION_PRED_P_S (vrmlaldavhxq, VRMLALDAVHXQ)
FUNCTION_PRED_P_S (vrmlsldavhaq, VRMLSLDAVHAQ)
FUNCTION_PRED_P_S (vrmlsldavhaxq, VRMLSLDAVHAXQ)
FUNCTION_PRED_P_S (vrmlsldavhq, VRMLSLDAVHQ)
FUNCTION_PRED_P_S (vrmlsldavhxq, VRMLSLDAVHXQ)
FUNCTION_WITHOUT_N_NO_F (vrmulhq, VRMULHQ)
FUNCTION_ONLY_F (vrndq, VRNDQ)
FUNCTION_ONLY_F (vrndaq, VRNDAQ)
FUNCTION_ONLY_F (vrndmq, VRNDMQ)
FUNCTION_ONLY_F (vrndnq, VRNDNQ)
FUNCTION_ONLY_F (vrndpq, VRNDPQ)
FUNCTION_ONLY_F (vrndxq, VRNDXQ)
FUNCTION_WITH_M_N_NO_F (vrshlq, VRSHLQ)
FUNCTION_ONLY_N_NO_F (vrshrnbq, VRSHRNBQ)
FUNCTION_ONLY_N_NO_F (vrshrntq, VRSHRNTQ)
FUNCTION_ONLY_N_NO_F (vrshrq, VRSHRQ)
FUNCTION_ONLY_N_NO_F (vshllbq, VSHLLBQ)
FUNCTION_ONLY_N_NO_F (vshlltq, VSHLLTQ)
FUNCTION_WITH_M_N_R (vshlq, VSHLQ)
FUNCTION_ONLY_N_NO_F (vshrnbq, VSHRNBQ)
FUNCTION_ONLY_N_NO_F (vshrntq, VSHRNTQ)
FUNCTION_ONLY_N_NO_F (vshrq, VSHRQ)
FUNCTION_ONLY_N_NO_F (vsliq, VSLIQ)
FUNCTION_ONLY_N_NO_F (vsriq, VSRIQ)
FUNCTION_WITH_RTX_M_N (vsubq, MINUS, VSUBQ)
FUNCTION (vuninitializedq, vuninitializedq_impl,)
} /* end namespace arm_mve */