Home | History | Annotate | Line # | Download | only in aarch64
aarch64-simd-builtins.def revision 1.1.1.5
      1 /* Machine description for AArch64 architecture.
      2    Copyright (C) 2012-2018 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   BUILTIN_VDQ_I (SHIFTIMM, ashr, 3)
    221   VAR1 (SHIFTIMM, ashr_simd, 0, di)
    222   BUILTIN_VDQ_I (SHIFTIMM, lshr, 3)
    223   VAR1 (USHIFTIMM, lshr_simd, 0, di)
    224   /* Implemented by aarch64_<sur>shr_n<mode>.  */
    225   BUILTIN_VSDQ_I_DI (SHIFTIMM, srshr_n, 0)
    226   BUILTIN_VSDQ_I_DI (USHIFTIMM, urshr_n, 0)
    227   /* Implemented by aarch64_<sur>sra_n<mode>.  */
    228   BUILTIN_VSDQ_I_DI (SHIFTACC, ssra_n, 0)
    229   BUILTIN_VSDQ_I_DI (USHIFTACC, usra_n, 0)
    230   BUILTIN_VSDQ_I_DI (SHIFTACC, srsra_n, 0)
    231   BUILTIN_VSDQ_I_DI (USHIFTACC, ursra_n, 0)
    232   /* Implemented by aarch64_<sur>shll_n<mode>.  */
    233   BUILTIN_VD_BHSI (SHIFTIMM, sshll_n, 0)
    234   BUILTIN_VD_BHSI (USHIFTIMM, ushll_n, 0)
    235   /* Implemented by aarch64_<sur>shll2_n<mode>.  */
    236   BUILTIN_VQW (SHIFTIMM, sshll2_n, 0)
    237   BUILTIN_VQW (SHIFTIMM, ushll2_n, 0)
    238   /* Implemented by aarch64_<sur>q<r>shr<u>n_n<mode>.  */
    239   BUILTIN_VSQN_HSDI (SHIFTIMM, sqshrun_n, 0)
    240   BUILTIN_VSQN_HSDI (SHIFTIMM, sqrshrun_n, 0)
    241   BUILTIN_VSQN_HSDI (SHIFTIMM, sqshrn_n, 0)
    242   BUILTIN_VSQN_HSDI (USHIFTIMM, uqshrn_n, 0)
    243   BUILTIN_VSQN_HSDI (SHIFTIMM, sqrshrn_n, 0)
    244   BUILTIN_VSQN_HSDI (USHIFTIMM, uqrshrn_n, 0)
    245   /* Implemented by aarch64_<sur>s<lr>i_n<mode>.  */
    246   BUILTIN_VSDQ_I_DI (SHIFTINSERT, ssri_n, 0)
    247   BUILTIN_VSDQ_I_DI (USHIFTACC, usri_n, 0)
    248   BUILTIN_VSDQ_I_DI (SHIFTINSERT, ssli_n, 0)
    249   VAR2 (SHIFTINSERTP, ssli_n, 0, di, v2di)
    250   BUILTIN_VSDQ_I_DI (USHIFTACC, usli_n, 0)
    251   /* Implemented by aarch64_<sur>qshl<u>_n<mode>.  */
    252   BUILTIN_VSDQ_I (SHIFTIMM_USS, sqshlu_n, 0)
    253   BUILTIN_VSDQ_I (SHIFTIMM, sqshl_n, 0)
    254   BUILTIN_VSDQ_I (USHIFTIMM, uqshl_n, 0)
    255 
    256   /* Implemented by aarch64_reduc_plus_<mode>.  */
    257   BUILTIN_VALL (UNOP, reduc_plus_scal_, 10)
    258 
    259   /* Implemented by reduc_<maxmin_uns>_scal_<mode> (producing scalar).  */
    260   BUILTIN_VDQIF_F16 (UNOP, reduc_smax_scal_, 10)
    261   BUILTIN_VDQIF_F16 (UNOP, reduc_smin_scal_, 10)
    262   BUILTIN_VDQ_BHSI (UNOPU, reduc_umax_scal_, 10)
    263   BUILTIN_VDQ_BHSI (UNOPU, reduc_umin_scal_, 10)
    264   BUILTIN_VHSDF (UNOP, reduc_smax_nan_scal_, 10)
    265   BUILTIN_VHSDF (UNOP, reduc_smin_nan_scal_, 10)
    266 
    267   /* Implemented by <maxmin_uns><mode>3.
    268      smax variants map to fmaxnm,
    269      smax_nan variants map to fmax.  */
    270   BUILTIN_VDQ_BHSI (BINOP, smax, 3)
    271   BUILTIN_VDQ_BHSI (BINOP, smin, 3)
    272   BUILTIN_VDQ_BHSI (BINOP, umax, 3)
    273   BUILTIN_VDQ_BHSI (BINOP, umin, 3)
    274   BUILTIN_VHSDF_DF (BINOP, smax_nan, 3)
    275   BUILTIN_VHSDF_DF (BINOP, smin_nan, 3)
    276 
    277   /* Implemented by <maxmin_uns><mode>3.  */
    278   BUILTIN_VHSDF_HSDF (BINOP, fmax, 3)
    279   BUILTIN_VHSDF_HSDF (BINOP, fmin, 3)
    280 
    281   /* Implemented by aarch64_<maxmin_uns>p<mode>.  */
    282   BUILTIN_VDQ_BHSI (BINOP, smaxp, 0)
    283   BUILTIN_VDQ_BHSI (BINOP, sminp, 0)
    284   BUILTIN_VDQ_BHSI (BINOP, umaxp, 0)
    285   BUILTIN_VDQ_BHSI (BINOP, uminp, 0)
    286   BUILTIN_VHSDF (BINOP, smaxp, 0)
    287   BUILTIN_VHSDF (BINOP, sminp, 0)
    288   BUILTIN_VHSDF (BINOP, smax_nanp, 0)
    289   BUILTIN_VHSDF (BINOP, smin_nanp, 0)
    290 
    291   /* Implemented by <frint_pattern><mode>2.  */
    292   BUILTIN_VHSDF (UNOP, btrunc, 2)
    293   BUILTIN_VHSDF (UNOP, ceil, 2)
    294   BUILTIN_VHSDF (UNOP, floor, 2)
    295   BUILTIN_VHSDF (UNOP, nearbyint, 2)
    296   BUILTIN_VHSDF (UNOP, rint, 2)
    297   BUILTIN_VHSDF (UNOP, round, 2)
    298   BUILTIN_VHSDF_DF (UNOP, frintn, 2)
    299 
    300   VAR1 (UNOP, btrunc, 2, hf)
    301   VAR1 (UNOP, ceil, 2, hf)
    302   VAR1 (UNOP, floor, 2, hf)
    303   VAR1 (UNOP, frintn, 2, hf)
    304   VAR1 (UNOP, nearbyint, 2, hf)
    305   VAR1 (UNOP, rint, 2, hf)
    306   VAR1 (UNOP, round, 2, hf)
    307 
    308   /* Implemented by l<fcvt_pattern><su_optab><VQDF:mode><vcvt_target>2.  */
    309   VAR1 (UNOP, lbtruncv4hf, 2, v4hi)
    310   VAR1 (UNOP, lbtruncv8hf, 2, v8hi)
    311   VAR1 (UNOP, lbtruncv2sf, 2, v2si)
    312   VAR1 (UNOP, lbtruncv4sf, 2, v4si)
    313   VAR1 (UNOP, lbtruncv2df, 2, v2di)
    314 
    315   VAR1 (UNOPUS, lbtruncuv4hf, 2, v4hi)
    316   VAR1 (UNOPUS, lbtruncuv8hf, 2, v8hi)
    317   VAR1 (UNOPUS, lbtruncuv2sf, 2, v2si)
    318   VAR1 (UNOPUS, lbtruncuv4sf, 2, v4si)
    319   VAR1 (UNOPUS, lbtruncuv2df, 2, v2di)
    320 
    321   VAR1 (UNOP, lroundv4hf, 2, v4hi)
    322   VAR1 (UNOP, lroundv8hf, 2, v8hi)
    323   VAR1 (UNOP, lroundv2sf, 2, v2si)
    324   VAR1 (UNOP, lroundv4sf, 2, v4si)
    325   VAR1 (UNOP, lroundv2df, 2, v2di)
    326   /* Implemented by l<fcvt_pattern><su_optab><GPF_F16:mode><GPI:mode>2.  */
    327   BUILTIN_GPI_I16 (UNOP, lroundhf, 2)
    328   VAR1 (UNOP, lroundsf, 2, si)
    329   VAR1 (UNOP, lrounddf, 2, di)
    330 
    331   VAR1 (UNOPUS, lrounduv4hf, 2, v4hi)
    332   VAR1 (UNOPUS, lrounduv8hf, 2, v8hi)
    333   VAR1 (UNOPUS, lrounduv2sf, 2, v2si)
    334   VAR1 (UNOPUS, lrounduv4sf, 2, v4si)
    335   VAR1 (UNOPUS, lrounduv2df, 2, v2di)
    336   BUILTIN_GPI_I16 (UNOPUS, lrounduhf, 2)
    337   VAR1 (UNOPUS, lroundusf, 2, si)
    338   VAR1 (UNOPUS, lroundudf, 2, di)
    339 
    340   VAR1 (UNOP, lceilv4hf, 2, v4hi)
    341   VAR1 (UNOP, lceilv8hf, 2, v8hi)
    342   VAR1 (UNOP, lceilv2sf, 2, v2si)
    343   VAR1 (UNOP, lceilv4sf, 2, v4si)
    344   VAR1 (UNOP, lceilv2df, 2, v2di)
    345   BUILTIN_GPI_I16 (UNOP, lceilhf, 2)
    346 
    347   VAR1 (UNOPUS, lceiluv4hf, 2, v4hi)
    348   VAR1 (UNOPUS, lceiluv8hf, 2, v8hi)
    349   VAR1 (UNOPUS, lceiluv2sf, 2, v2si)
    350   VAR1 (UNOPUS, lceiluv4sf, 2, v4si)
    351   VAR1 (UNOPUS, lceiluv2df, 2, v2di)
    352   BUILTIN_GPI_I16 (UNOPUS, lceiluhf, 2)
    353   VAR1 (UNOPUS, lceilusf, 2, si)
    354   VAR1 (UNOPUS, lceiludf, 2, di)
    355 
    356   VAR1 (UNOP, lfloorv4hf, 2, v4hi)
    357   VAR1 (UNOP, lfloorv8hf, 2, v8hi)
    358   VAR1 (UNOP, lfloorv2sf, 2, v2si)
    359   VAR1 (UNOP, lfloorv4sf, 2, v4si)
    360   VAR1 (UNOP, lfloorv2df, 2, v2di)
    361   BUILTIN_GPI_I16 (UNOP, lfloorhf, 2)
    362 
    363   VAR1 (UNOPUS, lflooruv4hf, 2, v4hi)
    364   VAR1 (UNOPUS, lflooruv8hf, 2, v8hi)
    365   VAR1 (UNOPUS, lflooruv2sf, 2, v2si)
    366   VAR1 (UNOPUS, lflooruv4sf, 2, v4si)
    367   VAR1 (UNOPUS, lflooruv2df, 2, v2di)
    368   BUILTIN_GPI_I16 (UNOPUS, lflooruhf, 2)
    369   VAR1 (UNOPUS, lfloorusf, 2, si)
    370   VAR1 (UNOPUS, lfloorudf, 2, di)
    371 
    372   VAR1 (UNOP, lfrintnv4hf, 2, v4hi)
    373   VAR1 (UNOP, lfrintnv8hf, 2, v8hi)
    374   VAR1 (UNOP, lfrintnv2sf, 2, v2si)
    375   VAR1 (UNOP, lfrintnv4sf, 2, v4si)
    376   VAR1 (UNOP, lfrintnv2df, 2, v2di)
    377   BUILTIN_GPI_I16 (UNOP, lfrintnhf, 2)
    378   VAR1 (UNOP, lfrintnsf, 2, si)
    379   VAR1 (UNOP, lfrintndf, 2, di)
    380 
    381   VAR1 (UNOPUS, lfrintnuv4hf, 2, v4hi)
    382   VAR1 (UNOPUS, lfrintnuv8hf, 2, v8hi)
    383   VAR1 (UNOPUS, lfrintnuv2sf, 2, v2si)
    384   VAR1 (UNOPUS, lfrintnuv4sf, 2, v4si)
    385   VAR1 (UNOPUS, lfrintnuv2df, 2, v2di)
    386   BUILTIN_GPI_I16 (UNOPUS, lfrintnuhf, 2)
    387   VAR1 (UNOPUS, lfrintnusf, 2, si)
    388   VAR1 (UNOPUS, lfrintnudf, 2, di)
    389 
    390   /* Implemented by <optab><fcvt_target><VDQF:mode>2.  */
    391   VAR1 (UNOP, floatv4hi, 2, v4hf)
    392   VAR1 (UNOP, floatv8hi, 2, v8hf)
    393   VAR1 (UNOP, floatv2si, 2, v2sf)
    394   VAR1 (UNOP, floatv4si, 2, v4sf)
    395   VAR1 (UNOP, floatv2di, 2, v2df)
    396 
    397   VAR1 (UNOP, floatunsv4hi, 2, v4hf)
    398   VAR1 (UNOP, floatunsv8hi, 2, v8hf)
    399   VAR1 (UNOP, floatunsv2si, 2, v2sf)
    400   VAR1 (UNOP, floatunsv4si, 2, v4sf)
    401   VAR1 (UNOP, floatunsv2di, 2, v2df)
    402 
    403   VAR5 (UNOPU, bswap, 2, v4hi, v8hi, v2si, v4si, v2di)
    404 
    405   BUILTIN_VB (UNOP, rbit, 0)
    406 
    407   /* Implemented by
    408      aarch64_<PERMUTE:perm_insn><PERMUTE:perm_hilo><mode>.  */
    409   BUILTIN_VALL (BINOP, zip1, 0)
    410   BUILTIN_VALL (BINOP, zip2, 0)
    411   BUILTIN_VALL (BINOP, uzp1, 0)
    412   BUILTIN_VALL (BINOP, uzp2, 0)
    413   BUILTIN_VALL (BINOP, trn1, 0)
    414   BUILTIN_VALL (BINOP, trn2, 0)
    415 
    416   /* Implemented by
    417      aarch64_frecp<FRECP:frecp_suffix><mode>.  */
    418   BUILTIN_GPF_F16 (UNOP, frecpe, 0)
    419   BUILTIN_GPF_F16 (UNOP, frecpx, 0)
    420 
    421   BUILTIN_VDQ_SI (UNOP, urecpe, 0)
    422 
    423   BUILTIN_VHSDF (UNOP, frecpe, 0)
    424   BUILTIN_VHSDF_HSDF (BINOP, frecps, 0)
    425 
    426   /* Implemented by a mixture of abs2 patterns.  Note the DImode builtin is
    427      only ever used for the int64x1_t intrinsic, there is no scalar version.  */
    428   BUILTIN_VSDQ_I_DI (UNOP, abs, 0)
    429   BUILTIN_VHSDF (UNOP, abs, 2)
    430   VAR1 (UNOP, abs, 2, hf)
    431 
    432   BUILTIN_VQ_HSF (UNOP, vec_unpacks_hi_, 10)
    433   VAR1 (BINOP, float_truncate_hi_, 0, v4sf)
    434   VAR1 (BINOP, float_truncate_hi_, 0, v8hf)
    435 
    436   VAR1 (UNOP, float_extend_lo_, 0, v2df)
    437   VAR1 (UNOP, float_extend_lo_,  0, v4sf)
    438   BUILTIN_VDF (UNOP, float_truncate_lo_, 0)
    439 
    440   /* Implemented by aarch64_ld1<VALL_F16:mode>.  */
    441   BUILTIN_VALL_F16 (LOAD1, ld1, 0)
    442   VAR1(STORE1P, ld1, 0, v2di)
    443 
    444   /* Implemented by aarch64_st1<VALL_F16:mode>.  */
    445   BUILTIN_VALL_F16 (STORE1, st1, 0)
    446   VAR1(STORE1P, st1, 0, v2di)
    447 
    448   /* Implemented by fma<mode>4.  */
    449   BUILTIN_VHSDF (TERNOP, fma, 4)
    450   VAR1 (TERNOP, fma, 4, hf)
    451   /* Implemented by fnma<mode>4.  */
    452   BUILTIN_VHSDF (TERNOP, fnma, 4)
    453   VAR1 (TERNOP, fnma, 4, hf)
    454 
    455   /* Implemented by aarch64_simd_bsl<mode>.  */
    456   BUILTIN_VDQQH (BSL_P, simd_bsl, 0)
    457   VAR2 (BSL_P, simd_bsl,0, di, v2di)
    458   BUILTIN_VSDQ_I_DI (BSL_U, simd_bsl, 0)
    459   BUILTIN_VALLDIF (BSL_S, simd_bsl, 0)
    460 
    461   /* Implemented by aarch64_crypto_aes<op><mode>.  */
    462   VAR1 (BINOPU, crypto_aese, 0, v16qi)
    463   VAR1 (BINOPU, crypto_aesd, 0, v16qi)
    464   VAR1 (UNOPU, crypto_aesmc, 0, v16qi)
    465   VAR1 (UNOPU, crypto_aesimc, 0, v16qi)
    466 
    467   /* Implemented by aarch64_crypto_sha1<op><mode>.  */
    468   VAR1 (UNOPU, crypto_sha1h, 0, si)
    469   VAR1 (BINOPU, crypto_sha1su1, 0, v4si)
    470   VAR1 (TERNOPU, crypto_sha1c, 0, v4si)
    471   VAR1 (TERNOPU, crypto_sha1m, 0, v4si)
    472   VAR1 (TERNOPU, crypto_sha1p, 0, v4si)
    473   VAR1 (TERNOPU, crypto_sha1su0, 0, v4si)
    474 
    475   /* Implemented by aarch64_crypto_sha256<op><mode>.  */
    476   VAR1 (TERNOPU, crypto_sha256h, 0, v4si)
    477   VAR1 (TERNOPU, crypto_sha256h2, 0, v4si)
    478   VAR1 (BINOPU, crypto_sha256su0, 0, v4si)
    479   VAR1 (TERNOPU, crypto_sha256su1, 0, v4si)
    480 
    481   /* Implemented by aarch64_crypto_pmull<mode>.  */
    482   VAR1 (BINOPP, crypto_pmull, 0, di)
    483   VAR1 (BINOPP, crypto_pmull, 0, v2di)
    484 
    485   /* Implemented by aarch64_tbl3<mode>.  */
    486   VAR1 (BINOP, tbl3, 0, v8qi)
    487   VAR1 (BINOP, tbl3, 0, v16qi)
    488 
    489   /* Implemented by aarch64_qtbl3<mode>.  */
    490   VAR1 (BINOP, qtbl3, 0, v8qi)
    491   VAR1 (BINOP, qtbl3, 0, v16qi)
    492 
    493   /* Implemented by aarch64_qtbl4<mode>.  */
    494   VAR1 (BINOP, qtbl4, 0, v8qi)
    495   VAR1 (BINOP, qtbl4, 0, v16qi)
    496 
    497   /* Implemented by aarch64_tbx4<mode>.  */
    498   VAR1 (TERNOP, tbx4, 0, v8qi)
    499   VAR1 (TERNOP, tbx4, 0, v16qi)
    500 
    501   /* Implemented by aarch64_qtbx3<mode>.  */
    502   VAR1 (TERNOP, qtbx3, 0, v8qi)
    503   VAR1 (TERNOP, qtbx3, 0, v16qi)
    504 
    505   /* Implemented by aarch64_qtbx4<mode>.  */
    506   VAR1 (TERNOP, qtbx4, 0, v8qi)
    507   VAR1 (TERNOP, qtbx4, 0, v16qi)
    508 
    509   /* Builtins for ARMv8.1-A Adv.SIMD instructions.  */
    510 
    511   /* Implemented by aarch64_sqrdml<SQRDMLH_AS:rdma_as>h<mode>.  */
    512   BUILTIN_VSDQ_HSI (TERNOP, sqrdmlah, 0)
    513   BUILTIN_VSDQ_HSI (TERNOP, sqrdmlsh, 0)
    514 
    515   /* Implemented by aarch64_sqrdml<SQRDMLH_AS:rdma_as>h_lane<mode>.  */
    516   BUILTIN_VSDQ_HSI (QUADOP_LANE, sqrdmlah_lane, 0)
    517   BUILTIN_VSDQ_HSI (QUADOP_LANE, sqrdmlsh_lane, 0)
    518 
    519   /* Implemented by aarch64_sqrdml<SQRDMLH_AS:rdma_as>h_laneq<mode>.  */
    520   BUILTIN_VSDQ_HSI (QUADOP_LANE, sqrdmlah_laneq, 0)
    521   BUILTIN_VSDQ_HSI (QUADOP_LANE, sqrdmlsh_laneq, 0)
    522 
    523   /* Implemented by <FCVT_F2FIXED/FIXED2F:fcvt_fixed_insn><*><*>3.  */
    524   BUILTIN_VSDQ_HSDI (SHIFTIMM, scvtf, 3)
    525   BUILTIN_VSDQ_HSDI (FCVTIMM_SUS, ucvtf, 3)
    526   BUILTIN_VHSDF_HSDF (SHIFTIMM, fcvtzs, 3)
    527   BUILTIN_VHSDF_HSDF (SHIFTIMM_USS, fcvtzu, 3)
    528   VAR1 (SHIFTIMM, scvtfsi, 3, hf)
    529   VAR1 (SHIFTIMM, scvtfdi, 3, hf)
    530   VAR1 (FCVTIMM_SUS, ucvtfsi, 3, hf)
    531   VAR1 (FCVTIMM_SUS, ucvtfdi, 3, hf)
    532   BUILTIN_GPI (SHIFTIMM, fcvtzshf, 3)
    533   BUILTIN_GPI (SHIFTIMM_USS, fcvtzuhf, 3)
    534 
    535   /* Implemented by aarch64_rsqrte<mode>.  */
    536   BUILTIN_VHSDF_HSDF (UNOP, rsqrte, 0)
    537 
    538   /* Implemented by aarch64_rsqrts<mode>.  */
    539   BUILTIN_VHSDF_HSDF (BINOP, rsqrts, 0)
    540 
    541   /* Implemented by fabd<mode>3.  */
    542   BUILTIN_VHSDF_HSDF (BINOP, fabd, 3)
    543 
    544   /* Implemented by aarch64_faddp<mode>.  */
    545   BUILTIN_VHSDF (BINOP, faddp, 0)
    546 
    547   /* Implemented by aarch64_cm<optab><mode>.  */
    548   BUILTIN_VHSDF_HSDF (BINOP_USS, cmeq, 0)
    549   BUILTIN_VHSDF_HSDF (BINOP_USS, cmge, 0)
    550   BUILTIN_VHSDF_HSDF (BINOP_USS, cmgt, 0)
    551   BUILTIN_VHSDF_HSDF (BINOP_USS, cmle, 0)
    552   BUILTIN_VHSDF_HSDF (BINOP_USS, cmlt, 0)
    553 
    554   /* Implemented by neg<mode>2.  */
    555   BUILTIN_VHSDF_HSDF (UNOP, neg, 2)
    556 
    557   /* Implemented by aarch64_fac<optab><mode>.  */
    558   BUILTIN_VHSDF_HSDF (BINOP_USS, faclt, 0)
    559   BUILTIN_VHSDF_HSDF (BINOP_USS, facle, 0)
    560   BUILTIN_VHSDF_HSDF (BINOP_USS, facgt, 0)
    561   BUILTIN_VHSDF_HSDF (BINOP_USS, facge, 0)
    562 
    563   /* Implemented by sqrt<mode>2.  */
    564   VAR1 (UNOP, sqrt, 2, hf)
    565 
    566   /* Implemented by <optab><mode>hf2.  */
    567   VAR1 (UNOP, floatdi, 2, hf)
    568   VAR1 (UNOP, floatsi, 2, hf)
    569   VAR1 (UNOP, floathi, 2, hf)
    570   VAR1 (UNOPUS, floatunsdi, 2, hf)
    571   VAR1 (UNOPUS, floatunssi, 2, hf)
    572   VAR1 (UNOPUS, floatunshi, 2, hf)
    573   BUILTIN_GPI_I16 (UNOP, fix_trunchf, 2)
    574   BUILTIN_GPI (UNOP, fix_truncsf, 2)
    575   BUILTIN_GPI (UNOP, fix_truncdf, 2)
    576   BUILTIN_GPI_I16 (UNOPUS, fixuns_trunchf, 2)
    577   BUILTIN_GPI (UNOPUS, fixuns_truncsf, 2)
    578   BUILTIN_GPI (UNOPUS, fixuns_truncdf, 2)
    579 
    580   /* Implemented by aarch64_sm3ss1qv4si.  */
    581   VAR1 (TERNOPU, sm3ss1q, 0, v4si)
    582   /* Implemented by aarch64_sm3tt<sm3tt_op>qv4si.  */
    583   VAR1 (QUADOPUI, sm3tt1aq, 0, v4si)
    584   VAR1 (QUADOPUI, sm3tt1bq, 0, v4si)
    585   VAR1 (QUADOPUI, sm3tt2aq, 0, v4si)
    586   VAR1 (QUADOPUI, sm3tt2bq, 0, v4si)
    587   /* Implemented by aarch64_sm3partw<sm3part_op>qv4si.  */
    588   VAR1 (TERNOPU, sm3partw1q, 0, v4si)
    589   VAR1 (TERNOPU, sm3partw2q, 0, v4si)
    590   /* Implemented by aarch64_sm4eqv4si.  */
    591   VAR1 (BINOPU, sm4eq, 0, v4si)
    592   /* Implemented by aarch64_sm4ekeyqv4si.  */
    593   VAR1 (BINOPU, sm4ekeyq, 0, v4si)
    594   /* Implemented by aarch64_crypto_sha512hqv2di.  */
    595   VAR1 (TERNOPU, crypto_sha512hq, 0, v2di)
    596   /* Implemented by aarch64_sha512h2qv2di.  */
    597   VAR1 (TERNOPU, crypto_sha512h2q, 0, v2di)
    598   /* Implemented by aarch64_crypto_sha512su0qv2di.  */
    599   VAR1 (BINOPU, crypto_sha512su0q, 0, v2di)
    600   /* Implemented by aarch64_crypto_sha512su1qv2di.  */
    601   VAR1 (TERNOPU, crypto_sha512su1q, 0, v2di)
    602   /* Implemented by aarch64_eor3qv8hi.  */
    603   VAR1 (TERNOPU, eor3q, 0, v8hi)
    604   /* Implemented by aarch64_rax1qv2di.  */
    605   VAR1 (BINOPU, rax1q, 0, v2di)
    606   /* Implemented by aarch64_xarqv2di.  */
    607   VAR1 (TERNOPUI, xarq, 0, v2di)
    608   /* Implemented by aarch64_bcaxqv8hi.  */
    609   VAR1 (TERNOPU, bcaxq, 0, v8hi)
    610 
    611   /* Implemented by aarch64_fml<f16mac1>l<f16quad>_low<mode>.  */
    612   VAR1 (TERNOP, fmlal_low, 0, v2sf)
    613   VAR1 (TERNOP, fmlsl_low, 0, v2sf)
    614   VAR1 (TERNOP, fmlalq_low, 0, v4sf)
    615   VAR1 (TERNOP, fmlslq_low, 0, v4sf)
    616   /* Implemented by aarch64_fml<f16mac1>l<f16quad>_high<mode>.  */
    617   VAR1 (TERNOP, fmlal_high, 0, v2sf)
    618   VAR1 (TERNOP, fmlsl_high, 0, v2sf)
    619   VAR1 (TERNOP, fmlalq_high, 0, v4sf)
    620   VAR1 (TERNOP, fmlslq_high, 0, v4sf)
    621   /* Implemented by aarch64_fml<f16mac1>l_lane_lowv2sf.  */
    622   VAR1 (QUADOP_LANE, fmlal_lane_low, 0, v2sf)
    623   VAR1 (QUADOP_LANE, fmlsl_lane_low, 0, v2sf)
    624   /* Implemented by aarch64_fml<f16mac1>l_laneq_lowv2sf.  */
    625   VAR1 (QUADOP_LANE, fmlal_laneq_low, 0, v2sf)
    626   VAR1 (QUADOP_LANE, fmlsl_laneq_low, 0, v2sf)
    627   /* Implemented by aarch64_fml<f16mac1>lq_lane_lowv4sf.  */
    628   VAR1 (QUADOP_LANE, fmlalq_lane_low, 0, v4sf)
    629   VAR1 (QUADOP_LANE, fmlslq_lane_low, 0, v4sf)
    630   /* Implemented by aarch64_fml<f16mac1>lq_laneq_lowv4sf.  */
    631   VAR1 (QUADOP_LANE, fmlalq_laneq_low, 0, v4sf)
    632   VAR1 (QUADOP_LANE, fmlslq_laneq_low, 0, v4sf)
    633   /* Implemented by aarch64_fml<f16mac1>l_lane_highv2sf.  */
    634   VAR1 (QUADOP_LANE, fmlal_lane_high, 0, v2sf)
    635   VAR1 (QUADOP_LANE, fmlsl_lane_high, 0, v2sf)
    636   /* Implemented by aarch64_fml<f16mac1>l_laneq_highv2sf.  */
    637   VAR1 (QUADOP_LANE, fmlal_laneq_high, 0, v2sf)
    638   VAR1 (QUADOP_LANE, fmlsl_laneq_high, 0, v2sf)
    639   /* Implemented by aarch64_fml<f16mac1>lq_lane_highv4sf.  */
    640   VAR1 (QUADOP_LANE, fmlalq_lane_high, 0, v4sf)
    641   VAR1 (QUADOP_LANE, fmlslq_lane_high, 0, v4sf)
    642   /* Implemented by aarch64_fml<f16mac1>lq_laneq_highv4sf.  */
    643   VAR1 (QUADOP_LANE, fmlalq_laneq_high, 0, v4sf)
    644   VAR1 (QUADOP_LANE, fmlslq_laneq_high, 0, v4sf)
    645