/* ACLE builtin definitions for ARM.
   Copyright (C) 2016-2021 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/>.  */

VAR1 (UBINOP, crc32b, si)
VAR1 (UBINOP, crc32h, si)
VAR1 (UBINOP, crc32w, si)
VAR1 (UBINOP, crc32cb, si)
VAR1 (UBINOP, crc32ch, si)
VAR1 (UBINOP, crc32cw, si)
VAR1 (CDP, cdp, void)
VAR1 (CDP, cdp2, void)
VAR1 (LDC, ldc, void)
VAR1 (LDC, ldc2, void)
VAR1 (LDC, ldcl, void)
VAR1 (LDC, ldc2l, void)
VAR1 (STC, stc, void)
VAR1 (STC, stc2, void)
VAR1 (STC, stcl, void)
VAR1 (STC, stc2l, void)
VAR1 (MCR, mcr, void)
VAR1 (MCR, mcr2, void)
VAR1 (MRC, mrc, si)
VAR1 (MRC, mrc2, si)
VAR1 (MCRR, mcrr, void)
VAR1 (MCRR, mcrr2, void)
VAR1 (MRRC, mrrc, di)
VAR1 (MRRC, mrrc2, di)

VAR1 (BINOP, sxtab16, si)
VAR1 (UBINOP, uxtab16, si)
VAR1 (UNOP, sxtb16, si)
VAR1 (BSWAP, uxtb16, si)
VAR1 (BINOP, qadd8, si)
VAR1 (BINOP, qsub8, si)
VAR1 (BINOP, shadd8, si)
VAR1 (BINOP, shsub8, si)
VAR1 (UBINOP, uhadd8, si)
VAR1 (UBINOP, uhsub8, si)
VAR1 (UBINOP, uqadd8, si)
VAR1 (UBINOP, uqsub8, si)
VAR1 (BINOP, qadd16, si)
VAR1 (BINOP, qasx, si)
VAR1 (BINOP, qsax, si)
VAR1 (BINOP, qsub16, si)
VAR1 (BINOP, shadd16, si)
VAR1 (BINOP, shasx, si)
VAR1 (BINOP, shsax, si)
VAR1 (BINOP, shsub16, si)
VAR1 (UBINOP, uhadd16, si)
VAR1 (UBINOP, uhasx, si)
VAR1 (UBINOP, uhsax, si)
VAR1 (UBINOP, uhsub16, si)
VAR1 (UBINOP, uqadd16, si)
VAR1 (UBINOP, uqasx, si)
VAR1 (UBINOP, uqsax, si)
VAR1 (UBINOP, uqsub16, si)
VAR1 (BINOP, smusd, si)
VAR1 (BINOP, smusdx, si)
VAR1 (UBINOP, usad8, si)
VAR1 (UBINOP, usada8, si)
VAR1 (TERNOP, smlald, di)
VAR1 (TERNOP, smlaldx, di)
VAR1 (TERNOP, smlsld, di)
VAR1 (TERNOP, smlsldx, di)

VAR1 (SAT_BINOP_UNSIGNED_IMM, ssat, si)
VAR1 (UNSIGNED_SAT_BINOP_UNSIGNED_IMM, usat, si)
VAR1 (SAT_OCCURRED, saturation_occurred, si)
VAR1 (SET_SAT, set_saturation, void)
VAR1 (BINOP, qadd, si)
VAR1 (BINOP, qsub, si)
VAR1 (TERNOP, smlabb, si)
VAR1 (TERNOP, smlatb, si)
VAR1 (TERNOP, smlatt, si)
VAR1 (TERNOP, smlawb, si)
VAR1 (TERNOP, smlawt, si)

VAR1 (BINOP, sadd8, si)
VAR1 (BINOP, ssub8, si)
VAR1 (BINOP, sadd16, si)
VAR1 (BINOP, sasx, si)
VAR1 (BINOP, ssax, si)
VAR1 (BINOP, ssub16, si)

VAR1 (UBINOP, uadd8, si)
VAR1 (UBINOP, usub8, si)
VAR1 (UBINOP, uadd16, si)
VAR1 (UBINOP, uasx, si)
VAR1 (UBINOP, usax, si)
VAR1 (UBINOP, usub16, si)

VAR1 (UBINOP, sel, si)

VAR1 (TERNOP, smlad, si)
VAR1 (TERNOP, smladx, si)
VAR1 (TERNOP, smlsd, si)
VAR1 (TERNOP, smlsdx, si)
VAR1 (BINOP, smuad, si)
VAR1 (BINOP, smuadx, si)

VAR1 (SAT_BINOP_UNSIGNED_IMM, ssat16, si)
VAR1 (SAT_BINOP_UNSIGNED_IMM, usat16, si)
