]>
Commit | Line | Data |
---|---|---|
43e9d192 | 1 | ;; Machine description for AArch64 architecture. |
cbe34bb5 | 2 | ;; Copyright (C) 2009-2017 Free Software Foundation, Inc. |
43e9d192 IB |
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 | ;; ------------------------------------------------------------------- | |
22 | ;; Mode Iterators | |
23 | ;; ------------------------------------------------------------------- | |
24 | ||
25 | ||
26 | ;; Iterator for General Purpose Integer registers (32- and 64-bit modes) | |
27 | (define_mode_iterator GPI [SI DI]) | |
28 | ||
d7f33f07 JW |
29 | ;; Iterator for HI, SI, DI, some instructions can only work on these modes. |
30 | (define_mode_iterator GPI_I16 [(HI "AARCH64_ISA_F16") SI DI]) | |
31 | ||
43e9d192 IB |
32 | ;; Iterator for QI and HI modes |
33 | (define_mode_iterator SHORT [QI HI]) | |
34 | ||
35 | ;; Iterator for all integer modes (up to 64-bit) | |
36 | (define_mode_iterator ALLI [QI HI SI DI]) | |
37 | ||
43e9d192 IB |
38 | ;; Iterator for all integer modes that can be extended (up to 64-bit) |
39 | (define_mode_iterator ALLX [QI HI SI]) | |
40 | ||
41 | ;; Iterator for General Purpose Floating-point registers (32- and 64-bit modes) | |
42 | (define_mode_iterator GPF [SF DF]) | |
43 | ||
d7f33f07 JW |
44 | ;; Iterator for all scalar floating point modes (HF, SF, DF) |
45 | (define_mode_iterator GPF_F16 [(HF "AARCH64_ISA_F16") SF DF]) | |
46 | ||
09fcd8e1 RR |
47 | ;; Iterator for all scalar floating point modes (HF, SF, DF and TF) |
48 | (define_mode_iterator GPF_TF_F16 [HF SF DF TF]) | |
c2ec330c | 49 | |
922f9c25 AL |
50 | ;; Double vector modes. |
51 | (define_mode_iterator VDF [V2SF V4HF]) | |
52 | ||
b4f50fd4 RR |
53 | ;; Iterator for all scalar floating point modes (SF, DF and TF) |
54 | (define_mode_iterator GPF_TF [SF DF TF]) | |
55 | ||
43e9d192 IB |
56 | ;; Integer vector modes. |
57 | (define_mode_iterator VDQ_I [V8QI V16QI V4HI V8HI V2SI V4SI V2DI]) | |
58 | ||
59 | ;; vector and scalar, 64 & 128-bit container, all integer modes | |
60 | (define_mode_iterator VSDQ_I [V8QI V16QI V4HI V8HI V2SI V4SI V2DI QI HI SI DI]) | |
61 | ||
62 | ;; vector and scalar, 64 & 128-bit container: all vector integer modes; | |
63 | ;; 64-bit scalar integer mode | |
64 | (define_mode_iterator VSDQ_I_DI [V8QI V16QI V4HI V8HI V2SI V4SI V2DI DI]) | |
65 | ||
66 | ;; Double vector modes. | |
71a11456 | 67 | (define_mode_iterator VD [V8QI V4HI V4HF V2SI V2SF]) |
43e9d192 IB |
68 | |
69 | ;; vector, 64-bit container, all integer modes | |
70 | (define_mode_iterator VD_BHSI [V8QI V4HI V2SI]) | |
71 | ||
72 | ;; 128 and 64-bit container; 8, 16, 32-bit vector integer modes | |
73 | (define_mode_iterator VDQ_BHSI [V8QI V16QI V4HI V8HI V2SI V4SI]) | |
74 | ||
75 | ;; Quad vector modes. | |
71a11456 | 76 | (define_mode_iterator VQ [V16QI V8HI V4SI V2DI V8HF V4SF V2DF]) |
43e9d192 | 77 | |
51437269 | 78 | ;; VQ without 2 element modes. |
71a11456 | 79 | (define_mode_iterator VQ_NO2E [V16QI V8HI V4SI V8HF V4SF]) |
51437269 GW |
80 | |
81 | ;; Quad vector with only 2 element modes. | |
82 | (define_mode_iterator VQ_2E [V2DI V2DF]) | |
83 | ||
28514dda YZ |
84 | ;; This mode iterator allows :P to be used for patterns that operate on |
85 | ;; addresses in different modes. In LP64, only DI will match, while in | |
86 | ;; ILP32, either can match. | |
87 | (define_mode_iterator P [(SI "ptr_mode == SImode || Pmode == SImode") | |
88 | (DI "ptr_mode == DImode || Pmode == DImode")]) | |
89 | ||
43e9d192 IB |
90 | ;; This mode iterator allows :PTR to be used for patterns that operate on |
91 | ;; pointer-sized quantities. Exactly one of the two alternatives will match. | |
28514dda | 92 | (define_mode_iterator PTR [(SI "ptr_mode == SImode") (DI "ptr_mode == DImode")]) |
43e9d192 | 93 | |
862abc04 AL |
94 | ;; Vector Float modes suitable for moving, loading and storing. |
95 | (define_mode_iterator VDQF_F16 [V4HF V8HF V2SF V4SF V2DF]) | |
96 | ||
daef0a8c | 97 | ;; Vector Float modes. |
43e9d192 | 98 | (define_mode_iterator VDQF [V2SF V4SF V2DF]) |
daef0a8c JW |
99 | (define_mode_iterator VHSDF [(V4HF "TARGET_SIMD_F16INST") |
100 | (V8HF "TARGET_SIMD_F16INST") | |
101 | V2SF V4SF V2DF]) | |
43e9d192 | 102 | |
f421c516 | 103 | ;; Vector Float modes, and DF. |
daef0a8c JW |
104 | (define_mode_iterator VHSDF_DF [(V4HF "TARGET_SIMD_F16INST") |
105 | (V8HF "TARGET_SIMD_F16INST") | |
106 | V2SF V4SF V2DF DF]) | |
d7f33f07 JW |
107 | (define_mode_iterator VHSDF_HSDF [(V4HF "TARGET_SIMD_F16INST") |
108 | (V8HF "TARGET_SIMD_F16INST") | |
109 | V2SF V4SF V2DF | |
110 | (HF "TARGET_SIMD_F16INST") | |
111 | SF DF]) | |
f421c516 | 112 | |
828e70c1 JG |
113 | ;; Vector single Float modes. |
114 | (define_mode_iterator VDQSF [V2SF V4SF]) | |
115 | ||
03873eb9 AL |
116 | ;; Quad vector Float modes with half/single elements. |
117 | (define_mode_iterator VQ_HSF [V8HF V4SF]) | |
118 | ||
fc21784d JG |
119 | ;; Modes suitable to use as the return type of a vcond expression. |
120 | (define_mode_iterator VDQF_COND [V2SF V2SI V4SF V4SI V2DF V2DI]) | |
121 | ||
889b9412 JG |
122 | ;; All Float modes. |
123 | (define_mode_iterator VALLF [V2SF V4SF V2DF SF DF]) | |
124 | ||
43e9d192 IB |
125 | ;; Vector Float modes with 2 elements. |
126 | (define_mode_iterator V2F [V2SF V2DF]) | |
127 | ||
71a11456 | 128 | ;; All vector modes on which we support any arithmetic operations. |
43e9d192 IB |
129 | (define_mode_iterator VALL [V8QI V16QI V4HI V8HI V2SI V4SI V2DI V2SF V4SF V2DF]) |
130 | ||
71a11456 AL |
131 | ;; All vector modes suitable for moving, loading, and storing. |
132 | (define_mode_iterator VALL_F16 [V8QI V16QI V4HI V8HI V2SI V4SI V2DI | |
133 | V4HF V8HF V2SF V4SF V2DF]) | |
134 | ||
88119b46 KT |
135 | ;; The VALL_F16 modes except the 128-bit 2-element ones. |
136 | (define_mode_iterator VALL_F16_NO_V2Q [V8QI V16QI V4HI V8HI V2SI V4SI | |
137 | V4HF V8HF V2SF V4SF]) | |
138 | ||
71a11456 | 139 | ;; All vector modes barring HF modes, plus DI. |
a50344cb TB |
140 | (define_mode_iterator VALLDI [V8QI V16QI V4HI V8HI V2SI V4SI V2DI V2SF V4SF V2DF DI]) |
141 | ||
71a11456 AL |
142 | ;; All vector modes and DI. |
143 | (define_mode_iterator VALLDI_F16 [V8QI V16QI V4HI V8HI V2SI V4SI V2DI | |
144 | V4HF V8HF V2SF V4SF V2DF DI]) | |
145 | ||
7c369485 | 146 | ;; All vector modes, plus DI and DF. |
46e778c4 | 147 | (define_mode_iterator VALLDIF [V8QI V16QI V4HI V8HI V2SI V4SI |
7c369485 | 148 | V2DI V4HF V8HF V2SF V4SF V2DF DI DF]) |
46e778c4 | 149 | |
43e9d192 | 150 | ;; Vector modes for Integer reduction across lanes. |
92835317 TB |
151 | (define_mode_iterator VDQV [V8QI V16QI V4HI V8HI V4SI V2DI]) |
152 | ||
153 | ;; Vector modes(except V2DI) for Integer reduction across lanes. | |
154 | (define_mode_iterator VDQV_S [V8QI V16QI V4HI V8HI V4SI]) | |
43e9d192 IB |
155 | |
156 | ;; All double integer narrow-able modes. | |
157 | (define_mode_iterator VDN [V4HI V2SI DI]) | |
158 | ||
159 | ;; All quad integer narrow-able modes. | |
160 | (define_mode_iterator VQN [V8HI V4SI V2DI]) | |
161 | ||
43e9d192 IB |
162 | ;; Vector and scalar 128-bit container: narrowable 16, 32, 64-bit integer modes |
163 | (define_mode_iterator VSQN_HSDI [V8HI V4SI V2DI HI SI DI]) | |
164 | ||
165 | ;; All quad integer widen-able modes. | |
166 | (define_mode_iterator VQW [V16QI V8HI V4SI]) | |
167 | ||
168 | ;; Double vector modes for combines. | |
7c369485 | 169 | (define_mode_iterator VDC [V8QI V4HI V4HF V2SI V2SF DI DF]) |
43e9d192 | 170 | |
43e9d192 IB |
171 | ;; Vector modes except double int. |
172 | (define_mode_iterator VDQIF [V8QI V16QI V4HI V8HI V2SI V4SI V2SF V4SF V2DF]) | |
703bbcdf JW |
173 | (define_mode_iterator VDQIF_F16 [V8QI V16QI V4HI V8HI V2SI V4SI |
174 | V4HF V8HF V2SF V4SF V2DF]) | |
43e9d192 | 175 | |
58a3bd25 FY |
176 | ;; Vector modes for S type. |
177 | (define_mode_iterator VDQ_SI [V2SI V4SI]) | |
178 | ||
2644d4d9 JW |
179 | ;; Vector modes for S and D |
180 | (define_mode_iterator VDQ_SDI [V2SI V4SI V2DI]) | |
181 | ||
33d72b63 JW |
182 | ;; Vector modes for H, S and D |
183 | (define_mode_iterator VDQ_HSDI [(V4HI "TARGET_SIMD_F16INST") | |
184 | (V8HI "TARGET_SIMD_F16INST") | |
185 | V2SI V4SI V2DI]) | |
186 | ||
2644d4d9 JW |
187 | ;; Scalar and Vector modes for S and D |
188 | (define_mode_iterator VSDQ_SDI [V2SI V4SI V2DI SI DI]) | |
189 | ||
33d72b63 JW |
190 | ;; Scalar and Vector modes for S and D, Vector modes for H. |
191 | (define_mode_iterator VSDQ_HSDI [(V4HI "TARGET_SIMD_F16INST") | |
192 | (V8HI "TARGET_SIMD_F16INST") | |
68ad28c3 JW |
193 | V2SI V4SI V2DI |
194 | (HI "TARGET_SIMD_F16INST") | |
195 | SI DI]) | |
33d72b63 | 196 | |
66adb8eb JG |
197 | ;; Vector modes for Q and H types. |
198 | (define_mode_iterator VDQQH [V8QI V16QI V4HI V8HI]) | |
199 | ||
43e9d192 IB |
200 | ;; Vector modes for H and S types. |
201 | (define_mode_iterator VDQHS [V4HI V8HI V2SI V4SI]) | |
202 | ||
c7f28cd5 KT |
203 | ;; Vector modes for H, S and D types. |
204 | (define_mode_iterator VDQHSD [V4HI V8HI V2SI V4SI V2DI]) | |
205 | ||
43e9d192 IB |
206 | ;; Vector and scalar integer modes for H and S |
207 | (define_mode_iterator VSDQ_HSI [V4HI V8HI V2SI V4SI HI SI]) | |
208 | ||
209 | ;; Vector and scalar 64-bit container: 16, 32-bit integer modes | |
210 | (define_mode_iterator VSD_HSI [V4HI V2SI HI SI]) | |
211 | ||
212 | ;; Vector 64-bit container: 16, 32-bit integer modes | |
213 | (define_mode_iterator VD_HSI [V4HI V2SI]) | |
214 | ||
215 | ;; Scalar 64-bit container: 16, 32-bit integer modes | |
216 | (define_mode_iterator SD_HSI [HI SI]) | |
217 | ||
218 | ;; Vector 64-bit container: 16, 32-bit integer modes | |
219 | (define_mode_iterator VQ_HSI [V8HI V4SI]) | |
220 | ||
221 | ;; All byte modes. | |
222 | (define_mode_iterator VB [V8QI V16QI]) | |
223 | ||
5e32e83b JW |
224 | ;; 2 and 4 lane SI modes. |
225 | (define_mode_iterator VS [V2SI V4SI]) | |
226 | ||
43e9d192 IB |
227 | (define_mode_iterator TX [TI TF]) |
228 | ||
229 | ;; Opaque structure modes. | |
230 | (define_mode_iterator VSTRUCT [OI CI XI]) | |
231 | ||
232 | ;; Double scalar modes | |
233 | (define_mode_iterator DX [DI DF]) | |
234 | ||
779aea46 | 235 | ;; Modes available for <f>mul lane operations. |
ab2e8f01 JW |
236 | (define_mode_iterator VMUL [V4HI V8HI V2SI V4SI |
237 | (V4HF "TARGET_SIMD_F16INST") | |
238 | (V8HF "TARGET_SIMD_F16INST") | |
239 | V2SF V4SF V2DF]) | |
779aea46 JG |
240 | |
241 | ;; Modes available for <f>mul lane operations changing lane count. | |
242 | (define_mode_iterator VMUL_CHANGE_NLANES [V4HI V8HI V2SI V4SI V2SF V4SF]) | |
243 | ||
43e9d192 IB |
244 | ;; ------------------------------------------------------------------ |
245 | ;; Unspec enumerations for Advance SIMD. These could well go into | |
246 | ;; aarch64.md but for their use in int_iterators here. | |
247 | ;; ------------------------------------------------------------------ | |
248 | ||
249 | (define_c_enum "unspec" | |
250 | [ | |
251 | UNSPEC_ASHIFT_SIGNED ; Used in aarch-simd.md. | |
252 | UNSPEC_ASHIFT_UNSIGNED ; Used in aarch64-simd.md. | |
285398d2 | 253 | UNSPEC_ABS ; Used in aarch64-simd.md. |
998eaf97 JG |
254 | UNSPEC_FMAX ; Used in aarch64-simd.md. |
255 | UNSPEC_FMAXNMV ; Used in aarch64-simd.md. | |
43e9d192 | 256 | UNSPEC_FMAXV ; Used in aarch64-simd.md. |
998eaf97 JG |
257 | UNSPEC_FMIN ; Used in aarch64-simd.md. |
258 | UNSPEC_FMINNMV ; Used in aarch64-simd.md. | |
43e9d192 IB |
259 | UNSPEC_FMINV ; Used in aarch64-simd.md. |
260 | UNSPEC_FADDV ; Used in aarch64-simd.md. | |
f5156c3e | 261 | UNSPEC_ADDV ; Used in aarch64-simd.md. |
43e9d192 IB |
262 | UNSPEC_SMAXV ; Used in aarch64-simd.md. |
263 | UNSPEC_SMINV ; Used in aarch64-simd.md. | |
264 | UNSPEC_UMAXV ; Used in aarch64-simd.md. | |
265 | UNSPEC_UMINV ; Used in aarch64-simd.md. | |
266 | UNSPEC_SHADD ; Used in aarch64-simd.md. | |
267 | UNSPEC_UHADD ; Used in aarch64-simd.md. | |
268 | UNSPEC_SRHADD ; Used in aarch64-simd.md. | |
269 | UNSPEC_URHADD ; Used in aarch64-simd.md. | |
270 | UNSPEC_SHSUB ; Used in aarch64-simd.md. | |
271 | UNSPEC_UHSUB ; Used in aarch64-simd.md. | |
272 | UNSPEC_SRHSUB ; Used in aarch64-simd.md. | |
273 | UNSPEC_URHSUB ; Used in aarch64-simd.md. | |
274 | UNSPEC_ADDHN ; Used in aarch64-simd.md. | |
275 | UNSPEC_RADDHN ; Used in aarch64-simd.md. | |
276 | UNSPEC_SUBHN ; Used in aarch64-simd.md. | |
277 | UNSPEC_RSUBHN ; Used in aarch64-simd.md. | |
278 | UNSPEC_ADDHN2 ; Used in aarch64-simd.md. | |
279 | UNSPEC_RADDHN2 ; Used in aarch64-simd.md. | |
280 | UNSPEC_SUBHN2 ; Used in aarch64-simd.md. | |
281 | UNSPEC_RSUBHN2 ; Used in aarch64-simd.md. | |
282 | UNSPEC_SQDMULH ; Used in aarch64-simd.md. | |
283 | UNSPEC_SQRDMULH ; Used in aarch64-simd.md. | |
284 | UNSPEC_PMUL ; Used in aarch64-simd.md. | |
496ea87d | 285 | UNSPEC_FMULX ; Used in aarch64-simd.md. |
43e9d192 IB |
286 | UNSPEC_USQADD ; Used in aarch64-simd.md. |
287 | UNSPEC_SUQADD ; Used in aarch64-simd.md. | |
288 | UNSPEC_SQXTUN ; Used in aarch64-simd.md. | |
289 | UNSPEC_SQXTN ; Used in aarch64-simd.md. | |
290 | UNSPEC_UQXTN ; Used in aarch64-simd.md. | |
291 | UNSPEC_SSRA ; Used in aarch64-simd.md. | |
292 | UNSPEC_USRA ; Used in aarch64-simd.md. | |
293 | UNSPEC_SRSRA ; Used in aarch64-simd.md. | |
294 | UNSPEC_URSRA ; Used in aarch64-simd.md. | |
295 | UNSPEC_SRSHR ; Used in aarch64-simd.md. | |
296 | UNSPEC_URSHR ; Used in aarch64-simd.md. | |
297 | UNSPEC_SQSHLU ; Used in aarch64-simd.md. | |
298 | UNSPEC_SQSHL ; Used in aarch64-simd.md. | |
299 | UNSPEC_UQSHL ; Used in aarch64-simd.md. | |
300 | UNSPEC_SQSHRUN ; Used in aarch64-simd.md. | |
301 | UNSPEC_SQRSHRUN ; Used in aarch64-simd.md. | |
302 | UNSPEC_SQSHRN ; Used in aarch64-simd.md. | |
303 | UNSPEC_UQSHRN ; Used in aarch64-simd.md. | |
304 | UNSPEC_SQRSHRN ; Used in aarch64-simd.md. | |
305 | UNSPEC_UQRSHRN ; Used in aarch64-simd.md. | |
306 | UNSPEC_SSHL ; Used in aarch64-simd.md. | |
307 | UNSPEC_USHL ; Used in aarch64-simd.md. | |
308 | UNSPEC_SRSHL ; Used in aarch64-simd.md. | |
309 | UNSPEC_URSHL ; Used in aarch64-simd.md. | |
310 | UNSPEC_SQRSHL ; Used in aarch64-simd.md. | |
311 | UNSPEC_UQRSHL ; Used in aarch64-simd.md. | |
43e9d192 IB |
312 | UNSPEC_SSLI ; Used in aarch64-simd.md. |
313 | UNSPEC_USLI ; Used in aarch64-simd.md. | |
314 | UNSPEC_SSRI ; Used in aarch64-simd.md. | |
315 | UNSPEC_USRI ; Used in aarch64-simd.md. | |
316 | UNSPEC_SSHLL ; Used in aarch64-simd.md. | |
317 | UNSPEC_USHLL ; Used in aarch64-simd.md. | |
318 | UNSPEC_ADDP ; Used in aarch64-simd.md. | |
88b08073 | 319 | UNSPEC_TBL ; Used in vector permute patterns. |
9371aecc | 320 | UNSPEC_TBX ; Used in vector permute patterns. |
88b08073 | 321 | UNSPEC_CONCAT ; Used in vector permute patterns. |
cc4d934f JG |
322 | UNSPEC_ZIP1 ; Used in vector permute patterns. |
323 | UNSPEC_ZIP2 ; Used in vector permute patterns. | |
324 | UNSPEC_UZP1 ; Used in vector permute patterns. | |
325 | UNSPEC_UZP2 ; Used in vector permute patterns. | |
326 | UNSPEC_TRN1 ; Used in vector permute patterns. | |
327 | UNSPEC_TRN2 ; Used in vector permute patterns. | |
ae0533da | 328 | UNSPEC_EXT ; Used in aarch64-simd.md. |
923fcec3 AL |
329 | UNSPEC_REV64 ; Used in vector reverse patterns (permute). |
330 | UNSPEC_REV32 ; Used in vector reverse patterns (permute). | |
331 | UNSPEC_REV16 ; Used in vector reverse patterns (permute). | |
5a7a4e80 TB |
332 | UNSPEC_AESE ; Used in aarch64-simd.md. |
333 | UNSPEC_AESD ; Used in aarch64-simd.md. | |
334 | UNSPEC_AESMC ; Used in aarch64-simd.md. | |
335 | UNSPEC_AESIMC ; Used in aarch64-simd.md. | |
30442682 TB |
336 | UNSPEC_SHA1C ; Used in aarch64-simd.md. |
337 | UNSPEC_SHA1M ; Used in aarch64-simd.md. | |
338 | UNSPEC_SHA1P ; Used in aarch64-simd.md. | |
339 | UNSPEC_SHA1H ; Used in aarch64-simd.md. | |
340 | UNSPEC_SHA1SU0 ; Used in aarch64-simd.md. | |
341 | UNSPEC_SHA1SU1 ; Used in aarch64-simd.md. | |
b9cb0a44 TB |
342 | UNSPEC_SHA256H ; Used in aarch64-simd.md. |
343 | UNSPEC_SHA256H2 ; Used in aarch64-simd.md. | |
344 | UNSPEC_SHA256SU0 ; Used in aarch64-simd.md. | |
345 | UNSPEC_SHA256SU1 ; Used in aarch64-simd.md. | |
7baa225d TB |
346 | UNSPEC_PMULL ; Used in aarch64-simd.md. |
347 | UNSPEC_PMULL2 ; Used in aarch64-simd.md. | |
668046d1 | 348 | UNSPEC_REV_REGLIST ; Used in aarch64-simd.md. |
9c004c58 | 349 | UNSPEC_VEC_SHR ; Used in aarch64-simd.md. |
57b26d65 MW |
350 | UNSPEC_SQRDMLAH ; Used in aarch64-simd.md. |
351 | UNSPEC_SQRDMLSH ; Used in aarch64-simd.md. | |
202d0c11 DS |
352 | UNSPEC_FMAXNM ; Used in aarch64-simd.md. |
353 | UNSPEC_FMINNM ; Used in aarch64-simd.md. | |
43e9d192 IB |
354 | ]) |
355 | ||
d81cb613 MW |
356 | ;; ------------------------------------------------------------------ |
357 | ;; Unspec enumerations for Atomics. They are here so that they can be | |
358 | ;; used in the int_iterators for atomic operations. | |
359 | ;; ------------------------------------------------------------------ | |
360 | ||
361 | (define_c_enum "unspecv" | |
362 | [ | |
363 | UNSPECV_LX ; Represent a load-exclusive. | |
364 | UNSPECV_SX ; Represent a store-exclusive. | |
365 | UNSPECV_LDA ; Represent an atomic load or load-acquire. | |
366 | UNSPECV_STL ; Represent an atomic store or store-release. | |
367 | UNSPECV_ATOMIC_CMPSW ; Represent an atomic compare swap. | |
368 | UNSPECV_ATOMIC_EXCHG ; Represent an atomic exchange. | |
369 | UNSPECV_ATOMIC_CAS ; Represent an atomic CAS. | |
370 | UNSPECV_ATOMIC_SWP ; Represent an atomic SWP. | |
371 | UNSPECV_ATOMIC_OP ; Represent an atomic operation. | |
372 | UNSPECV_ATOMIC_LDOP ; Represent an atomic load-operation | |
373 | UNSPECV_ATOMIC_LDOP_OR ; Represent an atomic load-or | |
374 | UNSPECV_ATOMIC_LDOP_BIC ; Represent an atomic load-bic | |
375 | UNSPECV_ATOMIC_LDOP_XOR ; Represent an atomic load-xor | |
376 | UNSPECV_ATOMIC_LDOP_PLUS ; Represent an atomic load-add | |
377 | ]) | |
378 | ||
43e9d192 IB |
379 | ;; ------------------------------------------------------------------- |
380 | ;; Mode attributes | |
381 | ;; ------------------------------------------------------------------- | |
382 | ||
383 | ;; In GPI templates, a string like "%<w>0" will expand to "%w0" in the | |
384 | ;; 32-bit version and "%x0" in the 64-bit version. | |
385 | (define_mode_attr w [(QI "w") (HI "w") (SI "w") (DI "x") (SF "s") (DF "d")]) | |
386 | ||
0d35c5c2 | 387 | ;; For inequal width int to float conversion |
d7f33f07 JW |
388 | (define_mode_attr w1 [(HF "w") (SF "w") (DF "x")]) |
389 | (define_mode_attr w2 [(HF "x") (SF "x") (DF "w")]) | |
0d35c5c2 | 390 | |
2b8568fe KT |
391 | (define_mode_attr short_mask [(HI "65535") (QI "255")]) |
392 | ||
051d0e2f SN |
393 | ;; For constraints used in scalar immediate vector moves |
394 | (define_mode_attr hq [(HI "h") (QI "q")]) | |
395 | ||
ef22810a RH |
396 | ;; For doubling width of an integer mode |
397 | (define_mode_attr DWI [(QI "HI") (HI "SI") (SI "DI") (DI "TI")]) | |
398 | ||
43e9d192 IB |
399 | ;; For scalar usage of vector/FP registers |
400 | (define_mode_attr v [(QI "b") (HI "h") (SI "s") (DI "d") | |
d7f33f07 | 401 | (HF "h") (SF "s") (DF "d") |
43e9d192 IB |
402 | (V8QI "") (V16QI "") |
403 | (V4HI "") (V8HI "") | |
404 | (V2SI "") (V4SI "") | |
405 | (V2DI "") (V2SF "") | |
daef0a8c JW |
406 | (V4SF "") (V4HF "") |
407 | (V8HF "") (V2DF "")]) | |
43e9d192 IB |
408 | |
409 | ;; For scalar usage of vector/FP registers, narrowing | |
410 | (define_mode_attr vn2 [(QI "") (HI "b") (SI "h") (DI "s") | |
411 | (V8QI "") (V16QI "") | |
412 | (V4HI "") (V8HI "") | |
413 | (V2SI "") (V4SI "") | |
414 | (V2DI "") (V2SF "") | |
415 | (V4SF "") (V2DF "")]) | |
416 | ||
417 | ;; For scalar usage of vector/FP registers, widening | |
418 | (define_mode_attr vw2 [(DI "") (QI "h") (HI "s") (SI "d") | |
419 | (V8QI "") (V16QI "") | |
420 | (V4HI "") (V8HI "") | |
421 | (V2SI "") (V4SI "") | |
422 | (V2DI "") (V2SF "") | |
423 | (V4SF "") (V2DF "")]) | |
424 | ||
89fdc743 IB |
425 | ;; Register Type Name and Vector Arrangement Specifier for when |
426 | ;; we are doing scalar for DI and SIMD for SI (ignoring all but | |
427 | ;; lane 0). | |
428 | (define_mode_attr rtn [(DI "d") (SI "")]) | |
429 | (define_mode_attr vas [(DI "") (SI ".2s")]) | |
430 | ||
43e9d192 | 431 | ;; Map a floating point mode to the appropriate register name prefix |
d7f33f07 | 432 | (define_mode_attr s [(HF "h") (SF "s") (DF "d")]) |
43e9d192 IB |
433 | |
434 | ;; Give the length suffix letter for a sign- or zero-extension. | |
435 | (define_mode_attr size [(QI "b") (HI "h") (SI "w")]) | |
436 | ||
437 | ;; Give the number of bits in the mode | |
438 | (define_mode_attr sizen [(QI "8") (HI "16") (SI "32") (DI "64")]) | |
439 | ||
440 | ;; Give the ordinal of the MSB in the mode | |
441 | (define_mode_attr sizem1 [(QI "#7") (HI "#15") (SI "#31") (DI "#63")]) | |
442 | ||
443 | ;; Attribute to describe constants acceptable in logical operations | |
444 | (define_mode_attr lconst [(SI "K") (DI "L")]) | |
445 | ||
43fd192f MC |
446 | ;; Attribute to describe constants acceptable in logical and operations |
447 | (define_mode_attr lconst2 [(SI "UsO") (DI "UsP")]) | |
448 | ||
43e9d192 IB |
449 | ;; Map a mode to a specific constraint character. |
450 | (define_mode_attr cmode [(QI "q") (HI "h") (SI "s") (DI "d")]) | |
451 | ||
452 | (define_mode_attr Vtype [(V8QI "8b") (V16QI "16b") | |
453 | (V4HI "4h") (V8HI "8h") | |
454 | (V2SI "2s") (V4SI "4s") | |
455 | (DI "1d") (DF "1d") | |
456 | (V2DI "2d") (V2SF "2s") | |
7c369485 AL |
457 | (V4SF "4s") (V2DF "2d") |
458 | (V4HF "4h") (V8HF "8h")]) | |
43e9d192 | 459 | |
c7f28cd5 KT |
460 | (define_mode_attr Vrevsuff [(V4HI "16") (V8HI "16") (V2SI "32") |
461 | (V4SI "32") (V2DI "64")]) | |
462 | ||
43e9d192 IB |
463 | (define_mode_attr Vmtype [(V8QI ".8b") (V16QI ".16b") |
464 | (V4HI ".4h") (V8HI ".8h") | |
465 | (V2SI ".2s") (V4SI ".4s") | |
71a11456 AL |
466 | (V2DI ".2d") (V4HF ".4h") |
467 | (V8HF ".8h") (V2SF ".2s") | |
43e9d192 IB |
468 | (V4SF ".4s") (V2DF ".2d") |
469 | (DI "") (SI "") | |
470 | (HI "") (QI "") | |
d7f33f07 JW |
471 | (TI "") (HF "") |
472 | (SF "") (DF "")]) | |
43e9d192 IB |
473 | |
474 | ;; Register suffix narrowed modes for VQN. | |
475 | (define_mode_attr Vmntype [(V8HI ".8b") (V4SI ".4h") | |
476 | (V2DI ".2s") | |
477 | (DI "") (SI "") | |
478 | (HI "")]) | |
479 | ||
480 | ;; Mode-to-individual element type mapping. | |
481 | (define_mode_attr Vetype [(V8QI "b") (V16QI "b") | |
482 | (V4HI "h") (V8HI "h") | |
483 | (V2SI "s") (V4SI "s") | |
7c369485 AL |
484 | (V2DI "d") (V4HF "h") |
485 | (V8HF "h") (V2SF "s") | |
43e9d192 | 486 | (V4SF "s") (V2DF "d") |
d7f33f07 | 487 | (HF "h") |
0f686aa9 | 488 | (SF "s") (DF "d") |
43e9d192 IB |
489 | (QI "b") (HI "h") |
490 | (SI "s") (DI "d")]) | |
491 | ||
daef0a8c JW |
492 | ;; Vetype is used everywhere in scheduling type and assembly output, |
493 | ;; sometimes they are not the same, for example HF modes on some | |
494 | ;; instructions. stype is defined to represent scheduling type | |
495 | ;; more accurately. | |
496 | (define_mode_attr stype [(V8QI "b") (V16QI "b") (V4HI "s") (V8HI "s") | |
497 | (V2SI "s") (V4SI "s") (V2DI "d") (V4HF "s") | |
498 | (V8HF "s") (V2SF "s") (V4SF "s") (V2DF "d") | |
499 | (HF "s") (SF "s") (DF "d") (QI "b") (HI "s") | |
500 | (SI "s") (DI "d")]) | |
501 | ||
43e9d192 IB |
502 | ;; Mode-to-bitwise operation type mapping. |
503 | (define_mode_attr Vbtype [(V8QI "8b") (V16QI "16b") | |
504 | (V4HI "8b") (V8HI "16b") | |
505 | (V2SI "8b") (V4SI "16b") | |
7c369485 AL |
506 | (V2DI "16b") (V4HF "8b") |
507 | (V8HF "16b") (V2SF "8b") | |
46e778c4 | 508 | (V4SF "16b") (V2DF "16b") |
fe82d1f2 AL |
509 | (DI "8b") (DF "8b") |
510 | (SI "8b")]) | |
43e9d192 IB |
511 | |
512 | ;; Define element mode for each vector mode. | |
513 | (define_mode_attr VEL [(V8QI "QI") (V16QI "QI") | |
514 | (V4HI "HI") (V8HI "HI") | |
515 | (V2SI "SI") (V4SI "SI") | |
516 | (DI "DI") (V2DI "DI") | |
71a11456 | 517 | (V4HF "HF") (V8HF "HF") |
43e9d192 | 518 | (V2SF "SF") (V4SF "SF") |
779aea46 | 519 | (V2DF "DF") (DF "DF") |
43e9d192 IB |
520 | (SI "SI") (HI "HI") |
521 | (QI "QI")]) | |
522 | ||
278821f2 KT |
523 | ;; 64-bit container modes the inner or scalar source mode. |
524 | (define_mode_attr VCOND [(HI "V4HI") (SI "V2SI") | |
525 | (V4HI "V4HI") (V8HI "V4HI") | |
b7d7d917 TB |
526 | (V2SI "V2SI") (V4SI "V2SI") |
527 | (DI "DI") (V2DI "DI") | |
528 | (V2SF "V2SF") (V4SF "V2SF") | |
529 | (V2DF "DF")]) | |
530 | ||
278821f2 | 531 | ;; 128-bit container modes the inner or scalar source mode. |
b7d7d917 TB |
532 | (define_mode_attr VCONQ [(V8QI "V16QI") (V16QI "V16QI") |
533 | (V4HI "V8HI") (V8HI "V8HI") | |
534 | (V2SI "V4SI") (V4SI "V4SI") | |
535 | (DI "V2DI") (V2DI "V2DI") | |
71a11456 | 536 | (V4HF "V8HF") (V8HF "V8HF") |
b7d7d917 TB |
537 | (V2SF "V2SF") (V4SF "V4SF") |
538 | (V2DF "V2DF") (SI "V4SI") | |
539 | (HI "V8HI") (QI "V16QI")]) | |
540 | ||
43e9d192 IB |
541 | ;; Half modes of all vector modes. |
542 | (define_mode_attr VHALF [(V8QI "V4QI") (V16QI "V8QI") | |
543 | (V4HI "V2HI") (V8HI "V4HI") | |
544 | (V2SI "SI") (V4SI "V2SI") | |
545 | (V2DI "DI") (V2SF "SF") | |
71a11456 AL |
546 | (V4SF "V2SF") (V4HF "V2HF") |
547 | (V8HF "V4HF") (V2DF "DF")]) | |
43e9d192 | 548 | |
b1b49824 MC |
549 | ;; Half modes of all vector modes, in lower-case. |
550 | (define_mode_attr Vhalf [(V8QI "v4qi") (V16QI "v8qi") | |
551 | (V4HI "v2hi") (V8HI "v4hi") | |
552 | (V2SI "si") (V4SI "v2si") | |
553 | (V2DI "di") (V2SF "sf") | |
554 | (V4SF "v2sf") (V2DF "df")]) | |
555 | ||
43e9d192 IB |
556 | ;; Double modes of vector modes. |
557 | (define_mode_attr VDBL [(V8QI "V16QI") (V4HI "V8HI") | |
71a11456 | 558 | (V4HF "V8HF") |
43e9d192 IB |
559 | (V2SI "V4SI") (V2SF "V4SF") |
560 | (SI "V2SI") (DI "V2DI") | |
561 | (DF "V2DF")]) | |
562 | ||
922f9c25 AL |
563 | ;; Register suffix for double-length mode. |
564 | (define_mode_attr Vdtype [(V4HF "8h") (V2SF "4s")]) | |
565 | ||
43e9d192 IB |
566 | ;; Double modes of vector modes (lower case). |
567 | (define_mode_attr Vdbl [(V8QI "v16qi") (V4HI "v8hi") | |
7c369485 | 568 | (V4HF "v8hf") |
43e9d192 | 569 | (V2SI "v4si") (V2SF "v4sf") |
8b033a8a SN |
570 | (SI "v2si") (DI "v2di") |
571 | (DF "v2df")]) | |
43e9d192 | 572 | |
b1b49824 MC |
573 | ;; Modes with double-width elements. |
574 | (define_mode_attr VDBLW [(V8QI "V4HI") (V16QI "V8HI") | |
575 | (V4HI "V2SI") (V8HI "V4SI") | |
576 | (V2SI "DI") (V4SI "V2DI")]) | |
577 | ||
43e9d192 IB |
578 | ;; Narrowed modes for VDN. |
579 | (define_mode_attr VNARROWD [(V4HI "V8QI") (V2SI "V4HI") | |
580 | (DI "V2SI")]) | |
581 | ||
582 | ;; Narrowed double-modes for VQN (Used for XTN). | |
583 | (define_mode_attr VNARROWQ [(V8HI "V8QI") (V4SI "V4HI") | |
584 | (V2DI "V2SI") | |
585 | (DI "SI") (SI "HI") | |
586 | (HI "QI")]) | |
587 | ||
588 | ;; Narrowed quad-modes for VQN (Used for XTN2). | |
589 | (define_mode_attr VNARROWQ2 [(V8HI "V16QI") (V4SI "V8HI") | |
590 | (V2DI "V4SI")]) | |
591 | ||
592 | ;; Register suffix narrowed modes for VQN. | |
593 | (define_mode_attr Vntype [(V8HI "8b") (V4SI "4h") | |
594 | (V2DI "2s")]) | |
595 | ||
596 | ;; Register suffix narrowed modes for VQN. | |
597 | (define_mode_attr V2ntype [(V8HI "16b") (V4SI "8h") | |
598 | (V2DI "4s")]) | |
599 | ||
600 | ;; Widened modes of vector modes. | |
601 | (define_mode_attr VWIDE [(V8QI "V8HI") (V4HI "V4SI") | |
602 | (V2SI "V2DI") (V16QI "V8HI") | |
603 | (V8HI "V4SI") (V4SI "V2DI") | |
922f9c25 | 604 | (HI "SI") (SI "DI") |
03873eb9 | 605 | (V8HF "V4SF") (V4SF "V2DF") |
922f9c25 | 606 | (V4HF "V4SF") (V2SF "V2DF")] |
43e9d192 IB |
607 | ) |
608 | ||
03873eb9 AL |
609 | ;; Widened modes of vector modes, lowercase |
610 | (define_mode_attr Vwide [(V2SF "v2df") (V4HF "v4sf")]) | |
611 | ||
612 | ;; Widened mode register suffixes for VD_BHSI/VQW/VQ_HSF. | |
43e9d192 IB |
613 | (define_mode_attr Vwtype [(V8QI "8h") (V4HI "4s") |
614 | (V2SI "2d") (V16QI "8h") | |
03873eb9 AL |
615 | (V8HI "4s") (V4SI "2d") |
616 | (V8HF "4s") (V4SF "2d")]) | |
43e9d192 IB |
617 | |
618 | ;; Widened mode register suffixes for VDW/VQW. | |
619 | (define_mode_attr Vmwtype [(V8QI ".8h") (V4HI ".4s") | |
620 | (V2SI ".2d") (V16QI ".8h") | |
621 | (V8HI ".4s") (V4SI ".2d") | |
922f9c25 | 622 | (V4HF ".4s") (V2SF ".2d") |
43e9d192 IB |
623 | (SI "") (HI "")]) |
624 | ||
03873eb9 | 625 | ;; Lower part register suffixes for VQW/VQ_HSF. |
43e9d192 | 626 | (define_mode_attr Vhalftype [(V16QI "8b") (V8HI "4h") |
03873eb9 AL |
627 | (V4SI "2s") (V8HF "4h") |
628 | (V4SF "2s")]) | |
43e9d192 IB |
629 | |
630 | ;; Define corresponding core/FP element mode for each vector mode. | |
631 | (define_mode_attr vw [(V8QI "w") (V16QI "w") | |
632 | (V4HI "w") (V8HI "w") | |
633 | (V2SI "w") (V4SI "w") | |
634 | (DI "x") (V2DI "x") | |
635 | (V2SF "s") (V4SF "s") | |
636 | (V2DF "d")]) | |
637 | ||
66adb8eb JG |
638 | ;; Corresponding core element mode for each vector mode. This is a |
639 | ;; variation on <vw> mapping FP modes to GP regs. | |
640 | (define_mode_attr vwcore [(V8QI "w") (V16QI "w") | |
641 | (V4HI "w") (V8HI "w") | |
642 | (V2SI "w") (V4SI "w") | |
643 | (DI "x") (V2DI "x") | |
64e9a944 | 644 | (V4HF "w") (V8HF "w") |
66adb8eb JG |
645 | (V2SF "w") (V4SF "w") |
646 | (V2DF "x")]) | |
647 | ||
43e9d192 IB |
648 | ;; Double vector types for ALLX. |
649 | (define_mode_attr Vallxd [(QI "8b") (HI "4h") (SI "2s")]) | |
650 | ||
651 | ;; Mode of result of comparison operations. | |
652 | (define_mode_attr V_cmp_result [(V8QI "V8QI") (V16QI "V16QI") | |
653 | (V4HI "V4HI") (V8HI "V8HI") | |
654 | (V2SI "V2SI") (V4SI "V4SI") | |
88b08073 | 655 | (DI "DI") (V2DI "V2DI") |
7c369485 | 656 | (V4HF "V4HI") (V8HF "V8HI") |
43e9d192 | 657 | (V2SF "V2SI") (V4SF "V4SI") |
889b9412 | 658 | (V2DF "V2DI") (DF "DI") |
d7f33f07 | 659 | (SF "SI") (HF "HI")]) |
43e9d192 | 660 | |
70c67693 JG |
661 | ;; Lower case mode of results of comparison operations. |
662 | (define_mode_attr v_cmp_result [(V8QI "v8qi") (V16QI "v16qi") | |
663 | (V4HI "v4hi") (V8HI "v8hi") | |
664 | (V2SI "v2si") (V4SI "v4si") | |
665 | (DI "di") (V2DI "v2di") | |
7c369485 | 666 | (V4HF "v4hi") (V8HF "v8hi") |
70c67693 | 667 | (V2SF "v2si") (V4SF "v4si") |
889b9412 JG |
668 | (V2DF "v2di") (DF "di") |
669 | (SF "si")]) | |
70c67693 | 670 | |
6c553b76 BC |
671 | ;; Mode for vector conditional operations where the comparison has |
672 | ;; different type from the lhs. | |
673 | (define_mode_attr V_cmp_mixed [(V2SI "V2SF") (V4SI "V4SF") | |
674 | (V2DI "V2DF") (V2SF "V2SI") | |
675 | (V4SF "V4SI") (V2DF "V2DI")]) | |
676 | ||
677 | (define_mode_attr v_cmp_mixed [(V2SI "v2sf") (V4SI "v4sf") | |
678 | (V2DI "v2df") (V2SF "v2si") | |
679 | (V4SF "v4si") (V2DF "v2di")]) | |
680 | ||
cb23a30c JG |
681 | ;; Lower case element modes (as used in shift immediate patterns). |
682 | (define_mode_attr ve_mode [(V8QI "qi") (V16QI "qi") | |
683 | (V4HI "hi") (V8HI "hi") | |
684 | (V2SI "si") (V4SI "si") | |
685 | (DI "di") (V2DI "di") | |
686 | (QI "qi") (HI "hi") | |
687 | (SI "si")]) | |
688 | ||
43e9d192 IB |
689 | ;; Vm for lane instructions is restricted to FP_LO_REGS. |
690 | (define_mode_attr vwx [(V4HI "x") (V8HI "x") (HI "x") | |
691 | (V2SI "w") (V4SI "w") (SI "w")]) | |
692 | ||
693 | (define_mode_attr Vendreg [(OI "T") (CI "U") (XI "V")]) | |
694 | ||
97755701 AL |
695 | ;; This is both the number of Q-Registers needed to hold the corresponding |
696 | ;; opaque large integer mode, and the number of elements touched by the | |
697 | ;; ld..._lane and st..._lane operations. | |
43e9d192 IB |
698 | (define_mode_attr nregs [(OI "2") (CI "3") (XI "4")]) |
699 | ||
700 | (define_mode_attr VRL2 [(V8QI "V32QI") (V4HI "V16HI") | |
71a11456 | 701 | (V4HF "V16HF") |
43e9d192 | 702 | (V2SI "V8SI") (V2SF "V8SF") |
110d61da | 703 | (DI "V4DI") (DF "V4DF")]) |
43e9d192 IB |
704 | |
705 | (define_mode_attr VRL3 [(V8QI "V48QI") (V4HI "V24HI") | |
71a11456 | 706 | (V4HF "V24HF") |
43e9d192 | 707 | (V2SI "V12SI") (V2SF "V12SF") |
110d61da | 708 | (DI "V6DI") (DF "V6DF")]) |
43e9d192 IB |
709 | |
710 | (define_mode_attr VRL4 [(V8QI "V64QI") (V4HI "V32HI") | |
71a11456 | 711 | (V4HF "V32HF") |
43e9d192 | 712 | (V2SI "V16SI") (V2SF "V16SF") |
110d61da | 713 | (DI "V8DI") (DF "V8DF")]) |
43e9d192 | 714 | |
0462169c SN |
715 | ;; Mode for atomic operation suffixes |
716 | (define_mode_attr atomic_sfx | |
717 | [(QI "b") (HI "h") (SI "") (DI "")]) | |
718 | ||
3f598afe | 719 | (define_mode_attr fcvt_target [(V2DF "v2di") (V4SF "v4si") (V2SF "v2si") |
2644d4d9 | 720 | (V2DI "v2df") (V4SI "v4sf") (V2SI "v2sf") |
daef0a8c JW |
721 | (SF "si") (DF "di") (SI "sf") (DI "df") |
722 | (V4HF "v4hi") (V8HF "v8hi") (V4HI "v4hf") | |
68ad28c3 | 723 | (V8HI "v8hf") (HF "hi") (HI "hf")]) |
3f598afe | 724 | (define_mode_attr FCVT_TARGET [(V2DF "V2DI") (V4SF "V4SI") (V2SF "V2SI") |
2644d4d9 | 725 | (V2DI "V2DF") (V4SI "V4SF") (V2SI "V2SF") |
daef0a8c JW |
726 | (SF "SI") (DF "DI") (SI "SF") (DI "DF") |
727 | (V4HF "V4HI") (V8HF "V8HI") (V4HI "V4HF") | |
68ad28c3 | 728 | (V8HI "V8HF") (HF "HI") (HI "HF")]) |
3f598afe | 729 | |
0d35c5c2 VP |
730 | |
731 | ;; for the inequal width integer to fp conversions | |
d7f33f07 JW |
732 | (define_mode_attr fcvt_iesize [(HF "di") (SF "di") (DF "si")]) |
733 | (define_mode_attr FCVT_IESIZE [(HF "DI") (SF "DI") (DF "SI")]) | |
42fc9a7f | 734 | |
91bd4114 JG |
735 | (define_mode_attr VSWAP_WIDTH [(V8QI "V16QI") (V16QI "V8QI") |
736 | (V4HI "V8HI") (V8HI "V4HI") | |
737 | (V2SI "V4SI") (V4SI "V2SI") | |
738 | (DI "V2DI") (V2DI "DI") | |
739 | (V2SF "V4SF") (V4SF "V2SF") | |
862abc04 | 740 | (V4HF "V8HF") (V8HF "V4HF") |
91bd4114 JG |
741 | (DF "V2DF") (V2DF "DF")]) |
742 | ||
743 | (define_mode_attr vswap_width_name [(V8QI "to_128") (V16QI "to_64") | |
744 | (V4HI "to_128") (V8HI "to_64") | |
745 | (V2SI "to_128") (V4SI "to_64") | |
746 | (DI "to_128") (V2DI "to_64") | |
862abc04 | 747 | (V4HF "to_128") (V8HF "to_64") |
91bd4114 JG |
748 | (V2SF "to_128") (V4SF "to_64") |
749 | (DF "to_128") (V2DF "to_64")]) | |
750 | ||
779aea46 JG |
751 | ;; For certain vector-by-element multiplication instructions we must |
752 | ;; constrain the HI cases to use only V0-V15. This is covered by | |
753 | ;; the 'x' constraint. All other modes may use the 'w' constraint. | |
754 | (define_mode_attr h_con [(V2SI "w") (V4SI "w") | |
755 | (V4HI "x") (V8HI "x") | |
daef0a8c | 756 | (V4HF "w") (V8HF "w") |
779aea46 JG |
757 | (V2SF "w") (V4SF "w") |
758 | (V2DF "w") (DF "w")]) | |
759 | ||
760 | ;; Defined to 'f' for types whose element type is a float type. | |
761 | (define_mode_attr f [(V8QI "") (V16QI "") | |
762 | (V4HI "") (V8HI "") | |
763 | (V2SI "") (V4SI "") | |
764 | (DI "") (V2DI "") | |
ab2e8f01 | 765 | (V4HF "f") (V8HF "f") |
779aea46 JG |
766 | (V2SF "f") (V4SF "f") |
767 | (V2DF "f") (DF "f")]) | |
768 | ||
0f686aa9 JG |
769 | ;; Defined to '_fp' for types whose element type is a float type. |
770 | (define_mode_attr fp [(V8QI "") (V16QI "") | |
771 | (V4HI "") (V8HI "") | |
772 | (V2SI "") (V4SI "") | |
773 | (DI "") (V2DI "") | |
ab2e8f01 | 774 | (V4HF "_fp") (V8HF "_fp") |
0f686aa9 JG |
775 | (V2SF "_fp") (V4SF "_fp") |
776 | (V2DF "_fp") (DF "_fp") | |
777 | (SF "_fp")]) | |
778 | ||
a9e66678 JG |
779 | ;; Defined to '_q' for 128-bit types. |
780 | (define_mode_attr q [(V8QI "") (V16QI "_q") | |
0f686aa9 JG |
781 | (V4HI "") (V8HI "_q") |
782 | (V2SI "") (V4SI "_q") | |
783 | (DI "") (V2DI "_q") | |
71a11456 | 784 | (V4HF "") (V8HF "_q") |
0f686aa9 JG |
785 | (V2SF "") (V4SF "_q") |
786 | (V2DF "_q") | |
d7f33f07 | 787 | (QI "") (HI "") (SI "") (DI "") (HF "") (SF "") (DF "")]) |
a9e66678 | 788 | |
92835317 TB |
789 | (define_mode_attr vp [(V8QI "v") (V16QI "v") |
790 | (V4HI "v") (V8HI "v") | |
791 | (V2SI "p") (V4SI "v") | |
703bbcdf JW |
792 | (V2DI "p") (V2DF "p") |
793 | (V2SF "p") (V4SF "v") | |
794 | (V4HF "v") (V8HF "v")]) | |
92835317 | 795 | |
5e32e83b JW |
796 | (define_mode_attr vsi2qi [(V2SI "v8qi") (V4SI "v16qi")]) |
797 | (define_mode_attr VSI2QI [(V2SI "V8QI") (V4SI "V16QI")]) | |
798 | ||
cd78b3dd | 799 | ;; Sum of lengths of instructions needed to move vector registers of a mode. |
668046d1 DS |
800 | (define_mode_attr insn_count [(OI "8") (CI "12") (XI "16")]) |
801 | ||
1b1e81f8 JW |
802 | ;; -fpic small model GOT reloc modifers: gotpage_lo15/lo14 for ILP64/32. |
803 | ;; No need of iterator for -fPIC as it use got_lo12 for both modes. | |
804 | (define_mode_attr got_modifier [(SI "gotpage_lo14") (DI "gotpage_lo15")]) | |
805 | ||
43e9d192 IB |
806 | ;; ------------------------------------------------------------------- |
807 | ;; Code Iterators | |
808 | ;; ------------------------------------------------------------------- | |
809 | ||
810 | ;; This code iterator allows the various shifts supported on the core | |
811 | (define_code_iterator SHIFT [ashift ashiftrt lshiftrt rotatert]) | |
812 | ||
813 | ;; This code iterator allows the shifts supported in arithmetic instructions | |
814 | (define_code_iterator ASHIFT [ashift ashiftrt lshiftrt]) | |
815 | ||
816 | ;; Code iterator for logical operations | |
817 | (define_code_iterator LOGICAL [and ior xor]) | |
818 | ||
84be6032 AL |
819 | ;; Code iterator for logical operations whose :nlogical works on SIMD registers. |
820 | (define_code_iterator NLOGICAL [and ior]) | |
821 | ||
3204ac98 KT |
822 | ;; Code iterator for unary negate and bitwise complement. |
823 | (define_code_iterator NEG_NOT [neg not]) | |
824 | ||
43e9d192 IB |
825 | ;; Code iterator for sign/zero extension |
826 | (define_code_iterator ANY_EXTEND [sign_extend zero_extend]) | |
827 | ||
828 | ;; All division operations (signed/unsigned) | |
829 | (define_code_iterator ANY_DIV [div udiv]) | |
830 | ||
831 | ;; Code iterator for sign/zero extraction | |
832 | (define_code_iterator ANY_EXTRACT [sign_extract zero_extract]) | |
833 | ||
834 | ;; Code iterator for equality comparisons | |
835 | (define_code_iterator EQL [eq ne]) | |
836 | ||
837 | ;; Code iterator for less-than and greater/equal-to | |
838 | (define_code_iterator LTGE [lt ge]) | |
839 | ||
840 | ;; Iterator for __sync_<op> operations that where the operation can be | |
841 | ;; represented directly RTL. This is all of the sync operations bar | |
842 | ;; nand. | |
0462169c | 843 | (define_code_iterator atomic_op [plus minus ior xor and]) |
43e9d192 IB |
844 | |
845 | ;; Iterator for integer conversions | |
846 | (define_code_iterator FIXUORS [fix unsigned_fix]) | |
847 | ||
1709ff9b JG |
848 | ;; Iterator for float conversions |
849 | (define_code_iterator FLOATUORS [float unsigned_float]) | |
850 | ||
43e9d192 IB |
851 | ;; Code iterator for variants of vector max and min. |
852 | (define_code_iterator MAXMIN [smax smin umax umin]) | |
853 | ||
998eaf97 JG |
854 | (define_code_iterator FMAXMIN [smax smin]) |
855 | ||
43e9d192 IB |
856 | ;; Code iterator for variants of vector max and min. |
857 | (define_code_iterator ADDSUB [plus minus]) | |
858 | ||
859 | ;; Code iterator for variants of vector saturating binary ops. | |
860 | (define_code_iterator BINQOPS [ss_plus us_plus ss_minus us_minus]) | |
861 | ||
862 | ;; Code iterator for variants of vector saturating unary ops. | |
863 | (define_code_iterator UNQOPS [ss_neg ss_abs]) | |
864 | ||
865 | ;; Code iterator for signed variants of vector saturating binary ops. | |
866 | (define_code_iterator SBINQOPS [ss_plus ss_minus]) | |
867 | ||
889b9412 JG |
868 | ;; Comparison operators for <F>CM. |
869 | (define_code_iterator COMPARISONS [lt le eq ge gt]) | |
870 | ||
871 | ;; Unsigned comparison operators. | |
872 | (define_code_iterator UCOMPARISONS [ltu leu geu gtu]) | |
873 | ||
75dd5ace JG |
874 | ;; Unsigned comparison operators. |
875 | (define_code_iterator FAC_COMPARISONS [lt le ge gt]) | |
876 | ||
43e9d192 IB |
877 | ;; ------------------------------------------------------------------- |
878 | ;; Code Attributes | |
879 | ;; ------------------------------------------------------------------- | |
880 | ;; Map rtl objects to optab names | |
881 | (define_code_attr optab [(ashift "ashl") | |
882 | (ashiftrt "ashr") | |
883 | (lshiftrt "lshr") | |
884 | (rotatert "rotr") | |
885 | (sign_extend "extend") | |
886 | (zero_extend "zero_extend") | |
887 | (sign_extract "extv") | |
888 | (zero_extract "extzv") | |
384be29f JG |
889 | (fix "fix") |
890 | (unsigned_fix "fixuns") | |
1709ff9b JG |
891 | (float "float") |
892 | (unsigned_float "floatuns") | |
43e9d192 IB |
893 | (and "and") |
894 | (ior "ior") | |
895 | (xor "xor") | |
896 | (not "one_cmpl") | |
897 | (neg "neg") | |
898 | (plus "add") | |
899 | (minus "sub") | |
900 | (ss_plus "qadd") | |
901 | (us_plus "qadd") | |
902 | (ss_minus "qsub") | |
903 | (us_minus "qsub") | |
904 | (ss_neg "qneg") | |
905 | (ss_abs "qabs") | |
906 | (eq "eq") | |
907 | (ne "ne") | |
908 | (lt "lt") | |
889b9412 JG |
909 | (ge "ge") |
910 | (le "le") | |
911 | (gt "gt") | |
912 | (ltu "ltu") | |
913 | (leu "leu") | |
914 | (geu "geu") | |
915 | (gtu "gtu")]) | |
916 | ||
917 | ;; For comparison operators we use the FCM* and CM* instructions. | |
918 | ;; As there are no CMLE or CMLT instructions which act on 3 vector | |
919 | ;; operands, we must use CMGE or CMGT and swap the order of the | |
920 | ;; source operands. | |
921 | ||
922 | (define_code_attr n_optab [(lt "gt") (le "ge") (eq "eq") (ge "ge") (gt "gt") | |
923 | (ltu "hi") (leu "hs") (geu "hs") (gtu "hi")]) | |
924 | (define_code_attr cmp_1 [(lt "2") (le "2") (eq "1") (ge "1") (gt "1") | |
925 | (ltu "2") (leu "2") (geu "1") (gtu "1")]) | |
926 | (define_code_attr cmp_2 [(lt "1") (le "1") (eq "2") (ge "2") (gt "2") | |
927 | (ltu "1") (leu "1") (geu "2") (gtu "2")]) | |
928 | ||
929 | (define_code_attr CMP [(lt "LT") (le "LE") (eq "EQ") (ge "GE") (gt "GT") | |
714e1b3b KT |
930 | (ltu "LTU") (leu "LEU") (ne "NE") (geu "GEU") |
931 | (gtu "GTU")]) | |
43e9d192 | 932 | |
384be29f JG |
933 | (define_code_attr fix_trunc_optab [(fix "fix_trunc") |
934 | (unsigned_fix "fixuns_trunc")]) | |
935 | ||
43e9d192 IB |
936 | ;; Optab prefix for sign/zero-extending operations |
937 | (define_code_attr su_optab [(sign_extend "") (zero_extend "u") | |
938 | (div "") (udiv "u") | |
939 | (fix "") (unsigned_fix "u") | |
1709ff9b | 940 | (float "s") (unsigned_float "u") |
43e9d192 IB |
941 | (ss_plus "s") (us_plus "u") |
942 | (ss_minus "s") (us_minus "u")]) | |
943 | ||
944 | ;; Similar for the instruction mnemonics | |
945 | (define_code_attr shift [(ashift "lsl") (ashiftrt "asr") | |
946 | (lshiftrt "lsr") (rotatert "ror")]) | |
947 | ||
948 | ;; Map shift operators onto underlying bit-field instructions | |
949 | (define_code_attr bfshift [(ashift "ubfiz") (ashiftrt "sbfx") | |
950 | (lshiftrt "ubfx") (rotatert "extr")]) | |
951 | ||
952 | ;; Logical operator instruction mnemonics | |
953 | (define_code_attr logical [(and "and") (ior "orr") (xor "eor")]) | |
954 | ||
3204ac98 KT |
955 | ;; Operation names for negate and bitwise complement. |
956 | (define_code_attr neg_not_op [(neg "neg") (not "not")]) | |
957 | ||
43e9d192 IB |
958 | ;; Similar, but when not(op) |
959 | (define_code_attr nlogical [(and "bic") (ior "orn") (xor "eon")]) | |
960 | ||
43e9d192 IB |
961 | ;; Sign- or zero-extending data-op |
962 | (define_code_attr su [(sign_extend "s") (zero_extend "u") | |
963 | (sign_extract "s") (zero_extract "u") | |
964 | (fix "s") (unsigned_fix "u") | |
998eaf97 JG |
965 | (div "s") (udiv "u") |
966 | (smax "s") (umax "u") | |
967 | (smin "s") (umin "u")]) | |
43e9d192 | 968 | |
096e8448 JW |
969 | ;; Emit conditional branch instructions. |
970 | (define_code_attr bcond [(eq "beq") (ne "bne") (lt "bne") (ge "beq")]) | |
971 | ||
43e9d192 IB |
972 | ;; Emit cbz/cbnz depending on comparison type. |
973 | (define_code_attr cbz [(eq "cbz") (ne "cbnz") (lt "cbnz") (ge "cbz")]) | |
974 | ||
973d2e01 TP |
975 | ;; Emit inverted cbz/cbnz depending on comparison type. |
976 | (define_code_attr inv_cb [(eq "cbnz") (ne "cbz") (lt "cbz") (ge "cbnz")]) | |
977 | ||
43e9d192 IB |
978 | ;; Emit tbz/tbnz depending on comparison type. |
979 | (define_code_attr tbz [(eq "tbz") (ne "tbnz") (lt "tbnz") (ge "tbz")]) | |
980 | ||
973d2e01 TP |
981 | ;; Emit inverted tbz/tbnz depending on comparison type. |
982 | (define_code_attr inv_tb [(eq "tbnz") (ne "tbz") (lt "tbz") (ge "tbnz")]) | |
983 | ||
43e9d192 | 984 | ;; Max/min attributes. |
998eaf97 JG |
985 | (define_code_attr maxmin [(smax "max") |
986 | (smin "min") | |
987 | (umax "max") | |
988 | (umin "min")]) | |
43e9d192 IB |
989 | |
990 | ;; MLA/MLS attributes. | |
991 | (define_code_attr as [(ss_plus "a") (ss_minus "s")]) | |
992 | ||
0462169c SN |
993 | ;; Atomic operations |
994 | (define_code_attr atomic_optab | |
995 | [(ior "or") (xor "xor") (and "and") (plus "add") (minus "sub")]) | |
996 | ||
997 | (define_code_attr atomic_op_operand | |
998 | [(ior "aarch64_logical_operand") | |
999 | (xor "aarch64_logical_operand") | |
1000 | (and "aarch64_logical_operand") | |
1001 | (plus "aarch64_plus_operand") | |
1002 | (minus "aarch64_plus_operand")]) | |
43e9d192 | 1003 | |
356c32e2 MW |
1004 | ;; Constants acceptable for atomic operations. |
1005 | ;; This definition must appear in this file before the iterators it refers to. | |
1006 | (define_code_attr const_atomic | |
1007 | [(plus "IJ") (minus "IJ") | |
1008 | (xor "<lconst_atomic>") (ior "<lconst_atomic>") | |
1009 | (and "<lconst_atomic>")]) | |
1010 | ||
1011 | ;; Attribute to describe constants acceptable in atomic logical operations | |
1012 | (define_mode_attr lconst_atomic [(QI "K") (HI "K") (SI "K") (DI "L")]) | |
1013 | ||
43e9d192 IB |
1014 | ;; ------------------------------------------------------------------- |
1015 | ;; Int Iterators. | |
1016 | ;; ------------------------------------------------------------------- | |
1017 | (define_int_iterator MAXMINV [UNSPEC_UMAXV UNSPEC_UMINV | |
1018 | UNSPEC_SMAXV UNSPEC_SMINV]) | |
1019 | ||
998eaf97 JG |
1020 | (define_int_iterator FMAXMINV [UNSPEC_FMAXV UNSPEC_FMINV |
1021 | UNSPEC_FMAXNMV UNSPEC_FMINNMV]) | |
43e9d192 IB |
1022 | |
1023 | (define_int_iterator HADDSUB [UNSPEC_SHADD UNSPEC_UHADD | |
1024 | UNSPEC_SRHADD UNSPEC_URHADD | |
1025 | UNSPEC_SHSUB UNSPEC_UHSUB | |
1026 | UNSPEC_SRHSUB UNSPEC_URHSUB]) | |
1027 | ||
1028 | ||
1029 | (define_int_iterator ADDSUBHN [UNSPEC_ADDHN UNSPEC_RADDHN | |
1030 | UNSPEC_SUBHN UNSPEC_RSUBHN]) | |
1031 | ||
1032 | (define_int_iterator ADDSUBHN2 [UNSPEC_ADDHN2 UNSPEC_RADDHN2 | |
1033 | UNSPEC_SUBHN2 UNSPEC_RSUBHN2]) | |
1034 | ||
1efafef3 TC |
1035 | (define_int_iterator FMAXMIN_UNS [UNSPEC_FMAX UNSPEC_FMIN |
1036 | UNSPEC_FMAXNM UNSPEC_FMINNM]) | |
202d0c11 | 1037 | |
db58fd89 JW |
1038 | (define_int_iterator PAUTH_LR_SP [UNSPEC_PACISP UNSPEC_AUTISP]) |
1039 | ||
1040 | (define_int_iterator PAUTH_17_16 [UNSPEC_PACI1716 UNSPEC_AUTI1716]) | |
1041 | ||
43e9d192 IB |
1042 | (define_int_iterator VQDMULH [UNSPEC_SQDMULH UNSPEC_SQRDMULH]) |
1043 | ||
1044 | (define_int_iterator USSUQADD [UNSPEC_SUQADD UNSPEC_USQADD]) | |
1045 | ||
1046 | (define_int_iterator SUQMOVN [UNSPEC_SQXTN UNSPEC_UQXTN]) | |
1047 | ||
1048 | (define_int_iterator VSHL [UNSPEC_SSHL UNSPEC_USHL | |
1049 | UNSPEC_SRSHL UNSPEC_URSHL]) | |
1050 | ||
1051 | (define_int_iterator VSHLL [UNSPEC_SSHLL UNSPEC_USHLL]) | |
1052 | ||
1053 | (define_int_iterator VQSHL [UNSPEC_SQSHL UNSPEC_UQSHL | |
1054 | UNSPEC_SQRSHL UNSPEC_UQRSHL]) | |
1055 | ||
1056 | (define_int_iterator VSRA [UNSPEC_SSRA UNSPEC_USRA | |
1057 | UNSPEC_SRSRA UNSPEC_URSRA]) | |
1058 | ||
1059 | (define_int_iterator VSLRI [UNSPEC_SSLI UNSPEC_USLI | |
1060 | UNSPEC_SSRI UNSPEC_USRI]) | |
1061 | ||
1062 | ||
1063 | (define_int_iterator VRSHR_N [UNSPEC_SRSHR UNSPEC_URSHR]) | |
1064 | ||
1065 | (define_int_iterator VQSHL_N [UNSPEC_SQSHLU UNSPEC_SQSHL UNSPEC_UQSHL]) | |
1066 | ||
1067 | (define_int_iterator VQSHRN_N [UNSPEC_SQSHRUN UNSPEC_SQRSHRUN | |
1068 | UNSPEC_SQSHRN UNSPEC_UQSHRN | |
1069 | UNSPEC_SQRSHRN UNSPEC_UQRSHRN]) | |
1070 | ||
57b26d65 MW |
1071 | (define_int_iterator SQRDMLH_AS [UNSPEC_SQRDMLAH UNSPEC_SQRDMLSH]) |
1072 | ||
cc4d934f JG |
1073 | (define_int_iterator PERMUTE [UNSPEC_ZIP1 UNSPEC_ZIP2 |
1074 | UNSPEC_TRN1 UNSPEC_TRN2 | |
1075 | UNSPEC_UZP1 UNSPEC_UZP2]) | |
43e9d192 | 1076 | |
923fcec3 AL |
1077 | (define_int_iterator REVERSE [UNSPEC_REV64 UNSPEC_REV32 UNSPEC_REV16]) |
1078 | ||
42fc9a7f | 1079 | (define_int_iterator FRINT [UNSPEC_FRINTZ UNSPEC_FRINTP UNSPEC_FRINTM |
0659ce6f JG |
1080 | UNSPEC_FRINTN UNSPEC_FRINTI UNSPEC_FRINTX |
1081 | UNSPEC_FRINTA]) | |
42fc9a7f JG |
1082 | |
1083 | (define_int_iterator FCVT [UNSPEC_FRINTZ UNSPEC_FRINTP UNSPEC_FRINTM | |
ce966824 | 1084 | UNSPEC_FRINTA UNSPEC_FRINTN]) |
42fc9a7f | 1085 | |
3f598afe JW |
1086 | (define_int_iterator FCVT_F2FIXED [UNSPEC_FCVTZS UNSPEC_FCVTZU]) |
1087 | (define_int_iterator FCVT_FIXED2F [UNSPEC_SCVTF UNSPEC_UCVTF]) | |
1088 | ||
0050faf8 JG |
1089 | (define_int_iterator FRECP [UNSPEC_FRECPE UNSPEC_FRECPX]) |
1090 | ||
5d357f26 KT |
1091 | (define_int_iterator CRC [UNSPEC_CRC32B UNSPEC_CRC32H UNSPEC_CRC32W |
1092 | UNSPEC_CRC32X UNSPEC_CRC32CB UNSPEC_CRC32CH | |
1093 | UNSPEC_CRC32CW UNSPEC_CRC32CX]) | |
1094 | ||
5a7a4e80 TB |
1095 | (define_int_iterator CRYPTO_AES [UNSPEC_AESE UNSPEC_AESD]) |
1096 | (define_int_iterator CRYPTO_AESMC [UNSPEC_AESMC UNSPEC_AESIMC]) | |
1097 | ||
30442682 TB |
1098 | (define_int_iterator CRYPTO_SHA1 [UNSPEC_SHA1C UNSPEC_SHA1M UNSPEC_SHA1P]) |
1099 | ||
b9cb0a44 TB |
1100 | (define_int_iterator CRYPTO_SHA256 [UNSPEC_SHA256H UNSPEC_SHA256H2]) |
1101 | ||
d81cb613 MW |
1102 | ;; Iterators for atomic operations. |
1103 | ||
1104 | (define_int_iterator ATOMIC_LDOP | |
1105 | [UNSPECV_ATOMIC_LDOP_OR UNSPECV_ATOMIC_LDOP_BIC | |
1106 | UNSPECV_ATOMIC_LDOP_XOR UNSPECV_ATOMIC_LDOP_PLUS]) | |
1107 | ||
1108 | (define_int_attr atomic_ldop | |
1109 | [(UNSPECV_ATOMIC_LDOP_OR "set") (UNSPECV_ATOMIC_LDOP_BIC "clr") | |
1110 | (UNSPECV_ATOMIC_LDOP_XOR "eor") (UNSPECV_ATOMIC_LDOP_PLUS "add")]) | |
1111 | ||
43e9d192 IB |
1112 | ;; ------------------------------------------------------------------- |
1113 | ;; Int Iterators Attributes. | |
1114 | ;; ------------------------------------------------------------------- | |
998eaf97 JG |
1115 | (define_int_attr maxmin_uns [(UNSPEC_UMAXV "umax") |
1116 | (UNSPEC_UMINV "umin") | |
1117 | (UNSPEC_SMAXV "smax") | |
1118 | (UNSPEC_SMINV "smin") | |
1119 | (UNSPEC_FMAX "smax_nan") | |
1120 | (UNSPEC_FMAXNMV "smax") | |
1121 | (UNSPEC_FMAXV "smax_nan") | |
1122 | (UNSPEC_FMIN "smin_nan") | |
1123 | (UNSPEC_FMINNMV "smin") | |
1efafef3 TC |
1124 | (UNSPEC_FMINV "smin_nan") |
1125 | (UNSPEC_FMAXNM "fmax") | |
1126 | (UNSPEC_FMINNM "fmin")]) | |
998eaf97 JG |
1127 | |
1128 | (define_int_attr maxmin_uns_op [(UNSPEC_UMAXV "umax") | |
1129 | (UNSPEC_UMINV "umin") | |
1130 | (UNSPEC_SMAXV "smax") | |
1131 | (UNSPEC_SMINV "smin") | |
1132 | (UNSPEC_FMAX "fmax") | |
1133 | (UNSPEC_FMAXNMV "fmaxnm") | |
1134 | (UNSPEC_FMAXV "fmax") | |
1135 | (UNSPEC_FMIN "fmin") | |
1136 | (UNSPEC_FMINNMV "fminnm") | |
1efafef3 TC |
1137 | (UNSPEC_FMINV "fmin") |
1138 | (UNSPEC_FMAXNM "fmaxnm") | |
1139 | (UNSPEC_FMINNM "fminnm")]) | |
202d0c11 | 1140 | |
43e9d192 IB |
1141 | (define_int_attr sur [(UNSPEC_SHADD "s") (UNSPEC_UHADD "u") |
1142 | (UNSPEC_SRHADD "sr") (UNSPEC_URHADD "ur") | |
1143 | (UNSPEC_SHSUB "s") (UNSPEC_UHSUB "u") | |
1144 | (UNSPEC_SRHSUB "sr") (UNSPEC_URHSUB "ur") | |
1145 | (UNSPEC_ADDHN "") (UNSPEC_RADDHN "r") | |
1146 | (UNSPEC_SUBHN "") (UNSPEC_RSUBHN "r") | |
1147 | (UNSPEC_ADDHN2 "") (UNSPEC_RADDHN2 "r") | |
1148 | (UNSPEC_SUBHN2 "") (UNSPEC_RSUBHN2 "r") | |
1149 | (UNSPEC_SQXTN "s") (UNSPEC_UQXTN "u") | |
1150 | (UNSPEC_USQADD "us") (UNSPEC_SUQADD "su") | |
1151 | (UNSPEC_SSLI "s") (UNSPEC_USLI "u") | |
1152 | (UNSPEC_SSRI "s") (UNSPEC_USRI "u") | |
1153 | (UNSPEC_USRA "u") (UNSPEC_SSRA "s") | |
1154 | (UNSPEC_URSRA "ur") (UNSPEC_SRSRA "sr") | |
1155 | (UNSPEC_URSHR "ur") (UNSPEC_SRSHR "sr") | |
1156 | (UNSPEC_SQSHLU "s") (UNSPEC_SQSHL "s") | |
1157 | (UNSPEC_UQSHL "u") | |
1158 | (UNSPEC_SQSHRUN "s") (UNSPEC_SQRSHRUN "s") | |
1159 | (UNSPEC_SQSHRN "s") (UNSPEC_UQSHRN "u") | |
1160 | (UNSPEC_SQRSHRN "s") (UNSPEC_UQRSHRN "u") | |
1161 | (UNSPEC_USHL "u") (UNSPEC_SSHL "s") | |
1162 | (UNSPEC_USHLL "u") (UNSPEC_SSHLL "s") | |
1163 | (UNSPEC_URSHL "ur") (UNSPEC_SRSHL "sr") | |
1164 | (UNSPEC_UQRSHL "u") (UNSPEC_SQRSHL "s") | |
1165 | ]) | |
1166 | ||
1167 | (define_int_attr r [(UNSPEC_SQDMULH "") (UNSPEC_SQRDMULH "r") | |
1168 | (UNSPEC_SQSHRUN "") (UNSPEC_SQRSHRUN "r") | |
1169 | (UNSPEC_SQSHRN "") (UNSPEC_UQSHRN "") | |
1170 | (UNSPEC_SQRSHRN "r") (UNSPEC_UQRSHRN "r") | |
1171 | (UNSPEC_SQSHL "") (UNSPEC_UQSHL "") | |
1172 | (UNSPEC_SQRSHL "r")(UNSPEC_UQRSHL "r") | |
1173 | ]) | |
1174 | ||
1175 | (define_int_attr lr [(UNSPEC_SSLI "l") (UNSPEC_USLI "l") | |
1176 | (UNSPEC_SSRI "r") (UNSPEC_USRI "r")]) | |
1177 | ||
1178 | (define_int_attr u [(UNSPEC_SQSHLU "u") (UNSPEC_SQSHL "") (UNSPEC_UQSHL "") | |
1179 | (UNSPEC_SQSHRUN "u") (UNSPEC_SQRSHRUN "u") | |
1180 | (UNSPEC_SQSHRN "") (UNSPEC_UQSHRN "") | |
1181 | (UNSPEC_SQRSHRN "") (UNSPEC_UQRSHRN "")]) | |
1182 | ||
1183 | (define_int_attr addsub [(UNSPEC_SHADD "add") | |
1184 | (UNSPEC_UHADD "add") | |
1185 | (UNSPEC_SRHADD "add") | |
1186 | (UNSPEC_URHADD "add") | |
1187 | (UNSPEC_SHSUB "sub") | |
1188 | (UNSPEC_UHSUB "sub") | |
1189 | (UNSPEC_SRHSUB "sub") | |
1190 | (UNSPEC_URHSUB "sub") | |
1191 | (UNSPEC_ADDHN "add") | |
1192 | (UNSPEC_SUBHN "sub") | |
1193 | (UNSPEC_RADDHN "add") | |
1194 | (UNSPEC_RSUBHN "sub") | |
1195 | (UNSPEC_ADDHN2 "add") | |
1196 | (UNSPEC_SUBHN2 "sub") | |
1197 | (UNSPEC_RADDHN2 "add") | |
1198 | (UNSPEC_RSUBHN2 "sub")]) | |
1199 | ||
cb23a30c JG |
1200 | (define_int_attr offsetlr [(UNSPEC_SSLI "") (UNSPEC_USLI "") |
1201 | (UNSPEC_SSRI "offset_") | |
1202 | (UNSPEC_USRI "offset_")]) | |
43e9d192 | 1203 | |
42fc9a7f JG |
1204 | ;; Standard pattern names for floating-point rounding instructions. |
1205 | (define_int_attr frint_pattern [(UNSPEC_FRINTZ "btrunc") | |
1206 | (UNSPEC_FRINTP "ceil") | |
1207 | (UNSPEC_FRINTM "floor") | |
1208 | (UNSPEC_FRINTI "nearbyint") | |
1209 | (UNSPEC_FRINTX "rint") | |
0659ce6f JG |
1210 | (UNSPEC_FRINTA "round") |
1211 | (UNSPEC_FRINTN "frintn")]) | |
42fc9a7f JG |
1212 | |
1213 | ;; frint suffix for floating-point rounding instructions. | |
1214 | (define_int_attr frint_suffix [(UNSPEC_FRINTZ "z") (UNSPEC_FRINTP "p") | |
1215 | (UNSPEC_FRINTM "m") (UNSPEC_FRINTI "i") | |
0659ce6f JG |
1216 | (UNSPEC_FRINTX "x") (UNSPEC_FRINTA "a") |
1217 | (UNSPEC_FRINTN "n")]) | |
42fc9a7f JG |
1218 | |
1219 | (define_int_attr fcvt_pattern [(UNSPEC_FRINTZ "btrunc") (UNSPEC_FRINTA "round") | |
ce966824 JG |
1220 | (UNSPEC_FRINTP "ceil") (UNSPEC_FRINTM "floor") |
1221 | (UNSPEC_FRINTN "frintn")]) | |
42fc9a7f | 1222 | |
3f598afe JW |
1223 | (define_int_attr fcvt_fixed_insn [(UNSPEC_SCVTF "scvtf") |
1224 | (UNSPEC_UCVTF "ucvtf") | |
1225 | (UNSPEC_FCVTZS "fcvtzs") | |
1226 | (UNSPEC_FCVTZU "fcvtzu")]) | |
1227 | ||
db58fd89 JW |
1228 | ;; Pointer authentication mnemonic prefix. |
1229 | (define_int_attr pauth_mnem_prefix [(UNSPEC_PACISP "paci") | |
1230 | (UNSPEC_AUTISP "auti") | |
1231 | (UNSPEC_PACI1716 "paci") | |
1232 | (UNSPEC_AUTI1716 "auti")]) | |
1233 | ||
1234 | ;; Pointer authentication HINT number for NOP space instructions using A Key. | |
1235 | (define_int_attr pauth_hint_num_a [(UNSPEC_PACISP "25") | |
1236 | (UNSPEC_AUTISP "29") | |
1237 | (UNSPEC_PACI1716 "8") | |
1238 | (UNSPEC_AUTI1716 "12")]) | |
1239 | ||
cc4d934f JG |
1240 | (define_int_attr perm_insn [(UNSPEC_ZIP1 "zip") (UNSPEC_ZIP2 "zip") |
1241 | (UNSPEC_TRN1 "trn") (UNSPEC_TRN2 "trn") | |
1242 | (UNSPEC_UZP1 "uzp") (UNSPEC_UZP2 "uzp")]) | |
1243 | ||
923fcec3 AL |
1244 | ; op code for REV instructions (size within which elements are reversed). |
1245 | (define_int_attr rev_op [(UNSPEC_REV64 "64") (UNSPEC_REV32 "32") | |
1246 | (UNSPEC_REV16 "16")]) | |
1247 | ||
cc4d934f JG |
1248 | (define_int_attr perm_hilo [(UNSPEC_ZIP1 "1") (UNSPEC_ZIP2 "2") |
1249 | (UNSPEC_TRN1 "1") (UNSPEC_TRN2 "2") | |
1250 | (UNSPEC_UZP1 "1") (UNSPEC_UZP2 "2")]) | |
0050faf8 JG |
1251 | |
1252 | (define_int_attr frecp_suffix [(UNSPEC_FRECPE "e") (UNSPEC_FRECPX "x")]) | |
5a7a4e80 | 1253 | |
5d357f26 KT |
1254 | (define_int_attr crc_variant [(UNSPEC_CRC32B "crc32b") (UNSPEC_CRC32H "crc32h") |
1255 | (UNSPEC_CRC32W "crc32w") (UNSPEC_CRC32X "crc32x") | |
1256 | (UNSPEC_CRC32CB "crc32cb") (UNSPEC_CRC32CH "crc32ch") | |
1257 | (UNSPEC_CRC32CW "crc32cw") (UNSPEC_CRC32CX "crc32cx")]) | |
1258 | ||
1259 | (define_int_attr crc_mode [(UNSPEC_CRC32B "QI") (UNSPEC_CRC32H "HI") | |
1260 | (UNSPEC_CRC32W "SI") (UNSPEC_CRC32X "DI") | |
1261 | (UNSPEC_CRC32CB "QI") (UNSPEC_CRC32CH "HI") | |
1262 | (UNSPEC_CRC32CW "SI") (UNSPEC_CRC32CX "DI")]) | |
1263 | ||
5a7a4e80 TB |
1264 | (define_int_attr aes_op [(UNSPEC_AESE "e") (UNSPEC_AESD "d")]) |
1265 | (define_int_attr aesmc_op [(UNSPEC_AESMC "mc") (UNSPEC_AESIMC "imc")]) | |
30442682 TB |
1266 | |
1267 | (define_int_attr sha1_op [(UNSPEC_SHA1C "c") (UNSPEC_SHA1P "p") | |
1268 | (UNSPEC_SHA1M "m")]) | |
b9cb0a44 TB |
1269 | |
1270 | (define_int_attr sha256_op [(UNSPEC_SHA256H "") (UNSPEC_SHA256H2 "2")]) | |
57b26d65 MW |
1271 | |
1272 | (define_int_attr rdma_as [(UNSPEC_SQRDMLAH "a") (UNSPEC_SQRDMLSH "s")]) |