xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/config/aarch64/aarch64-simd-builtins.def (revision 222d8db193024acacd40f1e7f971a15776aacc91)
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