Home | History | Annotate | Line # | Download | only in aarch64
aarch64-simd-builtins.def revision 1.1.1.6
      1 /* Machine description for AArch64 architecture.
      2    Copyright (C) 2012-2019 Free Software Foundation, Inc.
      3    Contributed by ARM Ltd.
      4 
      5    This file is part of GCC.
      6 
      7    GCC is free software; you can redistribute it and/or modify it
      8    under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3, or (at your option)
     10    any later version.
     11 
     12    GCC is distributed in the hope that it will be useful, but
     13    WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     15    General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with GCC; see the file COPYING3.  If not see
     19    <http://www.gnu.org/licenses/>.  */
     20 
     21 /* In the list below, the BUILTIN_<ITERATOR> macros expand to create
     22    builtins for each of the modes described by <ITERATOR>.  When adding
     23    new builtins to this list, a helpful idiom to follow is to add
     24    a line for each pattern in the md file.  Thus, ADDP, which has one
     25    pattern defined for the VD_BHSI iterator, and one for DImode, has two
     26    entries below.
     27 
     28    Parameter 1 is the 'type' of the intrinsic.  This is used to
     29    describe the type modifiers (for example; unsigned) applied to
     30    each of the parameters to the intrinsic function.
     31 
     32    Parameter 2 is the name of the intrinsic.  This is appended
     33    to `__builtin_aarch64_<name><mode>` to give the intrinsic name
     34    as exported to the front-ends.
     35 
     36    Parameter 3 describes how to map from the name to the CODE_FOR_
     37    macro holding the RTL pattern for the intrinsic.  This mapping is:
     38    0 - CODE_FOR_aarch64_<name><mode>
     39    1-9 - CODE_FOR_<name><mode><1-9>
     40    10 - CODE_FOR_<name><mode>.  */
     41 
     42   BUILTIN_VDC (COMBINE, combine, 0)
     43   VAR1 (COMBINEP, combine, 0, di)
     44   BUILTIN_VB (BINOP, pmul, 0)
     45   BUILTIN_VHSDF_HSDF (BINOP, fmulx, 0)
     46   BUILTIN_VHSDF_DF (UNOP, sqrt, 2)
     47   BUILTIN_VD_BHSI (BINOP, addp, 0)
     48   VAR1 (UNOP, addp, 0, di)
     49   BUILTIN_VDQ_BHSI (UNOP, clrsb, 2)
     50   BUILTIN_VDQ_BHSI (UNOP, clz, 2)
     51   BUILTIN_VS (UNOP, ctz, 2)
     52   BUILTIN_VB (UNOP, popcount, 2)
     53 
     54   /* Implemented by aarch64_<sur>q<r>shl<mode>.  */
     55   BUILTIN_VSDQ_I (BINOP, sqshl, 0)
     56   BUILTIN_VSDQ_I (BINOP_UUS, uqshl, 0)
     57   BUILTIN_VSDQ_I (BINOP, sqrshl, 0)
     58   BUILTIN_VSDQ_I (BINOP_UUS, uqrshl, 0)
     59   /* Implemented by aarch64_<su_optab><optab><mode>.  */
     60   BUILTIN_VSDQ_I (BINOP, sqadd, 0)
     61   BUILTIN_VSDQ_I (BINOPU, uqadd, 0)
     62   BUILTIN_VSDQ_I (BINOP, sqsub, 0)
     63   BUILTIN_VSDQ_I (BINOPU, uqsub, 0)
     64   /* Implemented by aarch64_<sur>qadd<mode>.  */
     65   BUILTIN_VSDQ_I (BINOP_SSU, suqadd, 0)
     66   BUILTIN_VSDQ_I (BINOP_UUS, usqadd, 0)
     67 
     68   /* Implemented by aarch64_get_dreg<VSTRUCT:mode><VDC:mode>.  */
     69   BUILTIN_VDC (GETREG, get_dregoi, 0)
     70   BUILTIN_VDC (GETREG, get_dregci, 0)
     71   BUILTIN_VDC (GETREG, get_dregxi, 0)
     72   VAR1 (GETREGP, get_dregoi, 0, di)
     73   VAR1 (GETREGP, get_dregci, 0, di)
     74   VAR1 (GETREGP, get_dregxi, 0, di)
     75   /* Implemented by aarch64_get_qreg<VSTRUCT:mode><VQ:mode>.  */
     76   BUILTIN_VQ (GETREG, get_qregoi, 0)
     77   BUILTIN_VQ (GETREG, get_qregci, 0)
     78   BUILTIN_VQ (GETREG, get_qregxi, 0)
     79   VAR1 (GETREGP, get_qregoi, 0, v2di)
     80   VAR1 (GETREGP, get_qregci, 0, v2di)
     81   VAR1 (GETREGP, get_qregxi, 0, v2di)
     82   /* Implemented by aarch64_set_qreg<VSTRUCT:mode><VQ:mode>.  */
     83   BUILTIN_VQ (SETREG, set_qregoi, 0)
     84   BUILTIN_VQ (SETREG, set_qregci, 0)
     85   BUILTIN_VQ (SETREG, set_qregxi, 0)
     86   VAR1 (SETREGP, set_qregoi, 0, v2di)
     87   VAR1 (SETREGP, set_qregci, 0, v2di)
     88   VAR1 (SETREGP, set_qregxi, 0, v2di)
     89   /* Implemented by aarch64_ld1x2<VQ:mode>. */
     90   BUILTIN_VQ (LOADSTRUCT, ld1x2, 0)
     91   /* Implemented by aarch64_ld1x2<VDC:mode>. */
     92   BUILTIN_VDC (LOADSTRUCT, ld1x2, 0)
     93   /* Implemented by aarch64_ld<VSTRUCT:nregs><VDC:mode>.  */
     94   BUILTIN_VDC (LOADSTRUCT, ld2, 0)
     95   BUILTIN_VDC (LOADSTRUCT, ld3, 0)
     96   BUILTIN_VDC (LOADSTRUCT, ld4, 0)
     97   /* Implemented by aarch64_ld<VSTRUCT:nregs><VQ:mode>.  */
     98   BUILTIN_VQ (LOADSTRUCT, ld2, 0)
     99   BUILTIN_VQ (LOADSTRUCT, ld3, 0)
    100   BUILTIN_VQ (LOADSTRUCT, ld4, 0)
    101   /* Implemented by aarch64_ld<VSTRUCT:nregs>r<VALLDIF:mode>.  */
    102   BUILTIN_VALLDIF (LOADSTRUCT, ld2r, 0)
    103   BUILTIN_VALLDIF (LOADSTRUCT, ld3r, 0)
    104   BUILTIN_VALLDIF (LOADSTRUCT, ld4r, 0)
    105   /* Implemented by aarch64_ld<VSTRUCT:nregs>_lane<VQ:mode>.  */
    106   BUILTIN_VALLDIF (LOADSTRUCT_LANE, ld2_lane, 0)
    107   BUILTIN_VALLDIF (LOADSTRUCT_LANE, ld3_lane, 0)
    108   BUILTIN_VALLDIF (LOADSTRUCT_LANE, ld4_lane, 0)
    109   /* Implemented by aarch64_st<VSTRUCT:nregs><VDC:mode>.  */
    110   BUILTIN_VDC (STORESTRUCT, st2, 0)
    111   BUILTIN_VDC (STORESTRUCT, st3, 0)
    112   BUILTIN_VDC (STORESTRUCT, st4, 0)
    113   /* Implemented by aarch64_st<VSTRUCT:nregs><VQ:mode>.  */
    114   BUILTIN_VQ (STORESTRUCT, st2, 0)
    115   BUILTIN_VQ (STORESTRUCT, st3, 0)
    116   BUILTIN_VQ (STORESTRUCT, st4, 0)
    117 
    118   BUILTIN_VALLDIF (STORESTRUCT_LANE, st2_lane, 0)
    119   BUILTIN_VALLDIF (STORESTRUCT_LANE, st3_lane, 0)
    120   BUILTIN_VALLDIF (STORESTRUCT_LANE, st4_lane, 0)
    121 
    122   BUILTIN_VQW (BINOP, saddl2, 0)
    123   BUILTIN_VQW (BINOP, uaddl2, 0)
    124   BUILTIN_VQW (BINOP, ssubl2, 0)
    125   BUILTIN_VQW (BINOP, usubl2, 0)
    126   BUILTIN_VQW (BINOP, saddw2, 0)
    127   BUILTIN_VQW (BINOP, uaddw2, 0)
    128   BUILTIN_VQW (BINOP, ssubw2, 0)
    129   BUILTIN_VQW (BINOP, usubw2, 0)
    130   /* Implemented by aarch64_<ANY_EXTEND:su><ADDSUB:optab>l<mode>.  */
    131   BUILTIN_VD_BHSI (BINOP, saddl, 0)
    132   BUILTIN_VD_BHSI (BINOP, uaddl, 0)
    133   BUILTIN_VD_BHSI (BINOP, ssubl, 0)
    134   BUILTIN_VD_BHSI (BINOP, usubl, 0)
    135   /* Implemented by aarch64_<ANY_EXTEND:su><ADDSUB:optab>w<mode>.  */
    136   BUILTIN_VD_BHSI (BINOP, saddw, 0)
    137   BUILTIN_VD_BHSI (BINOP, uaddw, 0)
    138   BUILTIN_VD_BHSI (BINOP, ssubw, 0)
    139   BUILTIN_VD_BHSI (BINOP, usubw, 0)
    140   /* Implemented by aarch64_<sur>h<addsub><mode>.  */
    141   BUILTIN_VDQ_BHSI (BINOP, shadd, 0)
    142   BUILTIN_VDQ_BHSI (BINOP, shsub, 0)
    143   BUILTIN_VDQ_BHSI (BINOP, uhadd, 0)
    144   BUILTIN_VDQ_BHSI (BINOP, uhsub, 0)
    145   BUILTIN_VDQ_BHSI (BINOP, srhadd, 0)
    146   BUILTIN_VDQ_BHSI (BINOP, urhadd, 0)
    147   /* Implemented by aarch64_<sur><addsub>hn<mode>.  */
    148   BUILTIN_VQN (BINOP, addhn, 0)
    149   BUILTIN_VQN (BINOP, subhn, 0)
    150   BUILTIN_VQN (BINOP, raddhn, 0)
    151   BUILTIN_VQN (BINOP, rsubhn, 0)
    152   /* Implemented by aarch64_<sur><addsub>hn2<mode>.  */
    153   BUILTIN_VQN (TERNOP, addhn2, 0)
    154   BUILTIN_VQN (TERNOP, subhn2, 0)
    155   BUILTIN_VQN (TERNOP, raddhn2, 0)
    156   BUILTIN_VQN (TERNOP, rsubhn2, 0)
    157 
    158   BUILTIN_VSQN_HSDI (UNOP, sqmovun, 0)
    159   /* Implemented by aarch64_<sur>qmovn<mode>.  */
    160   BUILTIN_VSQN_HSDI (UNOP, sqmovn, 0)
    161   BUILTIN_VSQN_HSDI (UNOP, uqmovn, 0)
    162   /* Implemented by aarch64_s<optab><mode>.  */
    163   BUILTIN_VSDQ_I (UNOP, sqabs, 0)
    164   BUILTIN_VSDQ_I (UNOP, sqneg, 0)
    165 
    166   /* Implemented by aarch64_sqdml<SBINQOPS:as>l<mode>.  */
    167   BUILTIN_VSD_HSI (TERNOP, sqdmlal, 0)
    168   BUILTIN_VSD_HSI (TERNOP, sqdmlsl, 0)
    169   /* Implemented by aarch64_sqdml<SBINQOPS:as>l_lane<mode>.  */
    170   BUILTIN_VSD_HSI (QUADOP_LANE, sqdmlal_lane, 0)
    171   BUILTIN_VSD_HSI (QUADOP_LANE, sqdmlsl_lane, 0)
    172   /* Implemented by aarch64_sqdml<SBINQOPS:as>l_laneq<mode>.  */
    173   BUILTIN_VSD_HSI (QUADOP_LANE, sqdmlal_laneq, 0)
    174   BUILTIN_VSD_HSI (QUADOP_LANE, sqdmlsl_laneq, 0)
    175   /* Implemented by aarch64_sqdml<SBINQOPS:as>l_n<mode>.  */
    176   BUILTIN_VD_HSI (TERNOP, sqdmlal_n, 0)
    177   BUILTIN_VD_HSI (TERNOP, sqdmlsl_n, 0)
    178 
    179   BUILTIN_VQ_HSI (TERNOP, sqdmlal2, 0)
    180   BUILTIN_VQ_HSI (TERNOP, sqdmlsl2, 0)
    181   BUILTIN_VQ_HSI (QUADOP_LANE, sqdmlal2_lane, 0)
    182   BUILTIN_VQ_HSI (QUADOP_LANE, sqdmlsl2_lane, 0)
    183   BUILTIN_VQ_HSI (QUADOP_LANE, sqdmlal2_laneq, 0)
    184   BUILTIN_VQ_HSI (QUADOP_LANE, sqdmlsl2_laneq, 0)
    185   BUILTIN_VQ_HSI (TERNOP, sqdmlal2_n, 0)
    186   BUILTIN_VQ_HSI (TERNOP, sqdmlsl2_n, 0)
    187 
    188   BUILTIN_VSD_HSI (BINOP, sqdmull, 0)
    189   BUILTIN_VSD_HSI (TERNOP_LANE, sqdmull_lane, 0)
    190   BUILTIN_VSD_HSI (TERNOP_LANE, sqdmull_laneq, 0)
    191   BUILTIN_VD_HSI (BINOP, sqdmull_n, 0)
    192   BUILTIN_VQ_HSI (BINOP, sqdmull2, 0)
    193   BUILTIN_VQ_HSI (TERNOP_LANE, sqdmull2_lane, 0)
    194   BUILTIN_VQ_HSI (TERNOP_LANE, sqdmull2_laneq, 0)
    195   BUILTIN_VQ_HSI (BINOP, sqdmull2_n, 0)
    196   /* Implemented by aarch64_sq<r>dmulh<mode>.  */
    197   BUILTIN_VSDQ_HSI (BINOP, sqdmulh, 0)
    198   BUILTIN_VSDQ_HSI (BINOP, sqrdmulh, 0)
    199   /* Implemented by aarch64_sq<r>dmulh_lane<q><mode>.  */
    200   BUILTIN_VSDQ_HSI (TERNOP_LANE, sqdmulh_lane, 0)
    201   BUILTIN_VSDQ_HSI (TERNOP_LANE, sqdmulh_laneq, 0)
    202   BUILTIN_VSDQ_HSI (TERNOP_LANE, sqrdmulh_lane, 0)
    203   BUILTIN_VSDQ_HSI (TERNOP_LANE, sqrdmulh_laneq, 0)
    204 
    205   BUILTIN_VSDQ_I_DI (BINOP, ashl, 3)
    206   /* Implemented by aarch64_<sur>shl<mode>.  */
    207   BUILTIN_VSDQ_I_DI (BINOP, sshl, 0)
    208   BUILTIN_VSDQ_I_DI (BINOP_UUS, ushl, 0)
    209   BUILTIN_VSDQ_I_DI (BINOP, srshl, 0)
    210   BUILTIN_VSDQ_I_DI (BINOP_UUS, urshl, 0)
    211 
    212   /* Implemented by aarch64_<sur><dotprod>{_lane}{q}<dot_mode>.  */
    213   BUILTIN_VB (TERNOP, sdot, 0)
    214   BUILTIN_VB (TERNOPU, udot, 0)
    215   BUILTIN_VB (QUADOP_LANE, sdot_lane, 0)
    216   BUILTIN_VB (QUADOPU_LANE, udot_lane, 0)
    217   BUILTIN_VB (QUADOP_LANE, sdot_laneq, 0)
    218   BUILTIN_VB (QUADOPU_LANE, udot_laneq, 0)
    219 
    220   /* Implemented by aarch64_fcadd<rot><mode>.   */
    221   BUILTIN_VHSDF (BINOP, fcadd90, 0)
    222   BUILTIN_VHSDF (BINOP, fcadd270, 0)
    223 
    224   /* Implemented by aarch64_fcmla{_lane}{q}<rot><mode>.   */
    225   BUILTIN_VHSDF (TERNOP, fcmla0, 0)
    226   BUILTIN_VHSDF (TERNOP, fcmla90, 0)
    227   BUILTIN_VHSDF (TERNOP, fcmla180, 0)
    228   BUILTIN_VHSDF (TERNOP, fcmla270, 0)
    229   BUILTIN_VHSDF (QUADOP_LANE_PAIR, fcmla_lane0, 0)
    230   BUILTIN_VHSDF (QUADOP_LANE_PAIR, fcmla_lane90, 0)
    231   BUILTIN_VHSDF (QUADOP_LANE_PAIR, fcmla_lane180, 0)
    232   BUILTIN_VHSDF (QUADOP_LANE_PAIR, fcmla_lane270, 0)
    233 
    234   BUILTIN_VQ_HSF (QUADOP_LANE_PAIR, fcmlaq_lane0, 0)
    235   BUILTIN_VQ_HSF (QUADOP_LANE_PAIR, fcmlaq_lane90, 0)
    236   BUILTIN_VQ_HSF (QUADOP_LANE_PAIR, fcmlaq_lane180, 0)
    237   BUILTIN_VQ_HSF (QUADOP_LANE_PAIR, fcmlaq_lane270, 0)
    238 
    239   BUILTIN_VDQ_I (SHIFTIMM, ashr, 3)
    240   VAR1 (SHIFTIMM, ashr_simd, 0, di)
    241   BUILTIN_VDQ_I (SHIFTIMM, lshr, 3)
    242   VAR1 (USHIFTIMM, lshr_simd, 0, di)
    243   /* Implemented by aarch64_<sur>shr_n<mode>.  */
    244   BUILTIN_VSDQ_I_DI (SHIFTIMM, srshr_n, 0)
    245   BUILTIN_VSDQ_I_DI (USHIFTIMM, urshr_n, 0)
    246   /* Implemented by aarch64_<sur>sra_n<mode>.  */
    247   BUILTIN_VSDQ_I_DI (SHIFTACC, ssra_n, 0)
    248   BUILTIN_VSDQ_I_DI (USHIFTACC, usra_n, 0)
    249   BUILTIN_VSDQ_I_DI (SHIFTACC, srsra_n, 0)
    250   BUILTIN_VSDQ_I_DI (USHIFTACC, ursra_n, 0)
    251   /* Implemented by aarch64_<sur>shll_n<mode>.  */
    252   BUILTIN_VD_BHSI (SHIFTIMM, sshll_n, 0)
    253   BUILTIN_VD_BHSI (USHIFTIMM, ushll_n, 0)
    254   /* Implemented by aarch64_<sur>shll2_n<mode>.  */
    255   BUILTIN_VQW (SHIFTIMM, sshll2_n, 0)
    256   BUILTIN_VQW (SHIFTIMM, ushll2_n, 0)
    257   /* Implemented by aarch64_<sur>q<r>shr<u>n_n<mode>.  */
    258   BUILTIN_VSQN_HSDI (SHIFTIMM, sqshrun_n, 0)
    259   BUILTIN_VSQN_HSDI (SHIFTIMM, sqrshrun_n, 0)
    260   BUILTIN_VSQN_HSDI (SHIFTIMM, sqshrn_n, 0)
    261   BUILTIN_VSQN_HSDI (USHIFTIMM, uqshrn_n, 0)
    262   BUILTIN_VSQN_HSDI (SHIFTIMM, sqrshrn_n, 0)
    263   BUILTIN_VSQN_HSDI (USHIFTIMM, uqrshrn_n, 0)
    264   /* Implemented by aarch64_<sur>s<lr>i_n<mode>.  */
    265   BUILTIN_VSDQ_I_DI (SHIFTINSERT, ssri_n, 0)
    266   BUILTIN_VSDQ_I_DI (USHIFTACC, usri_n, 0)
    267   BUILTIN_VSDQ_I_DI (SHIFTINSERT, ssli_n, 0)
    268   VAR2 (SHIFTINSERTP, ssli_n, 0, di, v2di)
    269   BUILTIN_VSDQ_I_DI (USHIFTACC, usli_n, 0)
    270   /* Implemented by aarch64_<sur>qshl<u>_n<mode>.  */
    271   BUILTIN_VSDQ_I (SHIFTIMM_USS, sqshlu_n, 0)
    272   BUILTIN_VSDQ_I (SHIFTIMM, sqshl_n, 0)
    273   BUILTIN_VSDQ_I (USHIFTIMM, uqshl_n, 0)
    274 
    275   /* Implemented by aarch64_reduc_plus_<mode>.  */
    276   BUILTIN_VALL (UNOP, reduc_plus_scal_, 10)
    277 
    278   /* Implemented by reduc_<maxmin_uns>_scal_<mode> (producing scalar).  */
    279   BUILTIN_VDQIF_F16 (UNOP, reduc_smax_scal_, 10)
    280   BUILTIN_VDQIF_F16 (UNOP, reduc_smin_scal_, 10)
    281   BUILTIN_VDQ_BHSI (UNOPU, reduc_umax_scal_, 10)
    282   BUILTIN_VDQ_BHSI (UNOPU, reduc_umin_scal_, 10)
    283   BUILTIN_VHSDF (UNOP, reduc_smax_nan_scal_, 10)
    284   BUILTIN_VHSDF (UNOP, reduc_smin_nan_scal_, 10)
    285 
    286   /* Implemented by <maxmin_uns><mode>3.
    287      smax variants map to fmaxnm,
    288      smax_nan variants map to fmax.  */
    289   BUILTIN_VDQ_BHSI (BINOP, smax, 3)
    290   BUILTIN_VDQ_BHSI (BINOP, smin, 3)
    291   BUILTIN_VDQ_BHSI (BINOP, umax, 3)
    292   BUILTIN_VDQ_BHSI (BINOP, umin, 3)
    293   BUILTIN_VHSDF_DF (BINOP, smax_nan, 3)
    294   BUILTIN_VHSDF_DF (BINOP, smin_nan, 3)
    295 
    296   /* Implemented by <maxmin_uns><mode>3.  */
    297   BUILTIN_VHSDF_HSDF (BINOP, fmax, 3)
    298   BUILTIN_VHSDF_HSDF (BINOP, fmin, 3)
    299 
    300   /* Implemented by aarch64_<maxmin_uns>p<mode>.  */
    301   BUILTIN_VDQ_BHSI (BINOP, smaxp, 0)
    302   BUILTIN_VDQ_BHSI (BINOP, sminp, 0)
    303   BUILTIN_VDQ_BHSI (BINOP, umaxp, 0)
    304   BUILTIN_VDQ_BHSI (BINOP, uminp, 0)
    305   BUILTIN_VHSDF (BINOP, smaxp, 0)
    306   BUILTIN_VHSDF (BINOP, sminp, 0)
    307   BUILTIN_VHSDF (BINOP, smax_nanp, 0)
    308   BUILTIN_VHSDF (BINOP, smin_nanp, 0)
    309 
    310   /* Implemented by <frint_pattern><mode>2.  */
    311   BUILTIN_VHSDF (UNOP, btrunc, 2)
    312   BUILTIN_VHSDF (UNOP, ceil, 2)
    313   BUILTIN_VHSDF (UNOP, floor, 2)
    314   BUILTIN_VHSDF (UNOP, nearbyint, 2)
    315   BUILTIN_VHSDF (UNOP, rint, 2)
    316   BUILTIN_VHSDF (UNOP, round, 2)
    317   BUILTIN_VHSDF_DF (UNOP, frintn, 2)
    318 
    319   VAR1 (UNOP, btrunc, 2, hf)
    320   VAR1 (UNOP, ceil, 2, hf)
    321   VAR1 (UNOP, floor, 2, hf)
    322   VAR1 (UNOP, frintn, 2, hf)
    323   VAR1 (UNOP, nearbyint, 2, hf)
    324   VAR1 (UNOP, rint, 2, hf)
    325   VAR1 (UNOP, round, 2, hf)
    326 
    327   /* Implemented by l<fcvt_pattern><su_optab><VQDF:mode><vcvt_target>2.  */
    328   VAR1 (UNOP, lbtruncv4hf, 2, v4hi)
    329   VAR1 (UNOP, lbtruncv8hf, 2, v8hi)
    330   VAR1 (UNOP, lbtruncv2sf, 2, v2si)
    331   VAR1 (UNOP, lbtruncv4sf, 2, v4si)
    332   VAR1 (UNOP, lbtruncv2df, 2, v2di)
    333 
    334   VAR1 (UNOPUS, lbtruncuv4hf, 2, v4hi)
    335   VAR1 (UNOPUS, lbtruncuv8hf, 2, v8hi)
    336   VAR1 (UNOPUS, lbtruncuv2sf, 2, v2si)
    337   VAR1 (UNOPUS, lbtruncuv4sf, 2, v4si)
    338   VAR1 (UNOPUS, lbtruncuv2df, 2, v2di)
    339 
    340   VAR1 (UNOP, lroundv4hf, 2, v4hi)
    341   VAR1 (UNOP, lroundv8hf, 2, v8hi)
    342   VAR1 (UNOP, lroundv2sf, 2, v2si)
    343   VAR1 (UNOP, lroundv4sf, 2, v4si)
    344   VAR1 (UNOP, lroundv2df, 2, v2di)
    345   /* Implemented by l<fcvt_pattern><su_optab><GPF_F16:mode><GPI:mode>2.  */
    346   BUILTIN_GPI_I16 (UNOP, lroundhf, 2)
    347   VAR1 (UNOP, lroundsf, 2, si)
    348   VAR1 (UNOP, lrounddf, 2, di)
    349 
    350   VAR1 (UNOPUS, lrounduv4hf, 2, v4hi)
    351   VAR1 (UNOPUS, lrounduv8hf, 2, v8hi)
    352   VAR1 (UNOPUS, lrounduv2sf, 2, v2si)
    353   VAR1 (UNOPUS, lrounduv4sf, 2, v4si)
    354   VAR1 (UNOPUS, lrounduv2df, 2, v2di)
    355   BUILTIN_GPI_I16 (UNOPUS, lrounduhf, 2)
    356   VAR1 (UNOPUS, lroundusf, 2, si)
    357   VAR1 (UNOPUS, lroundudf, 2, di)
    358 
    359   VAR1 (UNOP, lceilv4hf, 2, v4hi)
    360   VAR1 (UNOP, lceilv8hf, 2, v8hi)
    361   VAR1 (UNOP, lceilv2sf, 2, v2si)
    362   VAR1 (UNOP, lceilv4sf, 2, v4si)
    363   VAR1 (UNOP, lceilv2df, 2, v2di)
    364   BUILTIN_GPI_I16 (UNOP, lceilhf, 2)
    365 
    366   VAR1 (UNOPUS, lceiluv4hf, 2, v4hi)
    367   VAR1 (UNOPUS, lceiluv8hf, 2, v8hi)
    368   VAR1 (UNOPUS, lceiluv2sf, 2, v2si)
    369   VAR1 (UNOPUS, lceiluv4sf, 2, v4si)
    370   VAR1 (UNOPUS, lceiluv2df, 2, v2di)
    371   BUILTIN_GPI_I16 (UNOPUS, lceiluhf, 2)
    372   VAR1 (UNOPUS, lceilusf, 2, si)
    373   VAR1 (UNOPUS, lceiludf, 2, di)
    374 
    375   VAR1 (UNOP, lfloorv4hf, 2, v4hi)
    376   VAR1 (UNOP, lfloorv8hf, 2, v8hi)
    377   VAR1 (UNOP, lfloorv2sf, 2, v2si)
    378   VAR1 (UNOP, lfloorv4sf, 2, v4si)
    379   VAR1 (UNOP, lfloorv2df, 2, v2di)
    380   BUILTIN_GPI_I16 (UNOP, lfloorhf, 2)
    381 
    382   VAR1 (UNOPUS, lflooruv4hf, 2, v4hi)
    383   VAR1 (UNOPUS, lflooruv8hf, 2, v8hi)
    384   VAR1 (UNOPUS, lflooruv2sf, 2, v2si)
    385   VAR1 (UNOPUS, lflooruv4sf, 2, v4si)
    386   VAR1 (UNOPUS, lflooruv2df, 2, v2di)
    387   BUILTIN_GPI_I16 (UNOPUS, lflooruhf, 2)
    388   VAR1 (UNOPUS, lfloorusf, 2, si)
    389   VAR1 (UNOPUS, lfloorudf, 2, di)
    390 
    391   VAR1 (UNOP, lfrintnv4hf, 2, v4hi)
    392   VAR1 (UNOP, lfrintnv8hf, 2, v8hi)
    393   VAR1 (UNOP, lfrintnv2sf, 2, v2si)
    394   VAR1 (UNOP, lfrintnv4sf, 2, v4si)
    395   VAR1 (UNOP, lfrintnv2df, 2, v2di)
    396   BUILTIN_GPI_I16 (UNOP, lfrintnhf, 2)
    397   VAR1 (UNOP, lfrintnsf, 2, si)
    398   VAR1 (UNOP, lfrintndf, 2, di)
    399 
    400   VAR1 (UNOPUS, lfrintnuv4hf, 2, v4hi)
    401   VAR1 (UNOPUS, lfrintnuv8hf, 2, v8hi)
    402   VAR1 (UNOPUS, lfrintnuv2sf, 2, v2si)
    403   VAR1 (UNOPUS, lfrintnuv4sf, 2, v4si)
    404   VAR1 (UNOPUS, lfrintnuv2df, 2, v2di)
    405   BUILTIN_GPI_I16 (UNOPUS, lfrintnuhf, 2)
    406   VAR1 (UNOPUS, lfrintnusf, 2, si)
    407   VAR1 (UNOPUS, lfrintnudf, 2, di)
    408 
    409   /* Implemented by <optab><fcvt_target><VDQF:mode>2.  */
    410   VAR1 (UNOP, floatv4hi, 2, v4hf)
    411   VAR1 (UNOP, floatv8hi, 2, v8hf)
    412   VAR1 (UNOP, floatv2si, 2, v2sf)
    413   VAR1 (UNOP, floatv4si, 2, v4sf)
    414   VAR1 (UNOP, floatv2di, 2, v2df)
    415 
    416   VAR1 (UNOP, floatunsv4hi, 2, v4hf)
    417   VAR1 (UNOP, floatunsv8hi, 2, v8hf)
    418   VAR1 (UNOP, floatunsv2si, 2, v2sf)
    419   VAR1 (UNOP, floatunsv4si, 2, v4sf)
    420   VAR1 (UNOP, floatunsv2di, 2, v2df)
    421 
    422   VAR5 (UNOPU, bswap, 2, v4hi, v8hi, v2si, v4si, v2di)
    423 
    424   BUILTIN_VB (UNOP, rbit, 0)
    425 
    426   /* Implemented by
    427      aarch64_<PERMUTE:perm_insn><PERMUTE:perm_hilo><mode>.  */
    428   BUILTIN_VALL (BINOP, zip1, 0)
    429   BUILTIN_VALL (BINOP, zip2, 0)
    430   BUILTIN_VALL (BINOP, uzp1, 0)
    431   BUILTIN_VALL (BINOP, uzp2, 0)
    432   BUILTIN_VALL (BINOP, trn1, 0)
    433   BUILTIN_VALL (BINOP, trn2, 0)
    434 
    435   BUILTIN_GPF_F16 (UNOP, frecpe, 0)
    436   BUILTIN_GPF_F16 (UNOP, frecpx, 0)
    437 
    438   BUILTIN_VDQ_SI (UNOP, urecpe, 0)
    439 
    440   BUILTIN_VHSDF (UNOP, frecpe, 0)
    441   BUILTIN_VHSDF_HSDF (BINOP, frecps, 0)
    442 
    443   /* Implemented by a mixture of abs2 patterns.  Note the DImode builtin is
    444      only ever used for the int64x1_t intrinsic, there is no scalar version.  */
    445   BUILTIN_VSDQ_I_DI (UNOP, abs, 0)
    446   BUILTIN_VHSDF (UNOP, abs, 2)
    447   VAR1 (UNOP, abs, 2, hf)
    448 
    449   BUILTIN_VQ_HSF (UNOP, vec_unpacks_hi_, 10)
    450   VAR1 (BINOP, float_truncate_hi_, 0, v4sf)
    451   VAR1 (BINOP, float_truncate_hi_, 0, v8hf)
    452 
    453   VAR1 (UNOP, float_extend_lo_, 0, v2df)
    454   VAR1 (UNOP, float_extend_lo_,  0, v4sf)
    455   BUILTIN_VDF (UNOP, float_truncate_lo_, 0)
    456 
    457   /* Implemented by aarch64_ld1<VALL_F16:mode>.  */
    458   BUILTIN_VALL_F16 (LOAD1, ld1, 0)
    459   VAR1(STORE1P, ld1, 0, v2di)
    460 
    461   /* Implemented by aarch64_st1<VALL_F16:mode>.  */
    462   BUILTIN_VALL_F16 (STORE1, st1, 0)
    463   VAR1(STORE1P, st1, 0, v2di)
    464 
    465   /* Implemented by aarch64_ld1x3<VALLDIF:mode>.  */
    466   BUILTIN_VALLDIF (LOADSTRUCT, ld1x3, 0)
    467 
    468   /* Implemented by aarch64_st1x2<VALLDIF:mode>.  */
    469   BUILTIN_VALLDIF (STORESTRUCT, st1x2, 0)
    470 
    471   /* Implemented by aarch64_st1x3<VALLDIF:mode>.  */
    472   BUILTIN_VALLDIF (STORESTRUCT, st1x3, 0)
    473 
    474   /* Implemented by fma<mode>4.  */
    475   BUILTIN_VHSDF (TERNOP, fma, 4)
    476   VAR1 (TERNOP, fma, 4, hf)
    477   /* Implemented by fnma<mode>4.  */
    478   BUILTIN_VHSDF (TERNOP, fnma, 4)
    479   VAR1 (TERNOP, fnma, 4, hf)
    480 
    481   /* Implemented by aarch64_simd_bsl<mode>.  */
    482   BUILTIN_VDQQH (BSL_P, simd_bsl, 0)
    483   VAR2 (BSL_P, simd_bsl,0, di, v2di)
    484   BUILTIN_VSDQ_I_DI (BSL_U, simd_bsl, 0)
    485   BUILTIN_VALLDIF (BSL_S, simd_bsl, 0)
    486 
    487   /* Implemented by aarch64_crypto_aes<op><mode>.  */
    488   VAR1 (BINOPU, crypto_aese, 0, v16qi)
    489   VAR1 (BINOPU, crypto_aesd, 0, v16qi)
    490   VAR1 (UNOPU, crypto_aesmc, 0, v16qi)
    491   VAR1 (UNOPU, crypto_aesimc, 0, v16qi)
    492 
    493   /* Implemented by aarch64_crypto_sha1<op><mode>.  */
    494   VAR1 (UNOPU, crypto_sha1h, 0, si)
    495   VAR1 (BINOPU, crypto_sha1su1, 0, v4si)
    496   VAR1 (TERNOPU, crypto_sha1c, 0, v4si)
    497   VAR1 (TERNOPU, crypto_sha1m, 0, v4si)
    498   VAR1 (TERNOPU, crypto_sha1p, 0, v4si)
    499   VAR1 (TERNOPU, crypto_sha1su0, 0, v4si)
    500 
    501   /* Implemented by aarch64_crypto_sha256<op><mode>.  */
    502   VAR1 (TERNOPU, crypto_sha256h, 0, v4si)
    503   VAR1 (TERNOPU, crypto_sha256h2, 0, v4si)
    504   VAR1 (BINOPU, crypto_sha256su0, 0, v4si)
    505   VAR1 (TERNOPU, crypto_sha256su1, 0, v4si)
    506 
    507   /* Implemented by aarch64_crypto_pmull<mode>.  */
    508   VAR1 (BINOPP, crypto_pmull, 0, di)
    509   VAR1 (BINOPP, crypto_pmull, 0, v2di)
    510 
    511   /* Implemented by aarch64_tbl3<mode>.  */
    512   VAR1 (BINOP, tbl3, 0, v8qi)
    513   VAR1 (BINOP, tbl3, 0, v16qi)
    514 
    515   /* Implemented by aarch64_qtbl3<mode>.  */
    516   VAR1 (BINOP, qtbl3, 0, v8qi)
    517   VAR1 (BINOP, qtbl3, 0, v16qi)
    518 
    519   /* Implemented by aarch64_qtbl4<mode>.  */
    520   VAR1 (BINOP, qtbl4, 0, v8qi)
    521   VAR1 (BINOP, qtbl4, 0, v16qi)
    522 
    523   /* Implemented by aarch64_tbx4<mode>.  */
    524   VAR1 (TERNOP, tbx4, 0, v8qi)
    525   VAR1 (TERNOP, tbx4, 0, v16qi)
    526 
    527   /* Implemented by aarch64_qtbx3<mode>.  */
    528   VAR1 (TERNOP, qtbx3, 0, v8qi)
    529   VAR1 (TERNOP, qtbx3, 0, v16qi)
    530 
    531   /* Implemented by aarch64_qtbx4<mode>.  */
    532   VAR1 (TERNOP, qtbx4, 0, v8qi)
    533   VAR1 (TERNOP, qtbx4, 0, v16qi)
    534 
    535   /* Builtins for ARMv8.1-A Adv.SIMD instructions.  */
    536 
    537   /* Implemented by aarch64_sqrdml<SQRDMLH_AS:rdma_as>h<mode>.  */
    538   BUILTIN_VSDQ_HSI (TERNOP, sqrdmlah, 0)
    539   BUILTIN_VSDQ_HSI (TERNOP, sqrdmlsh, 0)
    540 
    541   /* Implemented by aarch64_sqrdml<SQRDMLH_AS:rdma_as>h_lane<mode>.  */
    542   BUILTIN_VSDQ_HSI (QUADOP_LANE, sqrdmlah_lane, 0)
    543   BUILTIN_VSDQ_HSI (QUADOP_LANE, sqrdmlsh_lane, 0)
    544 
    545   /* Implemented by aarch64_sqrdml<SQRDMLH_AS:rdma_as>h_laneq<mode>.  */
    546   BUILTIN_VSDQ_HSI (QUADOP_LANE, sqrdmlah_laneq, 0)
    547   BUILTIN_VSDQ_HSI (QUADOP_LANE, sqrdmlsh_laneq, 0)
    548 
    549   /* Implemented by <FCVT_F2FIXED/FIXED2F:fcvt_fixed_insn><*><*>3.  */
    550   BUILTIN_VSDQ_HSDI (SHIFTIMM, scvtf, 3)
    551   BUILTIN_VSDQ_HSDI (FCVTIMM_SUS, ucvtf, 3)
    552   BUILTIN_VHSDF_HSDF (SHIFTIMM, fcvtzs, 3)
    553   BUILTIN_VHSDF_HSDF (SHIFTIMM_USS, fcvtzu, 3)
    554   VAR1 (SHIFTIMM, scvtfsi, 3, hf)
    555   VAR1 (SHIFTIMM, scvtfdi, 3, hf)
    556   VAR1 (FCVTIMM_SUS, ucvtfsi, 3, hf)
    557   VAR1 (FCVTIMM_SUS, ucvtfdi, 3, hf)
    558   BUILTIN_GPI (SHIFTIMM, fcvtzshf, 3)
    559   BUILTIN_GPI (SHIFTIMM_USS, fcvtzuhf, 3)
    560 
    561   /* Implemented by aarch64_rsqrte<mode>.  */
    562   BUILTIN_VHSDF_HSDF (UNOP, rsqrte, 0)
    563 
    564   /* Implemented by aarch64_rsqrts<mode>.  */
    565   BUILTIN_VHSDF_HSDF (BINOP, rsqrts, 0)
    566 
    567   /* Implemented by fabd<mode>3.  */
    568   BUILTIN_VHSDF_HSDF (BINOP, fabd, 3)
    569 
    570   /* Implemented by aarch64_faddp<mode>.  */
    571   BUILTIN_VHSDF (BINOP, faddp, 0)
    572 
    573   /* Implemented by aarch64_cm<optab><mode>.  */
    574   BUILTIN_VHSDF_HSDF (BINOP_USS, cmeq, 0)
    575   BUILTIN_VHSDF_HSDF (BINOP_USS, cmge, 0)
    576   BUILTIN_VHSDF_HSDF (BINOP_USS, cmgt, 0)
    577   BUILTIN_VHSDF_HSDF (BINOP_USS, cmle, 0)
    578   BUILTIN_VHSDF_HSDF (BINOP_USS, cmlt, 0)
    579 
    580   /* Implemented by neg<mode>2.  */
    581   BUILTIN_VHSDF_HSDF (UNOP, neg, 2)
    582 
    583   /* Implemented by aarch64_fac<optab><mode>.  */
    584   BUILTIN_VHSDF_HSDF (BINOP_USS, faclt, 0)
    585   BUILTIN_VHSDF_HSDF (BINOP_USS, facle, 0)
    586   BUILTIN_VHSDF_HSDF (BINOP_USS, facgt, 0)
    587   BUILTIN_VHSDF_HSDF (BINOP_USS, facge, 0)
    588 
    589   /* Implemented by sqrt<mode>2.  */
    590   VAR1 (UNOP, sqrt, 2, hf)
    591 
    592   /* Implemented by <optab><mode>hf2.  */
    593   VAR1 (UNOP, floatdi, 2, hf)
    594   VAR1 (UNOP, floatsi, 2, hf)
    595   VAR1 (UNOP, floathi, 2, hf)
    596   VAR1 (UNOPUS, floatunsdi, 2, hf)
    597   VAR1 (UNOPUS, floatunssi, 2, hf)
    598   VAR1 (UNOPUS, floatunshi, 2, hf)
    599   BUILTIN_GPI_I16 (UNOP, fix_trunchf, 2)
    600   BUILTIN_GPI (UNOP, fix_truncsf, 2)
    601   BUILTIN_GPI (UNOP, fix_truncdf, 2)
    602   BUILTIN_GPI_I16 (UNOPUS, fixuns_trunchf, 2)
    603   BUILTIN_GPI (UNOPUS, fixuns_truncsf, 2)
    604   BUILTIN_GPI (UNOPUS, fixuns_truncdf, 2)
    605 
    606   /* Implemented by aarch64_sm3ss1qv4si.  */
    607   VAR1 (TERNOPU, sm3ss1q, 0, v4si)
    608   /* Implemented by aarch64_sm3tt<sm3tt_op>qv4si.  */
    609   VAR1 (QUADOPUI, sm3tt1aq, 0, v4si)
    610   VAR1 (QUADOPUI, sm3tt1bq, 0, v4si)
    611   VAR1 (QUADOPUI, sm3tt2aq, 0, v4si)
    612   VAR1 (QUADOPUI, sm3tt2bq, 0, v4si)
    613   /* Implemented by aarch64_sm3partw<sm3part_op>qv4si.  */
    614   VAR1 (TERNOPU, sm3partw1q, 0, v4si)
    615   VAR1 (TERNOPU, sm3partw2q, 0, v4si)
    616   /* Implemented by aarch64_sm4eqv4si.  */
    617   VAR1 (BINOPU, sm4eq, 0, v4si)
    618   /* Implemented by aarch64_sm4ekeyqv4si.  */
    619   VAR1 (BINOPU, sm4ekeyq, 0, v4si)
    620   /* Implemented by aarch64_crypto_sha512hqv2di.  */
    621   VAR1 (TERNOPU, crypto_sha512hq, 0, v2di)
    622   /* Implemented by aarch64_sha512h2qv2di.  */
    623   VAR1 (TERNOPU, crypto_sha512h2q, 0, v2di)
    624   /* Implemented by aarch64_crypto_sha512su0qv2di.  */
    625   VAR1 (BINOPU, crypto_sha512su0q, 0, v2di)
    626   /* Implemented by aarch64_crypto_sha512su1qv2di.  */
    627   VAR1 (TERNOPU, crypto_sha512su1q, 0, v2di)
    628   /* Implemented by eor3q<mode>4.  */
    629   BUILTIN_VQ_I (TERNOPU, eor3q, 4)
    630   BUILTIN_VQ_I (TERNOP, eor3q, 4)
    631   /* Implemented by aarch64_rax1qv2di.  */
    632   VAR1 (BINOPU, rax1q, 0, v2di)
    633   /* Implemented by aarch64_xarqv2di.  */
    634   VAR1 (TERNOPUI, xarq, 0, v2di)
    635   /* Implemented by bcaxq<mode>4.  */
    636   BUILTIN_VQ_I (TERNOPU, bcaxq, 4)
    637   BUILTIN_VQ_I (TERNOP, bcaxq, 4)
    638 
    639   /* Implemented by aarch64_fml<f16mac1>l<f16quad>_low<mode>.  */
    640   VAR1 (TERNOP, fmlal_low, 0, v2sf)
    641   VAR1 (TERNOP, fmlsl_low, 0, v2sf)
    642   VAR1 (TERNOP, fmlalq_low, 0, v4sf)
    643   VAR1 (TERNOP, fmlslq_low, 0, v4sf)
    644   /* Implemented by aarch64_fml<f16mac1>l<f16quad>_high<mode>.  */
    645   VAR1 (TERNOP, fmlal_high, 0, v2sf)
    646   VAR1 (TERNOP, fmlsl_high, 0, v2sf)
    647   VAR1 (TERNOP, fmlalq_high, 0, v4sf)
    648   VAR1 (TERNOP, fmlslq_high, 0, v4sf)
    649   /* Implemented by aarch64_fml<f16mac1>l_lane_lowv2sf.  */
    650   VAR1 (QUADOP_LANE, fmlal_lane_low, 0, v2sf)
    651   VAR1 (QUADOP_LANE, fmlsl_lane_low, 0, v2sf)
    652   /* Implemented by aarch64_fml<f16mac1>l_laneq_lowv2sf.  */
    653   VAR1 (QUADOP_LANE, fmlal_laneq_low, 0, v2sf)
    654   VAR1 (QUADOP_LANE, fmlsl_laneq_low, 0, v2sf)
    655   /* Implemented by aarch64_fml<f16mac1>lq_lane_lowv4sf.  */
    656   VAR1 (QUADOP_LANE, fmlalq_lane_low, 0, v4sf)
    657   VAR1 (QUADOP_LANE, fmlslq_lane_low, 0, v4sf)
    658   /* Implemented by aarch64_fml<f16mac1>lq_laneq_lowv4sf.  */
    659   VAR1 (QUADOP_LANE, fmlalq_laneq_low, 0, v4sf)
    660   VAR1 (QUADOP_LANE, fmlslq_laneq_low, 0, v4sf)
    661   /* Implemented by aarch64_fml<f16mac1>l_lane_highv2sf.  */
    662   VAR1 (QUADOP_LANE, fmlal_lane_high, 0, v2sf)
    663   VAR1 (QUADOP_LANE, fmlsl_lane_high, 0, v2sf)
    664   /* Implemented by aarch64_fml<f16mac1>l_laneq_highv2sf.  */
    665   VAR1 (QUADOP_LANE, fmlal_laneq_high, 0, v2sf)
    666   VAR1 (QUADOP_LANE, fmlsl_laneq_high, 0, v2sf)
    667   /* Implemented by aarch64_fml<f16mac1>lq_lane_highv4sf.  */
    668   VAR1 (QUADOP_LANE, fmlalq_lane_high, 0, v4sf)
    669   VAR1 (QUADOP_LANE, fmlslq_lane_high, 0, v4sf)
    670   /* Implemented by aarch64_fml<f16mac1>lq_laneq_highv4sf.  */
    671   VAR1 (QUADOP_LANE, fmlalq_laneq_high, 0, v4sf)
    672   VAR1 (QUADOP_LANE, fmlslq_laneq_high, 0, v4sf)
    673