Home | History | Annotate | Line # | Download | only in aarch64
aarch64-simd-builtins.def revision 1.1.1.1
      1 /* Machine description for AArch64 architecture.
      2    Copyright (C) 2012-2013 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 should
     22    correspond to the iterator used to construct the instruction's
     23    patterns in aarch64-simd.md.  A helpful idiom to follow when
     24    adding new builtins is to add a line for each pattern in the md
     25    file.  Thus, ADDP, which has one pattern defined for the VD_BHSI
     26    iterator, and one for DImode, has two entries below.  */
     27 
     28   BUILTIN_VD_RE (CREATE, create)
     29   BUILTIN_VQ_S (GETLANE, get_lane_signed)
     30   BUILTIN_VDQ (GETLANE, get_lane_unsigned)
     31   BUILTIN_VDQF (GETLANE, get_lane)
     32   VAR1 (GETLANE, get_lane, di)
     33   BUILTIN_VDC (COMBINE, combine)
     34   BUILTIN_VB (BINOP, pmul)
     35   BUILTIN_VDQF (UNOP, sqrt)
     36   BUILTIN_VD_BHSI (BINOP, addp)
     37   VAR1 (UNOP, addp, di)
     38 
     39   BUILTIN_VD_RE (REINTERP, reinterpretdi)
     40   BUILTIN_VDC (REINTERP, reinterpretv8qi)
     41   BUILTIN_VDC (REINTERP, reinterpretv4hi)
     42   BUILTIN_VDC (REINTERP, reinterpretv2si)
     43   BUILTIN_VDC (REINTERP, reinterpretv2sf)
     44   BUILTIN_VQ (REINTERP, reinterpretv16qi)
     45   BUILTIN_VQ (REINTERP, reinterpretv8hi)
     46   BUILTIN_VQ (REINTERP, reinterpretv4si)
     47   BUILTIN_VQ (REINTERP, reinterpretv4sf)
     48   BUILTIN_VQ (REINTERP, reinterpretv2di)
     49   BUILTIN_VQ (REINTERP, reinterpretv2df)
     50 
     51   BUILTIN_VDQ_I (BINOP, dup_lane)
     52   BUILTIN_SDQ_I (BINOP, dup_lane)
     53   /* Implemented by aarch64_<sur>q<r>shl<mode>.  */
     54   BUILTIN_VSDQ_I (BINOP, sqshl)
     55   BUILTIN_VSDQ_I (BINOP, uqshl)
     56   BUILTIN_VSDQ_I (BINOP, sqrshl)
     57   BUILTIN_VSDQ_I (BINOP, uqrshl)
     58   /* Implemented by aarch64_<su_optab><optab><mode>.  */
     59   BUILTIN_VSDQ_I (BINOP, sqadd)
     60   BUILTIN_VSDQ_I (BINOP, uqadd)
     61   BUILTIN_VSDQ_I (BINOP, sqsub)
     62   BUILTIN_VSDQ_I (BINOP, uqsub)
     63   /* Implemented by aarch64_<sur>qadd<mode>.  */
     64   BUILTIN_VSDQ_I (BINOP, suqadd)
     65   BUILTIN_VSDQ_I (BINOP, usqadd)
     66 
     67   /* Implemented by aarch64_get_dreg<VSTRUCT:mode><VDC:mode>.  */
     68   BUILTIN_VDC (GETLANE, get_dregoi)
     69   BUILTIN_VDC (GETLANE, get_dregci)
     70   BUILTIN_VDC (GETLANE, get_dregxi)
     71   /* Implemented by aarch64_get_qreg<VSTRUCT:mode><VQ:mode>.  */
     72   BUILTIN_VQ (GETLANE, get_qregoi)
     73   BUILTIN_VQ (GETLANE, get_qregci)
     74   BUILTIN_VQ (GETLANE, get_qregxi)
     75   /* Implemented by aarch64_set_qreg<VSTRUCT:mode><VQ:mode>.  */
     76   BUILTIN_VQ (SETLANE, set_qregoi)
     77   BUILTIN_VQ (SETLANE, set_qregci)
     78   BUILTIN_VQ (SETLANE, set_qregxi)
     79   /* Implemented by aarch64_ld<VSTRUCT:nregs><VDC:mode>.  */
     80   BUILTIN_VDC (LOADSTRUCT, ld2)
     81   BUILTIN_VDC (LOADSTRUCT, ld3)
     82   BUILTIN_VDC (LOADSTRUCT, ld4)
     83   /* Implemented by aarch64_ld<VSTRUCT:nregs><VQ:mode>.  */
     84   BUILTIN_VQ (LOADSTRUCT, ld2)
     85   BUILTIN_VQ (LOADSTRUCT, ld3)
     86   BUILTIN_VQ (LOADSTRUCT, ld4)
     87   /* Implemented by aarch64_st<VSTRUCT:nregs><VDC:mode>.  */
     88   BUILTIN_VDC (STORESTRUCT, st2)
     89   BUILTIN_VDC (STORESTRUCT, st3)
     90   BUILTIN_VDC (STORESTRUCT, st4)
     91   /* Implemented by aarch64_st<VSTRUCT:nregs><VQ:mode>.  */
     92   BUILTIN_VQ (STORESTRUCT, st2)
     93   BUILTIN_VQ (STORESTRUCT, st3)
     94   BUILTIN_VQ (STORESTRUCT, st4)
     95 
     96   BUILTIN_VQW (BINOP, saddl2)
     97   BUILTIN_VQW (BINOP, uaddl2)
     98   BUILTIN_VQW (BINOP, ssubl2)
     99   BUILTIN_VQW (BINOP, usubl2)
    100   BUILTIN_VQW (BINOP, saddw2)
    101   BUILTIN_VQW (BINOP, uaddw2)
    102   BUILTIN_VQW (BINOP, ssubw2)
    103   BUILTIN_VQW (BINOP, usubw2)
    104   /* Implemented by aarch64_<ANY_EXTEND:su><ADDSUB:optab>l<mode>.  */
    105   BUILTIN_VDW (BINOP, saddl)
    106   BUILTIN_VDW (BINOP, uaddl)
    107   BUILTIN_VDW (BINOP, ssubl)
    108   BUILTIN_VDW (BINOP, usubl)
    109   /* Implemented by aarch64_<ANY_EXTEND:su><ADDSUB:optab>w<mode>.  */
    110   BUILTIN_VDW (BINOP, saddw)
    111   BUILTIN_VDW (BINOP, uaddw)
    112   BUILTIN_VDW (BINOP, ssubw)
    113   BUILTIN_VDW (BINOP, usubw)
    114   /* Implemented by aarch64_<sur>h<addsub><mode>.  */
    115   BUILTIN_VQ_S (BINOP, shadd)
    116   BUILTIN_VQ_S (BINOP, uhadd)
    117   BUILTIN_VQ_S (BINOP, srhadd)
    118   BUILTIN_VQ_S (BINOP, urhadd)
    119   /* Implemented by aarch64_<sur><addsub>hn<mode>.  */
    120   BUILTIN_VQN (BINOP, addhn)
    121   BUILTIN_VQN (BINOP, raddhn)
    122   /* Implemented by aarch64_<sur><addsub>hn2<mode>.  */
    123   BUILTIN_VQN (TERNOP, addhn2)
    124   BUILTIN_VQN (TERNOP, raddhn2)
    125 
    126   BUILTIN_VSQN_HSDI (UNOP, sqmovun)
    127   /* Implemented by aarch64_<sur>qmovn<mode>.  */
    128   BUILTIN_VSQN_HSDI (UNOP, sqmovn)
    129   BUILTIN_VSQN_HSDI (UNOP, uqmovn)
    130   /* Implemented by aarch64_s<optab><mode>.  */
    131   BUILTIN_VSDQ_I_BHSI (UNOP, sqabs)
    132   BUILTIN_VSDQ_I_BHSI (UNOP, sqneg)
    133 
    134   BUILTIN_VSD_HSI (QUADOP, sqdmlal_lane)
    135   BUILTIN_VSD_HSI (QUADOP, sqdmlsl_lane)
    136   BUILTIN_VSD_HSI (QUADOP, sqdmlal_laneq)
    137   BUILTIN_VSD_HSI (QUADOP, sqdmlsl_laneq)
    138   BUILTIN_VQ_HSI (TERNOP, sqdmlal2)
    139   BUILTIN_VQ_HSI (TERNOP, sqdmlsl2)
    140   BUILTIN_VQ_HSI (QUADOP, sqdmlal2_lane)
    141   BUILTIN_VQ_HSI (QUADOP, sqdmlsl2_lane)
    142   BUILTIN_VQ_HSI (QUADOP, sqdmlal2_laneq)
    143   BUILTIN_VQ_HSI (QUADOP, sqdmlsl2_laneq)
    144   BUILTIN_VQ_HSI (TERNOP, sqdmlal2_n)
    145   BUILTIN_VQ_HSI (TERNOP, sqdmlsl2_n)
    146   /* Implemented by aarch64_sqdml<SBINQOPS:as>l<mode>.  */
    147   BUILTIN_VSD_HSI (TERNOP, sqdmlal)
    148   BUILTIN_VSD_HSI (TERNOP, sqdmlsl)
    149   /* Implemented by aarch64_sqdml<SBINQOPS:as>l_n<mode>.  */
    150   BUILTIN_VD_HSI (TERNOP, sqdmlal_n)
    151   BUILTIN_VD_HSI (TERNOP, sqdmlsl_n)
    152 
    153   BUILTIN_VSD_HSI (BINOP, sqdmull)
    154   BUILTIN_VSD_HSI (TERNOP, sqdmull_lane)
    155   BUILTIN_VD_HSI (TERNOP, sqdmull_laneq)
    156   BUILTIN_VD_HSI (BINOP, sqdmull_n)
    157   BUILTIN_VQ_HSI (BINOP, sqdmull2)
    158   BUILTIN_VQ_HSI (TERNOP, sqdmull2_lane)
    159   BUILTIN_VQ_HSI (TERNOP, sqdmull2_laneq)
    160   BUILTIN_VQ_HSI (BINOP, sqdmull2_n)
    161   /* Implemented by aarch64_sq<r>dmulh<mode>.  */
    162   BUILTIN_VSDQ_HSI (BINOP, sqdmulh)
    163   BUILTIN_VSDQ_HSI (BINOP, sqrdmulh)
    164   /* Implemented by aarch64_sq<r>dmulh_lane<q><mode>.  */
    165   BUILTIN_VDQHS (TERNOP, sqdmulh_lane)
    166   BUILTIN_VDQHS (TERNOP, sqdmulh_laneq)
    167   BUILTIN_VDQHS (TERNOP, sqrdmulh_lane)
    168   BUILTIN_VDQHS (TERNOP, sqrdmulh_laneq)
    169   BUILTIN_SD_HSI (TERNOP, sqdmulh_lane)
    170   BUILTIN_SD_HSI (TERNOP, sqrdmulh_lane)
    171 
    172   BUILTIN_VSDQ_I_DI (BINOP, sshl_n)
    173   BUILTIN_VSDQ_I_DI (BINOP, ushl_n)
    174   /* Implemented by aarch64_<sur>shl<mode>.  */
    175   BUILTIN_VSDQ_I_DI (BINOP, sshl)
    176   BUILTIN_VSDQ_I_DI (BINOP, ushl)
    177   BUILTIN_VSDQ_I_DI (BINOP, srshl)
    178   BUILTIN_VSDQ_I_DI (BINOP, urshl)
    179 
    180   BUILTIN_VSDQ_I_DI (SHIFTIMM, sshr_n)
    181   BUILTIN_VSDQ_I_DI (SHIFTIMM, ushr_n)
    182   /* Implemented by aarch64_<sur>shr_n<mode>.  */
    183   BUILTIN_VSDQ_I_DI (SHIFTIMM, srshr_n)
    184   BUILTIN_VSDQ_I_DI (SHIFTIMM, urshr_n)
    185   /* Implemented by aarch64_<sur>sra_n<mode>.  */
    186   BUILTIN_VSDQ_I_DI (SHIFTACC, ssra_n)
    187   BUILTIN_VSDQ_I_DI (SHIFTACC, usra_n)
    188   BUILTIN_VSDQ_I_DI (SHIFTACC, srsra_n)
    189   BUILTIN_VSDQ_I_DI (SHIFTACC, ursra_n)
    190   /* Implemented by aarch64_<sur>shll_n<mode>.  */
    191   BUILTIN_VDW (SHIFTIMM, sshll_n)
    192   BUILTIN_VDW (SHIFTIMM, ushll_n)
    193   /* Implemented by aarch64_<sur>shll2_n<mode>.  */
    194   BUILTIN_VQW (SHIFTIMM, sshll2_n)
    195   BUILTIN_VQW (SHIFTIMM, ushll2_n)
    196   /* Implemented by aarch64_<sur>q<r>shr<u>n_n<mode>.  */
    197   BUILTIN_VSQN_HSDI (SHIFTIMM, sqshrun_n)
    198   BUILTIN_VSQN_HSDI (SHIFTIMM, sqrshrun_n)
    199   BUILTIN_VSQN_HSDI (SHIFTIMM, sqshrn_n)
    200   BUILTIN_VSQN_HSDI (SHIFTIMM, uqshrn_n)
    201   BUILTIN_VSQN_HSDI (SHIFTIMM, sqrshrn_n)
    202   BUILTIN_VSQN_HSDI (SHIFTIMM, uqrshrn_n)
    203   /* Implemented by aarch64_<sur>s<lr>i_n<mode>.  */
    204   BUILTIN_VSDQ_I_DI (SHIFTINSERT, ssri_n)
    205   BUILTIN_VSDQ_I_DI (SHIFTINSERT, usri_n)
    206   BUILTIN_VSDQ_I_DI (SHIFTINSERT, ssli_n)
    207   BUILTIN_VSDQ_I_DI (SHIFTINSERT, usli_n)
    208   /* Implemented by aarch64_<sur>qshl<u>_n<mode>.  */
    209   BUILTIN_VSDQ_I (SHIFTIMM, sqshlu_n)
    210   BUILTIN_VSDQ_I (SHIFTIMM, sqshl_n)
    211   BUILTIN_VSDQ_I (SHIFTIMM, uqshl_n)
    212 
    213   /* Implemented by aarch64_cm<cmp><mode>.  */
    214   BUILTIN_VSDQ_I_DI (BINOP, cmeq)
    215   BUILTIN_VSDQ_I_DI (BINOP, cmge)
    216   BUILTIN_VSDQ_I_DI (BINOP, cmgt)
    217   BUILTIN_VSDQ_I_DI (BINOP, cmle)
    218   BUILTIN_VSDQ_I_DI (BINOP, cmlt)
    219   /* Implemented by aarch64_cm<cmp><mode>.  */
    220   BUILTIN_VSDQ_I_DI (BINOP, cmgeu)
    221   BUILTIN_VSDQ_I_DI (BINOP, cmgtu)
    222   BUILTIN_VSDQ_I_DI (BINOP, cmtst)
    223 
    224   /* Implemented by aarch64_<fmaxmin><mode>.  */
    225   BUILTIN_VDQF (BINOP, fmax)
    226   BUILTIN_VDQF (BINOP, fmin)
    227   /* Implemented by aarch64_<maxmin><mode>.  */
    228   BUILTIN_VDQ_BHSI (BINOP, smax)
    229   BUILTIN_VDQ_BHSI (BINOP, smin)
    230   BUILTIN_VDQ_BHSI (BINOP, umax)
    231   BUILTIN_VDQ_BHSI (BINOP, umin)
    232 
    233   /* Implemented by aarch64_frint<frint_suffix><mode>.  */
    234   BUILTIN_VDQF (UNOP, frintz)
    235   BUILTIN_VDQF (UNOP, frintp)
    236   BUILTIN_VDQF (UNOP, frintm)
    237   BUILTIN_VDQF (UNOP, frinti)
    238   BUILTIN_VDQF (UNOP, frintx)
    239   BUILTIN_VDQF (UNOP, frinta)
    240 
    241   /* Implemented by aarch64_fcvt<frint_suffix><su><mode>.  */
    242   BUILTIN_VDQF (UNOP, fcvtzs)
    243   BUILTIN_VDQF (UNOP, fcvtzu)
    244   BUILTIN_VDQF (UNOP, fcvtas)
    245   BUILTIN_VDQF (UNOP, fcvtau)
    246   BUILTIN_VDQF (UNOP, fcvtps)
    247   BUILTIN_VDQF (UNOP, fcvtpu)
    248   BUILTIN_VDQF (UNOP, fcvtms)
    249   BUILTIN_VDQF (UNOP, fcvtmu)
    250 
    251   /* Implemented by
    252      aarch64_<PERMUTE:perm_insn><PERMUTE:perm_hilo><mode>.  */
    253   BUILTIN_VALL (BINOP, zip1)
    254   BUILTIN_VALL (BINOP, zip2)
    255   BUILTIN_VALL (BINOP, uzp1)
    256   BUILTIN_VALL (BINOP, uzp2)
    257   BUILTIN_VALL (BINOP, trn1)
    258   BUILTIN_VALL (BINOP, trn2)
    259 
    260   /* Implemented by aarch64_ld1<VALL:mode>.  */
    261   BUILTIN_VALL (LOAD1, ld1)
    262 
    263   /* Implemented by aarch64_st1<VALL:mode>.  */
    264   BUILTIN_VALL (STORE1, st1)
    265 
    266