]>
Commit | Line | Data |
---|---|---|
43e9d192 | 1 | ;; Machine description for AArch64 architecture. |
a945c346 | 2 | ;; Copyright (C) 2009-2024 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 | ||
865257c4 RS |
25 | ;; Condition-code iterators. |
26 | (define_mode_iterator CC_ONLY [CC]) | |
27 | (define_mode_iterator CCFP_CCFPE [CCFP CCFPE]) | |
43e9d192 IB |
28 | |
29 | ;; Iterator for General Purpose Integer registers (32- and 64-bit modes) | |
30 | (define_mode_iterator GPI [SI DI]) | |
31 | ||
d7f33f07 | 32 | ;; Iterator for HI, SI, DI, some instructions can only work on these modes. |
8797a869 | 33 | (define_mode_iterator GPI_I16 [(HI "TARGET_FP_F16INST") SI DI]) |
d7f33f07 | 34 | |
4a2095eb RH |
35 | ;; "Iterator" for just TI -- features like @pattern only work with iterators. |
36 | (define_mode_iterator JUST_TI [TI]) | |
37 | ||
43e9d192 IB |
38 | ;; Iterator for QI and HI modes |
39 | (define_mode_iterator SHORT [QI HI]) | |
40 | ||
624d0f07 RS |
41 | ;; Iterators for single modes, for "@" patterns. |
42 | (define_mode_iterator SI_ONLY [SI]) | |
43 | (define_mode_iterator DI_ONLY [DI]) | |
44 | ||
43e9d192 IB |
45 | ;; Iterator for all integer modes (up to 64-bit) |
46 | (define_mode_iterator ALLI [QI HI SI DI]) | |
47 | ||
c0111dc4 RE |
48 | ;; Iterator for all integer modes (up to 128-bit) |
49 | (define_mode_iterator ALLI_TI [QI HI SI DI TI]) | |
50 | ||
43e9d192 IB |
51 | ;; Iterator for all integer modes that can be extended (up to 64-bit) |
52 | (define_mode_iterator ALLX [QI HI SI]) | |
53 | ||
54 | ;; Iterator for General Purpose Floating-point registers (32- and 64-bit modes) | |
55 | (define_mode_iterator GPF [SF DF]) | |
56 | ||
d7f33f07 | 57 | ;; Iterator for all scalar floating point modes (HF, SF, DF) |
8797a869 | 58 | (define_mode_iterator GPF_F16 [(HF "TARGET_FP_F16INST") SF DF]) |
d7f33f07 | 59 | |
90e6443f TC |
60 | ;; Iterator for all scalar floating point modes (HF, SF, DF) |
61 | (define_mode_iterator GPF_HF [HF SF DF]) | |
62 | ||
abbe1ed2 SMW |
63 | ;; Iterator for all 16-bit scalar floating point modes (HF, BF) |
64 | (define_mode_iterator HFBF [HF BF]) | |
65 | ||
abbe1ed2 | 66 | ;; Iterator for all scalar floating point modes suitable for moving, including |
0dc8e1e7 CL |
67 | ;; special BF type and decimal floating point types (HF, SF, DF, TF, BF, |
68 | ;; SD, DD and TD) | |
69 | (define_mode_iterator GPF_TF_F16_MOV [HF BF SF DF TF SD DD TD]) | |
70 | ||
71 | ;; Iterator for scalar 32bit fp modes (SF, SD) | |
72 | (define_mode_iterator SFD [SD SF]) | |
73 | ||
74 | ;; Iterator for scalar 64bit fp modes (DF, DD) | |
75 | (define_mode_iterator DFD [DD DF]) | |
76 | ||
77 | ;; Iterator for scalar 128bit fp modes (TF, TD) | |
78 | (define_mode_iterator TFD [TD TF]) | |
abbe1ed2 | 79 | |
922f9c25 AL |
80 | ;; Double vector modes. |
81 | (define_mode_iterator VDF [V2SF V4HF]) | |
82 | ||
0dc8e1e7 CL |
83 | ;; Iterator for all scalar floating point modes (SF, DF, TF, SD, DD, and TD) |
84 | (define_mode_iterator GPF_TF [SF DF TF SD DD TD]) | |
b4f50fd4 | 85 | |
43cacb12 | 86 | ;; Integer Advanced SIMD modes. |
43e9d192 IB |
87 | (define_mode_iterator VDQ_I [V8QI V16QI V4HI V8HI V2SI V4SI V2DI]) |
88 | ||
43cacb12 | 89 | ;; Advanced SIMD and scalar, 64 & 128-bit container, all integer modes. |
43e9d192 IB |
90 | (define_mode_iterator VSDQ_I [V8QI V16QI V4HI V8HI V2SI V4SI V2DI QI HI SI DI]) |
91 | ||
43cacb12 RS |
92 | ;; Advanced SIMD and scalar, 64 & 128-bit container: all Advanced SIMD |
93 | ;; integer modes; 64-bit scalar integer mode. | |
43e9d192 IB |
94 | (define_mode_iterator VSDQ_I_DI [V8QI V16QI V4HI V8HI V2SI V4SI V2DI DI]) |
95 | ||
96 | ;; Double vector modes. | |
e603cd43 | 97 | (define_mode_iterator VD [V8QI V4HI V4HF V2SI V2SF V4BF]) |
43e9d192 | 98 | |
abbe1ed2 SMW |
99 | ;; Double vector modes suitable for moving. Includes BFmode. |
100 | (define_mode_iterator VDMOV [V8QI V4HI V4HF V4BF V2SI V2SF]) | |
101 | ||
f824216c KT |
102 | ;; 64-bit modes for operations that implicitly clear the top bits of a Q reg. |
103 | (define_mode_iterator VDZ [V8QI V4HI V4HF V4BF V2SI V2SF DI DF]) | |
104 | ||
dfe1da23 JW |
105 | ;; All modes stored in registers d0-d31. |
106 | (define_mode_iterator DREG [V8QI V4HI V4HF V2SI V2SF DF]) | |
107 | ||
108 | ;; Copy of the above. | |
5dbaf485 | 109 | (define_mode_iterator DREG2 [DREG]) |
dfe1da23 | 110 | |
cd91a084 PW |
111 | ;; All modes suitable to store/load pair (2 elements) using STP/LDP. |
112 | (define_mode_iterator VP_2E [V2SI V2SF V2DI V2DF]) | |
113 | ||
43cacb12 | 114 | ;; Advanced SIMD, 64-bit container, all integer modes. |
43e9d192 IB |
115 | (define_mode_iterator VD_BHSI [V8QI V4HI V2SI]) |
116 | ||
117 | ;; 128 and 64-bit container; 8, 16, 32-bit vector integer modes | |
118 | (define_mode_iterator VDQ_BHSI [V8QI V16QI V4HI V8HI V2SI V4SI]) | |
119 | ||
120 | ;; Quad vector modes. | |
e603cd43 | 121 | (define_mode_iterator VQ [V16QI V8HI V4SI V2DI V8HF V4SF V2DF V8BF]) |
43e9d192 | 122 | |
9f5361c8 | 123 | ;; Copy of the above. |
5dbaf485 | 124 | (define_mode_iterator VQ2 [VQ]) |
9f5361c8 | 125 | |
abbe1ed2 SMW |
126 | ;; Quad vector modes suitable for moving. Includes BFmode. |
127 | (define_mode_iterator VQMOV [V16QI V8HI V4SI V2DI V8HF V8BF V4SF V2DF]) | |
128 | ||
129 | ;; VQMOV without 2-element modes. | |
130 | (define_mode_iterator VQMOV_NO2E [V16QI V8HI V4SI V8HF V8BF V4SF]) | |
131 | ||
e1b218d1 JW |
132 | ;; Double integer vector modes. |
133 | (define_mode_iterator VD_I [V8QI V4HI V2SI DI]) | |
134 | ||
d21052eb TC |
135 | ;; Quad integer vector modes. |
136 | (define_mode_iterator VQ_I [V16QI V8HI V4SI V2DI]) | |
137 | ||
51437269 | 138 | ;; VQ without 2 element modes. |
e603cd43 | 139 | (define_mode_iterator VQ_NO2E [V16QI V8HI V4SI V8HF V4SF V8BF]) |
51437269 | 140 | |
5ba864c5 AC |
141 | ;; 2 element quad vector modes. |
142 | (define_mode_iterator VQ_2E [V2DI V2DF]) | |
143 | ||
f275d73a SMW |
144 | ;; BFmode vector modes. |
145 | (define_mode_iterator VBF [V4BF V8BF]) | |
146 | ||
28514dda YZ |
147 | ;; This mode iterator allows :P to be used for patterns that operate on |
148 | ;; addresses in different modes. In LP64, only DI will match, while in | |
149 | ;; ILP32, either can match. | |
150 | (define_mode_iterator P [(SI "ptr_mode == SImode || Pmode == SImode") | |
151 | (DI "ptr_mode == DImode || Pmode == DImode")]) | |
152 | ||
43e9d192 IB |
153 | ;; This mode iterator allows :PTR to be used for patterns that operate on |
154 | ;; pointer-sized quantities. Exactly one of the two alternatives will match. | |
28514dda | 155 | (define_mode_iterator PTR [(SI "ptr_mode == SImode") (DI "ptr_mode == DImode")]) |
43e9d192 | 156 | |
43cacb12 | 157 | ;; Advanced SIMD Float modes suitable for moving, loading and storing. |
8ea6c1b8 MI |
158 | (define_mode_iterator VDQF_F16 [V4HF V8HF V2SF V4SF V2DF |
159 | V4BF V8BF]) | |
862abc04 | 160 | |
43cacb12 | 161 | ;; Advanced SIMD Float modes. |
43e9d192 | 162 | (define_mode_iterator VDQF [V2SF V4SF V2DF]) |
daef0a8c JW |
163 | (define_mode_iterator VHSDF [(V4HF "TARGET_SIMD_F16INST") |
164 | (V8HF "TARGET_SIMD_F16INST") | |
165 | V2SF V4SF V2DF]) | |
43e9d192 | 166 | |
43cacb12 | 167 | ;; Advanced SIMD Float modes, and DF. |
b0d9aac8 | 168 | (define_mode_iterator VDQF_DF [V2SF V4SF V2DF DF]) |
daef0a8c JW |
169 | (define_mode_iterator VHSDF_DF [(V4HF "TARGET_SIMD_F16INST") |
170 | (V8HF "TARGET_SIMD_F16INST") | |
171 | V2SF V4SF V2DF DF]) | |
d7f33f07 JW |
172 | (define_mode_iterator VHSDF_HSDF [(V4HF "TARGET_SIMD_F16INST") |
173 | (V8HF "TARGET_SIMD_F16INST") | |
174 | V2SF V4SF V2DF | |
175 | (HF "TARGET_SIMD_F16INST") | |
176 | SF DF]) | |
f421c516 | 177 | |
10bd1d96 KT |
178 | ;; Scalar and vetor modes for SF, DF. |
179 | (define_mode_iterator VSFDF [V2SF V4SF V2DF DF SF]) | |
180 | ||
43cacb12 | 181 | ;; Advanced SIMD single Float modes. |
828e70c1 JG |
182 | (define_mode_iterator VDQSF [V2SF V4SF]) |
183 | ||
03873eb9 AL |
184 | ;; Quad vector Float modes with half/single elements. |
185 | (define_mode_iterator VQ_HSF [V8HF V4SF]) | |
186 | ||
fc21784d JG |
187 | ;; Modes suitable to use as the return type of a vcond expression. |
188 | (define_mode_iterator VDQF_COND [V2SF V2SI V4SF V4SI V2DF V2DI]) | |
189 | ||
43cacb12 | 190 | ;; All scalar and Advanced SIMD Float modes. |
889b9412 JG |
191 | (define_mode_iterator VALLF [V2SF V4SF V2DF SF DF]) |
192 | ||
43cacb12 | 193 | ;; Advanced SIMD Float modes with 2 elements. |
a40c22c3 | 194 | (define_mode_iterator V2F [V2SF V2DF]) |
43e9d192 | 195 | |
43cacb12 | 196 | ;; All Advanced SIMD modes on which we support any arithmetic operations. |
43e9d192 IB |
197 | (define_mode_iterator VALL [V8QI V16QI V4HI V8HI V2SI V4SI V2DI V2SF V4SF V2DF]) |
198 | ||
a40c22c3 | 199 | ;; All Advanced SIMD modes suitable for moving, loading, and storing. |
71a11456 | 200 | (define_mode_iterator VALL_F16 [V8QI V16QI V4HI V8HI V2SI V4SI V2DI |
8ea6c1b8 | 201 | V4HF V8HF V4BF V8BF V2SF V4SF V2DF]) |
71a11456 | 202 | |
88119b46 KT |
203 | ;; The VALL_F16 modes except the 128-bit 2-element ones. |
204 | (define_mode_iterator VALL_F16_NO_V2Q [V8QI V16QI V4HI V8HI V2SI V4SI | |
205 | V4HF V8HF V2SF V4SF]) | |
206 | ||
43cacb12 | 207 | ;; All Advanced SIMD modes barring HF modes, plus DI. |
a50344cb TB |
208 | (define_mode_iterator VALLDI [V8QI V16QI V4HI V8HI V2SI V4SI V2DI V2SF V4SF V2DF DI]) |
209 | ||
43cacb12 | 210 | ;; All Advanced SIMD modes and DI. |
71a11456 | 211 | (define_mode_iterator VALLDI_F16 [V8QI V16QI V4HI V8HI V2SI V4SI V2DI |
8ea6c1b8 | 212 | V4HF V8HF V4BF V8BF V2SF V4SF V2DF DI]) |
71a11456 | 213 | |
43cacb12 | 214 | ;; All Advanced SIMD modes, plus DI and DF. |
e603cd43 | 215 | (define_mode_iterator VALLDIF [V8QI V16QI V4HI V8HI V2SI V4SI V4BF V8BF |
7c369485 | 216 | V2DI V4HF V8HF V2SF V4SF V2DF DI DF]) |
46e778c4 | 217 | |
6372b05e JW |
218 | ;; All Advanced SIMD polynomial modes and DI. |
219 | (define_mode_iterator VALLP [V8QI V16QI V4HI V8HI V2DI DI]) | |
220 | ||
1716ddd1 JW |
221 | ;; All Advanced SIMD polynomial modes. |
222 | (define_mode_iterator VALLP_NO_DI [V8QI V16QI V4HI V8HI V2DI]) | |
223 | ||
43cacb12 | 224 | ;; Advanced SIMD modes for Integer reduction across lanes. |
92835317 TB |
225 | (define_mode_iterator VDQV [V8QI V16QI V4HI V8HI V4SI V2DI]) |
226 | ||
43cacb12 | 227 | ;; Advanced SIMD modes (except V2DI) for Integer reduction across lanes. |
92835317 | 228 | (define_mode_iterator VDQV_S [V8QI V16QI V4HI V8HI V4SI]) |
43e9d192 | 229 | |
9921bbf9 WD |
230 | ;; Advanced SIMD modes for Integer reduction across lanes (zero/sign extended). |
231 | (define_mode_iterator VDQV_E [V8QI V16QI V4HI V8HI]) | |
232 | ||
cb995de6 KT |
233 | ;; Advanced SIMD modes for Integer widening reduction across lanes. |
234 | (define_mode_iterator VDQV_L [V8QI V16QI V4HI V8HI V4SI V2SI]) | |
235 | ||
43e9d192 IB |
236 | ;; All double integer narrow-able modes. |
237 | (define_mode_iterator VDN [V4HI V2SI DI]) | |
238 | ||
239 | ;; All quad integer narrow-able modes. | |
240 | (define_mode_iterator VQN [V8HI V4SI V2DI]) | |
241 | ||
43cacb12 RS |
242 | ;; Advanced SIMD and scalar 128-bit container: narrowable 16, 32, 64-bit |
243 | ;; integer modes | |
43e9d192 IB |
244 | (define_mode_iterator VSQN_HSDI [V8HI V4SI V2DI HI SI DI]) |
245 | ||
246 | ;; All quad integer widen-able modes. | |
247 | (define_mode_iterator VQW [V16QI V8HI V4SI]) | |
248 | ||
249 | ;; Double vector modes for combines. | |
e603cd43 | 250 | (define_mode_iterator VDC [V8QI V4HI V4BF V4HF V2SI V2SF DI DF]) |
43e9d192 | 251 | |
83d7e720 RS |
252 | ;; VDC plus SI and SF. |
253 | (define_mode_iterator VDCSIF [V8QI V4HI V4BF V4HF V2SI V2SF SI SF DI DF]) | |
254 | ||
e1b218d1 JW |
255 | ;; Polynomial modes for vector combines. |
256 | (define_mode_iterator VDC_P [V8QI V4HI DI]) | |
257 | ||
43cacb12 | 258 | ;; Advanced SIMD modes except double int. |
43e9d192 | 259 | (define_mode_iterator VDQIF [V8QI V16QI V4HI V8HI V2SI V4SI V2SF V4SF V2DF]) |
703bbcdf JW |
260 | (define_mode_iterator VDQIF_F16 [V8QI V16QI V4HI V8HI V2SI V4SI |
261 | V4HF V8HF V2SF V4SF V2DF]) | |
43e9d192 | 262 | |
43cacb12 | 263 | ;; Advanced SIMD modes for S type. |
58a3bd25 FY |
264 | (define_mode_iterator VDQ_SI [V2SI V4SI]) |
265 | ||
43cacb12 | 266 | ;; Advanced SIMD modes for S and D. |
2644d4d9 JW |
267 | (define_mode_iterator VDQ_SDI [V2SI V4SI V2DI]) |
268 | ||
43cacb12 | 269 | ;; Advanced SIMD modes for H, S and D. |
33d72b63 JW |
270 | (define_mode_iterator VDQ_HSDI [(V4HI "TARGET_SIMD_F16INST") |
271 | (V8HI "TARGET_SIMD_F16INST") | |
272 | V2SI V4SI V2DI]) | |
273 | ||
43cacb12 | 274 | ;; Scalar and Advanced SIMD modes for S and D. |
2644d4d9 JW |
275 | (define_mode_iterator VSDQ_SDI [V2SI V4SI V2DI SI DI]) |
276 | ||
43cacb12 | 277 | ;; Scalar and Advanced SIMD modes for S and D, Advanced SIMD modes for H. |
33d72b63 JW |
278 | (define_mode_iterator VSDQ_HSDI [(V4HI "TARGET_SIMD_F16INST") |
279 | (V8HI "TARGET_SIMD_F16INST") | |
68ad28c3 JW |
280 | V2SI V4SI V2DI |
281 | (HI "TARGET_SIMD_F16INST") | |
282 | SI DI]) | |
33d72b63 | 283 | |
43cacb12 | 284 | ;; Advanced SIMD modes for Q and H types. |
66adb8eb JG |
285 | (define_mode_iterator VDQQH [V8QI V16QI V4HI V8HI]) |
286 | ||
43cacb12 | 287 | ;; Advanced SIMD modes for H and S types. |
43e9d192 IB |
288 | (define_mode_iterator VDQHS [V4HI V8HI V2SI V4SI]) |
289 | ||
43cacb12 | 290 | ;; Advanced SIMD modes for H, S and D types. |
c7f28cd5 KT |
291 | (define_mode_iterator VDQHSD [V4HI V8HI V2SI V4SI V2DI]) |
292 | ||
43cacb12 | 293 | ;; Advanced SIMD and scalar integer modes for H and S. |
43e9d192 IB |
294 | (define_mode_iterator VSDQ_HSI [V4HI V8HI V2SI V4SI HI SI]) |
295 | ||
43cacb12 | 296 | ;; Advanced SIMD and scalar 64-bit container: 16, 32-bit integer modes. |
43e9d192 IB |
297 | (define_mode_iterator VSD_HSI [V4HI V2SI HI SI]) |
298 | ||
43cacb12 | 299 | ;; Advanced SIMD 64-bit container: 16, 32-bit integer modes. |
43e9d192 IB |
300 | (define_mode_iterator VD_HSI [V4HI V2SI]) |
301 | ||
302 | ;; Scalar 64-bit container: 16, 32-bit integer modes | |
303 | (define_mode_iterator SD_HSI [HI SI]) | |
304 | ||
ddbdb9a3 JW |
305 | ;; Scalar 64-bit container: 16-bit, 32-bit and 64-bit integer modes. |
306 | (define_mode_iterator SD_HSDI [HI SI DI]) | |
307 | ||
43cacb12 | 308 | ;; Advanced SIMD 64-bit container: 16, 32-bit integer modes. |
43e9d192 IB |
309 | (define_mode_iterator VQ_HSI [V8HI V4SI]) |
310 | ||
311 | ;; All byte modes. | |
312 | (define_mode_iterator VB [V8QI V16QI]) | |
313 | ||
1750c038 VDN |
314 | ;; 1 and 2 lane DI and DF modes. |
315 | (define_mode_iterator V12DIF [V1DI V1DF V2DI V2DF]) | |
316 | ||
317 | ;; 1 and 2 lane DI mode. | |
318 | (define_mode_iterator V12DI [V1DI V2DI]) | |
319 | ||
5e32e83b JW |
320 | ;; 2 and 4 lane SI modes. |
321 | (define_mode_iterator VS [V2SI V4SI]) | |
322 | ||
0dc8e1e7 | 323 | (define_mode_iterator TX [TI TF TD]) |
43e9d192 | 324 | |
947fb34a | 325 | ;; Duplicate of the above |
5dbaf485 | 326 | (define_mode_iterator TX2 [TX]) |
947fb34a | 327 | |
721c0fb3 RS |
328 | (define_mode_iterator VTX [TI TF TD V16QI V8HI V4SI V2DI V8HF V4SF V2DF V8BF]) |
329 | ||
43cacb12 | 330 | ;; Advanced SIMD opaque structure modes. |
43e9d192 IB |
331 | (define_mode_iterator VSTRUCT [OI CI XI]) |
332 | ||
66f206b8 JW |
333 | ;; Advanced SIMD 64-bit 2-vector structure modes. |
334 | (define_mode_iterator VSTRUCT_2D [V2x8QI V2x4HI V2x2SI V2x1DI | |
335 | V2x4HF V2x2SF V2x1DF V2x4BF]) | |
336 | ||
337 | ;; Advanced SIMD 64-bit 3-vector structure modes. | |
338 | (define_mode_iterator VSTRUCT_3D [V3x8QI V3x4HI V3x2SI V3x1DI | |
339 | V3x4HF V3x2SF V3x1DF V3x4BF]) | |
340 | ||
341 | ;; Advanced SIMD 64-bit 4-vector structure modes. | |
342 | (define_mode_iterator VSTRUCT_4D [V4x8QI V4x4HI V4x2SI V4x1DI | |
343 | V4x4HF V4x2SF V4x1DF V4x4BF]) | |
344 | ||
5dbaf485 RS |
345 | ;; Advanced SIMD 64-bit vector structure modes. |
346 | (define_mode_iterator VSTRUCT_D [VSTRUCT_2D VSTRUCT_3D VSTRUCT_4D]) | |
347 | ||
66f206b8 JW |
348 | ;; Advanced SIMD 64-bit 2-vector structure modes minus V2x1DI and V2x1DF. |
349 | (define_mode_iterator VSTRUCT_2DNX [V2x8QI V2x4HI V2x2SI V2x4HF | |
350 | V2x2SF V2x4BF]) | |
351 | ||
352 | ;; Advanced SIMD 64-bit 3-vector structure modes minus V3x1DI and V3x1DF. | |
353 | (define_mode_iterator VSTRUCT_3DNX [V3x8QI V3x4HI V3x2SI V3x4HF | |
354 | V3x2SF V3x4BF]) | |
355 | ||
356 | ;; Advanced SIMD 64-bit 4-vector structure modes minus V4x1DI and V4x1DF. | |
357 | (define_mode_iterator VSTRUCT_4DNX [V4x8QI V4x4HI V4x2SI V4x4HF | |
358 | V4x2SF V4x4BF]) | |
359 | ||
360 | ;; Advanced SIMD 64-bit structure modes with 64-bit elements. | |
361 | (define_mode_iterator VSTRUCT_DX [V2x1DI V2x1DF V3x1DI V3x1DF V4x1DI V4x1DF]) | |
362 | ||
363 | ;; Advanced SIMD 64-bit 2-vector structure modes with 64-bit elements. | |
364 | (define_mode_iterator VSTRUCT_2DX [V2x1DI V2x1DF]) | |
365 | ||
366 | ;; Advanced SIMD 64-bit 3-vector structure modes with 64-bit elements. | |
367 | (define_mode_iterator VSTRUCT_3DX [V3x1DI V3x1DF]) | |
368 | ||
369 | ;; Advanced SIMD 64-bit 4-vector structure modes with 64-bit elements. | |
370 | (define_mode_iterator VSTRUCT_4DX [V4x1DI V4x1DF]) | |
371 | ||
66f206b8 JW |
372 | ;; Advanced SIMD 128-bit 2-vector structure modes. |
373 | (define_mode_iterator VSTRUCT_2Q [V2x16QI V2x8HI V2x4SI V2x2DI | |
374 | V2x8HF V2x4SF V2x2DF V2x8BF]) | |
375 | ||
376 | ;; Advanced SIMD 128-bit 3-vector structure modes. | |
377 | (define_mode_iterator VSTRUCT_3Q [V3x16QI V3x8HI V3x4SI V3x2DI | |
378 | V3x8HF V3x4SF V3x2DF V3x8BF]) | |
379 | ||
380 | ;; Advanced SIMD 128-bit 4-vector structure modes. | |
381 | (define_mode_iterator VSTRUCT_4Q [V4x16QI V4x8HI V4x4SI V4x2DI | |
382 | V4x8HF V4x4SF V4x2DF V4x8BF]) | |
383 | ||
5dbaf485 RS |
384 | ;; Advanced SIMD 128-bit vector structure modes. |
385 | (define_mode_iterator VSTRUCT_Q [VSTRUCT_2Q VSTRUCT_3Q VSTRUCT_4Q]) | |
386 | ||
66f206b8 | 387 | ;; Advanced SIMD 2-vector structure modes. |
5dbaf485 | 388 | (define_mode_iterator VSTRUCT_2QD [VSTRUCT_2D VSTRUCT_2Q]) |
66f206b8 JW |
389 | |
390 | ;; Advanced SIMD 3-vector structure modes. | |
5dbaf485 | 391 | (define_mode_iterator VSTRUCT_3QD [VSTRUCT_3D VSTRUCT_3Q]) |
66f206b8 JW |
392 | |
393 | ;; Advanced SIMD 4-vector structure modes. | |
5dbaf485 | 394 | (define_mode_iterator VSTRUCT_4QD [VSTRUCT_4D VSTRUCT_4Q]) |
66f206b8 JW |
395 | |
396 | ;; Advanced SIMD vector structure modes. | |
5dbaf485 | 397 | (define_mode_iterator VSTRUCT_QD [VSTRUCT_D VSTRUCT_Q]) |
66f206b8 | 398 | |
43e9d192 | 399 | ;; Double scalar modes |
0dc8e1e7 | 400 | (define_mode_iterator DX [DI DF DD]) |
43e9d192 | 401 | |
dfe1da23 | 402 | ;; Duplicate of the above |
5dbaf485 | 403 | (define_mode_iterator DX2 [DX]) |
dfe1da23 JW |
404 | |
405 | ;; Single scalar modes | |
406 | (define_mode_iterator SX [SI SF]) | |
407 | ||
408 | ;; Duplicate of the above | |
5dbaf485 | 409 | (define_mode_iterator SX2 [SX]) |
dfe1da23 JW |
410 | |
411 | ;; Single and double integer and float modes | |
412 | (define_mode_iterator DSX [DF DI SF SI]) | |
413 | ||
414 | ||
28de75d2 | 415 | ;; Modes available for Advanced SIMD <f>mul operations. |
ab2e8f01 JW |
416 | (define_mode_iterator VMUL [V4HI V8HI V2SI V4SI |
417 | (V4HF "TARGET_SIMD_F16INST") | |
418 | (V8HF "TARGET_SIMD_F16INST") | |
419 | V2SF V4SF V2DF]) | |
779aea46 | 420 | |
28de75d2 RS |
421 | ;; The subset of VMUL for which VCOND is a vector mode. |
422 | (define_mode_iterator VMULD [V4HI V8HI V2SI V4SI | |
423 | (V4HF "TARGET_SIMD_F16INST") | |
424 | (V8HF "TARGET_SIMD_F16INST") | |
425 | V2SF V4SF]) | |
779aea46 | 426 | |
95eb5537 | 427 | ;; Iterators for single modes, for "@" patterns. |
0a09a948 | 428 | (define_mode_iterator VNx16QI_ONLY [VNx16QI]) |
c1c267df | 429 | (define_mode_iterator VNx16SI_ONLY [VNx16SI]) |
624d0f07 | 430 | (define_mode_iterator VNx8HI_ONLY [VNx8HI]) |
896dff99 | 431 | (define_mode_iterator VNx8BF_ONLY [VNx8BF]) |
c1c267df RS |
432 | (define_mode_iterator VNx8SI_ONLY [VNx8SI]) |
433 | (define_mode_iterator VNx8DI_ONLY [VNx8DI]) | |
95eb5537 | 434 | (define_mode_iterator VNx4SI_ONLY [VNx4SI]) |
0a09a948 | 435 | (define_mode_iterator VNx4SF_ONLY [VNx4SF]) |
624d0f07 | 436 | (define_mode_iterator VNx2DI_ONLY [VNx2DI]) |
95eb5537 | 437 | (define_mode_iterator VNx2DF_ONLY [VNx2DF]) |
4f6ab953 | 438 | (define_mode_iterator VNx1TI_ONLY [VNx1TI]) |
95eb5537 | 439 | |
f75cdd2c RS |
440 | ;; All fully-packed SVE vector modes. |
441 | (define_mode_iterator SVE_FULL [VNx16QI VNx8HI VNx4SI VNx2DI | |
02fcd8ac | 442 | VNx8BF VNx8HF VNx4SF VNx2DF]) |
f75cdd2c RS |
443 | |
444 | ;; All fully-packed SVE integer vector modes. | |
445 | (define_mode_iterator SVE_FULL_I [VNx16QI VNx8HI VNx4SI VNx2DI]) | |
43cacb12 | 446 | |
f75cdd2c RS |
447 | ;; All fully-packed SVE floating-point vector modes. |
448 | (define_mode_iterator SVE_FULL_F [VNx8HF VNx4SF VNx2DF]) | |
43cacb12 | 449 | |
0a09a948 RS |
450 | ;; Fully-packed SVE integer vector modes that have 8-bit or 16-bit elements. |
451 | (define_mode_iterator SVE_FULL_BHI [VNx16QI VNx8HI]) | |
452 | ||
f75cdd2c RS |
453 | ;; Fully-packed SVE integer vector modes that have 8-bit, 16-bit or 32-bit |
454 | ;; elements. | |
455 | (define_mode_iterator SVE_FULL_BHSI [VNx16QI VNx8HI VNx4SI]) | |
43cacb12 | 456 | |
c1c267df RS |
457 | ;; Pairs of the above. |
458 | (define_mode_iterator SVE_FULL_BHSIx2 [VNx32QI VNx16HI VNx8SI]) | |
459 | ||
460 | ;; Fully-packed SVE vector modes that have 16-bit float elements. | |
461 | (define_mode_iterator SVE_FULL_HF [VNx8BF VNx8HF]) | |
462 | ||
f75cdd2c | 463 | ;; Fully-packed SVE vector modes that have 16-bit, 32-bit or 64-bit elements. |
02fcd8ac RS |
464 | (define_mode_iterator SVE_FULL_HSD [VNx8HI VNx4SI VNx2DI |
465 | VNx8BF VNx8HF VNx4SF VNx2DF]) | |
95eb5537 | 466 | |
f75cdd2c RS |
467 | ;; Fully-packed SVE integer vector modes that have 16-bit, 32-bit or 64-bit |
468 | ;; elements. | |
469 | (define_mode_iterator SVE_FULL_HSDI [VNx8HI VNx4SI VNx2DI]) | |
95eb5537 | 470 | |
dfa17fd3 TC |
471 | ;; Fully-packed SVE integer vector modes that have 16-bit, 32-bit or 64-bit |
472 | ;; elements and Advanced SIMD Fully-packed 64-bit elements. | |
473 | (define_mode_iterator SVE_FULL_HSDI_SIMD_DI [SVE_FULL_HSDI V2DI]) | |
474 | ||
0a09a948 RS |
475 | ;; Fully-packed SVE integer vector modes that have 16-bit or 32-bit |
476 | ;; elements. | |
477 | (define_mode_iterator SVE_FULL_HSI [VNx8HI VNx4SI]) | |
478 | ||
f75cdd2c RS |
479 | ;; Fully-packed SVE floating-point vector modes that have 16-bit or 32-bit |
480 | ;; elements. | |
481 | (define_mode_iterator SVE_FULL_HSF [VNx8HF VNx4SF]) | |
a70965b1 | 482 | |
0a09a948 RS |
483 | ;; Fully-packed SVE integer vector modes that have 16-bit or 64-bit elements. |
484 | (define_mode_iterator SVE_FULL_HDI [VNx8HI VNx2DI]) | |
485 | ||
f75cdd2c RS |
486 | ;; Fully-packed SVE vector modes that have 32-bit or 64-bit elements. |
487 | (define_mode_iterator SVE_FULL_SD [VNx4SI VNx2DI VNx4SF VNx2DF]) | |
43cacb12 | 488 | |
f75cdd2c RS |
489 | ;; Fully-packed SVE integer vector modes that have 32-bit or 64-bit elements. |
490 | (define_mode_iterator SVE_FULL_SDI [VNx4SI VNx2DI]) | |
bfaa08b7 | 491 | |
dfa17fd3 TC |
492 | ;; Fully-packed SVE and Advanced SIMD integer vector modes that have 32-bit or |
493 | ;; 64-bit elements. | |
494 | (define_mode_iterator SVE_FULL_SDI_SIMD [SVE_FULL_SDI V4SI V2DI]) | |
495 | ||
c1c267df RS |
496 | ;; 2x and 4x tuples of the above, excluding 2x DI. |
497 | (define_mode_iterator SVE_FULL_SIx2_SDIx4 [VNx8SI VNx16SI VNx8DI]) | |
498 | ||
f75cdd2c RS |
499 | ;; Fully-packed SVE floating-point vector modes that have 32-bit or 64-bit |
500 | ;; elements. | |
501 | (define_mode_iterator SVE_FULL_SDF [VNx4SF VNx2DF]) | |
bfaa08b7 | 502 | |
36696774 RS |
503 | ;; Same, but with the appropriate conditions for FMMLA support. |
504 | (define_mode_iterator SVE_MATMULF [(VNx4SF "TARGET_SVE_F32MM") | |
505 | (VNx2DF "TARGET_SVE_F64MM")]) | |
506 | ||
c1c267df RS |
507 | ;; Fully-packed SVE vector modes that have 32-bit or smaller elements. |
508 | (define_mode_iterator SVE_FULL_BHS [VNx16QI VNx8HI VNx4SI | |
509 | VNx8BF VNx8HF VNx4SF]) | |
510 | ||
f75cdd2c RS |
511 | ;; Fully-packed SVE vector modes that have 32-bit elements. |
512 | (define_mode_iterator SVE_FULL_S [VNx4SI VNx4SF]) | |
43cacb12 | 513 | |
f75cdd2c RS |
514 | ;; Fully-packed SVE vector modes that have 64-bit elements. |
515 | (define_mode_iterator SVE_FULL_D [VNx2DI VNx2DF]) | |
43cacb12 | 516 | |
6544cb52 RS |
517 | ;; All partial SVE integer modes. |
518 | (define_mode_iterator SVE_PARTIAL_I [VNx8QI VNx4QI VNx2QI | |
519 | VNx4HI VNx2HI | |
520 | VNx2SI]) | |
624d0f07 | 521 | |
cc68f7c2 RS |
522 | ;; All SVE vector modes. |
523 | (define_mode_iterator SVE_ALL [VNx16QI VNx8QI VNx4QI VNx2QI | |
524 | VNx8HI VNx4HI VNx2HI | |
525 | VNx8HF VNx4HF VNx2HF | |
6c3ce63b | 526 | VNx8BF VNx4BF VNx2BF |
cc68f7c2 RS |
527 | VNx4SI VNx2SI |
528 | VNx4SF VNx2SF | |
529 | VNx2DI | |
530 | VNx2DF]) | |
531 | ||
1ce9dc26 RS |
532 | ;; All SVE 2-vector modes. |
533 | (define_mode_iterator SVE_FULLx2 [VNx32QI VNx16HI VNx8SI VNx4DI | |
534 | VNx16BF VNx16HF VNx8SF VNx4DF]) | |
535 | ||
536 | ;; All SVE 3-vector modes. | |
537 | (define_mode_iterator SVE_FULLx3 [VNx48QI VNx24HI VNx12SI VNx6DI | |
538 | VNx24BF VNx24HF VNx12SF VNx6DF]) | |
539 | ||
540 | ;; All SVE 4-vector modes. | |
541 | (define_mode_iterator SVE_FULLx4 [VNx64QI VNx32HI VNx16SI VNx8DI | |
542 | VNx32BF VNx32HF VNx16SF VNx8DF]) | |
543 | ||
c1c267df RS |
544 | (define_mode_iterator SVE_FULLx24 [SVE_FULLx2 SVE_FULLx4]) |
545 | ||
1ce9dc26 RS |
546 | ;; All SVE vector structure modes. |
547 | (define_mode_iterator SVE_STRUCT [SVE_FULLx2 SVE_FULLx3 SVE_FULLx4]) | |
548 | ||
549 | ;; All SVE vector and structure modes. | |
550 | (define_mode_iterator SVE_ALL_STRUCT [SVE_ALL SVE_STRUCT]) | |
551 | ||
cc68f7c2 RS |
552 | ;; All SVE integer vector modes. |
553 | (define_mode_iterator SVE_I [VNx16QI VNx8QI VNx4QI VNx2QI | |
554 | VNx8HI VNx4HI VNx2HI | |
555 | VNx4SI VNx2SI | |
556 | VNx2DI]) | |
557 | ||
dfa17fd3 TC |
558 | ;; All SVE integer vector modes and Advanced SIMD 64-bit vector |
559 | ;; element modes | |
560 | (define_mode_iterator SVE_I_SIMD_DI [SVE_I V2DI]) | |
561 | ||
e4b8db26 PZ |
562 | ;; All SVE and Advanced SIMD integer vector modes. |
563 | (define_mode_iterator SVE_VDQ_I [SVE_I VDQ_I]) | |
564 | ||
e58703e2 RS |
565 | ;; SVE integer vector modes whose elements are 16 bits or wider. |
566 | (define_mode_iterator SVE_HSDI [VNx8HI VNx4HI VNx2HI | |
567 | VNx4SI VNx2SI | |
568 | VNx2DI]) | |
569 | ||
c1c267df RS |
570 | (define_mode_iterator SVE_DIx24 [VNx4DI VNx8DI]) |
571 | ||
f8186eea | 572 | ;; SVE modes with 2 or 4 elements. |
6c3ce63b RS |
573 | (define_mode_iterator SVE_24 [VNx2QI VNx2HI VNx2HF VNx2BF VNx2SI VNx2SF |
574 | VNx2DI VNx2DF | |
575 | VNx4QI VNx4HI VNx4HF VNx4BF VNx4SI VNx4SF]) | |
f8186eea | 576 | |
3f8b0bba RS |
577 | ;; SVE integer modes with 2 or 4 elements. |
578 | (define_mode_iterator SVE_24I [VNx2QI VNx2HI VNx2SI VNx2DI | |
579 | VNx4QI VNx4HI VNx4SI]) | |
580 | ||
f8186eea | 581 | ;; SVE modes with 2 elements. |
6c3ce63b RS |
582 | (define_mode_iterator SVE_2 [VNx2QI VNx2HI VNx2HF VNx2BF |
583 | VNx2SI VNx2SF VNx2DI VNx2DF]) | |
f8186eea | 584 | |
87a80d27 RS |
585 | ;; SVE integer modes with 2 elements, excluding the widest element. |
586 | (define_mode_iterator SVE_2BHSI [VNx2QI VNx2HI VNx2SI]) | |
587 | ||
588 | ;; SVE integer modes with 2 elements, excluding the narrowest element. | |
589 | (define_mode_iterator SVE_2HSDI [VNx2HI VNx2SI VNx2DI]) | |
590 | ||
f8186eea | 591 | ;; SVE modes with 4 elements. |
6c3ce63b | 592 | (define_mode_iterator SVE_4 [VNx4QI VNx4HI VNx4HF VNx4BF VNx4SI VNx4SF]) |
f8186eea | 593 | |
87a80d27 RS |
594 | ;; SVE integer modes with 4 elements, excluding the widest element. |
595 | (define_mode_iterator SVE_4BHI [VNx4QI VNx4HI]) | |
596 | ||
597 | ;; SVE integer modes with 4 elements, excluding the narrowest element. | |
598 | (define_mode_iterator SVE_4HSI [VNx4HI VNx4SI]) | |
599 | ||
0a09a948 RS |
600 | ;; SVE integer modes that can form the input to an SVE2 PMULL[BT] instruction. |
601 | (define_mode_iterator SVE2_PMULL_PAIR_I [VNx16QI VNx4SI | |
602 | (VNx2DI "TARGET_SVE2_AES")]) | |
603 | ||
624d0f07 RS |
604 | ;; Modes involved in extending or truncating SVE data, for 8 elements per |
605 | ;; 128-bit block. | |
606 | (define_mode_iterator VNx8_NARROW [VNx8QI]) | |
607 | (define_mode_iterator VNx8_WIDE [VNx8HI]) | |
608 | ||
609 | ;; ...same for 4 elements per 128-bit block. | |
610 | (define_mode_iterator VNx4_NARROW [VNx4QI VNx4HI]) | |
611 | (define_mode_iterator VNx4_WIDE [VNx4SI]) | |
612 | ||
613 | ;; ...same for 2 elements per 128-bit block. | |
614 | (define_mode_iterator VNx2_NARROW [VNx2QI VNx2HI VNx2SI]) | |
615 | (define_mode_iterator VNx2_WIDE [VNx2DI]) | |
616 | ||
43cacb12 RS |
617 | ;; All SVE predicate modes. |
618 | (define_mode_iterator PRED_ALL [VNx16BI VNx8BI VNx4BI VNx2BI]) | |
619 | ||
620 | ;; SVE predicate modes that control 8-bit, 16-bit or 32-bit elements. | |
621 | (define_mode_iterator PRED_BHS [VNx16BI VNx8BI VNx4BI]) | |
622 | ||
624d0f07 RS |
623 | ;; SVE predicate modes that control 16-bit, 32-bit or 64-bit elements. |
624 | (define_mode_iterator PRED_HSD [VNx8BI VNx4BI VNx2BI]) | |
625 | ||
1f520d34 DB |
626 | ;; Bfloat16 modes to which V4SF can be converted |
627 | (define_mode_iterator V4SF_TO_BF [V4BF V8BF]) | |
628 | ||
c1c267df RS |
629 | (define_mode_iterator SVE_BHSx24 [VNx32QI VNx16HI VNx8SI |
630 | VNx16BF VNx16HF VNx8SF | |
631 | VNx64QI VNx32HI VNx16SI | |
632 | VNx32BF VNx32HF VNx16SF]) | |
633 | ||
634 | (define_mode_iterator SVE_Ix24 [VNx32QI VNx16HI VNx8SI VNx4DI | |
635 | VNx64QI VNx32HI VNx16SI VNx8DI]) | |
636 | ||
637 | (define_mode_iterator SVE_Fx24 [VNx16HF VNx8SF VNx4DF | |
638 | VNx32HF VNx16SF VNx8DF]) | |
639 | ||
640 | (define_mode_iterator SVE_SFx24 [VNx8SF VNx16SF]) | |
641 | ||
4f6ab953 RS |
642 | ;; The modes used to represent different ZA access sizes. |
643 | (define_mode_iterator SME_ZA_I [VNx16QI VNx8HI VNx4SI VNx2DI VNx1TI]) | |
644 | (define_mode_iterator SME_ZA_SDI [VNx4SI (VNx2DI "TARGET_SME_I16I64")]) | |
645 | ||
646 | (define_mode_iterator SME_ZA_SDF_I [VNx4SI (VNx2DI "TARGET_SME_F64F64")]) | |
647 | ||
c1c267df RS |
648 | (define_mode_iterator SME_ZA_BIx24 [VNx32QI VNx64QI]) |
649 | ||
650 | (define_mode_iterator SME_ZA_BHIx124 [VNx16QI VNx32QI VNx64QI | |
651 | VNx8HI VNx16HI VNx32HI]) | |
652 | ||
653 | (define_mode_iterator SME_ZA_BHIx24 [VNx32QI VNx64QI VNx16HI VNx32HI]) | |
654 | ||
655 | (define_mode_iterator SME_ZA_HFx124 [VNx8BF VNx16BF VNx32BF | |
656 | VNx8HF VNx16HF VNx32HF]) | |
657 | ||
658 | (define_mode_iterator SME_ZA_HFx24 [VNx16BF VNx32BF VNx16HF VNx32HF]) | |
659 | ||
660 | (define_mode_iterator SME_ZA_HIx124 [VNx8HI VNx16HI VNx32HI]) | |
661 | ||
662 | (define_mode_iterator SME_ZA_HIx24 [VNx16HI VNx32HI]) | |
663 | ||
664 | (define_mode_iterator SME_ZA_SDIx24 [VNx8SI (VNx4DI "TARGET_SME_I16I64") | |
665 | VNx16SI (VNx8DI "TARGET_SME_I16I64")]) | |
666 | ||
667 | (define_mode_iterator SME_ZA_SDFx24 [VNx8SF (VNx4DF "TARGET_SME_F64F64") | |
668 | VNx16SF (VNx8DF "TARGET_SME_F64F64")]) | |
669 | ||
4f6ab953 RS |
670 | ;; The modes for which outer product instructions are supported. |
671 | (define_mode_iterator SME_MOP_BHI [VNx16QI (VNx8HI "TARGET_SME_I16I64")]) | |
672 | (define_mode_iterator SME_MOP_HSDF [VNx8BF VNx8HF VNx4SF | |
673 | (VNx2DF "TARGET_SME_F64F64")]) | |
674 | ||
43e9d192 IB |
675 | ;; ------------------------------------------------------------------ |
676 | ;; Unspec enumerations for Advance SIMD. These could well go into | |
677 | ;; aarch64.md but for their use in int_iterators here. | |
678 | ;; ------------------------------------------------------------------ | |
679 | ||
680 | (define_c_enum "unspec" | |
681 | [ | |
682 | UNSPEC_ASHIFT_SIGNED ; Used in aarch-simd.md. | |
683 | UNSPEC_ASHIFT_UNSIGNED ; Used in aarch64-simd.md. | |
285398d2 | 684 | UNSPEC_ABS ; Used in aarch64-simd.md. |
998eaf97 JG |
685 | UNSPEC_FMAX ; Used in aarch64-simd.md. |
686 | UNSPEC_FMAXNMV ; Used in aarch64-simd.md. | |
43e9d192 | 687 | UNSPEC_FMAXV ; Used in aarch64-simd.md. |
998eaf97 JG |
688 | UNSPEC_FMIN ; Used in aarch64-simd.md. |
689 | UNSPEC_FMINNMV ; Used in aarch64-simd.md. | |
43e9d192 IB |
690 | UNSPEC_FMINV ; Used in aarch64-simd.md. |
691 | UNSPEC_FADDV ; Used in aarch64-simd.md. | |
2c24e056 | 692 | UNSPEC_FNEG ; Used in aarch64-simd.md. |
f5156c3e | 693 | UNSPEC_ADDV ; Used in aarch64-simd.md. |
43e9d192 IB |
694 | UNSPEC_SMAXV ; Used in aarch64-simd.md. |
695 | UNSPEC_SMINV ; Used in aarch64-simd.md. | |
696 | UNSPEC_UMAXV ; Used in aarch64-simd.md. | |
697 | UNSPEC_UMINV ; Used in aarch64-simd.md. | |
698 | UNSPEC_SHADD ; Used in aarch64-simd.md. | |
699 | UNSPEC_UHADD ; Used in aarch64-simd.md. | |
700 | UNSPEC_SRHADD ; Used in aarch64-simd.md. | |
701 | UNSPEC_URHADD ; Used in aarch64-simd.md. | |
702 | UNSPEC_SHSUB ; Used in aarch64-simd.md. | |
703 | UNSPEC_UHSUB ; Used in aarch64-simd.md. | |
43e9d192 IB |
704 | UNSPEC_SQDMULH ; Used in aarch64-simd.md. |
705 | UNSPEC_SQRDMULH ; Used in aarch64-simd.md. | |
706 | UNSPEC_PMUL ; Used in aarch64-simd.md. | |
496ea87d | 707 | UNSPEC_FMULX ; Used in aarch64-simd.md. |
43e9d192 IB |
708 | UNSPEC_USQADD ; Used in aarch64-simd.md. |
709 | UNSPEC_SUQADD ; Used in aarch64-simd.md. | |
43e9d192 IB |
710 | UNSPEC_SSRA ; Used in aarch64-simd.md. |
711 | UNSPEC_USRA ; Used in aarch64-simd.md. | |
43e9d192 IB |
712 | UNSPEC_SRSHR ; Used in aarch64-simd.md. |
713 | UNSPEC_URSHR ; Used in aarch64-simd.md. | |
714 | UNSPEC_SQSHLU ; Used in aarch64-simd.md. | |
715 | UNSPEC_SQSHL ; Used in aarch64-simd.md. | |
716 | UNSPEC_UQSHL ; Used in aarch64-simd.md. | |
43e9d192 IB |
717 | UNSPEC_SSHL ; Used in aarch64-simd.md. |
718 | UNSPEC_USHL ; Used in aarch64-simd.md. | |
719 | UNSPEC_SRSHL ; Used in aarch64-simd.md. | |
720 | UNSPEC_URSHL ; Used in aarch64-simd.md. | |
721 | UNSPEC_SQRSHL ; Used in aarch64-simd.md. | |
722 | UNSPEC_UQRSHL ; Used in aarch64-simd.md. | |
43e9d192 IB |
723 | UNSPEC_SSLI ; Used in aarch64-simd.md. |
724 | UNSPEC_USLI ; Used in aarch64-simd.md. | |
725 | UNSPEC_SSRI ; Used in aarch64-simd.md. | |
726 | UNSPEC_USRI ; Used in aarch64-simd.md. | |
727 | UNSPEC_SSHLL ; Used in aarch64-simd.md. | |
728 | UNSPEC_USHLL ; Used in aarch64-simd.md. | |
729 | UNSPEC_ADDP ; Used in aarch64-simd.md. | |
88b08073 | 730 | UNSPEC_TBL ; Used in vector permute patterns. |
9371aecc | 731 | UNSPEC_TBX ; Used in vector permute patterns. |
88b08073 | 732 | UNSPEC_CONCAT ; Used in vector permute patterns. |
3f8334a5 RS |
733 | |
734 | ;; The following permute unspecs are generated directly by | |
735 | ;; aarch64_expand_vec_perm_const, so any changes to the underlying | |
736 | ;; instructions would need a corresponding change there. | |
cc4d934f JG |
737 | UNSPEC_ZIP1 ; Used in vector permute patterns. |
738 | UNSPEC_ZIP2 ; Used in vector permute patterns. | |
739 | UNSPEC_UZP1 ; Used in vector permute patterns. | |
740 | UNSPEC_UZP2 ; Used in vector permute patterns. | |
741 | UNSPEC_TRN1 ; Used in vector permute patterns. | |
742 | UNSPEC_TRN2 ; Used in vector permute patterns. | |
3f8334a5 | 743 | UNSPEC_EXT ; Used in vector permute patterns. |
923fcec3 AL |
744 | UNSPEC_REV64 ; Used in vector reverse patterns (permute). |
745 | UNSPEC_REV32 ; Used in vector reverse patterns (permute). | |
746 | UNSPEC_REV16 ; Used in vector reverse patterns (permute). | |
3f8334a5 | 747 | |
5a7a4e80 TB |
748 | UNSPEC_AESE ; Used in aarch64-simd.md. |
749 | UNSPEC_AESD ; Used in aarch64-simd.md. | |
750 | UNSPEC_AESMC ; Used in aarch64-simd.md. | |
751 | UNSPEC_AESIMC ; Used in aarch64-simd.md. | |
30442682 TB |
752 | UNSPEC_SHA1C ; Used in aarch64-simd.md. |
753 | UNSPEC_SHA1M ; Used in aarch64-simd.md. | |
754 | UNSPEC_SHA1P ; Used in aarch64-simd.md. | |
755 | UNSPEC_SHA1H ; Used in aarch64-simd.md. | |
756 | UNSPEC_SHA1SU0 ; Used in aarch64-simd.md. | |
757 | UNSPEC_SHA1SU1 ; Used in aarch64-simd.md. | |
b9cb0a44 TB |
758 | UNSPEC_SHA256H ; Used in aarch64-simd.md. |
759 | UNSPEC_SHA256H2 ; Used in aarch64-simd.md. | |
760 | UNSPEC_SHA256SU0 ; Used in aarch64-simd.md. | |
761 | UNSPEC_SHA256SU1 ; Used in aarch64-simd.md. | |
7baa225d TB |
762 | UNSPEC_PMULL ; Used in aarch64-simd.md. |
763 | UNSPEC_PMULL2 ; Used in aarch64-simd.md. | |
668046d1 | 764 | UNSPEC_REV_REGLIST ; Used in aarch64-simd.md. |
9c004c58 | 765 | UNSPEC_VEC_SHR ; Used in aarch64-simd.md. |
57b26d65 MW |
766 | UNSPEC_SQRDMLAH ; Used in aarch64-simd.md. |
767 | UNSPEC_SQRDMLSH ; Used in aarch64-simd.md. | |
202d0c11 DS |
768 | UNSPEC_FMAXNM ; Used in aarch64-simd.md. |
769 | UNSPEC_FMINNM ; Used in aarch64-simd.md. | |
7a08d813 TC |
770 | UNSPEC_SDOT ; Used in aarch64-simd.md. |
771 | UNSPEC_UDOT ; Used in aarch64-simd.md. | |
27086ea3 MC |
772 | UNSPEC_SM3SS1 ; Used in aarch64-simd.md. |
773 | UNSPEC_SM3TT1A ; Used in aarch64-simd.md. | |
774 | UNSPEC_SM3TT1B ; Used in aarch64-simd.md. | |
775 | UNSPEC_SM3TT2A ; Used in aarch64-simd.md. | |
776 | UNSPEC_SM3TT2B ; Used in aarch64-simd.md. | |
777 | UNSPEC_SM3PARTW1 ; Used in aarch64-simd.md. | |
778 | UNSPEC_SM3PARTW2 ; Used in aarch64-simd.md. | |
779 | UNSPEC_SM4E ; Used in aarch64-simd.md. | |
780 | UNSPEC_SM4EKEY ; Used in aarch64-simd.md. | |
781 | UNSPEC_SHA512H ; Used in aarch64-simd.md. | |
782 | UNSPEC_SHA512H2 ; Used in aarch64-simd.md. | |
783 | UNSPEC_SHA512SU0 ; Used in aarch64-simd.md. | |
784 | UNSPEC_SHA512SU1 ; Used in aarch64-simd.md. | |
785 | UNSPEC_FMLAL ; Used in aarch64-simd.md. | |
786 | UNSPEC_FMLSL ; Used in aarch64-simd.md. | |
787 | UNSPEC_FMLAL2 ; Used in aarch64-simd.md. | |
788 | UNSPEC_FMLSL2 ; Used in aarch64-simd.md. | |
624d0f07 | 789 | UNSPEC_ADR ; Used in aarch64-sve.md. |
43cacb12 | 790 | UNSPEC_SEL ; Used in aarch64-sve.md. |
624d0f07 RS |
791 | UNSPEC_BRKA ; Used in aarch64-sve.md. |
792 | UNSPEC_BRKB ; Used in aarch64-sve.md. | |
793 | UNSPEC_BRKN ; Used in aarch64-sve.md. | |
794 | UNSPEC_BRKPA ; Used in aarch64-sve.md. | |
795 | UNSPEC_BRKPB ; Used in aarch64-sve.md. | |
796 | UNSPEC_PFIRST ; Used in aarch64-sve.md. | |
797 | UNSPEC_PNEXT ; Used in aarch64-sve.md. | |
798 | UNSPEC_CNTP ; Used in aarch64-sve.md. | |
799 | UNSPEC_SADDV ; Used in aarch64-sve.md. | |
800 | UNSPEC_UADDV ; Used in aarch64-sve.md. | |
898f07b0 RS |
801 | UNSPEC_ANDV ; Used in aarch64-sve.md. |
802 | UNSPEC_IORV ; Used in aarch64-sve.md. | |
803 | UNSPEC_XORV ; Used in aarch64-sve.md. | |
43cacb12 RS |
804 | UNSPEC_ANDF ; Used in aarch64-sve.md. |
805 | UNSPEC_IORF ; Used in aarch64-sve.md. | |
806 | UNSPEC_XORF ; Used in aarch64-sve.md. | |
d7a09c44 | 807 | UNSPEC_REVB ; Used in aarch64-sve.md. |
c1c267df | 808 | UNSPEC_REVD ; Used in aarch64-sve2.md. |
d7a09c44 RS |
809 | UNSPEC_REVH ; Used in aarch64-sve.md. |
810 | UNSPEC_REVW ; Used in aarch64-sve.md. | |
6c3ce63b | 811 | UNSPEC_REVBHW ; Used in aarch64-sve.md. |
11e9443f RS |
812 | UNSPEC_SMUL_HIGHPART ; Used in aarch64-sve.md. |
813 | UNSPEC_UMUL_HIGHPART ; Used in aarch64-sve.md. | |
624d0f07 RS |
814 | UNSPEC_FMLA ; Used in aarch64-sve.md. |
815 | UNSPEC_FMLS ; Used in aarch64-sve.md. | |
816 | UNSPEC_FEXPA ; Used in aarch64-sve.md. | |
36696774 | 817 | UNSPEC_FMMLA ; Used in aarch64-sve.md. |
624d0f07 RS |
818 | UNSPEC_FTMAD ; Used in aarch64-sve.md. |
819 | UNSPEC_FTSMUL ; Used in aarch64-sve.md. | |
820 | UNSPEC_FTSSEL ; Used in aarch64-sve.md. | |
36696774 | 821 | UNSPEC_SMATMUL ; Used in aarch64-sve.md. |
c5353607 | 822 | UNSPEC_SET_NEONQ ; Used in aarch64-sve.md. |
36696774 RS |
823 | UNSPEC_UMATMUL ; Used in aarch64-sve.md. |
824 | UNSPEC_USMATMUL ; Used in aarch64-sve.md. | |
825 | UNSPEC_TRN1Q ; Used in aarch64-sve.md. | |
826 | UNSPEC_TRN2Q ; Used in aarch64-sve.md. | |
827 | UNSPEC_UZP1Q ; Used in aarch64-sve.md. | |
828 | UNSPEC_UZP2Q ; Used in aarch64-sve.md. | |
829 | UNSPEC_ZIP1Q ; Used in aarch64-sve.md. | |
830 | UNSPEC_ZIP2Q ; Used in aarch64-sve.md. | |
8535755a | 831 | UNSPEC_TRN1_CONV ; Used in aarch64-sve.md. |
624d0f07 RS |
832 | UNSPEC_COND_CMPEQ_WIDE ; Used in aarch64-sve.md. |
833 | UNSPEC_COND_CMPGE_WIDE ; Used in aarch64-sve.md. | |
834 | UNSPEC_COND_CMPGT_WIDE ; Used in aarch64-sve.md. | |
835 | UNSPEC_COND_CMPHI_WIDE ; Used in aarch64-sve.md. | |
836 | UNSPEC_COND_CMPHS_WIDE ; Used in aarch64-sve.md. | |
837 | UNSPEC_COND_CMPLE_WIDE ; Used in aarch64-sve.md. | |
838 | UNSPEC_COND_CMPLO_WIDE ; Used in aarch64-sve.md. | |
839 | UNSPEC_COND_CMPLS_WIDE ; Used in aarch64-sve.md. | |
840 | UNSPEC_COND_CMPLT_WIDE ; Used in aarch64-sve.md. | |
841 | UNSPEC_COND_CMPNE_WIDE ; Used in aarch64-sve.md. | |
d45b20a5 | 842 | UNSPEC_COND_FABS ; Used in aarch64-sve.md. |
cb18e86d | 843 | UNSPEC_COND_FADD ; Used in aarch64-sve.md. |
624d0f07 RS |
844 | UNSPEC_COND_FCADD90 ; Used in aarch64-sve.md. |
845 | UNSPEC_COND_FCADD270 ; Used in aarch64-sve.md. | |
cb18e86d RS |
846 | UNSPEC_COND_FCMEQ ; Used in aarch64-sve.md. |
847 | UNSPEC_COND_FCMGE ; Used in aarch64-sve.md. | |
848 | UNSPEC_COND_FCMGT ; Used in aarch64-sve.md. | |
624d0f07 RS |
849 | UNSPEC_COND_FCMLA ; Used in aarch64-sve.md. |
850 | UNSPEC_COND_FCMLA90 ; Used in aarch64-sve.md. | |
851 | UNSPEC_COND_FCMLA180 ; Used in aarch64-sve.md. | |
852 | UNSPEC_COND_FCMLA270 ; Used in aarch64-sve.md. | |
cb18e86d RS |
853 | UNSPEC_COND_FCMLE ; Used in aarch64-sve.md. |
854 | UNSPEC_COND_FCMLT ; Used in aarch64-sve.md. | |
855 | UNSPEC_COND_FCMNE ; Used in aarch64-sve.md. | |
4a942af6 | 856 | UNSPEC_COND_FCMUO ; Used in aarch64-sve.md. |
99361551 RS |
857 | UNSPEC_COND_FCVT ; Used in aarch64-sve.md. |
858 | UNSPEC_COND_FCVTZS ; Used in aarch64-sve.md. | |
859 | UNSPEC_COND_FCVTZU ; Used in aarch64-sve.md. | |
cb18e86d | 860 | UNSPEC_COND_FDIV ; Used in aarch64-sve.md. |
624d0f07 | 861 | UNSPEC_COND_FMAX ; Used in aarch64-sve.md. |
cb18e86d | 862 | UNSPEC_COND_FMAXNM ; Used in aarch64-sve.md. |
624d0f07 | 863 | UNSPEC_COND_FMIN ; Used in aarch64-sve.md. |
cb18e86d | 864 | UNSPEC_COND_FMINNM ; Used in aarch64-sve.md. |
b41d1f6e RS |
865 | UNSPEC_COND_FMLA ; Used in aarch64-sve.md. |
866 | UNSPEC_COND_FMLS ; Used in aarch64-sve.md. | |
cb18e86d | 867 | UNSPEC_COND_FMUL ; Used in aarch64-sve.md. |
624d0f07 | 868 | UNSPEC_COND_FMULX ; Used in aarch64-sve.md. |
d45b20a5 | 869 | UNSPEC_COND_FNEG ; Used in aarch64-sve.md. |
b41d1f6e RS |
870 | UNSPEC_COND_FNMLA ; Used in aarch64-sve.md. |
871 | UNSPEC_COND_FNMLS ; Used in aarch64-sve.md. | |
624d0f07 | 872 | UNSPEC_COND_FRECPX ; Used in aarch64-sve.md. |
d45b20a5 RS |
873 | UNSPEC_COND_FRINTA ; Used in aarch64-sve.md. |
874 | UNSPEC_COND_FRINTI ; Used in aarch64-sve.md. | |
875 | UNSPEC_COND_FRINTM ; Used in aarch64-sve.md. | |
876 | UNSPEC_COND_FRINTN ; Used in aarch64-sve.md. | |
877 | UNSPEC_COND_FRINTP ; Used in aarch64-sve.md. | |
878 | UNSPEC_COND_FRINTX ; Used in aarch64-sve.md. | |
879 | UNSPEC_COND_FRINTZ ; Used in aarch64-sve.md. | |
624d0f07 | 880 | UNSPEC_COND_FSCALE ; Used in aarch64-sve.md. |
d45b20a5 | 881 | UNSPEC_COND_FSQRT ; Used in aarch64-sve.md. |
cb18e86d | 882 | UNSPEC_COND_FSUB ; Used in aarch64-sve.md. |
99361551 RS |
883 | UNSPEC_COND_SCVTF ; Used in aarch64-sve.md. |
884 | UNSPEC_COND_UCVTF ; Used in aarch64-sve.md. | |
624d0f07 | 885 | UNSPEC_LASTA ; Used in aarch64-sve.md. |
43cacb12 | 886 | UNSPEC_LASTB ; Used in aarch64-sve.md. |
624d0f07 RS |
887 | UNSPEC_ASHIFT_WIDE ; Used in aarch64-sve.md. |
888 | UNSPEC_ASHIFTRT_WIDE ; Used in aarch64-sve.md. | |
889 | UNSPEC_LSHIFTRT_WIDE ; Used in aarch64-sve.md. | |
890 | UNSPEC_LDFF1 ; Used in aarch64-sve.md. | |
891 | UNSPEC_LDNF1 ; Used in aarch64-sve.md. | |
9d63f43b TC |
892 | UNSPEC_FCADD90 ; Used in aarch64-simd.md. |
893 | UNSPEC_FCADD270 ; Used in aarch64-simd.md. | |
894 | UNSPEC_FCMLA ; Used in aarch64-simd.md. | |
895 | UNSPEC_FCMLA90 ; Used in aarch64-simd.md. | |
896 | UNSPEC_FCMLA180 ; Used in aarch64-simd.md. | |
897 | UNSPEC_FCMLA270 ; Used in aarch64-simd.md. | |
ad260343 TC |
898 | UNSPEC_FCMUL ; Used in aarch64-simd.md. |
899 | UNSPEC_FCMUL_CONJ ; Used in aarch64-simd.md. | |
900 | UNSPEC_FCMLA_CONJ ; Used in aarch64-simd.md. | |
901 | UNSPEC_FCMLA180_CONJ ; Used in aarch64-simd.md. | |
0a09a948 RS |
902 | UNSPEC_ASRD ; Used in aarch64-sve.md. |
903 | UNSPEC_ADCLB ; Used in aarch64-sve2.md. | |
904 | UNSPEC_ADCLT ; Used in aarch64-sve2.md. | |
905 | UNSPEC_ADDHNB ; Used in aarch64-sve2.md. | |
906 | UNSPEC_ADDHNT ; Used in aarch64-sve2.md. | |
907 | UNSPEC_BDEP ; Used in aarch64-sve2.md. | |
908 | UNSPEC_BEXT ; Used in aarch64-sve2.md. | |
909 | UNSPEC_BGRP ; Used in aarch64-sve2.md. | |
910 | UNSPEC_CADD270 ; Used in aarch64-sve2.md. | |
911 | UNSPEC_CADD90 ; Used in aarch64-sve2.md. | |
912 | UNSPEC_CDOT ; Used in aarch64-sve2.md. | |
913 | UNSPEC_CDOT180 ; Used in aarch64-sve2.md. | |
914 | UNSPEC_CDOT270 ; Used in aarch64-sve2.md. | |
915 | UNSPEC_CDOT90 ; Used in aarch64-sve2.md. | |
916 | UNSPEC_CMLA ; Used in aarch64-sve2.md. | |
917 | UNSPEC_CMLA180 ; Used in aarch64-sve2.md. | |
918 | UNSPEC_CMLA270 ; Used in aarch64-sve2.md. | |
919 | UNSPEC_CMLA90 ; Used in aarch64-sve2.md. | |
ad260343 TC |
920 | UNSPEC_CMLA_CONJ ; Used in aarch64-sve2.md. |
921 | UNSPEC_CMLA180_CONJ ; Used in aarch64-sve2.md. | |
922 | UNSPEC_CMUL ; Used in aarch64-sve2.md. | |
923 | UNSPEC_CMUL_CONJ ; Used in aarch64-sve2.md. | |
c1c267df | 924 | UNSPEC_CNTP_C ; Used in aarch64-sve2.md. |
0a09a948 RS |
925 | UNSPEC_COND_FCVTLT ; Used in aarch64-sve2.md. |
926 | UNSPEC_COND_FCVTNT ; Used in aarch64-sve2.md. | |
927 | UNSPEC_COND_FCVTX ; Used in aarch64-sve2.md. | |
928 | UNSPEC_COND_FCVTXNT ; Used in aarch64-sve2.md. | |
929 | UNSPEC_COND_FLOGB ; Used in aarch64-sve2.md. | |
930 | UNSPEC_EORBT ; Used in aarch64-sve2.md. | |
931 | UNSPEC_EORTB ; Used in aarch64-sve2.md. | |
932 | UNSPEC_FADDP ; Used in aarch64-sve2.md. | |
933 | UNSPEC_FMAXNMP ; Used in aarch64-sve2.md. | |
934 | UNSPEC_FMAXP ; Used in aarch64-sve2.md. | |
935 | UNSPEC_FMINNMP ; Used in aarch64-sve2.md. | |
936 | UNSPEC_FMINP ; Used in aarch64-sve2.md. | |
937 | UNSPEC_FMLALB ; Used in aarch64-sve2.md. | |
938 | UNSPEC_FMLALT ; Used in aarch64-sve2.md. | |
939 | UNSPEC_FMLSLB ; Used in aarch64-sve2.md. | |
940 | UNSPEC_FMLSLT ; Used in aarch64-sve2.md. | |
941 | UNSPEC_HISTCNT ; Used in aarch64-sve2.md. | |
942 | UNSPEC_HISTSEG ; Used in aarch64-sve2.md. | |
9f0f7d80 RS |
943 | UNSPEC_LD1_COUNT ; Used in aarch64-sve2.md. |
944 | UNSPEC_LDNT1_COUNT ; Used in aarch64-sve2.md. | |
0a09a948 RS |
945 | UNSPEC_MATCH ; Used in aarch64-sve2.md. |
946 | UNSPEC_NMATCH ; Used in aarch64-sve2.md. | |
c1c267df RS |
947 | UNSPEC_PEXT ; Used in aarch64-sve2.md. |
948 | UNSPEC_PEXTx2 ; Used in aarch64-sve2.md. | |
0a09a948 RS |
949 | UNSPEC_PMULLB ; Used in aarch64-sve2.md. |
950 | UNSPEC_PMULLB_PAIR ; Used in aarch64-sve2.md. | |
951 | UNSPEC_PMULLT ; Used in aarch64-sve2.md. | |
952 | UNSPEC_PMULLT_PAIR ; Used in aarch64-sve2.md. | |
c1c267df RS |
953 | UNSPEC_PSEL ; Used in aarch64-sve2.md. |
954 | UNSPEC_PTRUE_C ; Used in aarch64-sve2.md. | |
0a09a948 RS |
955 | UNSPEC_RADDHNB ; Used in aarch64-sve2.md. |
956 | UNSPEC_RADDHNT ; Used in aarch64-sve2.md. | |
957 | UNSPEC_RSHRNB ; Used in aarch64-sve2.md. | |
958 | UNSPEC_RSHRNT ; Used in aarch64-sve2.md. | |
959 | UNSPEC_RSUBHNB ; Used in aarch64-sve2.md. | |
960 | UNSPEC_RSUBHNT ; Used in aarch64-sve2.md. | |
961 | UNSPEC_SABDLB ; Used in aarch64-sve2.md. | |
962 | UNSPEC_SABDLT ; Used in aarch64-sve2.md. | |
963 | UNSPEC_SADDLB ; Used in aarch64-sve2.md. | |
964 | UNSPEC_SADDLBT ; Used in aarch64-sve2.md. | |
965 | UNSPEC_SADDLT ; Used in aarch64-sve2.md. | |
966 | UNSPEC_SADDWB ; Used in aarch64-sve2.md. | |
967 | UNSPEC_SADDWT ; Used in aarch64-sve2.md. | |
968 | UNSPEC_SBCLB ; Used in aarch64-sve2.md. | |
969 | UNSPEC_SBCLT ; Used in aarch64-sve2.md. | |
970 | UNSPEC_SHRNB ; Used in aarch64-sve2.md. | |
971 | UNSPEC_SHRNT ; Used in aarch64-sve2.md. | |
972 | UNSPEC_SLI ; Used in aarch64-sve2.md. | |
973 | UNSPEC_SMAXP ; Used in aarch64-sve2.md. | |
974 | UNSPEC_SMINP ; Used in aarch64-sve2.md. | |
58cc9876 | 975 | UNSPEC_SMULHRS ; Used in aarch64-sve2.md. |
0a09a948 RS |
976 | UNSPEC_SMULHS ; Used in aarch64-sve2.md. |
977 | UNSPEC_SMULLB ; Used in aarch64-sve2.md. | |
978 | UNSPEC_SMULLT ; Used in aarch64-sve2.md. | |
979 | UNSPEC_SQCADD270 ; Used in aarch64-sve2.md. | |
980 | UNSPEC_SQCADD90 ; Used in aarch64-sve2.md. | |
981 | UNSPEC_SQDMULLB ; Used in aarch64-sve2.md. | |
982 | UNSPEC_SQDMULLBT ; Used in aarch64-sve2.md. | |
983 | UNSPEC_SQDMULLT ; Used in aarch64-sve2.md. | |
984 | UNSPEC_SQRDCMLAH ; Used in aarch64-sve2.md. | |
985 | UNSPEC_SQRDCMLAH180 ; Used in aarch64-sve2.md. | |
986 | UNSPEC_SQRDCMLAH270 ; Used in aarch64-sve2.md. | |
987 | UNSPEC_SQRDCMLAH90 ; Used in aarch64-sve2.md. | |
c1c267df RS |
988 | UNSPEC_SQRSHR ; Used in aarch64-sve2.md. |
989 | UNSPEC_SQRSHRN ; Used in aarch64-sve2.md. | |
0a09a948 RS |
990 | UNSPEC_SQRSHRNB ; Used in aarch64-sve2.md. |
991 | UNSPEC_SQRSHRNT ; Used in aarch64-sve2.md. | |
c1c267df RS |
992 | UNSPEC_SQRSHRU ; Used in aarch64-sve2.md. |
993 | UNSPEC_SQRSHRUN ; Used in aarch64-sve2.md. | |
0a09a948 RS |
994 | UNSPEC_SQRSHRUNB ; Used in aarch64-sve2.md. |
995 | UNSPEC_SQRSHRUNT ; Used in aarch64-sve2.md. | |
996 | UNSPEC_SQSHRNB ; Used in aarch64-sve2.md. | |
997 | UNSPEC_SQSHRNT ; Used in aarch64-sve2.md. | |
998 | UNSPEC_SQSHRUNB ; Used in aarch64-sve2.md. | |
999 | UNSPEC_SQSHRUNT ; Used in aarch64-sve2.md. | |
1000 | UNSPEC_SQXTNB ; Used in aarch64-sve2.md. | |
1001 | UNSPEC_SQXTNT ; Used in aarch64-sve2.md. | |
1002 | UNSPEC_SQXTUNB ; Used in aarch64-sve2.md. | |
1003 | UNSPEC_SQXTUNT ; Used in aarch64-sve2.md. | |
1004 | UNSPEC_SRI ; Used in aarch64-sve2.md. | |
1005 | UNSPEC_SSHLLB ; Used in aarch64-sve2.md. | |
1006 | UNSPEC_SSHLLT ; Used in aarch64-sve2.md. | |
1007 | UNSPEC_SSUBLB ; Used in aarch64-sve2.md. | |
1008 | UNSPEC_SSUBLBT ; Used in aarch64-sve2.md. | |
1009 | UNSPEC_SSUBLT ; Used in aarch64-sve2.md. | |
1010 | UNSPEC_SSUBLTB ; Used in aarch64-sve2.md. | |
1011 | UNSPEC_SSUBWB ; Used in aarch64-sve2.md. | |
1012 | UNSPEC_SSUBWT ; Used in aarch64-sve2.md. | |
9f0f7d80 RS |
1013 | UNSPEC_ST1_COUNT ; Used in aarch64-sve2.md. |
1014 | UNSPEC_STNT1_COUNT ; Used in aarch64-sve2.md. | |
0a09a948 RS |
1015 | UNSPEC_SUBHNB ; Used in aarch64-sve2.md. |
1016 | UNSPEC_SUBHNT ; Used in aarch64-sve2.md. | |
1017 | UNSPEC_TBL2 ; Used in aarch64-sve2.md. | |
1018 | UNSPEC_UABDLB ; Used in aarch64-sve2.md. | |
1019 | UNSPEC_UABDLT ; Used in aarch64-sve2.md. | |
1020 | UNSPEC_UADDLB ; Used in aarch64-sve2.md. | |
1021 | UNSPEC_UADDLT ; Used in aarch64-sve2.md. | |
1022 | UNSPEC_UADDWB ; Used in aarch64-sve2.md. | |
1023 | UNSPEC_UADDWT ; Used in aarch64-sve2.md. | |
1024 | UNSPEC_UMAXP ; Used in aarch64-sve2.md. | |
1025 | UNSPEC_UMINP ; Used in aarch64-sve2.md. | |
58cc9876 | 1026 | UNSPEC_UMULHRS ; Used in aarch64-sve2.md. |
0a09a948 RS |
1027 | UNSPEC_UMULHS ; Used in aarch64-sve2.md. |
1028 | UNSPEC_UMULLB ; Used in aarch64-sve2.md. | |
1029 | UNSPEC_UMULLT ; Used in aarch64-sve2.md. | |
c1c267df RS |
1030 | UNSPEC_UQRSHR ; Used in aarch64-sve2.md. |
1031 | UNSPEC_UQRSHRN ; Used in aarch64-sve2.md. | |
0a09a948 RS |
1032 | UNSPEC_UQRSHRNB ; Used in aarch64-sve2.md. |
1033 | UNSPEC_UQRSHRNT ; Used in aarch64-sve2.md. | |
1034 | UNSPEC_UQSHRNB ; Used in aarch64-sve2.md. | |
1035 | UNSPEC_UQSHRNT ; Used in aarch64-sve2.md. | |
1036 | UNSPEC_UQXTNB ; Used in aarch64-sve2.md. | |
1037 | UNSPEC_UQXTNT ; Used in aarch64-sve2.md. | |
1038 | UNSPEC_USHLLB ; Used in aarch64-sve2.md. | |
1039 | UNSPEC_USHLLT ; Used in aarch64-sve2.md. | |
1040 | UNSPEC_USUBLB ; Used in aarch64-sve2.md. | |
1041 | UNSPEC_USUBLT ; Used in aarch64-sve2.md. | |
1042 | UNSPEC_USUBWB ; Used in aarch64-sve2.md. | |
1043 | UNSPEC_USUBWT ; Used in aarch64-sve2.md. | |
8c197c85 | 1044 | UNSPEC_USDOT ; Used in aarch64-simd.md. |
c1c267df RS |
1045 | UNSPEC_UZP ; Used in aarch64-sve2.md. |
1046 | UNSPEC_UZPQ ; Used in aarch64-sve2.md. | |
1047 | UNSPEC_ZIP ; Used in aarch64-sve2.md. | |
1048 | UNSPEC_ZIPQ ; Used in aarch64-sve2.md. | |
8c197c85 | 1049 | UNSPEC_SUDOT ; Used in aarch64-simd.md. |
f275d73a | 1050 | UNSPEC_BFDOT ; Used in aarch64-simd.md. |
896dff99 RS |
1051 | UNSPEC_BFMLALB ; Used in aarch64-sve.md. |
1052 | UNSPEC_BFMLALT ; Used in aarch64-sve.md. | |
c1c267df RS |
1053 | UNSPEC_BFMLSLB ; Used in aarch64-sve.md. |
1054 | UNSPEC_BFMLSLT ; Used in aarch64-sve.md. | |
896dff99 | 1055 | UNSPEC_BFMMLA ; Used in aarch64-sve.md. |
1f520d34 DB |
1056 | UNSPEC_BFCVTN ; Used in aarch64-simd.md. |
1057 | UNSPEC_BFCVTN2 ; Used in aarch64-simd.md. | |
1058 | UNSPEC_BFCVT ; Used in aarch64-simd.md. | |
8456a4cd | 1059 | UNSPEC_FCVTXN ; Used in aarch64-simd.md. |
bfefed6c SJ |
1060 | UNSPEC_FAMAX ; Used in aarch64-simd.md. |
1061 | UNSPEC_FAMIN ; Used in aarch64-simd.md. | |
4f6ab953 | 1062 | |
c1c267df RS |
1063 | ;; All used in aarch64-sve2.md |
1064 | UNSPEC_FCVTN | |
1065 | UNSPEC_FDOT | |
1066 | UNSPEC_SQCVT | |
1067 | UNSPEC_SQCVTN | |
1068 | UNSPEC_SQCVTU | |
1069 | UNSPEC_SQCVTUN | |
1070 | UNSPEC_UQCVT | |
1071 | UNSPEC_UQCVTN | |
1072 | ||
4f6ab953 | 1073 | ;; All used in aarch64-sme.md |
c1c267df RS |
1074 | UNSPEC_SME_ADD |
1075 | UNSPEC_SME_ADD_WRITE | |
4f6ab953 RS |
1076 | UNSPEC_SME_ADDHA |
1077 | UNSPEC_SME_ADDVA | |
c1c267df RS |
1078 | UNSPEC_SME_BMOPA |
1079 | UNSPEC_SME_BMOPS | |
1080 | UNSPEC_SME_FADD | |
1081 | UNSPEC_SME_FDOT | |
1082 | UNSPEC_SME_FVDOT | |
1083 | UNSPEC_SME_FMLA | |
1084 | UNSPEC_SME_FMLS | |
4f6ab953 RS |
1085 | UNSPEC_SME_FMOPA |
1086 | UNSPEC_SME_FMOPS | |
c1c267df | 1087 | UNSPEC_SME_FSUB |
4f6ab953 RS |
1088 | UNSPEC_SME_LD1_HOR |
1089 | UNSPEC_SME_LD1_VER | |
c1c267df | 1090 | UNSPEC_SME_READ |
4f6ab953 RS |
1091 | UNSPEC_SME_READ_HOR |
1092 | UNSPEC_SME_READ_VER | |
c1c267df RS |
1093 | UNSPEC_SME_SDOT |
1094 | UNSPEC_SME_SVDOT | |
1095 | UNSPEC_SME_SMLA | |
1096 | UNSPEC_SME_SMLS | |
4f6ab953 RS |
1097 | UNSPEC_SME_SMOPA |
1098 | UNSPEC_SME_SMOPS | |
1099 | UNSPEC_SME_ST1_HOR | |
1100 | UNSPEC_SME_ST1_VER | |
c1c267df RS |
1101 | UNSPEC_SME_SUB |
1102 | UNSPEC_SME_SUB_WRITE | |
1103 | UNSPEC_SME_SUDOT | |
1104 | UNSPEC_SME_SUVDOT | |
4f6ab953 RS |
1105 | UNSPEC_SME_SUMOPA |
1106 | UNSPEC_SME_SUMOPS | |
c1c267df RS |
1107 | UNSPEC_SME_UDOT |
1108 | UNSPEC_SME_UVDOT | |
1109 | UNSPEC_SME_UMLA | |
1110 | UNSPEC_SME_UMLS | |
4f6ab953 RS |
1111 | UNSPEC_SME_UMOPA |
1112 | UNSPEC_SME_UMOPS | |
c1c267df RS |
1113 | UNSPEC_SME_USDOT |
1114 | UNSPEC_SME_USVDOT | |
4f6ab953 RS |
1115 | UNSPEC_SME_USMOPA |
1116 | UNSPEC_SME_USMOPS | |
c1c267df | 1117 | UNSPEC_SME_WRITE |
4f6ab953 RS |
1118 | UNSPEC_SME_WRITE_HOR |
1119 | UNSPEC_SME_WRITE_VER | |
43e9d192 IB |
1120 | ]) |
1121 | ||
d81cb613 MW |
1122 | ;; ------------------------------------------------------------------ |
1123 | ;; Unspec enumerations for Atomics. They are here so that they can be | |
1124 | ;; used in the int_iterators for atomic operations. | |
1125 | ;; ------------------------------------------------------------------ | |
1126 | ||
1127 | (define_c_enum "unspecv" | |
1128 | [ | |
1129 | UNSPECV_LX ; Represent a load-exclusive. | |
1130 | UNSPECV_SX ; Represent a store-exclusive. | |
1131 | UNSPECV_LDA ; Represent an atomic load or load-acquire. | |
0431e8ae | 1132 | UNSPECV_LDAP ; Represent an atomic acquire load with RCpc semantics. |
d81cb613 MW |
1133 | UNSPECV_STL ; Represent an atomic store or store-release. |
1134 | UNSPECV_ATOMIC_CMPSW ; Represent an atomic compare swap. | |
1135 | UNSPECV_ATOMIC_EXCHG ; Represent an atomic exchange. | |
1136 | UNSPECV_ATOMIC_CAS ; Represent an atomic CAS. | |
1137 | UNSPECV_ATOMIC_SWP ; Represent an atomic SWP. | |
1138 | UNSPECV_ATOMIC_OP ; Represent an atomic operation. | |
d81cb613 MW |
1139 | UNSPECV_ATOMIC_LDOP_OR ; Represent an atomic load-or |
1140 | UNSPECV_ATOMIC_LDOP_BIC ; Represent an atomic load-bic | |
1141 | UNSPECV_ATOMIC_LDOP_XOR ; Represent an atomic load-xor | |
1142 | UNSPECV_ATOMIC_LDOP_PLUS ; Represent an atomic load-add | |
1143 | ]) | |
1144 | ||
43e9d192 IB |
1145 | ;; ------------------------------------------------------------------- |
1146 | ;; Mode attributes | |
1147 | ;; ------------------------------------------------------------------- | |
1148 | ||
865257c4 RS |
1149 | ;; "e" for signaling operations, "" for quiet operations. |
1150 | (define_mode_attr e [(CCFP "") (CCFPE "e")]) | |
1151 | ||
43e9d192 IB |
1152 | ;; In GPI templates, a string like "%<w>0" will expand to "%w0" in the |
1153 | ;; 32-bit version and "%x0" in the 64-bit version. | |
1154 | (define_mode_attr w [(QI "w") (HI "w") (SI "w") (DI "x") (SF "s") (DF "d")]) | |
1155 | ||
db46a2e6 JG |
1156 | ;; The size of access, in bytes. |
1157 | (define_mode_attr ldst_sz [(SI "4") (DI "8")]) | |
1158 | ;; Likewise for load/store pair. | |
1159 | (define_mode_attr ldpstp_sz [(SI "8") (DI "16")]) | |
1160 | ||
85279b0b VDN |
1161 | ;; Size of element access for STP/LDP-generated vectors. |
1162 | (define_mode_attr ldpstp_vel_sz [(V2SI "8") (V2SF "8") (V2DI "16") (V2DF "16")]) | |
1163 | ||
0d35c5c2 | 1164 | ;; For inequal width int to float conversion |
d7f33f07 JW |
1165 | (define_mode_attr w1 [(HF "w") (SF "w") (DF "x")]) |
1166 | (define_mode_attr w2 [(HF "x") (SF "x") (DF "w")]) | |
0d35c5c2 | 1167 | |
22be0d08 MC |
1168 | ;; For width of fp registers in fcvt instruction |
1169 | (define_mode_attr fpw [(DI "s") (SI "d")]) | |
1170 | ||
2b8568fe KT |
1171 | (define_mode_attr short_mask [(HI "65535") (QI "255")]) |
1172 | ||
b747f54a KT |
1173 | (define_mode_attr half_mask [(HI "255") (SI "65535") (DI "4294967295")]) |
1174 | ||
051d0e2f SN |
1175 | ;; For constraints used in scalar immediate vector moves |
1176 | (define_mode_attr hq [(HI "h") (QI "q")]) | |
1177 | ||
ef22810a RH |
1178 | ;; For doubling width of an integer mode |
1179 | (define_mode_attr DWI [(QI "HI") (HI "SI") (SI "DI") (DI "TI")]) | |
1180 | ||
22be0d08 MC |
1181 | (define_mode_attr fcvt_change_mode [(SI "df") (DI "sf")]) |
1182 | ||
1183 | (define_mode_attr FCVT_CHANGE_MODE [(SI "DF") (DI "SF")]) | |
1184 | ||
43e9d192 IB |
1185 | ;; For scalar usage of vector/FP registers |
1186 | (define_mode_attr v [(QI "b") (HI "h") (SI "s") (DI "d") | |
d7f33f07 | 1187 | (HF "h") (SF "s") (DF "d") |
43e9d192 IB |
1188 | (V8QI "") (V16QI "") |
1189 | (V4HI "") (V8HI "") | |
1190 | (V2SI "") (V4SI "") | |
1191 | (V2DI "") (V2SF "") | |
daef0a8c JW |
1192 | (V4SF "") (V4HF "") |
1193 | (V8HF "") (V2DF "")]) | |
43e9d192 IB |
1194 | |
1195 | ;; For scalar usage of vector/FP registers, narrowing | |
1196 | (define_mode_attr vn2 [(QI "") (HI "b") (SI "h") (DI "s") | |
1197 | (V8QI "") (V16QI "") | |
1198 | (V4HI "") (V8HI "") | |
1199 | (V2SI "") (V4SI "") | |
1200 | (V2DI "") (V2SF "") | |
1201 | (V4SF "") (V2DF "")]) | |
1202 | ||
1203 | ;; For scalar usage of vector/FP registers, widening | |
1204 | (define_mode_attr vw2 [(DI "") (QI "h") (HI "s") (SI "d") | |
1205 | (V8QI "") (V16QI "") | |
1206 | (V4HI "") (V8HI "") | |
1207 | (V2SI "") (V4SI "") | |
1208 | (V2DI "") (V2SF "") | |
1209 | (V4SF "") (V2DF "")]) | |
1210 | ||
89fdc743 IB |
1211 | ;; Register Type Name and Vector Arrangement Specifier for when |
1212 | ;; we are doing scalar for DI and SIMD for SI (ignoring all but | |
1213 | ;; lane 0). | |
1214 | (define_mode_attr rtn [(DI "d") (SI "")]) | |
1215 | (define_mode_attr vas [(DI "") (SI ".2s")]) | |
1216 | ||
7ac29c0f RS |
1217 | ;; Map a vector to the number of units in it, if the size of the mode |
1218 | ;; is constant. | |
1219 | (define_mode_attr nunits [(V8QI "8") (V16QI "16") | |
1220 | (V4HI "4") (V8HI "8") | |
1221 | (V2SI "2") (V4SI "4") | |
5ba864c5 | 1222 | (V1DI "1") (V2DI "2") |
7ac29c0f | 1223 | (V4HF "4") (V8HF "8") |
abbe1ed2 | 1224 | (V4BF "4") (V8BF "8") |
7ac29c0f RS |
1225 | (V2SF "2") (V4SF "4") |
1226 | (V1DF "1") (V2DF "2") | |
5ba864c5 | 1227 | (DI "1") (DF "1") |
a40c22c3 | 1228 | (V8DI "8")]) |
7ac29c0f | 1229 | |
b187677b RS |
1230 | ;; Map a mode to the number of bits in it, if the size of the mode |
1231 | ;; is constant. | |
1232 | (define_mode_attr bitsize [(V8QI "64") (V16QI "128") | |
1233 | (V4HI "64") (V8HI "128") | |
1234 | (V2SI "64") (V4SI "128") | |
1235 | (V2DI "128")]) | |
1236 | ||
22be0d08 MC |
1237 | ;; Map a floating point or integer mode to the appropriate register name prefix |
1238 | (define_mode_attr s [(HF "h") (SF "s") (DF "d") (SI "s") (DI "d")]) | |
43e9d192 IB |
1239 | |
1240 | ;; Give the length suffix letter for a sign- or zero-extension. | |
1241 | (define_mode_attr size [(QI "b") (HI "h") (SI "w")]) | |
1242 | ||
1243 | ;; Give the number of bits in the mode | |
1244 | (define_mode_attr sizen [(QI "8") (HI "16") (SI "32") (DI "64")]) | |
17ae956c TC |
1245 | (define_mode_attr ZEROM [(QI "SI") (HI "SI") (SI "SI") (DI "DI")]) |
1246 | (define_mode_attr zerom [(QI "si") (HI "si") (SI "si") (DI "di")]) | |
43e9d192 IB |
1247 | |
1248 | ;; Give the ordinal of the MSB in the mode | |
315fdae8 RE |
1249 | (define_mode_attr sizem1 [(QI "#7") (HI "#15") (SI "#31") (DI "#63") |
1250 | (HF "#15") (SF "#31") (DF "#63")]) | |
43e9d192 | 1251 | |
95eb5537 RS |
1252 | ;; The number of bits in a vector element, or controlled by a predicate |
1253 | ;; element. | |
d7a09c44 RS |
1254 | (define_mode_attr elem_bits [(VNx16BI "8") (VNx8BI "16") |
1255 | (VNx4BI "32") (VNx2BI "64") | |
4f6ab953 RS |
1256 | (VNx16QI "8") (VNx32QI "8") (VNx64QI "8") |
1257 | (VNx8HI "16") (VNx16HI "16") (VNx32HI "16") | |
1258 | (VNx8HF "16") (VNx16HF "16") (VNx32HF "16") | |
1259 | (VNx8BF "16") (VNx16BF "16") (VNx32BF "16") | |
1260 | (VNx4SI "32") (VNx8SI "32") (VNx16SI "32") | |
1261 | (VNx4SF "32") (VNx8SF "32") (VNx16SF "32") | |
1262 | (VNx2DI "64") (VNx4DI "64") (VNx8DI "64") | |
1263 | (VNx2DF "64") (VNx4DF "64") (VNx8DF "64") | |
1264 | (VNx1TI "128")]) | |
95eb5537 | 1265 | |
6c3ce63b RS |
1266 | ;; The number of bits in a vector container. |
1267 | (define_mode_attr container_bits [(VNx16QI "8") | |
1268 | (VNx8HI "16") (VNx8QI "16") (VNx8HF "16") | |
1269 | (VNx8BF "16") | |
1270 | (VNx4SI "32") (VNx4HI "32") (VNx4QI "32") | |
1271 | (VNx4SF "32") (VNx4HF "32") (VNx4BF "32") | |
1272 | (VNx2DI "64") (VNx2SI "64") (VNx2HI "64") | |
1273 | (VNx2QI "64") (VNx2DF "64") (VNx2SF "64") | |
1274 | (VNx2HF "64") (VNx2BF "64")]) | |
1275 | ||
43e9d192 IB |
1276 | ;; Attribute to describe constants acceptable in logical operations |
1277 | (define_mode_attr lconst [(SI "K") (DI "L")]) | |
1278 | ||
43fd192f MC |
1279 | ;; Attribute to describe constants acceptable in logical and operations |
1280 | (define_mode_attr lconst2 [(SI "UsO") (DI "UsP")]) | |
1281 | ||
43e9d192 IB |
1282 | ;; Map a mode to a specific constraint character. |
1283 | (define_mode_attr cmode [(QI "q") (HI "h") (SI "s") (DI "d")]) | |
1284 | ||
0603375c KT |
1285 | ;; Map modes to Usg and Usj constraints for SISD right shifts |
1286 | (define_mode_attr cmode_simd [(SI "g") (DI "j")]) | |
1287 | ||
43e9d192 IB |
1288 | (define_mode_attr Vtype [(V8QI "8b") (V16QI "16b") |
1289 | (V4HI "4h") (V8HI "8h") | |
8ea6c1b8 | 1290 | (V4BF "4h") (V8BF "8h") |
43e9d192 IB |
1291 | (V2SI "2s") (V4SI "4s") |
1292 | (DI "1d") (DF "1d") | |
1293 | (V2DI "2d") (V2SF "2s") | |
7c369485 | 1294 | (V4SF "4s") (V2DF "2d") |
66f206b8 JW |
1295 | (V4HF "4h") (V8HF "8h") |
1296 | (V2x8QI "8b") (V2x4HI "4h") | |
1297 | (V2x2SI "2s") (V2x1DI "1d") | |
1298 | (V2x4HF "4h") (V2x2SF "2s") | |
1299 | (V2x1DF "1d") (V2x4BF "4h") | |
1300 | (V2x16QI "16b") (V2x8HI "8h") | |
1301 | (V2x4SI "4s") (V2x2DI "2d") | |
1302 | (V2x8HF "8h") (V2x4SF "4s") | |
1303 | (V2x2DF "2d") (V2x8BF "8h") | |
1304 | (V3x8QI "8b") (V3x4HI "4h") | |
1305 | (V3x2SI "2s") (V3x1DI "1d") | |
1306 | (V3x4HF "4h") (V3x2SF "2s") | |
1307 | (V3x1DF "1d") (V3x4BF "4h") | |
1308 | (V3x16QI "16b") (V3x8HI "8h") | |
1309 | (V3x4SI "4s") (V3x2DI "2d") | |
1310 | (V3x8HF "8h") (V3x4SF "4s") | |
1311 | (V3x2DF "2d") (V3x8BF "8h") | |
1312 | (V4x8QI "8b") (V4x4HI "4h") | |
1313 | (V4x2SI "2s") (V4x1DI "1d") | |
1314 | (V4x4HF "4h") (V4x2SF "2s") | |
1315 | (V4x1DF "1d") (V4x4BF "4h") | |
1316 | (V4x16QI "16b") (V4x8HI "8h") | |
1317 | (V4x4SI "4s") (V4x2DI "2d") | |
1318 | (V4x8HF "8h") (V4x4SF "4s") | |
1319 | (V4x2DF "2d") (V4x8BF "8h")]) | |
43e9d192 | 1320 | |
0b839322 WD |
1321 | ;; Map mode to type used in widening multiplies. |
1322 | (define_mode_attr Vcondtype [(V4HI "4h") (V8HI "4h") (V2SI "2s") (V4SI "2s")]) | |
1323 | ||
1324 | ;; Map lane mode to name | |
1325 | (define_mode_attr Qlane [(V4HI "_v4hi") (V8HI "q_v4hi") | |
1326 | (V2SI "_v2si") (V4SI "q_v2si")]) | |
1327 | ||
c7f28cd5 KT |
1328 | (define_mode_attr Vrevsuff [(V4HI "16") (V8HI "16") (V2SI "32") |
1329 | (V4SI "32") (V2DI "64")]) | |
1330 | ||
43e9d192 IB |
1331 | (define_mode_attr Vmtype [(V8QI ".8b") (V16QI ".16b") |
1332 | (V4HI ".4h") (V8HI ".8h") | |
1333 | (V2SI ".2s") (V4SI ".4s") | |
71a11456 | 1334 | (V2DI ".2d") (V4HF ".4h") |
cf9c3bff RS |
1335 | (V8HF ".8h") (V4BF ".4h") |
1336 | (V8BF ".8h") (V2SF ".2s") | |
43e9d192 IB |
1337 | (V4SF ".4s") (V2DF ".2d") |
1338 | (DI "") (SI "") | |
1339 | (HI "") (QI "") | |
d7f33f07 JW |
1340 | (TI "") (HF "") |
1341 | (SF "") (DF "")]) | |
43e9d192 IB |
1342 | |
1343 | ;; Register suffix narrowed modes for VQN. | |
1344 | (define_mode_attr Vmntype [(V8HI ".8b") (V4SI ".4h") | |
1345 | (V2DI ".2s") | |
1346 | (DI "") (SI "") | |
1347 | (HI "")]) | |
1348 | ||
1349 | ;; Mode-to-individual element type mapping. | |
cc68f7c2 RS |
1350 | (define_mode_attr Vetype [(V8QI "b") (V16QI "b") |
1351 | (V4HI "h") (V8HI "h") | |
1352 | (V2SI "s") (V4SI "s") | |
1750c038 | 1353 | (V2DI "d") (V1DI "d") |
cc68f7c2 RS |
1354 | (V4HF "h") (V8HF "h") |
1355 | (V2SF "s") (V4SF "s") | |
1750c038 | 1356 | (V2DF "d") (V1DF "d") |
66f206b8 JW |
1357 | (V2x8QI "b") (V2x4HI "h") |
1358 | (V2x2SI "s") (V2x1DI "d") | |
1359 | (V2x4HF "h") (V2x2SF "s") | |
1360 | (V2x1DF "d") (V2x4BF "h") | |
1361 | (V2x16QI "b") (V2x8HI "h") | |
1362 | (V2x4SI "s") (V2x2DI "d") | |
1363 | (V2x8HF "h") (V2x4SF "s") | |
1364 | (V2x2DF "d") (V2x8BF "h") | |
1365 | (V3x8QI "b") (V3x4HI "h") | |
1366 | (V3x2SI "s") (V3x1DI "d") | |
1367 | (V3x4HF "h") (V3x2SF "s") | |
1368 | (V3x1DF "d") (V3x4BF "h") | |
1369 | (V3x16QI "b") (V3x8HI "h") | |
1370 | (V3x4SI "s") (V3x2DI "d") | |
1371 | (V3x8HF "h") (V3x4SF "s") | |
1372 | (V3x2DF "d") (V3x8BF "h") | |
1373 | (V4x8QI "b") (V4x4HI "h") | |
1374 | (V4x2SI "s") (V4x1DI "d") | |
1375 | (V4x4HF "h") (V4x2SF "s") | |
1376 | (V4x1DF "d") (V4x4BF "h") | |
1377 | (V4x16QI "b") (V4x8HI "h") | |
1378 | (V4x4SI "s") (V4x2DI "d") | |
1379 | (V4x8HF "h") (V4x4SF "s") | |
1380 | (V4x2DF "d") (V4x8BF "h") | |
cc68f7c2 RS |
1381 | (VNx16BI "b") (VNx8BI "h") (VNx4BI "s") (VNx2BI "d") |
1382 | (VNx16QI "b") (VNx8QI "b") (VNx4QI "b") (VNx2QI "b") | |
1383 | (VNx8HI "h") (VNx4HI "h") (VNx2HI "h") | |
1384 | (VNx8HF "h") (VNx4HF "h") (VNx2HF "h") | |
6c3ce63b | 1385 | (VNx8BF "h") (VNx4BF "h") (VNx2BF "h") |
cc68f7c2 RS |
1386 | (VNx4SI "s") (VNx2SI "s") |
1387 | (VNx4SF "s") (VNx2SF "s") | |
1388 | (VNx2DI "d") | |
1389 | (VNx2DF "d") | |
4f6ab953 | 1390 | (VNx1TI "q") |
c1c267df RS |
1391 | (VNx32QI "b") (VNx64QI "b") |
1392 | (VNx16HI "h") (VNx32HI "h") | |
1393 | (VNx16HF "h") (VNx32HF "h") | |
1394 | (VNx16BF "h") (VNx32BF "h") | |
1395 | (VNx8SI "s") (VNx16SI "s") | |
1396 | (VNx8SF "s") (VNx16SF "s") | |
1397 | (VNx4DI "d") (VNx8DI "d") | |
1398 | (VNx4DF "d") (VNx8DF "d") | |
8ea6c1b8 | 1399 | (BF "h") (V4BF "h") (V8BF "h") |
cc68f7c2 RS |
1400 | (HF "h") |
1401 | (SF "s") (DF "d") | |
1402 | (QI "b") (HI "h") | |
1403 | (SI "s") (DI "d")]) | |
43e9d192 | 1404 | |
9feeafd7 AM |
1405 | ;; Like Vetype, but map to types that are a quarter of the element size. |
1406 | (define_mode_attr Vetype_fourth [(VNx4SI "b") (VNx2DI "h")]) | |
1407 | ||
43cacb12 | 1408 | ;; Equivalent of "size" for a vector element. |
cc68f7c2 RS |
1409 | (define_mode_attr Vesize [(VNx16QI "b") (VNx8QI "b") (VNx4QI "b") (VNx2QI "b") |
1410 | (VNx8HI "h") (VNx4HI "h") (VNx2HI "h") | |
1411 | (VNx8HF "h") (VNx4HF "h") (VNx2HF "h") | |
6c3ce63b | 1412 | (VNx8BF "h") (VNx4BF "h") (VNx2BF "h") |
cc68f7c2 RS |
1413 | (VNx4SI "w") (VNx2SI "w") |
1414 | (VNx4SF "w") (VNx2SF "w") | |
1415 | (VNx2DI "d") | |
1416 | (VNx2DF "d") | |
4f6ab953 | 1417 | (VNx1TI "q") |
9f4cbab8 RS |
1418 | (VNx32QI "b") (VNx48QI "b") (VNx64QI "b") |
1419 | (VNx16HI "h") (VNx24HI "h") (VNx32HI "h") | |
1420 | (VNx16HF "h") (VNx24HF "h") (VNx32HF "h") | |
02fcd8ac | 1421 | (VNx16BF "h") (VNx24BF "h") (VNx32BF "h") |
9f4cbab8 RS |
1422 | (VNx8SI "w") (VNx12SI "w") (VNx16SI "w") |
1423 | (VNx8SF "w") (VNx12SF "w") (VNx16SF "w") | |
1424 | (VNx4DI "d") (VNx6DI "d") (VNx8DI "d") | |
1425 | (VNx4DF "d") (VNx6DF "d") (VNx8DF "d")]) | |
43cacb12 | 1426 | |
cc68f7c2 RS |
1427 | ;; The Z register suffix for an SVE mode's element container, i.e. the |
1428 | ;; Vetype of full SVE modes that have the same number of elements. | |
1429 | (define_mode_attr Vctype [(VNx16QI "b") (VNx8QI "h") (VNx4QI "s") (VNx2QI "d") | |
1430 | (VNx8HI "h") (VNx4HI "s") (VNx2HI "d") | |
1431 | (VNx8HF "h") (VNx4HF "s") (VNx2HF "d") | |
6c3ce63b | 1432 | (VNx8BF "h") (VNx4BF "s") (VNx2BF "d") |
cc68f7c2 RS |
1433 | (VNx4SI "s") (VNx2SI "d") |
1434 | (VNx4SF "s") (VNx2SF "d") | |
1435 | (VNx2DI "d") | |
1436 | (VNx2DF "d")]) | |
1437 | ||
6c3ce63b RS |
1438 | ;; The instruction mnemonic suffix for an SVE mode's element container, |
1439 | ;; i.e. the Vewtype of full SVE modes that have the same number of elements. | |
1440 | (define_mode_attr Vcwtype [(VNx16QI "b") (VNx8QI "h") (VNx4QI "w") (VNx2QI "d") | |
1441 | (VNx8HI "h") (VNx4HI "w") (VNx2HI "d") | |
1442 | (VNx8HF "h") (VNx4HF "w") (VNx2HF "d") | |
1443 | (VNx8BF "h") (VNx4BF "w") (VNx2BF "d") | |
1444 | (VNx4SI "w") (VNx2SI "d") | |
1445 | (VNx4SF "w") (VNx2SF "d") | |
1446 | (VNx2DI "d") | |
1447 | (VNx2DF "d")]) | |
1448 | ||
daef0a8c JW |
1449 | ;; Vetype is used everywhere in scheduling type and assembly output, |
1450 | ;; sometimes they are not the same, for example HF modes on some | |
1451 | ;; instructions. stype is defined to represent scheduling type | |
1452 | ;; more accurately. | |
1453 | (define_mode_attr stype [(V8QI "b") (V16QI "b") (V4HI "s") (V8HI "s") | |
1454 | (V2SI "s") (V4SI "s") (V2DI "d") (V4HF "s") | |
a40c22c3 | 1455 | (V8HF "s") (V2SF "s") (V4SF "s") (V2DF "d") |
daef0a8c JW |
1456 | (HF "s") (SF "s") (DF "d") (QI "b") (HI "s") |
1457 | (SI "s") (DI "d")]) | |
1458 | ||
43e9d192 IB |
1459 | ;; Mode-to-bitwise operation type mapping. |
1460 | (define_mode_attr Vbtype [(V8QI "8b") (V16QI "16b") | |
1461 | (V4HI "8b") (V8HI "16b") | |
1462 | (V2SI "8b") (V4SI "16b") | |
7c369485 AL |
1463 | (V2DI "16b") (V4HF "8b") |
1464 | (V8HF "16b") (V2SF "8b") | |
46e778c4 | 1465 | (V4SF "16b") (V2DF "16b") |
fe82d1f2 | 1466 | (DI "8b") (DF "8b") |
abbe1ed2 | 1467 | (SI "8b") (SF "8b") |
830460d6 | 1468 | (QI "8b") (HI "8b") |
abbe1ed2 | 1469 | (V4BF "8b") (V8BF "16b")]) |
43e9d192 | 1470 | |
66f206b8 JW |
1471 | ;; Advanced SIMD vector structure to element modes. |
1472 | (define_mode_attr VSTRUCT_ELT [(V2x8QI "V8QI") (V2x4HI "V4HI") | |
1473 | (V2x2SI "V2SI") (V2x1DI "DI") | |
1474 | (V2x4HF "V4HF") (V2x2SF "V2SF") | |
1475 | (V2x1DF "DF") (V2x4BF "V4BF") | |
1476 | (V3x8QI "V8QI") (V3x4HI "V4HI") | |
1477 | (V3x2SI "V2SI") (V3x1DI "DI") | |
1478 | (V3x4HF "V4HF") (V3x2SF "V2SF") | |
1479 | (V3x1DF "DF") (V3x4BF "V4BF") | |
1480 | (V4x8QI "V8QI") (V4x4HI "V4HI") | |
1481 | (V4x2SI "V2SI") (V4x1DI "DI") | |
1482 | (V4x4HF "V4HF") (V4x2SF "V2SF") | |
1483 | (V4x1DF "DF") (V4x4BF "V4BF") | |
1484 | (V2x16QI "V16QI") (V2x8HI "V8HI") | |
1485 | (V2x4SI "V4SI") (V2x2DI "V2DI") | |
1486 | (V2x8HF "V8HF") (V2x4SF "V4SF") | |
1487 | (V2x2DF "V2DF") (V2x8BF "V8BF") | |
1488 | (V3x16QI "V16QI") (V3x8HI "V8HI") | |
1489 | (V3x4SI "V4SI") (V3x2DI "V2DI") | |
1490 | (V3x8HF "V8HF") (V3x4SF "V4SF") | |
1491 | (V3x2DF "V2DF") (V3x8BF "V8BF") | |
1492 | (V4x16QI "V16QI") (V4x8HI "V8HI") | |
1493 | (V4x4SI "V4SI") (V4x2DI "V2DI") | |
1494 | (V4x8HF "V8HF") (V4x4SF "V4SF") | |
1495 | (V4x2DF "V2DF") (V4x8BF "V8BF")]) | |
1496 | ||
1497 | ;; Advanced SIMD vector structure to element modes in lower case. | |
1498 | (define_mode_attr vstruct_elt [(V2x8QI "v8qi") (V2x4HI "v4hi") | |
1499 | (V2x2SI "v2si") (V2x1DI "di") | |
1500 | (V2x4HF "v4hf") (V2x2SF "v2sf") | |
1501 | (V2x1DF "df") (V2x4BF "v4bf") | |
1502 | (V3x8QI "v8qi") (V3x4HI "v4hi") | |
1503 | (V3x2SI "v2si") (V3x1DI "di") | |
1504 | (V3x4HF "v4hf") (V3x2SF "v2sf") | |
1505 | (V3x1DF "df") (V3x4BF "v4bf") | |
1506 | (V4x8QI "v8qi") (V4x4HI "v4hi") | |
1507 | (V4x2SI "v2si") (V4x1DI "di") | |
1508 | (V4x4HF "v4hf") (V4x2SF "v2sf") | |
1509 | (V4x1DF "df") (V4x4BF "v4bf") | |
1510 | (V2x16QI "v16qi") (V2x8HI "v8hi") | |
1511 | (V2x4SI "v4si") (V2x2DI "v2di") | |
1512 | (V2x8HF "v8hf") (V2x4SF "v4sf") | |
1513 | (V2x2DF "v2df") (V2x8BF "v8bf") | |
1514 | (V3x16QI "v16qi") (V3x8HI "v8hi") | |
1515 | (V3x4SI "v4si") (V3x2DI "v2di") | |
1516 | (V3x8HF "v8hf") (V3x4SF "v4sf") | |
1517 | (V3x2DF "v2df") (V3x8BF "v8bf") | |
1518 | (V4x16QI "v16qi") (V4x8HI "v8hi") | |
1519 | (V4x4SI "v4si") (V4x2DI "v2di") | |
1520 | (V4x8HF "v8hf") (V4x4SF "v4sf") | |
1521 | (V4x2DF "v2df") (V4x8BF "v8bf")]) | |
1522 | ||
43e9d192 | 1523 | ;; Define element mode for each vector mode. |
cc68f7c2 RS |
1524 | (define_mode_attr VEL [(V8QI "QI") (V16QI "QI") |
1525 | (V4HI "HI") (V8HI "HI") | |
1526 | (V2SI "SI") (V4SI "SI") | |
1750c038 VDN |
1527 | (DI "DI") (V1DI "DI") |
1528 | (V2DI "DI") | |
cc68f7c2 RS |
1529 | (V4HF "HF") (V8HF "HF") |
1530 | (V2SF "SF") (V4SF "SF") | |
1750c038 VDN |
1531 | (DF "DF") (V1DF "DF") |
1532 | (V2DF "DF") | |
a40c22c3 TC |
1533 | (SI "SI") (HI "HI") |
1534 | (QI "QI") | |
8ea6c1b8 | 1535 | (V4BF "BF") (V8BF "BF") |
cc68f7c2 RS |
1536 | (VNx16QI "QI") (VNx8QI "QI") (VNx4QI "QI") (VNx2QI "QI") |
1537 | (VNx8HI "HI") (VNx4HI "HI") (VNx2HI "HI") | |
1538 | (VNx8HF "HF") (VNx4HF "HF") (VNx2HF "HF") | |
6c3ce63b | 1539 | (VNx8BF "BF") (VNx4BF "BF") (VNx2BF "BF") |
cc68f7c2 RS |
1540 | (VNx4SI "SI") (VNx2SI "SI") |
1541 | (VNx4SF "SF") (VNx2SF "SF") | |
1542 | (VNx2DI "DI") | |
1543 | (VNx2DF "DF")]) | |
43e9d192 | 1544 | |
ff03930a | 1545 | ;; Define element mode for each vector mode (lower case). |
cc68f7c2 RS |
1546 | (define_mode_attr Vel [(V8QI "qi") (V16QI "qi") |
1547 | (V4HI "hi") (V8HI "hi") | |
1548 | (V2SI "si") (V4SI "si") | |
1750c038 VDN |
1549 | (DI "di") (V1DI "si") |
1550 | (V2DI "di") | |
cc68f7c2 RS |
1551 | (V4HF "hf") (V8HF "hf") |
1552 | (V2SF "sf") (V4SF "sf") | |
1750c038 VDN |
1553 | (V1DF "df") (V2DF "df") |
1554 | (DF "df") (SI "si") | |
1555 | (HI "hi") (QI "qi") | |
8ea6c1b8 | 1556 | (V4BF "bf") (V8BF "bf") |
cc68f7c2 RS |
1557 | (VNx16QI "qi") (VNx8QI "qi") (VNx4QI "qi") (VNx2QI "qi") |
1558 | (VNx8HI "hi") (VNx4HI "hi") (VNx2HI "hi") | |
1559 | (VNx8HF "hf") (VNx4HF "hf") (VNx2HF "hf") | |
6c3ce63b | 1560 | (VNx8BF "bf") (VNx4BF "bf") (VNx2BF "bf") |
cc68f7c2 RS |
1561 | (VNx4SI "si") (VNx2SI "si") |
1562 | (VNx4SF "sf") (VNx2SF "sf") | |
1563 | (VNx2DI "di") | |
1564 | (VNx2DF "df")]) | |
ff03930a | 1565 | |
43cacb12 RS |
1566 | ;; Element mode with floating-point values replaced by like-sized integers. |
1567 | (define_mode_attr VEL_INT [(VNx16QI "QI") | |
02fcd8ac | 1568 | (VNx8HI "HI") (VNx8HF "HI") (VNx8BF "HI") |
43cacb12 RS |
1569 | (VNx4SI "SI") (VNx4SF "SI") |
1570 | (VNx2DI "DI") (VNx2DF "DI")]) | |
1571 | ||
1572 | ;; Gives the mode of the 128-bit lowpart of an SVE vector. | |
1573 | (define_mode_attr V128 [(VNx16QI "V16QI") | |
02fcd8ac | 1574 | (VNx8HI "V8HI") (VNx8HF "V8HF") (VNx8BF "V8BF") |
43cacb12 RS |
1575 | (VNx4SI "V4SI") (VNx4SF "V4SF") |
1576 | (VNx2DI "V2DI") (VNx2DF "V2DF")]) | |
1577 | ||
1578 | ;; ...and again in lower case. | |
1579 | (define_mode_attr v128 [(VNx16QI "v16qi") | |
02fcd8ac | 1580 | (VNx8HI "v8hi") (VNx8HF "v8hf") (VNx8BF "v8bf") |
43cacb12 RS |
1581 | (VNx4SI "v4si") (VNx4SF "v4sf") |
1582 | (VNx2DI "v2di") (VNx2DF "v2df")]) | |
1583 | ||
c69db3ef KT |
1584 | (define_mode_attr vnx [(V4SI "vnx4si") (V2DI "vnx2di")]) |
1585 | ||
278821f2 KT |
1586 | ;; 64-bit container modes the inner or scalar source mode. |
1587 | (define_mode_attr VCOND [(HI "V4HI") (SI "V2SI") | |
1588 | (V4HI "V4HI") (V8HI "V4HI") | |
b7d7d917 TB |
1589 | (V2SI "V2SI") (V4SI "V2SI") |
1590 | (DI "DI") (V2DI "DI") | |
28de75d2 | 1591 | (V4HF "V4HF") (V8HF "V4HF") |
b7d7d917 TB |
1592 | (V2SF "V2SF") (V4SF "V2SF") |
1593 | (V2DF "DF")]) | |
1594 | ||
278821f2 | 1595 | ;; 128-bit container modes the inner or scalar source mode. |
b7d7d917 TB |
1596 | (define_mode_attr VCONQ [(V8QI "V16QI") (V16QI "V16QI") |
1597 | (V4HI "V8HI") (V8HI "V8HI") | |
1598 | (V2SI "V4SI") (V4SI "V4SI") | |
1599 | (DI "V2DI") (V2DI "V2DI") | |
71a11456 | 1600 | (V4HF "V8HF") (V8HF "V8HF") |
28de75d2 | 1601 | (V2SF "V4SF") (V4SF "V4SF") |
b7d7d917 | 1602 | (V2DF "V2DF") (SI "V4SI") |
f2b23a59 TC |
1603 | (HI "V8HI") (QI "V16QI") |
1604 | (SF "V4SF") (DF "V2DF")]) | |
b7d7d917 | 1605 | |
43e9d192 IB |
1606 | ;; Half modes of all vector modes. |
1607 | (define_mode_attr VHALF [(V8QI "V4QI") (V16QI "V8QI") | |
1608 | (V4HI "V2HI") (V8HI "V4HI") | |
1609 | (V2SI "SI") (V4SI "V2SI") | |
1610 | (V2DI "DI") (V2SF "SF") | |
71a11456 | 1611 | (V4SF "V2SF") (V4HF "V2HF") |
abbe1ed2 SMW |
1612 | (V8HF "V4HF") (V2DF "DF") |
1613 | (V8BF "V4BF")]) | |
43e9d192 | 1614 | |
b1b49824 MC |
1615 | ;; Half modes of all vector modes, in lower-case. |
1616 | (define_mode_attr Vhalf [(V8QI "v4qi") (V16QI "v8qi") | |
1617 | (V4HI "v2hi") (V8HI "v4hi") | |
abbe1ed2 | 1618 | (V8HF "v4hf") (V8BF "v4bf") |
b1b49824 MC |
1619 | (V2SI "si") (V4SI "v2si") |
1620 | (V2DI "di") (V2SF "sf") | |
1621 | (V4SF "v2sf") (V2DF "df")]) | |
1622 | ||
5ba864c5 AC |
1623 | ;; Single-element half modes of quad vector modes. |
1624 | (define_mode_attr V1HALF [(V2DI "V1DI") (V2DF "V1DF")]) | |
1625 | ||
1626 | ;; Single-element half modes of quad vector modes, in lower-case | |
1627 | (define_mode_attr V1half [(V2DI "v1di") (V2DF "v1df")]) | |
1628 | ||
43e9d192 IB |
1629 | ;; Double modes of vector modes. |
1630 | (define_mode_attr VDBL [(V8QI "V16QI") (V4HI "V8HI") | |
e603cd43 | 1631 | (V4HF "V8HF") (V4BF "V8BF") |
43e9d192 | 1632 | (V2SI "V4SI") (V2SF "V4SF") |
83d7e720 RS |
1633 | (SI "V2SI") (SF "V2SF") |
1634 | (DI "V2DI") (DF "V2DF")]) | |
43e9d192 | 1635 | |
d7ee988c AC |
1636 | ;; Load/store pair mode. |
1637 | (define_mode_attr VPAIR [(SI "V2x4QI") (DI "V2x8QI")]) | |
1638 | ||
922f9c25 AL |
1639 | ;; Register suffix for double-length mode. |
1640 | (define_mode_attr Vdtype [(V4HF "8h") (V2SF "4s")]) | |
1641 | ||
43e9d192 IB |
1642 | ;; Double modes of vector modes (lower case). |
1643 | (define_mode_attr Vdbl [(V8QI "v16qi") (V4HI "v8hi") | |
e603cd43 | 1644 | (V4HF "v8hf") (V4BF "v8bf") |
43e9d192 | 1645 | (V2SI "v4si") (V2SF "v4sf") |
8b033a8a SN |
1646 | (SI "v2si") (DI "v2di") |
1647 | (DF "v2df")]) | |
43e9d192 | 1648 | |
b1b49824 MC |
1649 | ;; Modes with double-width elements. |
1650 | (define_mode_attr VDBLW [(V8QI "V4HI") (V16QI "V8HI") | |
1651 | (V4HI "V2SI") (V8HI "V4SI") | |
1652 | (V2SI "DI") (V4SI "V2DI")]) | |
1653 | ||
b327cbe8 KT |
1654 | (define_mode_attr VQUADW [(V8QI "V4SI") (V16QI "V8SI") |
1655 | (V4HI "V2DI") (V8HI "V4DI")]) | |
1656 | ||
43e9d192 IB |
1657 | ;; Narrowed modes for VDN. |
1658 | (define_mode_attr VNARROWD [(V4HI "V8QI") (V2SI "V4HI") | |
1659 | (DI "V2SI")]) | |
d8a88cda JW |
1660 | (define_mode_attr Vnarrowd [(V4HI "v8qi") (V2SI "v4hi") |
1661 | (DI "v2si")]) | |
43e9d192 IB |
1662 | |
1663 | ;; Narrowed double-modes for VQN (Used for XTN). | |
1664 | (define_mode_attr VNARROWQ [(V8HI "V8QI") (V4SI "V4HI") | |
1665 | (V2DI "V2SI") | |
1666 | (DI "SI") (SI "HI") | |
1667 | (HI "QI")]) | |
9c437a10 RS |
1668 | (define_mode_attr Vnarrowq [(V8HI "v8qi") (V4SI "v4hi") |
1669 | (V2DI "v2si")]) | |
43e9d192 IB |
1670 | |
1671 | ;; Narrowed quad-modes for VQN (Used for XTN2). | |
1672 | (define_mode_attr VNARROWQ2 [(V8HI "V16QI") (V4SI "V8HI") | |
1673 | (V2DI "V4SI")]) | |
74e3e839 RS |
1674 | (define_mode_attr Vnarrowq2 [(V8HI "v16qi") (V4SI "v8hi") |
1675 | (V2DI "v4si")]) | |
43e9d192 | 1676 | |
0a09a948 RS |
1677 | ;; Narrowed modes of vector modes. |
1678 | (define_mode_attr VNARROW [(VNx8HI "VNx16QI") | |
1679 | (VNx4SI "VNx8HI") (VNx4SF "VNx8HF") | |
c1c267df RS |
1680 | (VNx2DI "VNx4SI") (VNx2DF "VNx4SF") |
1681 | (VNx8SI "VNx8HI") (VNx16SI "VNx16QI") | |
1682 | (VNx8DI "VNx8HI")]) | |
0a09a948 | 1683 | |
43e9d192 IB |
1684 | ;; Register suffix narrowed modes for VQN. |
1685 | (define_mode_attr Vntype [(V8HI "8b") (V4SI "4h") | |
1686 | (V2DI "2s")]) | |
1687 | ||
1688 | ;; Register suffix narrowed modes for VQN. | |
1689 | (define_mode_attr V2ntype [(V8HI "16b") (V4SI "8h") | |
1690 | (V2DI "4s")]) | |
1691 | ||
1692 | ;; Widened modes of vector modes. | |
43cacb12 RS |
1693 | (define_mode_attr VWIDE [(V8QI "V8HI") (V4HI "V4SI") |
1694 | (V2SI "V2DI") (V16QI "V8HI") | |
1695 | (V8HI "V4SI") (V4SI "V2DI") | |
1696 | (HI "SI") (SI "DI") | |
1697 | (V8HF "V4SF") (V4SF "V2DF") | |
1698 | (V4HF "V4SF") (V2SF "V2DF") | |
1699 | (VNx8HF "VNx4SF") (VNx4SF "VNx2DF") | |
1700 | (VNx16QI "VNx8HI") (VNx8HI "VNx4SI") | |
1701 | (VNx4SI "VNx2DI") | |
1702 | (VNx16BI "VNx8BI") (VNx8BI "VNx4BI") | |
1703 | (VNx4BI "VNx2BI")]) | |
1704 | ||
84152985 KT |
1705 | ;; Modes with the same number of elements but strictly 2x the width. |
1706 | (define_mode_attr V2XWIDE [(V8QI "V8HI") (V4HI "V4SI") | |
1707 | (V16QI "V16HI") (V8HI "V8SI") | |
1708 | (V2SI "V2DI") (V4SI "V4DI") | |
d20b2ad8 | 1709 | (V2DI "V2TI") (DI "TI") |
c1c267df RS |
1710 | (HI "SI") (SI "DI") |
1711 | (VNx16QI "VNx16HI") | |
1712 | (VNx8HI "VNx8SI") | |
1713 | (VNx4SI "VNx4DI") | |
1714 | (VNx32QI "VNx32HI") | |
1715 | (VNx16HI "VNx16SI") | |
1716 | (VNx8SI "VNx8DI")]) | |
1717 | ||
1718 | (define_mode_attr v2xwide [(V8QI "v8hi") (V4HI "v4si") | |
1719 | (V16QI "v16hi") (V8HI "v8si") | |
1720 | (V2SI "v2di") (V4SI "v4di") | |
1721 | (V2DI "v2ti") (DI "ti") | |
1722 | (HI "si") (SI "di") | |
1723 | (VNx16QI "vnx16hi") | |
1724 | (VNx8HI "vnx8si") | |
1725 | (VNx4SI "vnx4di") | |
1726 | (VNx32QI "vnx32hi") | |
1727 | (VNx16HI "vnx16si") | |
1728 | (VNx8SI "vnx8di")]) | |
84152985 | 1729 | |
43cacb12 RS |
1730 | ;; Predicate mode associated with VWIDE. |
1731 | (define_mode_attr VWIDE_PRED [(VNx8HF "VNx4BI") (VNx4SF "VNx2BI")]) | |
43e9d192 | 1732 | |
03873eb9 | 1733 | ;; Widened modes of vector modes, lowercase |
43cacb12 RS |
1734 | (define_mode_attr Vwide [(V2SF "v2df") (V4HF "v4sf") |
1735 | (VNx16QI "vnx8hi") (VNx8HI "vnx4si") | |
1736 | (VNx4SI "vnx2di") | |
1737 | (VNx8HF "vnx4sf") (VNx4SF "vnx2df") | |
1738 | (VNx16BI "vnx8bi") (VNx8BI "vnx4bi") | |
1739 | (VNx4BI "vnx2bi")]) | |
03873eb9 AL |
1740 | |
1741 | ;; Widened mode register suffixes for VD_BHSI/VQW/VQ_HSF. | |
43e9d192 | 1742 | (define_mode_attr Vwtype [(V8QI "8h") (V4HI "4s") |
ad260343 | 1743 | (V2SI "2d") (V16QI "8h") |
03873eb9 AL |
1744 | (V8HI "4s") (V4SI "2d") |
1745 | (V8HF "4s") (V4SF "2d")]) | |
43e9d192 | 1746 | |
cb995de6 KT |
1747 | ;; Widened scalar register suffixes. |
1748 | (define_mode_attr Vwstype [(V8QI "h") (V4HI "s") | |
1749 | (V2SI "") (V16QI "h") | |
1750 | (V8HI "s") (V4SI "d")]) | |
1751 | ;; Add a .1d for V2SI. | |
1752 | (define_mode_attr Vwsuf [(V8QI "") (V4HI "") | |
1753 | (V2SI ".1d") (V16QI "") | |
1754 | (V8HI "") (V4SI "")]) | |
1755 | ||
1756 | ;; Scalar mode of widened vector reduction. | |
1757 | (define_mode_attr VWIDE_S [(V8QI "HI") (V4HI "SI") | |
1758 | (V2SI "DI") (V16QI "HI") | |
1759 | (V8HI "SI") (V4SI "DI")]) | |
1760 | ||
b327cbe8 KT |
1761 | (define_mode_attr VWIDE2X_S [(V8QI "SI") (V4HI "DI") |
1762 | (V16QI "SI") (V8HI "DI")]) | |
1763 | ||
e811f10b KT |
1764 | ;; Widened mode with half the element register suffixes for VD_BHSI/VQW/VQ_HSF. |
1765 | (define_mode_attr Vwhalf [(V8QI "4h") (V4HI "2s") | |
1766 | (V2SI "1d") (V16QI "8h") | |
1767 | (V8HI "4s") (V4SI "2d")]) | |
1768 | ||
0a09a948 RS |
1769 | ;; SVE vector after narrowing. |
1770 | (define_mode_attr Ventype [(VNx8HI "b") | |
1771 | (VNx4SI "h") (VNx4SF "h") | |
c1c267df RS |
1772 | (VNx2DI "s") (VNx2DF "s") |
1773 | (VNx8SI "h") (VNx16SI "b") | |
1774 | (VNx8DI "h")]) | |
0a09a948 RS |
1775 | |
1776 | ;; SVE vector after widening. | |
43cacb12 RS |
1777 | (define_mode_attr Vewtype [(VNx16QI "h") |
1778 | (VNx8HI "s") (VNx8HF "s") | |
0a09a948 RS |
1779 | (VNx4SI "d") (VNx4SF "d") |
1780 | (VNx2DI "q")]) | |
43cacb12 | 1781 | |
43e9d192 IB |
1782 | ;; Widened mode register suffixes for VDW/VQW. |
1783 | (define_mode_attr Vmwtype [(V8QI ".8h") (V4HI ".4s") | |
ad260343 | 1784 | (V2SI ".2d") (V16QI ".8h") |
43e9d192 | 1785 | (V8HI ".4s") (V4SI ".2d") |
922f9c25 | 1786 | (V4HF ".4s") (V2SF ".2d") |
43e9d192 IB |
1787 | (SI "") (HI "")]) |
1788 | ||
03873eb9 | 1789 | ;; Lower part register suffixes for VQW/VQ_HSF. |
43e9d192 | 1790 | (define_mode_attr Vhalftype [(V16QI "8b") (V8HI "4h") |
03873eb9 AL |
1791 | (V4SI "2s") (V8HF "4h") |
1792 | (V4SF "2s")]) | |
43e9d192 | 1793 | |
83d7e720 RS |
1794 | ;; Whether a mode fits in W or X registers (i.e. "w" for 32-bit modes |
1795 | ;; and "x" for 64-bit modes). | |
1796 | (define_mode_attr single_wx [(SI "w") (SF "w") | |
1797 | (V8QI "x") (V4HI "x") | |
1798 | (V4HF "x") (V4BF "x") | |
1799 | (V2SI "x") (V2SF "x") | |
1800 | (DI "x") (DF "x")]) | |
1801 | ||
1802 | ;; Whether a mode fits in S or D registers (i.e. "s" for 32-bit modes | |
1803 | ;; and "d" for 64-bit modes). | |
1804 | (define_mode_attr single_type [(SI "s") (SF "s") | |
1805 | (V8QI "d") (V4HI "d") | |
1806 | (V4HF "d") (V4BF "d") | |
1807 | (V2SI "d") (V2SF "d") | |
1808 | (DI "d") (DF "d")]) | |
1809 | ||
1810 | ;; Whether a double-width mode fits in D or Q registers (i.e. "d" for | |
1811 | ;; 32-bit modes and "q" for 64-bit modes). | |
1812 | (define_mode_attr single_dtype [(SI "d") (SF "d") | |
1813 | (V8QI "q") (V4HI "q") | |
1814 | (V4HF "q") (V4BF "q") | |
1815 | (V2SI "q") (V2SF "q") | |
1816 | (DI "q") (DF "q")]) | |
1817 | ||
43e9d192 | 1818 | ;; Define corresponding core/FP element mode for each vector mode. |
cc68f7c2 RS |
1819 | (define_mode_attr vw [(V8QI "w") (V16QI "w") |
1820 | (V4HI "w") (V8HI "w") | |
1821 | (V2SI "w") (V4SI "w") | |
1822 | (DI "x") (V2DI "x") | |
1823 | (V2SF "s") (V4SF "s") | |
1824 | (V2DF "d")]) | |
43e9d192 | 1825 | |
66adb8eb JG |
1826 | ;; Corresponding core element mode for each vector mode. This is a |
1827 | ;; variation on <vw> mapping FP modes to GP regs. | |
cc68f7c2 RS |
1828 | (define_mode_attr vwcore [(V8QI "w") (V16QI "w") |
1829 | (V4HI "w") (V8HI "w") | |
1830 | (V2SI "w") (V4SI "w") | |
1831 | (DI "x") (V2DI "x") | |
1832 | (V4HF "w") (V8HF "w") | |
5320d4e4 | 1833 | (V4BF "w") (V8BF "w") |
cc68f7c2 RS |
1834 | (V2SF "w") (V4SF "w") |
1835 | (V2DF "x") | |
1836 | (VNx16QI "w") (VNx8QI "w") (VNx4QI "w") (VNx2QI "w") | |
1837 | (VNx8HI "w") (VNx4HI "w") (VNx2HI "w") | |
1838 | (VNx8HF "w") (VNx4HF "w") (VNx2HF "w") | |
6c3ce63b | 1839 | (VNx8BF "w") (VNx4BF "w") (VNx2BF "w") |
cc68f7c2 RS |
1840 | (VNx4SI "w") (VNx2SI "w") |
1841 | (VNx4SF "w") (VNx2SF "w") | |
1842 | (VNx2DI "x") | |
1843 | (VNx2DF "x")]) | |
66adb8eb | 1844 | |
30f8bf3d RS |
1845 | ;; Like vwcore, but for the container mode rather than the element mode. |
1846 | (define_mode_attr vccore [(VNx16QI "w") (VNx8QI "w") (VNx4QI "w") (VNx2QI "x") | |
1847 | (VNx8HI "w") (VNx4HI "w") (VNx2HI "x") | |
1848 | (VNx4SI "w") (VNx2SI "x") | |
1849 | (VNx2DI "x")]) | |
1850 | ||
43e9d192 IB |
1851 | ;; Double vector types for ALLX. |
1852 | (define_mode_attr Vallxd [(QI "8b") (HI "4h") (SI "2s")]) | |
1853 | ||
5f565314 RS |
1854 | ;; Mode with floating-point values replaced by like-sized integers. |
1855 | (define_mode_attr V_INT_EQUIV [(V8QI "V8QI") (V16QI "V16QI") | |
1856 | (V4HI "V4HI") (V8HI "V8HI") | |
1857 | (V2SI "V2SI") (V4SI "V4SI") | |
1858 | (DI "DI") (V2DI "V2DI") | |
1859 | (V4HF "V4HI") (V8HF "V8HI") | |
e603cd43 | 1860 | (V4BF "V4HI") (V8BF "V8HI") |
5f565314 | 1861 | (V2SF "V2SI") (V4SF "V4SI") |
43cacb12 | 1862 | (DF "DI") (V2DF "V2DI") |
dfe1da23 JW |
1863 | (SF "SI") (SI "SI") |
1864 | (HF "HI") | |
43cacb12 RS |
1865 | (VNx16QI "VNx16QI") |
1866 | (VNx8HI "VNx8HI") (VNx8HF "VNx8HI") | |
02fcd8ac | 1867 | (VNx8BF "VNx8HI") |
43cacb12 RS |
1868 | (VNx4SI "VNx4SI") (VNx4SF "VNx4SI") |
1869 | (VNx2DI "VNx2DI") (VNx2DF "VNx2DI") | |
c1c267df | 1870 | (VNx8SF "VNx8SI") (VNx16SF "VNx16SI") |
43cacb12 | 1871 | ]) |
5f565314 RS |
1872 | |
1873 | ;; Lower case mode with floating-point values replaced by like-sized integers. | |
1874 | (define_mode_attr v_int_equiv [(V8QI "v8qi") (V16QI "v16qi") | |
1875 | (V4HI "v4hi") (V8HI "v8hi") | |
1876 | (V2SI "v2si") (V4SI "v4si") | |
1877 | (DI "di") (V2DI "v2di") | |
1878 | (V4HF "v4hi") (V8HF "v8hi") | |
e603cd43 | 1879 | (V4BF "v4hi") (V8BF "v8hi") |
5f565314 | 1880 | (V2SF "v2si") (V4SF "v4si") |
43cacb12 RS |
1881 | (DF "di") (V2DF "v2di") |
1882 | (SF "si") | |
1883 | (VNx16QI "vnx16qi") | |
1884 | (VNx8HI "vnx8hi") (VNx8HF "vnx8hi") | |
02fcd8ac | 1885 | (VNx8BF "vnx8hi") |
43cacb12 RS |
1886 | (VNx4SI "vnx4si") (VNx4SF "vnx4si") |
1887 | (VNx2DI "vnx2di") (VNx2DF "vnx2di") | |
c1c267df | 1888 | (VNx8SF "vnx8si") (VNx16SF "vnx16si") |
43cacb12 RS |
1889 | ]) |
1890 | ||
1891 | ;; Floating-point equivalent of selected modes. | |
a70965b1 | 1892 | (define_mode_attr V_FP_EQUIV [(VNx8HI "VNx8HF") (VNx8HF "VNx8HF") |
02fcd8ac | 1893 | (VNx8BF "VNx8HF") |
a70965b1 | 1894 | (VNx4SI "VNx4SF") (VNx4SF "VNx4SF") |
43cacb12 | 1895 | (VNx2DI "VNx2DF") (VNx2DF "VNx2DF")]) |
a70965b1 | 1896 | (define_mode_attr v_fp_equiv [(VNx8HI "vnx8hf") (VNx8HF "vnx8hf") |
02fcd8ac | 1897 | (VNx8BF "vnx8hf") |
a70965b1 | 1898 | (VNx4SI "vnx4sf") (VNx4SF "vnx4sf") |
43cacb12 | 1899 | (VNx2DI "vnx2df") (VNx2DF "vnx2df")]) |
70c67693 | 1900 | |
f8186eea RS |
1901 | ;; Maps full and partial vector modes of any element type to a full-vector |
1902 | ;; integer mode with the same number of units. | |
1903 | (define_mode_attr V_INT_CONTAINER [(VNx16QI "VNx16QI") (VNx8QI "VNx8HI") | |
1904 | (VNx4QI "VNx4SI") (VNx2QI "VNx2DI") | |
1905 | (VNx8HI "VNx8HI") (VNx4HI "VNx4SI") | |
1906 | (VNx2HI "VNx2DI") | |
1907 | (VNx4SI "VNx4SI") (VNx2SI "VNx2DI") | |
1908 | (VNx2DI "VNx2DI") | |
1909 | (VNx8HF "VNx8HI") (VNx4HF "VNx4SI") | |
1910 | (VNx2HF "VNx2DI") | |
6c3ce63b RS |
1911 | (VNx8BF "VNx8HI") (VNx4BF "VNx4SI") |
1912 | (VNx2BF "VNx2DI") | |
3261d8ba | 1913 | (VNx4SF "VNx4SI") (VNx2SF "VNx2DI") |
f8186eea RS |
1914 | (VNx2DF "VNx2DI")]) |
1915 | ||
1916 | ;; Lower-case version of V_INT_CONTAINER. | |
1917 | (define_mode_attr v_int_container [(VNx16QI "vnx16qi") (VNx8QI "vnx8hi") | |
1918 | (VNx4QI "vnx4si") (VNx2QI "vnx2di") | |
1919 | (VNx8HI "vnx8hi") (VNx4HI "vnx4si") | |
1920 | (VNx2HI "vnx2di") | |
1921 | (VNx4SI "vnx4si") (VNx2SI "vnx2di") | |
1922 | (VNx2DI "vnx2di") | |
1923 | (VNx8HF "vnx8hi") (VNx4HF "vnx4si") | |
1924 | (VNx2HF "vnx2di") | |
6c3ce63b RS |
1925 | (VNx8BF "vnx8hi") (VNx4BF "vnx4si") |
1926 | (VNx2BF "vnx2di") | |
f8186eea RS |
1927 | (VNx4SF "vnx4si") (VNx2SF "vnx2di") |
1928 | (VNx2DF "vnx2di")]) | |
1929 | ||
6c553b76 BC |
1930 | ;; Mode for vector conditional operations where the comparison has |
1931 | ;; different type from the lhs. | |
1932 | (define_mode_attr V_cmp_mixed [(V2SI "V2SF") (V4SI "V4SF") | |
1933 | (V2DI "V2DF") (V2SF "V2SI") | |
1934 | (V4SF "V4SI") (V2DF "V2DI")]) | |
1935 | ||
1936 | (define_mode_attr v_cmp_mixed [(V2SI "v2sf") (V4SI "v4sf") | |
1937 | (V2DI "v2df") (V2SF "v2si") | |
1938 | (V4SF "v4si") (V2DF "v2di")]) | |
1939 | ||
cb23a30c JG |
1940 | ;; Lower case element modes (as used in shift immediate patterns). |
1941 | (define_mode_attr ve_mode [(V8QI "qi") (V16QI "qi") | |
1942 | (V4HI "hi") (V8HI "hi") | |
1943 | (V2SI "si") (V4SI "si") | |
1944 | (DI "di") (V2DI "di") | |
1945 | (QI "qi") (HI "hi") | |
1946 | (SI "si")]) | |
1947 | ||
fdb904a1 KT |
1948 | ;; Like ve_mode but for the half-width modes. |
1949 | (define_mode_attr vn_mode [(V8HI "qi") (V4SI "hi") (V2DI "si")]) | |
1950 | ||
43e9d192 IB |
1951 | ;; Vm for lane instructions is restricted to FP_LO_REGS. |
1952 | (define_mode_attr vwx [(V4HI "x") (V8HI "x") (HI "x") | |
1953 | (V2SI "w") (V4SI "w") (SI "w")]) | |
1954 | ||
66f206b8 JW |
1955 | (define_mode_attr Vendreg [(OI "T") (CI "U") (XI "V") |
1956 | (V2x8QI "T") (V2x16QI "T") | |
1957 | (V2x4HI "T") (V2x8HI "T") | |
1958 | (V2x2SI "T") (V2x4SI "T") | |
1959 | (V2x1DI "T") (V2x2DI "T") | |
1960 | (V2x4HF "T") (V2x8HF "T") | |
1961 | (V2x2SF "T") (V2x4SF "T") | |
1962 | (V2x1DF "T") (V2x2DF "T") | |
1963 | (V2x4BF "T") (V2x8BF "T") | |
1964 | (V3x8QI "U") (V3x16QI "U") | |
1965 | (V3x4HI "U") (V3x8HI "U") | |
1966 | (V3x2SI "U") (V3x4SI "U") | |
1967 | (V3x1DI "U") (V3x2DI "U") | |
1968 | (V3x4HF "U") (V3x8HF "U") | |
1969 | (V3x2SF "U") (V3x4SF "U") | |
1970 | (V3x1DF "U") (V3x2DF "U") | |
1971 | (V3x4BF "U") (V3x8BF "U") | |
1972 | (V4x8QI "V") (V4x16QI "V") | |
1973 | (V4x4HI "V") (V4x8HI "V") | |
1974 | (V4x2SI "V") (V4x4SI "V") | |
1975 | (V4x1DI "V") (V4x2DI "V") | |
1976 | (V4x4HF "V") (V4x8HF "V") | |
1977 | (V4x2SF "V") (V4x4SF "V") | |
1978 | (V4x1DF "V") (V4x2DF "V") | |
1979 | (V4x4BF "V") (V4x8BF "V")]) | |
43e9d192 | 1980 | |
97755701 AL |
1981 | ;; This is both the number of Q-Registers needed to hold the corresponding |
1982 | ;; opaque large integer mode, and the number of elements touched by the | |
1983 | ;; ld..._lane and st..._lane operations. | |
66f206b8 JW |
1984 | (define_mode_attr nregs [(OI "2") (CI "3") (XI "4") |
1985 | (V2x8QI "2") (V2x16QI "2") | |
1986 | (V2x4HI "2") (V2x8HI "2") | |
1987 | (V2x2SI "2") (V2x4SI "2") | |
1988 | (V2x1DI "2") (V2x2DI "2") | |
1989 | (V2x4HF "2") (V2x8HF "2") | |
1990 | (V2x2SF "2") (V2x4SF "2") | |
1991 | (V2x1DF "2") (V2x2DF "2") | |
1992 | (V2x4BF "2") (V2x8BF "2") | |
1993 | (V3x8QI "3") (V3x16QI "3") | |
1994 | (V3x4HI "3") (V3x8HI "3") | |
1995 | (V3x2SI "3") (V3x4SI "3") | |
1996 | (V3x1DI "3") (V3x2DI "3") | |
1997 | (V3x4HF "3") (V3x8HF "3") | |
1998 | (V3x2SF "3") (V3x4SF "3") | |
1999 | (V3x1DF "3") (V3x2DF "3") | |
2000 | (V3x4BF "3") (V3x8BF "3") | |
2001 | (V4x8QI "4") (V4x16QI "4") | |
2002 | (V4x4HI "4") (V4x8HI "4") | |
2003 | (V4x2SI "4") (V4x4SI "4") | |
2004 | (V4x1DI "4") (V4x2DI "4") | |
2005 | (V4x4HF "4") (V4x8HF "4") | |
2006 | (V4x2SF "4") (V4x4SF "4") | |
2007 | (V4x1DF "4") (V4x2DF "4") | |
2008 | (V4x4BF "4") (V4x8BF "4")]) | |
43e9d192 | 2009 | |
0462169c SN |
2010 | ;; Mode for atomic operation suffixes |
2011 | (define_mode_attr atomic_sfx | |
2012 | [(QI "b") (HI "h") (SI "") (DI "")]) | |
2013 | ||
3f598afe | 2014 | (define_mode_attr fcvt_target [(V2DF "v2di") (V4SF "v4si") (V2SF "v2si") |
2644d4d9 | 2015 | (V2DI "v2df") (V4SI "v4sf") (V2SI "v2sf") |
daef0a8c JW |
2016 | (SF "si") (DF "di") (SI "sf") (DI "df") |
2017 | (V4HF "v4hi") (V8HF "v8hi") (V4HI "v4hf") | |
68ad28c3 | 2018 | (V8HI "v8hf") (HF "hi") (HI "hf")]) |
3f598afe | 2019 | (define_mode_attr FCVT_TARGET [(V2DF "V2DI") (V4SF "V4SI") (V2SF "V2SI") |
2644d4d9 | 2020 | (V2DI "V2DF") (V4SI "V4SF") (V2SI "V2SF") |
daef0a8c JW |
2021 | (SF "SI") (DF "DI") (SI "SF") (DI "DF") |
2022 | (V4HF "V4HI") (V8HF "V8HI") (V4HI "V4HF") | |
68ad28c3 | 2023 | (V8HI "V8HF") (HF "HI") (HI "HF")]) |
3f598afe | 2024 | |
0d35c5c2 VP |
2025 | |
2026 | ;; for the inequal width integer to fp conversions | |
d7f33f07 JW |
2027 | (define_mode_attr fcvt_iesize [(HF "di") (SF "di") (DF "si")]) |
2028 | (define_mode_attr FCVT_IESIZE [(HF "DI") (SF "DI") (DF "SI")]) | |
42fc9a7f | 2029 | |
91bd4114 JG |
2030 | (define_mode_attr VSWAP_WIDTH [(V8QI "V16QI") (V16QI "V8QI") |
2031 | (V4HI "V8HI") (V8HI "V4HI") | |
8ea6c1b8 | 2032 | (V8BF "V4BF") (V4BF "V8BF") |
91bd4114 JG |
2033 | (V2SI "V4SI") (V4SI "V2SI") |
2034 | (DI "V2DI") (V2DI "DI") | |
2035 | (V2SF "V4SF") (V4SF "V2SF") | |
862abc04 | 2036 | (V4HF "V8HF") (V8HF "V4HF") |
91bd4114 JG |
2037 | (DF "V2DF") (V2DF "DF")]) |
2038 | ||
2039 | (define_mode_attr vswap_width_name [(V8QI "to_128") (V16QI "to_64") | |
2040 | (V4HI "to_128") (V8HI "to_64") | |
2041 | (V2SI "to_128") (V4SI "to_64") | |
2042 | (DI "to_128") (V2DI "to_64") | |
862abc04 | 2043 | (V4HF "to_128") (V8HF "to_64") |
91bd4114 | 2044 | (V2SF "to_128") (V4SF "to_64") |
8ea6c1b8 | 2045 | (V4BF "to_128") (V8BF "to_64") |
91bd4114 JG |
2046 | (DF "to_128") (V2DF "to_64")]) |
2047 | ||
779aea46 | 2048 | ;; For certain vector-by-element multiplication instructions we must |
6d06971d | 2049 | ;; constrain the 16-bit cases to use only V0-V15. This is covered by |
779aea46 JG |
2050 | ;; the 'x' constraint. All other modes may use the 'w' constraint. |
2051 | (define_mode_attr h_con [(V2SI "w") (V4SI "w") | |
2052 | (V4HI "x") (V8HI "x") | |
6d06971d | 2053 | (V4HF "x") (V8HF "x") |
779aea46 JG |
2054 | (V2SF "w") (V4SF "w") |
2055 | (V2DF "w") (DF "w")]) | |
2056 | ||
2057 | ;; Defined to 'f' for types whose element type is a float type. | |
2058 | (define_mode_attr f [(V8QI "") (V16QI "") | |
2059 | (V4HI "") (V8HI "") | |
2060 | (V2SI "") (V4SI "") | |
2061 | (DI "") (V2DI "") | |
ab2e8f01 | 2062 | (V4HF "f") (V8HF "f") |
779aea46 JG |
2063 | (V2SF "f") (V4SF "f") |
2064 | (V2DF "f") (DF "f")]) | |
2065 | ||
0f686aa9 JG |
2066 | ;; Defined to '_fp' for types whose element type is a float type. |
2067 | (define_mode_attr fp [(V8QI "") (V16QI "") | |
2068 | (V4HI "") (V8HI "") | |
2069 | (V2SI "") (V4SI "") | |
2070 | (DI "") (V2DI "") | |
ab2e8f01 | 2071 | (V4HF "_fp") (V8HF "_fp") |
0f686aa9 JG |
2072 | (V2SF "_fp") (V4SF "_fp") |
2073 | (V2DF "_fp") (DF "_fp") | |
2074 | (SF "_fp")]) | |
2075 | ||
a9e66678 JG |
2076 | ;; Defined to '_q' for 128-bit types. |
2077 | (define_mode_attr q [(V8QI "") (V16QI "_q") | |
0f686aa9 | 2078 | (V4HI "") (V8HI "_q") |
8ea6c1b8 | 2079 | (V4BF "") (V8BF "_q") |
0f686aa9 JG |
2080 | (V2SI "") (V4SI "_q") |
2081 | (DI "") (V2DI "_q") | |
71a11456 | 2082 | (V4HF "") (V8HF "_q") |
abbe1ed2 | 2083 | (V4BF "") (V8BF "_q") |
0f686aa9 | 2084 | (V2SF "") (V4SF "_q") |
a40c22c3 | 2085 | (V2DF "_q") |
66f206b8 JW |
2086 | (QI "") (HI "") (SI "") (DI "") (HF "") (SF "") (DF "") |
2087 | (V2x8QI "") (V2x16QI "_q") | |
2088 | (V2x4HI "") (V2x8HI "_q") | |
2089 | (V2x2SI "") (V2x4SI "_q") | |
2090 | (V2x1DI "") (V2x2DI "_q") | |
2091 | (V2x4HF "") (V2x8HF "_q") | |
2092 | (V2x2SF "") (V2x4SF "_q") | |
2093 | (V2x1DF "") (V2x2DF "_q") | |
2094 | (V2x4BF "") (V2x8BF "_q") | |
2095 | (V3x8QI "") (V3x16QI "_q") | |
2096 | (V3x4HI "") (V3x8HI "_q") | |
2097 | (V3x2SI "") (V3x4SI "_q") | |
2098 | (V3x1DI "") (V3x2DI "_q") | |
2099 | (V3x4HF "") (V3x8HF "_q") | |
2100 | (V3x2SF "") (V3x4SF "_q") | |
2101 | (V3x1DF "") (V3x2DF "_q") | |
2102 | (V3x4BF "") (V3x8BF "_q") | |
2103 | (V4x8QI "") (V4x16QI "_q") | |
2104 | (V4x4HI "") (V4x8HI "_q") | |
2105 | (V4x2SI "") (V4x4SI "_q") | |
2106 | (V4x1DI "") (V4x2DI "_q") | |
2107 | (V4x4HF "") (V4x8HF "_q") | |
2108 | (V4x2SF "") (V4x4SF "_q") | |
2109 | (V4x1DF "") (V4x2DF "_q") | |
2110 | (V4x4BF "") (V4x8BF "_q")]) | |
a9e66678 | 2111 | |
83d7e720 RS |
2112 | ;; Equivalent of the "q" attribute for the <VDBL> mode. |
2113 | (define_mode_attr dblq [(SI "") (SF "") | |
2114 | (V8QI "_q") (V4HI "_q") | |
2115 | (V4HF "_q") (V4BF "_q") | |
2116 | (V2SI "_q") (V2SF "_q") | |
2117 | (DI "_q") (DF "_q")]) | |
2118 | ||
92835317 TB |
2119 | (define_mode_attr vp [(V8QI "v") (V16QI "v") |
2120 | (V4HI "v") (V8HI "v") | |
2121 | (V2SI "p") (V4SI "v") | |
703bbcdf JW |
2122 | (V2DI "p") (V2DF "p") |
2123 | (V2SF "p") (V4SF "v") | |
2124 | (V4HF "v") (V8HF "v")]) | |
92835317 | 2125 | |
9feeafd7 AM |
2126 | (define_mode_attr vsi2qi [(V2SI "v8qi") (V4SI "v16qi") |
2127 | (VNx4SI "vnx16qi") (VNx2DI "vnx8hi")]) | |
2128 | (define_mode_attr VSI2QI [(V2SI "V8QI") (V4SI "V16QI") | |
2129 | (VNx4SI "VNx16QI") (VNx2DI "VNx8HI")]) | |
5e32e83b | 2130 | |
7a08d813 TC |
2131 | |
2132 | ;; Register suffix for DOTPROD input types from the return type. | |
2133 | (define_mode_attr Vdottype [(V2SI "8b") (V4SI "16b")]) | |
2134 | ||
f275d73a SMW |
2135 | ;; Register suffix for BFDOT input types from the return type. |
2136 | (define_mode_attr Vbfdottype [(V2SF "4h") (V4SF "8h")]) | |
2137 | ||
cd78b3dd | 2138 | ;; Sum of lengths of instructions needed to move vector registers of a mode. |
66f206b8 JW |
2139 | (define_mode_attr insn_count [(OI "8") (CI "12") (XI "16") |
2140 | (V2x8QI "8") (V2x16QI "8") | |
2141 | (V2x4HI "8") (V2x8HI "8") | |
2142 | (V2x2SI "8") (V2x4SI "8") | |
2143 | (V2x1DI "8") (V2x2DI "8") | |
2144 | (V2x4HF "8") (V2x8HF "8") | |
2145 | (V2x2SF "8") (V2x4SF "8") | |
2146 | (V2x1DF "8") (V2x2DF "8") | |
2147 | (V2x4BF "8") (V2x8BF "8") | |
2148 | (V3x8QI "12") (V3x16QI "12") | |
2149 | (V3x4HI "12") (V3x8HI "12") | |
2150 | (V3x2SI "12") (V3x4SI "12") | |
2151 | (V3x1DI "12") (V3x2DI "12") | |
2152 | (V3x4HF "12") (V3x8HF "12") | |
2153 | (V3x2SF "12") (V3x4SF "12") | |
2154 | (V3x1DF "12") (V3x2DF "12") | |
2155 | (V3x4BF "12") (V3x8BF "12") | |
2156 | (V4x8QI "16") (V4x16QI "16") | |
2157 | (V4x4HI "16") (V4x8HI "16") | |
2158 | (V4x2SI "16") (V4x4SI "16") | |
2159 | (V4x1DI "16") (V4x2DI "16") | |
2160 | (V4x4HF "16") (V4x8HF "16") | |
2161 | (V4x2SF "16") (V4x4SF "16") | |
2162 | (V4x1DF "16") (V4x2DF "16") | |
2163 | (V4x4BF "16") (V4x8BF "16")]) | |
668046d1 | 2164 | |
1b1e81f8 JW |
2165 | ;; -fpic small model GOT reloc modifers: gotpage_lo15/lo14 for ILP64/32. |
2166 | ;; No need of iterator for -fPIC as it use got_lo12 for both modes. | |
2167 | (define_mode_attr got_modifier [(SI "gotpage_lo14") (DI "gotpage_lo15")]) | |
2168 | ||
27086ea3 MC |
2169 | ;; Width of 2nd and 3rd arguments to fp16 vector multiply add/sub |
2170 | (define_mode_attr VFMLA_W [(V2SF "V4HF") (V4SF "V8HF")]) | |
2171 | ||
f275d73a SMW |
2172 | ;; Width of 2nd and 3rd arguments to bf16 vector multiply add/sub |
2173 | (define_mode_attr VBFMLA_W [(V2SF "V4BF") (V4SF "V8BF")]) | |
2174 | ||
27086ea3 MC |
2175 | (define_mode_attr VFMLA_SEL_W [(V2SF "V2HF") (V4SF "V4HF")]) |
2176 | ||
2177 | (define_mode_attr f16quad [(V2SF "") (V4SF "q")]) | |
2178 | ||
f275d73a | 2179 | (define_mode_attr isquadop [(V8QI "") (V16QI "q") (V4BF "") (V8BF "q")]) |
8c197c85 | 2180 | |
27086ea3 MC |
2181 | (define_code_attr f16mac [(plus "a") (minus "s")]) |
2182 | ||
8544ed6e KT |
2183 | ;; Map smax to smin and umax to umin. |
2184 | (define_code_attr max_opp [(smax "smin") (umax "umin")]) | |
2185 | ||
a9fad8fe AM |
2186 | ;; Same as above, but louder. |
2187 | (define_code_attr MAX_OPP [(smax "SMIN") (umax "UMIN")]) | |
2188 | ||
900945f6 OA |
2189 | ;; Map smax and umax to sign_extend and zero_extend |
2190 | (define_code_attr USMAX_EXT [(smax "sign_extend") (umax "zero_extend")]) | |
2191 | ||
9f4cbab8 RS |
2192 | ;; The number of subvectors in an SVE_STRUCT. |
2193 | (define_mode_attr vector_count [(VNx32QI "2") (VNx16HI "2") | |
2194 | (VNx8SI "2") (VNx4DI "2") | |
02fcd8ac | 2195 | (VNx16BF "2") |
9f4cbab8 RS |
2196 | (VNx16HF "2") (VNx8SF "2") (VNx4DF "2") |
2197 | (VNx48QI "3") (VNx24HI "3") | |
2198 | (VNx12SI "3") (VNx6DI "3") | |
02fcd8ac | 2199 | (VNx24BF "3") |
9f4cbab8 RS |
2200 | (VNx24HF "3") (VNx12SF "3") (VNx6DF "3") |
2201 | (VNx64QI "4") (VNx32HI "4") | |
2202 | (VNx16SI "4") (VNx8DI "4") | |
02fcd8ac | 2203 | (VNx32BF "4") |
9f4cbab8 RS |
2204 | (VNx32HF "4") (VNx16SF "4") (VNx8DF "4")]) |
2205 | ||
2206 | ;; The number of instruction bytes needed for an SVE_STRUCT move. This is | |
2207 | ;; equal to vector_count * 4. | |
2208 | (define_mode_attr insn_length [(VNx32QI "8") (VNx16HI "8") | |
2209 | (VNx8SI "8") (VNx4DI "8") | |
02fcd8ac | 2210 | (VNx16BF "8") |
9f4cbab8 RS |
2211 | (VNx16HF "8") (VNx8SF "8") (VNx4DF "8") |
2212 | (VNx48QI "12") (VNx24HI "12") | |
2213 | (VNx12SI "12") (VNx6DI "12") | |
02fcd8ac | 2214 | (VNx24BF "12") |
9f4cbab8 RS |
2215 | (VNx24HF "12") (VNx12SF "12") (VNx6DF "12") |
2216 | (VNx64QI "16") (VNx32HI "16") | |
2217 | (VNx16SI "16") (VNx8DI "16") | |
02fcd8ac | 2218 | (VNx32BF "16") |
9f4cbab8 RS |
2219 | (VNx32HF "16") (VNx16SF "16") (VNx8DF "16")]) |
2220 | ||
2221 | ;; The type of a subvector in an SVE_STRUCT. | |
c1c267df RS |
2222 | (define_mode_attr VSINGLE [(VNx16QI "VNx16QI") |
2223 | (VNx8BF "VNx8BF") | |
2224 | (VNx8HF "VNx8HF") | |
2225 | (VNx8HI "VNx8HI") | |
2226 | (VNx32QI "VNx16QI") | |
9f4cbab8 | 2227 | (VNx16HI "VNx8HI") (VNx16HF "VNx8HF") |
02fcd8ac | 2228 | (VNx16BF "VNx8BF") |
9f4cbab8 RS |
2229 | (VNx8SI "VNx4SI") (VNx8SF "VNx4SF") |
2230 | (VNx4DI "VNx2DI") (VNx4DF "VNx2DF") | |
2231 | (VNx48QI "VNx16QI") | |
2232 | (VNx24HI "VNx8HI") (VNx24HF "VNx8HF") | |
02fcd8ac | 2233 | (VNx24BF "VNx8BF") |
9f4cbab8 RS |
2234 | (VNx12SI "VNx4SI") (VNx12SF "VNx4SF") |
2235 | (VNx6DI "VNx2DI") (VNx6DF "VNx2DF") | |
2236 | (VNx64QI "VNx16QI") | |
2237 | (VNx32HI "VNx8HI") (VNx32HF "VNx8HF") | |
02fcd8ac | 2238 | (VNx32BF "VNx8BF") |
9f4cbab8 RS |
2239 | (VNx16SI "VNx4SI") (VNx16SF "VNx4SF") |
2240 | (VNx8DI "VNx2DI") (VNx8DF "VNx2DF")]) | |
2241 | ||
2242 | ;; ...and again in lower case. | |
c1c267df RS |
2243 | (define_mode_attr vsingle [(VNx8HI "vnx8hi") |
2244 | (VNx32QI "vnx16qi") | |
9f4cbab8 | 2245 | (VNx16HI "vnx8hi") (VNx16HF "vnx8hf") |
02fcd8ac | 2246 | (VNx16BF "vnx8bf") |
9f4cbab8 RS |
2247 | (VNx8SI "vnx4si") (VNx8SF "vnx4sf") |
2248 | (VNx4DI "vnx2di") (VNx4DF "vnx2df") | |
2249 | (VNx48QI "vnx16qi") | |
2250 | (VNx24HI "vnx8hi") (VNx24HF "vnx8hf") | |
02fcd8ac | 2251 | (VNx24BF "vnx8bf") |
9f4cbab8 RS |
2252 | (VNx12SI "vnx4si") (VNx12SF "vnx4sf") |
2253 | (VNx6DI "vnx2di") (VNx6DF "vnx2df") | |
2254 | (VNx64QI "vnx16qi") | |
2255 | (VNx32HI "vnx8hi") (VNx32HF "vnx8hf") | |
02fcd8ac | 2256 | (VNx32BF "vnx8bf") |
9f4cbab8 RS |
2257 | (VNx16SI "vnx4si") (VNx16SF "vnx4sf") |
2258 | (VNx8DI "vnx2di") (VNx8DF "vnx2df")]) | |
2259 | ||
2260 | ;; The predicate mode associated with an SVE data mode. For structure modes | |
2261 | ;; this is equivalent to the <VPRED> of the subvector mode. | |
cc68f7c2 RS |
2262 | (define_mode_attr VPRED [(VNx16QI "VNx16BI") (VNx8QI "VNx8BI") |
2263 | (VNx4QI "VNx4BI") (VNx2QI "VNx2BI") | |
2264 | (VNx8HI "VNx8BI") (VNx4HI "VNx4BI") (VNx2HI "VNx2BI") | |
2265 | (VNx8HF "VNx8BI") (VNx4HF "VNx4BI") (VNx2HF "VNx2BI") | |
6c3ce63b | 2266 | (VNx8BF "VNx8BI") (VNx4BF "VNx4BI") (VNx2BF "VNx2BI") |
cc68f7c2 RS |
2267 | (VNx4SI "VNx4BI") (VNx2SI "VNx2BI") |
2268 | (VNx4SF "VNx4BI") (VNx2SF "VNx2BI") | |
2269 | (VNx2DI "VNx2BI") | |
2270 | (VNx2DF "VNx2BI") | |
4f6ab953 | 2271 | (VNx1TI "VNx2BI") |
9f4cbab8 RS |
2272 | (VNx32QI "VNx16BI") |
2273 | (VNx16HI "VNx8BI") (VNx16HF "VNx8BI") | |
02fcd8ac | 2274 | (VNx16BF "VNx8BI") |
9f4cbab8 RS |
2275 | (VNx8SI "VNx4BI") (VNx8SF "VNx4BI") |
2276 | (VNx4DI "VNx2BI") (VNx4DF "VNx2BI") | |
2277 | (VNx48QI "VNx16BI") | |
2278 | (VNx24HI "VNx8BI") (VNx24HF "VNx8BI") | |
02fcd8ac | 2279 | (VNx24BF "VNx8BI") |
9f4cbab8 RS |
2280 | (VNx12SI "VNx4BI") (VNx12SF "VNx4BI") |
2281 | (VNx6DI "VNx2BI") (VNx6DF "VNx2BI") | |
2282 | (VNx64QI "VNx16BI") | |
2283 | (VNx32HI "VNx8BI") (VNx32HF "VNx8BI") | |
02fcd8ac | 2284 | (VNx32BF "VNx8BI") |
9f4cbab8 | 2285 | (VNx16SI "VNx4BI") (VNx16SF "VNx4BI") |
dfa17fd3 | 2286 | (VNx8DI "VNx2BI") (VNx8DF "VNx2BI") |
e4b8db26 PZ |
2287 | (V8QI "VNx8BI") (V16QI "VNx16BI") |
2288 | (V4HI "VNx4BI") (V8HI "VNx8BI") (V2SI "VNx2BI") | |
dfa17fd3 | 2289 | (V4SI "VNx4BI") (V2DI "VNx2BI")]) |
43cacb12 RS |
2290 | |
2291 | ;; ...and again in lower case. | |
cc68f7c2 RS |
2292 | (define_mode_attr vpred [(VNx16QI "vnx16bi") (VNx8QI "vnx8bi") |
2293 | (VNx4QI "vnx4bi") (VNx2QI "vnx2bi") | |
2294 | (VNx8HI "vnx8bi") (VNx4HI "vnx4bi") (VNx2HI "vnx2bi") | |
2295 | (VNx8HF "vnx8bi") (VNx4HF "vnx4bi") (VNx2HF "vnx2bi") | |
6c3ce63b | 2296 | (VNx8BF "vnx8bi") (VNx4BF "vnx4bi") (VNx2BF "vnx2bi") |
cc68f7c2 RS |
2297 | (VNx4SI "vnx4bi") (VNx2SI "vnx2bi") |
2298 | (VNx4SF "vnx4bi") (VNx2SF "vnx2bi") | |
2299 | (VNx2DI "vnx2bi") | |
2300 | (VNx2DF "vnx2bi") | |
9f4cbab8 RS |
2301 | (VNx32QI "vnx16bi") |
2302 | (VNx16HI "vnx8bi") (VNx16HF "vnx8bi") | |
02fcd8ac | 2303 | (VNx16BF "vnx8bi") |
9f4cbab8 RS |
2304 | (VNx8SI "vnx4bi") (VNx8SF "vnx4bi") |
2305 | (VNx4DI "vnx2bi") (VNx4DF "vnx2bi") | |
2306 | (VNx48QI "vnx16bi") | |
2307 | (VNx24HI "vnx8bi") (VNx24HF "vnx8bi") | |
02fcd8ac | 2308 | (VNx24BF "vnx8bi") |
9f4cbab8 RS |
2309 | (VNx12SI "vnx4bi") (VNx12SF "vnx4bi") |
2310 | (VNx6DI "vnx2bi") (VNx6DF "vnx2bi") | |
2311 | (VNx64QI "vnx16bi") | |
2312 | (VNx32HI "vnx8bi") (VNx32HF "vnx4bi") | |
02fcd8ac | 2313 | (VNx32BF "vnx8bi") |
9f4cbab8 RS |
2314 | (VNx16SI "vnx4bi") (VNx16SF "vnx4bi") |
2315 | (VNx8DI "vnx2bi") (VNx8DF "vnx2bi")]) | |
43cacb12 | 2316 | |
0a09a948 RS |
2317 | (define_mode_attr VDOUBLE [(VNx16QI "VNx32QI") |
2318 | (VNx8HI "VNx16HI") (VNx8HF "VNx16HF") | |
02fcd8ac | 2319 | (VNx8BF "VNx16BF") |
0a09a948 RS |
2320 | (VNx4SI "VNx8SI") (VNx4SF "VNx8SF") |
2321 | (VNx2DI "VNx4DI") (VNx2DF "VNx4DF")]) | |
2322 | ||
9d63f43b TC |
2323 | ;; On AArch64 the By element instruction doesn't have a 2S variant. |
2324 | ;; However because the instruction always selects a pair of values | |
2325 | ;; The normal 3SAME instruction can be used here instead. | |
2326 | (define_mode_attr FCMLA_maybe_lane [(V2SF "<Vtype>") (V4SF "<Vetype>[%4]") | |
2327 | (V4HF "<Vetype>[%4]") (V8HF "<Vetype>[%4]") | |
2328 | ]) | |
2329 | ||
c1c267df RS |
2330 | (define_mode_attr za32_offset_range [(VNx16QI "0_to_12_step_4") |
2331 | (VNx8BF "0_to_14_step_2") | |
2332 | (VNx8HF "0_to_14_step_2") | |
2333 | (VNx8HI "0_to_14_step_2") | |
2334 | (VNx32QI "0_to_4_step_4") | |
2335 | (VNx16BF "0_to_6_step_2") | |
2336 | (VNx16HF "0_to_6_step_2") | |
2337 | (VNx16HI "0_to_6_step_2") | |
2338 | (VNx64QI "0_to_4_step_4") | |
2339 | (VNx32BF "0_to_6_step_2") | |
2340 | (VNx32HF "0_to_6_step_2") | |
2341 | (VNx32HI "0_to_6_step_2")]) | |
2342 | ||
2343 | (define_mode_attr za64_offset_range [(VNx8HI "0_to_12_step_4") | |
2344 | (VNx16HI "0_to_4_step_4") | |
2345 | (VNx32HI "0_to_4_step_4")]) | |
2346 | ||
2347 | (define_mode_attr za32_long [(VNx16QI "ll") (VNx32QI "ll") (VNx64QI "ll") | |
2348 | (VNx8HI "l") (VNx16HI "l") (VNx32HI "l")]) | |
2349 | ||
2350 | (define_mode_attr za32_last_offset [(VNx16QI "3") (VNx32QI "3") (VNx64QI "3") | |
2351 | (VNx8HI "1") (VNx16HI "1") (VNx32HI "1")]) | |
2352 | ||
2353 | (define_mode_attr vg_modifier [(VNx16QI "") | |
2354 | (VNx32QI ", vgx2") | |
2355 | (VNx64QI ", vgx4") | |
2356 | (VNx8BF "") | |
2357 | (VNx16BF ", vgx2") | |
2358 | (VNx32BF ", vgx4") | |
2359 | (VNx8HF "") | |
2360 | (VNx16HF ", vgx2") | |
2361 | (VNx32HF ", vgx4") | |
2362 | (VNx8HI "") | |
2363 | (VNx16HI ", vgx2") | |
2364 | (VNx32HI ", vgx4")]) | |
2365 | ||
2366 | (define_mode_attr z_suffix [(VNx16QI ".b") (VNx32QI "") (VNx64QI "") | |
2367 | (VNx8BF ".h") (VNx16BF "") (VNx32BF "") | |
2368 | (VNx8HF ".h") (VNx16HF "") (VNx32HF "") | |
2369 | (VNx8HI ".h") (VNx16HI "") (VNx32HI "")]) | |
2370 | ||
34467289 RS |
2371 | ;; The number of bytes controlled by a predicate |
2372 | (define_mode_attr data_bytes [(VNx16BI "1") (VNx8BI "2") | |
2373 | (VNx4BI "4") (VNx2BI "8")]) | |
2374 | ||
624d0f07 RS |
2375 | ;; Two-nybble mask for partial vector modes: nunits, byte size. |
2376 | (define_mode_attr self_mask [(VNx8QI "0x81") | |
2377 | (VNx4QI "0x41") | |
2378 | (VNx2QI "0x21") | |
2379 | (VNx4HI "0x42") | |
2380 | (VNx2HI "0x22") | |
2381 | (VNx2SI "0x24")]) | |
2382 | ||
e58703e2 RS |
2383 | ;; For SVE_HSDI vector modes, the mask of narrower modes, encoded as above. |
2384 | (define_mode_attr narrower_mask [(VNx8HI "0x81") (VNx4HI "0x41") | |
2385 | (VNx2HI "0x21") | |
2386 | (VNx4SI "0x43") (VNx2SI "0x23") | |
624d0f07 RS |
2387 | (VNx2DI "0x27")]) |
2388 | ||
2389 | ;; The constraint to use for an SVE [SU]DOT, FMUL, FMLA or FMLS lane index. | |
0a09a948 | 2390 | (define_mode_attr sve_lane_con [(VNx8HI "y") (VNx4SI "y") (VNx2DI "x") |
dfa17fd3 | 2391 | (V2DI "x") |
624d0f07 RS |
2392 | (VNx8HF "y") (VNx4SF "y") (VNx2DF "x")]) |
2393 | ||
2394 | ;; The constraint to use for an SVE FCMLA lane index. | |
2395 | (define_mode_attr sve_lane_pair_con [(VNx8HF "y") (VNx4SF "x")]) | |
2396 | ||
84152985 KT |
2397 | (define_mode_attr vec_or_offset [(V8QI "vec") (V16QI "vec") (V4HI "vec") |
2398 | (V8HI "vec") (V2SI "vec") (V4SI "vec") | |
2399 | (V2DI "vec") (DI "offset")]) | |
2400 | ||
c1c267df RS |
2401 | (define_mode_attr b [(VNx8BF "b") (VNx8HF "") (VNx4SF "") (VNx2DF "") |
2402 | (VNx16BF "b") (VNx16HF "") | |
2403 | (VNx32BF "b") (VNx32HF "")]) | |
2404 | ||
2405 | (define_mode_attr aligned_operand [(VNx16QI "register_operand") | |
2406 | (VNx8HI "register_operand") | |
2407 | (VNx8BF "register_operand") | |
2408 | (VNx8HF "register_operand") | |
2409 | (VNx32QI "aligned_register_operand") | |
2410 | (VNx16HI "aligned_register_operand") | |
2411 | (VNx16BF "aligned_register_operand") | |
2412 | (VNx16HF "aligned_register_operand") | |
2413 | (VNx64QI "aligned_register_operand") | |
2414 | (VNx32HI "aligned_register_operand") | |
2415 | (VNx32BF "aligned_register_operand") | |
2416 | (VNx32HF "aligned_register_operand")]) | |
2417 | ||
2418 | (define_mode_attr aligned_fpr [(VNx16QI "w") (VNx8HI "w") | |
2419 | (VNx8BF "w") (VNx8HF "w") | |
2420 | (VNx32QI "Uw2") (VNx16HI "Uw2") | |
2421 | (VNx16BF "Uw2") (VNx16HF "Uw2") | |
2422 | (VNx64QI "Uw4") (VNx32HI "Uw4") | |
2423 | (VNx32BF "Uw4") (VNx32HF "Uw4")]) | |
4f6ab953 | 2424 | |
43e9d192 IB |
2425 | ;; ------------------------------------------------------------------- |
2426 | ;; Code Iterators | |
2427 | ;; ------------------------------------------------------------------- | |
2428 | ||
2429 | ;; This code iterator allows the various shifts supported on the core | |
48f3f27f WD |
2430 | (define_code_iterator SHIFT [ashift ashiftrt lshiftrt rotatert rotate]) |
2431 | ||
2432 | ;; This code iterator allows all shifts except for rotates. | |
2433 | (define_code_iterator SHIFT_no_rotate [ashift ashiftrt lshiftrt]) | |
43e9d192 IB |
2434 | |
2435 | ;; This code iterator allows the shifts supported in arithmetic instructions | |
2436 | (define_code_iterator ASHIFT [ashift ashiftrt lshiftrt]) | |
2437 | ||
462e6f9a ST |
2438 | (define_code_iterator SHIFTRT [ashiftrt lshiftrt]) |
2439 | ||
43e9d192 IB |
2440 | ;; Code iterator for logical operations |
2441 | (define_code_iterator LOGICAL [and ior xor]) | |
2442 | ||
25332d23 RS |
2443 | ;; LOGICAL with plus, for when | gets converted to +. |
2444 | (define_code_iterator LOGICAL_OR_PLUS [and ior xor plus]) | |
2445 | ||
43cacb12 RS |
2446 | ;; LOGICAL without AND. |
2447 | (define_code_iterator LOGICAL_OR [ior xor]) | |
2448 | ||
84be6032 AL |
2449 | ;; Code iterator for logical operations whose :nlogical works on SIMD registers. |
2450 | (define_code_iterator NLOGICAL [and ior]) | |
2451 | ||
3204ac98 KT |
2452 | ;; Code iterator for unary negate and bitwise complement. |
2453 | (define_code_iterator NEG_NOT [neg not]) | |
2454 | ||
43e9d192 IB |
2455 | ;; Code iterator for sign/zero extension |
2456 | (define_code_iterator ANY_EXTEND [sign_extend zero_extend]) | |
87a80d27 | 2457 | (define_code_iterator ANY_EXTEND2 [sign_extend zero_extend]) |
43e9d192 IB |
2458 | |
2459 | ;; All division operations (signed/unsigned) | |
2460 | (define_code_iterator ANY_DIV [div udiv]) | |
2461 | ||
2462 | ;; Code iterator for sign/zero extraction | |
2463 | (define_code_iterator ANY_EXTRACT [sign_extract zero_extract]) | |
2464 | ||
2465 | ;; Code iterator for equality comparisons | |
2466 | (define_code_iterator EQL [eq ne]) | |
2467 | ||
2468 | ;; Code iterator for less-than and greater/equal-to | |
2469 | (define_code_iterator LTGE [lt ge]) | |
2470 | ||
2471 | ;; Iterator for __sync_<op> operations that where the operation can be | |
2472 | ;; represented directly RTL. This is all of the sync operations bar | |
2473 | ;; nand. | |
0462169c | 2474 | (define_code_iterator atomic_op [plus minus ior xor and]) |
43e9d192 IB |
2475 | |
2476 | ;; Iterator for integer conversions | |
2477 | (define_code_iterator FIXUORS [fix unsigned_fix]) | |
2478 | ||
1709ff9b JG |
2479 | ;; Iterator for float conversions |
2480 | (define_code_iterator FLOATUORS [float unsigned_float]) | |
2481 | ||
43e9d192 IB |
2482 | ;; Code iterator for variants of vector max and min. |
2483 | (define_code_iterator MAXMIN [smax smin umax umin]) | |
2484 | ||
d758d190 KT |
2485 | ;; Code iterator for min/max ops but without UMAX. |
2486 | (define_code_iterator MAXMIN_NOUMAX [smax smin umin]) | |
2487 | ||
998eaf97 JG |
2488 | (define_code_iterator FMAXMIN [smax smin]) |
2489 | ||
8544ed6e KT |
2490 | ;; Signed and unsigned max operations. |
2491 | (define_code_iterator USMAX [smax umax]) | |
2492 | ||
dd550c99 | 2493 | ;; Code iterator for plus and minus. |
43e9d192 IB |
2494 | (define_code_iterator ADDSUB [plus minus]) |
2495 | ||
2496 | ;; Code iterator for variants of vector saturating binary ops. | |
2497 | (define_code_iterator BINQOPS [ss_plus us_plus ss_minus us_minus]) | |
2498 | ||
2499 | ;; Code iterator for variants of vector saturating unary ops. | |
2500 | (define_code_iterator UNQOPS [ss_neg ss_abs]) | |
2501 | ||
2502 | ;; Code iterator for signed variants of vector saturating binary ops. | |
2503 | (define_code_iterator SBINQOPS [ss_plus ss_minus]) | |
2504 | ||
624d0f07 RS |
2505 | ;; Code iterator for unsigned variants of vector saturating binary ops. |
2506 | (define_code_iterator UBINQOPS [us_plus us_minus]) | |
2507 | ||
2508 | ;; Modular and saturating addition. | |
2509 | (define_code_iterator ANY_PLUS [plus ss_plus us_plus]) | |
2510 | ||
2511 | ;; Saturating addition. | |
2512 | (define_code_iterator SAT_PLUS [ss_plus us_plus]) | |
2513 | ||
2514 | ;; Modular and saturating subtraction. | |
2515 | (define_code_iterator ANY_MINUS [minus ss_minus us_minus]) | |
2516 | ||
2517 | ;; Saturating subtraction. | |
2518 | (define_code_iterator SAT_MINUS [ss_minus us_minus]) | |
2519 | ||
889b9412 JG |
2520 | ;; Comparison operators for <F>CM. |
2521 | (define_code_iterator COMPARISONS [lt le eq ge gt]) | |
2522 | ||
2523 | ;; Unsigned comparison operators. | |
2524 | (define_code_iterator UCOMPARISONS [ltu leu geu gtu]) | |
2525 | ||
75dd5ace JG |
2526 | ;; Unsigned comparison operators. |
2527 | (define_code_iterator FAC_COMPARISONS [lt le ge gt]) | |
2528 | ||
52cd1cd1 KT |
2529 | ;; Signed and unsigned saturating truncations. |
2530 | (define_code_iterator SAT_TRUNC [ss_truncate us_truncate]) | |
2531 | ||
ffb87344 KT |
2532 | (define_code_iterator ALL_TRUNC [ss_truncate us_truncate truncate]) |
2533 | ||
43cacb12 | 2534 | ;; SVE integer unary operations. |
0a09a948 | 2535 | (define_code_iterator SVE_INT_UNARY [abs neg not clrsb clz popcount |
c2f0aaf7 | 2536 | bitreverse |
0a09a948 RS |
2537 | (ss_abs "TARGET_SVE2") |
2538 | (ss_neg "TARGET_SVE2")]) | |
43cacb12 | 2539 | |
a08acce8 | 2540 | ;; SVE integer binary operations. |
6c4fd4a9 | 2541 | (define_code_iterator SVE_INT_BINARY [plus minus mult smax umax smin umin |
20103c0e | 2542 | ashift ashiftrt lshiftrt |
0a09a948 RS |
2543 | and ior xor |
2544 | (ss_plus "TARGET_SVE2") | |
2545 | (us_plus "TARGET_SVE2") | |
2546 | (ss_minus "TARGET_SVE2") | |
2547 | (us_minus "TARGET_SVE2")]) | |
9d4ac06e | 2548 | |
a08acce8 | 2549 | ;; SVE integer binary division operations. |
c38f7319 RS |
2550 | (define_code_iterator SVE_INT_BINARY_SD [div udiv]) |
2551 | ||
f8c22a8b RS |
2552 | ;; SVE integer binary operations that have an immediate form. |
2553 | (define_code_iterator SVE_INT_BINARY_IMM [mult smax smin umax umin]) | |
2554 | ||
c1c267df RS |
2555 | (define_code_iterator SVE_INT_BINARY_MULTI [smax smin umax umin]) |
2556 | ||
2557 | (define_code_iterator SVE_INT_BINARY_SINGLE [plus smax smin umax umin]) | |
2558 | ||
740c1ed7 RS |
2559 | ;; SVE floating-point operations with an unpredicated all-register form. |
2560 | (define_code_iterator SVE_UNPRED_FP_BINARY [plus minus mult]) | |
2561 | ||
f22d7973 RS |
2562 | ;; SVE integer comparisons. |
2563 | (define_code_iterator SVE_INT_CMP [lt le eq ne ge gt ltu leu geu gtu]) | |
2564 | ||
43e9d192 IB |
2565 | ;; ------------------------------------------------------------------- |
2566 | ;; Code Attributes | |
2567 | ;; ------------------------------------------------------------------- | |
2568 | ;; Map rtl objects to optab names | |
2569 | (define_code_attr optab [(ashift "ashl") | |
2570 | (ashiftrt "ashr") | |
2571 | (lshiftrt "lshr") | |
2572 | (rotatert "rotr") | |
48f3f27f | 2573 | (rotate "rotl") |
43e9d192 IB |
2574 | (sign_extend "extend") |
2575 | (zero_extend "zero_extend") | |
2576 | (sign_extract "extv") | |
2577 | (zero_extract "extzv") | |
384be29f JG |
2578 | (fix "fix") |
2579 | (unsigned_fix "fixuns") | |
1709ff9b JG |
2580 | (float "float") |
2581 | (unsigned_float "floatuns") | |
bca5a997 RS |
2582 | (clrsb "clrsb") |
2583 | (clz "clz") | |
43cacb12 | 2584 | (popcount "popcount") |
c2f0aaf7 | 2585 | (bitreverse "rbit") |
43e9d192 IB |
2586 | (and "and") |
2587 | (ior "ior") | |
2588 | (xor "xor") | |
2589 | (not "one_cmpl") | |
2590 | (neg "neg") | |
2591 | (plus "add") | |
2592 | (minus "sub") | |
6c4fd4a9 | 2593 | (mult "mul") |
c38f7319 RS |
2594 | (div "div") |
2595 | (udiv "udiv") | |
694e6b19 RS |
2596 | (ss_plus "ssadd") |
2597 | (us_plus "usadd") | |
2598 | (ss_minus "sssub") | |
2599 | (us_minus "ussub") | |
43e9d192 IB |
2600 | (ss_neg "qneg") |
2601 | (ss_abs "qabs") | |
43cacb12 RS |
2602 | (smin "smin") |
2603 | (smax "smax") | |
2604 | (umin "umin") | |
2605 | (umax "umax") | |
43e9d192 IB |
2606 | (eq "eq") |
2607 | (ne "ne") | |
2608 | (lt "lt") | |
889b9412 JG |
2609 | (ge "ge") |
2610 | (le "le") | |
2611 | (gt "gt") | |
2612 | (ltu "ltu") | |
2613 | (leu "leu") | |
2614 | (geu "geu") | |
43cacb12 | 2615 | (gtu "gtu") |
d45b20a5 | 2616 | (abs "abs")]) |
889b9412 | 2617 | |
694e6b19 RS |
2618 | (define_code_attr addsub [(ss_plus "add") |
2619 | (us_plus "add") | |
2620 | (ss_minus "sub") | |
2621 | (us_minus "sub")]) | |
2622 | ||
84152985 KT |
2623 | (define_code_attr SHIFTEXTEND [(ashiftrt "sign_extend") (lshiftrt "zero_extend")]) |
2624 | ||
ffb87344 KT |
2625 | (define_code_attr TRUNCEXTEND [(ss_truncate "sign_extend") |
2626 | (us_truncate "zero_extend") | |
2627 | (truncate "zero_extend")]) | |
2628 | ||
889b9412 JG |
2629 | ;; For comparison operators we use the FCM* and CM* instructions. |
2630 | ;; As there are no CMLE or CMLT instructions which act on 3 vector | |
2631 | ;; operands, we must use CMGE or CMGT and swap the order of the | |
2632 | ;; source operands. | |
2633 | ||
2634 | (define_code_attr n_optab [(lt "gt") (le "ge") (eq "eq") (ge "ge") (gt "gt") | |
2635 | (ltu "hi") (leu "hs") (geu "hs") (gtu "hi")]) | |
2636 | (define_code_attr cmp_1 [(lt "2") (le "2") (eq "1") (ge "1") (gt "1") | |
2637 | (ltu "2") (leu "2") (geu "1") (gtu "1")]) | |
2638 | (define_code_attr cmp_2 [(lt "1") (le "1") (eq "2") (ge "2") (gt "2") | |
2639 | (ltu "1") (leu "1") (geu "2") (gtu "2")]) | |
2640 | ||
2641 | (define_code_attr CMP [(lt "LT") (le "LE") (eq "EQ") (ge "GE") (gt "GT") | |
714e1b3b KT |
2642 | (ltu "LTU") (leu "LEU") (ne "NE") (geu "GEU") |
2643 | (gtu "GTU")]) | |
43e9d192 | 2644 | |
f22d7973 RS |
2645 | ;; The AArch64 condition associated with an rtl comparison code. |
2646 | (define_code_attr cmp_op [(lt "lt") | |
2647 | (le "le") | |
2648 | (eq "eq") | |
2649 | (ne "ne") | |
2650 | (ge "ge") | |
2651 | (gt "gt") | |
2652 | (ltu "lo") | |
2653 | (leu "ls") | |
2654 | (geu "hs") | |
2655 | (gtu "hi")]) | |
2656 | ||
384be29f JG |
2657 | (define_code_attr fix_trunc_optab [(fix "fix_trunc") |
2658 | (unsigned_fix "fixuns_trunc")]) | |
2659 | ||
43e9d192 IB |
2660 | ;; Optab prefix for sign/zero-extending operations |
2661 | (define_code_attr su_optab [(sign_extend "") (zero_extend "u") | |
2662 | (div "") (udiv "u") | |
2663 | (fix "") (unsigned_fix "u") | |
1709ff9b | 2664 | (float "s") (unsigned_float "u") |
43e9d192 IB |
2665 | (ss_plus "s") (us_plus "u") |
2666 | (ss_minus "s") (us_minus "u")]) | |
2667 | ||
2668 | ;; Similar for the instruction mnemonics | |
2669 | (define_code_attr shift [(ashift "lsl") (ashiftrt "asr") | |
48f3f27f WD |
2670 | (lshiftrt "lsr") (rotatert "ror") (rotate "ror")]) |
2671 | ;; True if shift is rotate left. | |
2672 | (define_code_attr is_rotl [(ashift "0") (ashiftrt "0") | |
2673 | (lshiftrt "0") (rotatert "0") (rotate "1")]) | |
43e9d192 | 2674 | |
462e6f9a ST |
2675 | ;; Op prefix for shift right and accumulate. |
2676 | (define_code_attr sra_op [(ashiftrt "s") (lshiftrt "u")]) | |
2677 | ||
e33aef11 TC |
2678 | ;; op prefix for shift right and narrow. |
2679 | (define_code_attr srn_op [(ashiftrt "r") (lshiftrt "")]) | |
2680 | ||
207db5d9 KT |
2681 | (define_code_attr shrn_s [(ashiftrt "s") (lshiftrt "")]) |
2682 | ||
43e9d192 IB |
2683 | ;; Map shift operators onto underlying bit-field instructions |
2684 | (define_code_attr bfshift [(ashift "ubfiz") (ashiftrt "sbfx") | |
2685 | (lshiftrt "ubfx") (rotatert "extr")]) | |
2686 | ||
2687 | ;; Logical operator instruction mnemonics | |
2688 | (define_code_attr logical [(and "and") (ior "orr") (xor "eor")]) | |
2689 | ||
3204ac98 KT |
2690 | ;; Operation names for negate and bitwise complement. |
2691 | (define_code_attr neg_not_op [(neg "neg") (not "not")]) | |
2692 | ||
d572ad49 AC |
2693 | ;; csinv, csneg insn suffixes. |
2694 | (define_code_attr neg_not_cs [(neg "neg") (not "inv")]) | |
2695 | ||
43cacb12 | 2696 | ;; Similar, but when the second operand is inverted. |
43e9d192 IB |
2697 | (define_code_attr nlogical [(and "bic") (ior "orn") (xor "eon")]) |
2698 | ||
43cacb12 RS |
2699 | ;; Similar, but when both operands are inverted. |
2700 | (define_code_attr logical_nn [(and "nor") (ior "nand")]) | |
2701 | ||
43e9d192 IB |
2702 | ;; Sign- or zero-extending data-op |
2703 | (define_code_attr su [(sign_extend "s") (zero_extend "u") | |
2704 | (sign_extract "s") (zero_extract "u") | |
2705 | (fix "s") (unsigned_fix "u") | |
998eaf97 JG |
2706 | (div "s") (udiv "u") |
2707 | (smax "s") (umax "u") | |
52cd1cd1 KT |
2708 | (smin "s") (umin "u") |
2709 | (ss_truncate "s") (us_truncate "u")]) | |
43e9d192 | 2710 | |
624d0f07 RS |
2711 | ;; "s" for signed ops, empty for unsigned ones. |
2712 | (define_code_attr s [(sign_extend "s") (zero_extend "")]) | |
2713 | ||
2714 | ;; Map signed/unsigned ops to the corresponding extension. | |
2715 | (define_code_attr paired_extend [(ss_plus "sign_extend") | |
2716 | (us_plus "zero_extend") | |
2717 | (ss_minus "sign_extend") | |
2718 | (us_minus "zero_extend")]) | |
2719 | ||
ffb87344 KT |
2720 | (define_code_attr TRUNC_SHIFT [(ss_truncate "ashiftrt") |
2721 | (us_truncate "lshiftrt") (truncate "lshiftrt")]) | |
2722 | ||
2723 | (define_code_attr shrn_op [(ss_truncate "sq") | |
2724 | (us_truncate "uq") (truncate "")]) | |
2725 | ||
43cacb12 RS |
2726 | ;; Whether a shift is left or right. |
2727 | (define_code_attr lr [(ashift "l") (ashiftrt "r") (lshiftrt "r")]) | |
2728 | ||
096e8448 JW |
2729 | ;; Emit conditional branch instructions. |
2730 | (define_code_attr bcond [(eq "beq") (ne "bne") (lt "bne") (ge "beq")]) | |
2731 | ||
43e9d192 IB |
2732 | ;; Emit cbz/cbnz depending on comparison type. |
2733 | (define_code_attr cbz [(eq "cbz") (ne "cbnz") (lt "cbnz") (ge "cbz")]) | |
2734 | ||
973d2e01 TP |
2735 | ;; Emit inverted cbz/cbnz depending on comparison type. |
2736 | (define_code_attr inv_cb [(eq "cbnz") (ne "cbz") (lt "cbz") (ge "cbnz")]) | |
2737 | ||
43e9d192 IB |
2738 | ;; Emit tbz/tbnz depending on comparison type. |
2739 | (define_code_attr tbz [(eq "tbz") (ne "tbnz") (lt "tbnz") (ge "tbz")]) | |
2740 | ||
973d2e01 TP |
2741 | ;; Emit inverted tbz/tbnz depending on comparison type. |
2742 | (define_code_attr inv_tb [(eq "tbnz") (ne "tbz") (lt "tbz") (ge "tbnz")]) | |
2743 | ||
43e9d192 | 2744 | ;; Max/min attributes. |
998eaf97 JG |
2745 | (define_code_attr maxmin [(smax "max") |
2746 | (smin "min") | |
2747 | (umax "max") | |
2748 | (umin "min")]) | |
43e9d192 | 2749 | |
88195141 KT |
2750 | (define_code_attr maxminand [(smax "bic") (smin "and")]) |
2751 | ||
43e9d192 IB |
2752 | ;; MLA/MLS attributes. |
2753 | (define_code_attr as [(ss_plus "a") (ss_minus "s")]) | |
2754 | ||
0462169c SN |
2755 | ;; Atomic operations |
2756 | (define_code_attr atomic_optab | |
2757 | [(ior "or") (xor "xor") (and "and") (plus "add") (minus "sub")]) | |
2758 | ||
2759 | (define_code_attr atomic_op_operand | |
2760 | [(ior "aarch64_logical_operand") | |
2761 | (xor "aarch64_logical_operand") | |
2762 | (and "aarch64_logical_operand") | |
2763 | (plus "aarch64_plus_operand") | |
2764 | (minus "aarch64_plus_operand")]) | |
43e9d192 | 2765 | |
356c32e2 MW |
2766 | ;; Constants acceptable for atomic operations. |
2767 | ;; This definition must appear in this file before the iterators it refers to. | |
2768 | (define_code_attr const_atomic | |
2769 | [(plus "IJ") (minus "IJ") | |
2770 | (xor "<lconst_atomic>") (ior "<lconst_atomic>") | |
2771 | (and "<lconst_atomic>")]) | |
2772 | ||
2773 | ;; Attribute to describe constants acceptable in atomic logical operations | |
2774 | (define_mode_attr lconst_atomic [(QI "K") (HI "K") (SI "K") (DI "L")]) | |
2775 | ||
43cacb12 RS |
2776 | ;; The integer SVE instruction that implements an rtx code. |
2777 | (define_code_attr sve_int_op [(plus "add") | |
9d4ac06e | 2778 | (minus "sub") |
6c4fd4a9 | 2779 | (mult "mul") |
c38f7319 RS |
2780 | (div "sdiv") |
2781 | (udiv "udiv") | |
69c5fdcf | 2782 | (abs "abs") |
43cacb12 RS |
2783 | (neg "neg") |
2784 | (smin "smin") | |
2785 | (smax "smax") | |
2786 | (umin "umin") | |
2787 | (umax "umax") | |
20103c0e RS |
2788 | (ashift "lsl") |
2789 | (ashiftrt "asr") | |
2790 | (lshiftrt "lsr") | |
43cacb12 RS |
2791 | (and "and") |
2792 | (ior "orr") | |
2793 | (xor "eor") | |
2794 | (not "not") | |
bca5a997 RS |
2795 | (clrsb "cls") |
2796 | (clz "clz") | |
0a09a948 | 2797 | (popcount "cnt") |
c2f0aaf7 | 2798 | (bitreverse "rbit") |
0a09a948 RS |
2799 | (ss_plus "sqadd") |
2800 | (us_plus "uqadd") | |
2801 | (ss_minus "sqsub") | |
2802 | (us_minus "uqsub") | |
2803 | (ss_neg "sqneg") | |
2804 | (ss_abs "sqabs")]) | |
43cacb12 | 2805 | |
a08acce8 | 2806 | (define_code_attr sve_int_op_rev [(plus "add") |
20103c0e RS |
2807 | (minus "subr") |
2808 | (mult "mul") | |
2809 | (div "sdivr") | |
2810 | (udiv "udivr") | |
2811 | (smin "smin") | |
2812 | (smax "smax") | |
2813 | (umin "umin") | |
2814 | (umax "umax") | |
2815 | (ashift "lslr") | |
2816 | (ashiftrt "asrr") | |
2817 | (lshiftrt "lsrr") | |
2818 | (and "and") | |
2819 | (ior "orr") | |
0a09a948 RS |
2820 | (xor "eor") |
2821 | (ss_plus "sqadd") | |
2822 | (us_plus "uqadd") | |
2823 | (ss_minus "sqsubr") | |
2824 | (us_minus "uqsubr")]) | |
a08acce8 | 2825 | |
43cacb12 RS |
2826 | ;; The floating-point SVE instruction that implements an rtx code. |
2827 | (define_code_attr sve_fp_op [(plus "fadd") | |
740c1ed7 | 2828 | (minus "fsub") |
d45b20a5 | 2829 | (mult "fmul")]) |
43cacb12 | 2830 | |
f22d7973 | 2831 | ;; The SVE immediate constraint to use for an rtl code. |
f8c22a8b RS |
2832 | (define_code_attr sve_imm_con [(mult "vsm") |
2833 | (smax "vsm") | |
2834 | (smin "vsm") | |
2835 | (umax "vsb") | |
2836 | (umin "vsb") | |
2837 | (eq "vsc") | |
f22d7973 RS |
2838 | (ne "vsc") |
2839 | (lt "vsc") | |
2840 | (ge "vsc") | |
2841 | (le "vsc") | |
2842 | (gt "vsc") | |
2843 | (ltu "vsd") | |
2844 | (leu "vsd") | |
2845 | (geu "vsd") | |
2846 | (gtu "vsd")]) | |
2847 | ||
f8c22a8b RS |
2848 | ;; The prefix letter to use when printing an immediate operand. |
2849 | (define_code_attr sve_imm_prefix [(mult "") | |
2850 | (smax "") | |
2851 | (smin "") | |
2852 | (umax "D") | |
2853 | (umin "D")]) | |
2854 | ||
d113ece6 RS |
2855 | ;; The predicate to use for the second input operand in a cond_<optab><mode> |
2856 | ;; pattern. | |
2857 | (define_code_attr sve_pred_int_rhs2_operand | |
2858 | [(plus "register_operand") | |
2859 | (minus "register_operand") | |
2860 | (mult "register_operand") | |
2861 | (smax "register_operand") | |
2862 | (umax "register_operand") | |
2863 | (smin "register_operand") | |
2864 | (umin "register_operand") | |
20103c0e RS |
2865 | (ashift "aarch64_sve_lshift_operand") |
2866 | (ashiftrt "aarch64_sve_rshift_operand") | |
2867 | (lshiftrt "aarch64_sve_rshift_operand") | |
d113ece6 RS |
2868 | (and "aarch64_sve_pred_and_operand") |
2869 | (ior "register_operand") | |
0a09a948 RS |
2870 | (xor "register_operand") |
2871 | (ss_plus "register_operand") | |
2872 | (us_plus "register_operand") | |
2873 | (ss_minus "register_operand") | |
2874 | (us_minus "register_operand")]) | |
d113ece6 | 2875 | |
624d0f07 RS |
2876 | (define_code_attr inc_dec [(minus "dec") (ss_minus "sqdec") (us_minus "uqdec") |
2877 | (plus "inc") (ss_plus "sqinc") (us_plus "uqinc")]) | |
2878 | ||
43e9d192 IB |
2879 | ;; ------------------------------------------------------------------- |
2880 | ;; Int Iterators. | |
2881 | ;; ------------------------------------------------------------------- | |
75add2d0 | 2882 | |
43e9d192 IB |
2883 | (define_int_iterator MAXMINV [UNSPEC_UMAXV UNSPEC_UMINV |
2884 | UNSPEC_SMAXV UNSPEC_SMINV]) | |
2885 | ||
998eaf97 JG |
2886 | (define_int_iterator FMAXMINV [UNSPEC_FMAXV UNSPEC_FMINV |
2887 | UNSPEC_FMAXNMV UNSPEC_FMINNMV]) | |
43e9d192 | 2888 | |
e32b9eb3 RS |
2889 | (define_int_iterator FMAXMINNMV [UNSPEC_FMAXNMV UNSPEC_FMINNMV]) |
2890 | ||
624d0f07 RS |
2891 | (define_int_iterator SVE_INT_ADDV [UNSPEC_SADDV UNSPEC_UADDV]) |
2892 | ||
43cacb12 RS |
2893 | (define_int_iterator LOGICALF [UNSPEC_ANDF UNSPEC_IORF UNSPEC_XORF]) |
2894 | ||
43e9d192 IB |
2895 | (define_int_iterator HADDSUB [UNSPEC_SHADD UNSPEC_UHADD |
2896 | UNSPEC_SRHADD UNSPEC_URHADD | |
2e828dfe | 2897 | UNSPEC_SHSUB UNSPEC_UHSUB]) |
43e9d192 | 2898 | |
42addb5a RS |
2899 | (define_int_iterator HADD [UNSPEC_SHADD UNSPEC_UHADD]) |
2900 | ||
2901 | (define_int_iterator RHADD [UNSPEC_SRHADD UNSPEC_URHADD]) | |
2902 | ||
2d57b12e YW |
2903 | (define_int_iterator BSL_DUP [1 2]) |
2904 | ||
7a08d813 | 2905 | (define_int_iterator DOTPROD [UNSPEC_SDOT UNSPEC_UDOT]) |
43e9d192 | 2906 | |
8c197c85 | 2907 | (define_int_iterator DOTPROD_I8MM [UNSPEC_USDOT UNSPEC_SUDOT]) |
36696774 | 2908 | (define_int_iterator DOTPROD_US_ONLY [UNSPEC_USDOT]) |
8c197c85 | 2909 | |
1efafef3 TC |
2910 | (define_int_iterator FMAXMIN_UNS [UNSPEC_FMAX UNSPEC_FMIN |
2911 | UNSPEC_FMAXNM UNSPEC_FMINNM]) | |
202d0c11 | 2912 | |
8fc16d72 ST |
2913 | (define_int_iterator PAUTH_LR_SP [UNSPEC_PACIASP UNSPEC_AUTIASP |
2914 | UNSPEC_PACIBSP UNSPEC_AUTIBSP]) | |
db58fd89 | 2915 | |
8fc16d72 ST |
2916 | (define_int_iterator PAUTH_17_16 [UNSPEC_PACIA1716 UNSPEC_AUTIA1716 |
2917 | UNSPEC_PACIB1716 UNSPEC_AUTIB1716]) | |
db58fd89 | 2918 | |
43e9d192 IB |
2919 | (define_int_iterator VQDMULH [UNSPEC_SQDMULH UNSPEC_SQRDMULH]) |
2920 | ||
58cc9876 YW |
2921 | (define_int_iterator MULHRS [UNSPEC_SMULHS UNSPEC_UMULHS |
2922 | UNSPEC_SMULHRS UNSPEC_UMULHRS]) | |
2923 | ||
43e9d192 IB |
2924 | (define_int_iterator USSUQADD [UNSPEC_SUQADD UNSPEC_USQADD]) |
2925 | ||
43e9d192 IB |
2926 | (define_int_iterator VSHL [UNSPEC_SSHL UNSPEC_USHL |
2927 | UNSPEC_SRSHL UNSPEC_URSHL]) | |
2928 | ||
2929 | (define_int_iterator VSHLL [UNSPEC_SSHLL UNSPEC_USHLL]) | |
2930 | ||
2931 | (define_int_iterator VQSHL [UNSPEC_SQSHL UNSPEC_UQSHL | |
2932 | UNSPEC_SQRSHL UNSPEC_UQRSHL]) | |
2933 | ||
84152985 | 2934 | (define_int_iterator VSRA [UNSPEC_SSRA UNSPEC_USRA]) |
43e9d192 IB |
2935 | |
2936 | (define_int_iterator VSLRI [UNSPEC_SSLI UNSPEC_USLI | |
2937 | UNSPEC_SSRI UNSPEC_USRI]) | |
2938 | ||
2939 | ||
2940 | (define_int_iterator VRSHR_N [UNSPEC_SRSHR UNSPEC_URSHR]) | |
2941 | ||
2942 | (define_int_iterator VQSHL_N [UNSPEC_SQSHLU UNSPEC_SQSHL UNSPEC_UQSHL]) | |
2943 | ||
57b26d65 MW |
2944 | (define_int_iterator SQRDMLH_AS [UNSPEC_SQRDMLAH UNSPEC_SQRDMLSH]) |
2945 | ||
cc4d934f JG |
2946 | (define_int_iterator PERMUTE [UNSPEC_ZIP1 UNSPEC_ZIP2 |
2947 | UNSPEC_TRN1 UNSPEC_TRN2 | |
2948 | UNSPEC_UZP1 UNSPEC_UZP2]) | |
43e9d192 | 2949 | |
36696774 RS |
2950 | (define_int_iterator PERMUTEQ [UNSPEC_ZIP1Q UNSPEC_ZIP2Q |
2951 | UNSPEC_TRN1Q UNSPEC_TRN2Q | |
2952 | UNSPEC_UZP1Q UNSPEC_UZP2Q]) | |
2953 | ||
43cacb12 RS |
2954 | (define_int_iterator OPTAB_PERMUTE [UNSPEC_ZIP1 UNSPEC_ZIP2 |
2955 | UNSPEC_UZP1 UNSPEC_UZP2]) | |
2956 | ||
923fcec3 AL |
2957 | (define_int_iterator REVERSE [UNSPEC_REV64 UNSPEC_REV32 UNSPEC_REV16]) |
2958 | ||
42fc9a7f | 2959 | (define_int_iterator FRINT [UNSPEC_FRINTZ UNSPEC_FRINTP UNSPEC_FRINTM |
0659ce6f JG |
2960 | UNSPEC_FRINTN UNSPEC_FRINTI UNSPEC_FRINTX |
2961 | UNSPEC_FRINTA]) | |
42fc9a7f JG |
2962 | |
2963 | (define_int_iterator FCVT [UNSPEC_FRINTZ UNSPEC_FRINTP UNSPEC_FRINTM | |
ce966824 | 2964 | UNSPEC_FRINTA UNSPEC_FRINTN]) |
42fc9a7f | 2965 | |
3f598afe JW |
2966 | (define_int_iterator FCVT_F2FIXED [UNSPEC_FCVTZS UNSPEC_FCVTZU]) |
2967 | (define_int_iterator FCVT_FIXED2F [UNSPEC_SCVTF UNSPEC_UCVTF]) | |
2968 | ||
5d357f26 KT |
2969 | (define_int_iterator CRC [UNSPEC_CRC32B UNSPEC_CRC32H UNSPEC_CRC32W |
2970 | UNSPEC_CRC32X UNSPEC_CRC32CB UNSPEC_CRC32CH | |
2971 | UNSPEC_CRC32CW UNSPEC_CRC32CX]) | |
2972 | ||
5a7a4e80 TB |
2973 | (define_int_iterator CRYPTO_AES [UNSPEC_AESE UNSPEC_AESD]) |
2974 | (define_int_iterator CRYPTO_AESMC [UNSPEC_AESMC UNSPEC_AESIMC]) | |
2975 | ||
30442682 TB |
2976 | (define_int_iterator CRYPTO_SHA1 [UNSPEC_SHA1C UNSPEC_SHA1M UNSPEC_SHA1P]) |
2977 | ||
b9cb0a44 TB |
2978 | (define_int_iterator CRYPTO_SHA256 [UNSPEC_SHA256H UNSPEC_SHA256H2]) |
2979 | ||
27086ea3 MC |
2980 | (define_int_iterator CRYPTO_SHA512 [UNSPEC_SHA512H UNSPEC_SHA512H2]) |
2981 | ||
2982 | (define_int_iterator CRYPTO_SM3TT [UNSPEC_SM3TT1A UNSPEC_SM3TT1B | |
2983 | UNSPEC_SM3TT2A UNSPEC_SM3TT2B]) | |
2984 | ||
2985 | (define_int_iterator CRYPTO_SM3PART [UNSPEC_SM3PARTW1 UNSPEC_SM3PARTW2]) | |
2986 | ||
2987 | ;; Iterators for fp16 operations | |
2988 | ||
2989 | (define_int_iterator VFMLA16_LOW [UNSPEC_FMLAL UNSPEC_FMLSL]) | |
2990 | ||
2991 | (define_int_iterator VFMLA16_HIGH [UNSPEC_FMLAL2 UNSPEC_FMLSL2]) | |
2992 | ||
43cacb12 RS |
2993 | (define_int_iterator UNPACK [UNSPEC_UNPACKSHI UNSPEC_UNPACKUHI |
2994 | UNSPEC_UNPACKSLO UNSPEC_UNPACKULO]) | |
2995 | ||
2996 | (define_int_iterator UNPACK_UNSIGNED [UNSPEC_UNPACKULO UNSPEC_UNPACKUHI]) | |
2997 | ||
11e9443f RS |
2998 | (define_int_iterator MUL_HIGHPART [UNSPEC_SMUL_HIGHPART UNSPEC_UMUL_HIGHPART]) |
2999 | ||
624d0f07 RS |
3000 | (define_int_iterator CLAST [UNSPEC_CLASTA UNSPEC_CLASTB]) |
3001 | ||
3002 | (define_int_iterator LAST [UNSPEC_LASTA UNSPEC_LASTB]) | |
3003 | ||
c2f0aaf7 | 3004 | (define_int_iterator SVE_INT_UNARY [UNSPEC_REVB |
624d0f07 RS |
3005 | UNSPEC_REVH UNSPEC_REVW]) |
3006 | ||
3007 | (define_int_iterator SVE_FP_UNARY [UNSPEC_FRECPE UNSPEC_RSQRTE]) | |
3008 | ||
983b4365 | 3009 | (define_int_iterator SVE_FP_UNARY_INT [(UNSPEC_FEXPA "TARGET_NON_STREAMING")]) |
624d0f07 | 3010 | |
0a09a948 RS |
3011 | (define_int_iterator SVE_INT_SHIFT_IMM [UNSPEC_ASRD |
3012 | (UNSPEC_SQSHLU "TARGET_SVE2") | |
3013 | (UNSPEC_SRSHR "TARGET_SVE2") | |
3014 | (UNSPEC_URSHR "TARGET_SVE2")]) | |
3015 | ||
c1c267df RS |
3016 | (define_int_iterator SVE_INT_BINARY_MULTI [UNSPEC_SQDMULH |
3017 | UNSPEC_SRSHL UNSPEC_URSHL]) | |
3018 | ||
624d0f07 RS |
3019 | (define_int_iterator SVE_FP_BINARY [UNSPEC_FRECPS UNSPEC_RSQRTS]) |
3020 | ||
3021 | (define_int_iterator SVE_FP_BINARY_INT [UNSPEC_FTSMUL UNSPEC_FTSSEL]) | |
d7a09c44 | 3022 | |
c1c267df RS |
3023 | (define_int_iterator SVE_FP_BINARY_MULTI [UNSPEC_FMAX UNSPEC_FMAXNM |
3024 | UNSPEC_FMIN UNSPEC_FMINNM]) | |
3025 | ||
3026 | (define_int_iterator SVE_BFLOAT_TERNARY_LONG | |
3027 | [UNSPEC_BFDOT | |
3028 | UNSPEC_BFMLALB | |
3029 | UNSPEC_BFMLALT | |
3030 | (UNSPEC_BFMLSLB "TARGET_SME2 && TARGET_STREAMING_SME") | |
3031 | (UNSPEC_BFMLSLT "TARGET_SME2 && TARGET_STREAMING_SME") | |
3032 | (UNSPEC_BFMMLA "TARGET_NON_STREAMING")]) | |
896dff99 | 3033 | |
c1c267df RS |
3034 | (define_int_iterator SVE_BFLOAT_TERNARY_LONG_LANE |
3035 | [UNSPEC_BFDOT | |
3036 | UNSPEC_BFMLALB | |
3037 | UNSPEC_BFMLALT | |
3038 | (UNSPEC_BFMLSLB "TARGET_SME2 && TARGET_STREAMING_SME") | |
3039 | (UNSPEC_BFMLSLT "TARGET_SME2 && TARGET_STREAMING_SME")]) | |
896dff99 | 3040 | |
b0760a40 RS |
3041 | (define_int_iterator SVE_INT_REDUCTION [UNSPEC_ANDV |
3042 | UNSPEC_IORV | |
3043 | UNSPEC_SMAXV | |
3044 | UNSPEC_SMINV | |
3045 | UNSPEC_UMAXV | |
3046 | UNSPEC_UMINV | |
3047 | UNSPEC_XORV]) | |
3048 | ||
3049 | (define_int_iterator SVE_FP_REDUCTION [UNSPEC_FADDV | |
3050 | UNSPEC_FMAXV | |
3051 | UNSPEC_FMAXNMV | |
3052 | UNSPEC_FMINV | |
3053 | UNSPEC_FMINNMV]) | |
3054 | ||
d45b20a5 RS |
3055 | (define_int_iterator SVE_COND_FP_UNARY [UNSPEC_COND_FABS |
3056 | UNSPEC_COND_FNEG | |
624d0f07 | 3057 | UNSPEC_COND_FRECPX |
d45b20a5 RS |
3058 | UNSPEC_COND_FRINTA |
3059 | UNSPEC_COND_FRINTI | |
3060 | UNSPEC_COND_FRINTM | |
3061 | UNSPEC_COND_FRINTN | |
3062 | UNSPEC_COND_FRINTP | |
3063 | UNSPEC_COND_FRINTX | |
3064 | UNSPEC_COND_FRINTZ | |
3065 | UNSPEC_COND_FSQRT]) | |
3066 | ||
a0ee8352 RS |
3067 | ;; Same as SVE_COND_FP_UNARY, but without codes that have a dedicated |
3068 | ;; <optab><mode>2 expander. | |
3069 | (define_int_iterator SVE_COND_FP_UNARY_OPTAB [UNSPEC_COND_FABS | |
3070 | UNSPEC_COND_FNEG | |
3071 | UNSPEC_COND_FRECPX | |
3072 | UNSPEC_COND_FRINTA | |
3073 | UNSPEC_COND_FRINTI | |
3074 | UNSPEC_COND_FRINTM | |
3075 | UNSPEC_COND_FRINTN | |
3076 | UNSPEC_COND_FRINTP | |
3077 | UNSPEC_COND_FRINTX | |
3078 | UNSPEC_COND_FRINTZ]) | |
3079 | ||
95eb5537 | 3080 | (define_int_iterator SVE_COND_FCVT [UNSPEC_COND_FCVT]) |
99361551 RS |
3081 | (define_int_iterator SVE_COND_FCVTI [UNSPEC_COND_FCVTZS UNSPEC_COND_FCVTZU]) |
3082 | (define_int_iterator SVE_COND_ICVTF [UNSPEC_COND_SCVTF UNSPEC_COND_UCVTF]) | |
3083 | ||
cb18e86d RS |
3084 | (define_int_iterator SVE_COND_FP_BINARY [UNSPEC_COND_FADD |
3085 | UNSPEC_COND_FDIV | |
624d0f07 | 3086 | UNSPEC_COND_FMAX |
cb18e86d | 3087 | UNSPEC_COND_FMAXNM |
624d0f07 | 3088 | UNSPEC_COND_FMIN |
cb18e86d RS |
3089 | UNSPEC_COND_FMINNM |
3090 | UNSPEC_COND_FMUL | |
624d0f07 | 3091 | UNSPEC_COND_FMULX |
cb18e86d | 3092 | UNSPEC_COND_FSUB]) |
0d2b3bca | 3093 | |
04f307cb RS |
3094 | ;; Same as SVE_COND_FP_BINARY, but without codes that have a dedicated |
3095 | ;; <optab><mode>3 expander. | |
3096 | (define_int_iterator SVE_COND_FP_BINARY_OPTAB [UNSPEC_COND_FADD | |
3097 | UNSPEC_COND_FMAX | |
3098 | UNSPEC_COND_FMAXNM | |
3099 | UNSPEC_COND_FMIN | |
3100 | UNSPEC_COND_FMINNM | |
3101 | UNSPEC_COND_FMUL | |
3102 | UNSPEC_COND_FMULX | |
3103 | UNSPEC_COND_FSUB]) | |
3104 | ||
624d0f07 RS |
3105 | (define_int_iterator SVE_COND_FP_BINARY_INT [UNSPEC_COND_FSCALE]) |
3106 | ||
3107 | (define_int_iterator SVE_COND_FP_ADD [UNSPEC_COND_FADD]) | |
3108 | (define_int_iterator SVE_COND_FP_SUB [UNSPEC_COND_FSUB]) | |
3109 | (define_int_iterator SVE_COND_FP_MUL [UNSPEC_COND_FMUL]) | |
3110 | ||
3111 | (define_int_iterator SVE_COND_FP_BINARY_I1 [UNSPEC_COND_FMAX | |
3112 | UNSPEC_COND_FMAXNM | |
3113 | UNSPEC_COND_FMIN | |
a19ba9e1 RS |
3114 | UNSPEC_COND_FMINNM |
3115 | UNSPEC_COND_FMUL]) | |
3116 | ||
624d0f07 RS |
3117 | (define_int_iterator SVE_COND_FP_BINARY_REG [UNSPEC_COND_FDIV |
3118 | UNSPEC_COND_FMULX]) | |
3119 | ||
3120 | (define_int_iterator SVE_COND_FCADD [UNSPEC_COND_FCADD90 | |
3121 | UNSPEC_COND_FCADD270]) | |
3122 | ||
3123 | (define_int_iterator SVE_COND_FP_MAXMIN [UNSPEC_COND_FMAX | |
3124 | UNSPEC_COND_FMAXNM | |
3125 | UNSPEC_COND_FMIN | |
3126 | UNSPEC_COND_FMINNM]) | |
0254ed79 | 3127 | |
214c42fa RS |
3128 | ;; Floating-point max/min operations that correspond to optabs, |
3129 | ;; as opposed to those that are internal to the port. | |
3130 | (define_int_iterator SVE_COND_FP_MAXMIN_PUBLIC [UNSPEC_COND_FMAXNM | |
3131 | UNSPEC_COND_FMINNM]) | |
3132 | ||
b41d1f6e RS |
3133 | (define_int_iterator SVE_COND_FP_TERNARY [UNSPEC_COND_FMLA |
3134 | UNSPEC_COND_FMLS | |
3135 | UNSPEC_COND_FNMLA | |
3136 | UNSPEC_COND_FNMLS]) | |
3137 | ||
624d0f07 RS |
3138 | (define_int_iterator SVE_COND_FCMLA [UNSPEC_COND_FCMLA |
3139 | UNSPEC_COND_FCMLA90 | |
3140 | UNSPEC_COND_FCMLA180 | |
3141 | UNSPEC_COND_FCMLA270]) | |
3142 | ||
3143 | (define_int_iterator SVE_COND_INT_CMP_WIDE [UNSPEC_COND_CMPEQ_WIDE | |
3144 | UNSPEC_COND_CMPGE_WIDE | |
3145 | UNSPEC_COND_CMPGT_WIDE | |
3146 | UNSPEC_COND_CMPHI_WIDE | |
3147 | UNSPEC_COND_CMPHS_WIDE | |
3148 | UNSPEC_COND_CMPLE_WIDE | |
3149 | UNSPEC_COND_CMPLO_WIDE | |
3150 | UNSPEC_COND_CMPLS_WIDE | |
3151 | UNSPEC_COND_CMPLT_WIDE | |
3152 | UNSPEC_COND_CMPNE_WIDE]) | |
3153 | ||
4a942af6 RS |
3154 | ;; SVE FP comparisons that accept #0.0. |
3155 | (define_int_iterator SVE_COND_FP_CMP_I0 [UNSPEC_COND_FCMEQ | |
3156 | UNSPEC_COND_FCMGE | |
3157 | UNSPEC_COND_FCMGT | |
3158 | UNSPEC_COND_FCMLE | |
3159 | UNSPEC_COND_FCMLT | |
3160 | UNSPEC_COND_FCMNE]) | |
43cacb12 | 3161 | |
42b4e87d RS |
3162 | (define_int_iterator SVE_COND_FP_ABS_CMP [UNSPEC_COND_FCMGE |
3163 | UNSPEC_COND_FCMGT | |
3164 | UNSPEC_COND_FCMLE | |
3165 | UNSPEC_COND_FCMLT]) | |
3166 | ||
624d0f07 RS |
3167 | (define_int_iterator SVE_FP_TERNARY_LANE [UNSPEC_FMLA UNSPEC_FMLS]) |
3168 | ||
3169 | (define_int_iterator SVE_CFP_TERNARY_LANE [UNSPEC_FCMLA UNSPEC_FCMLA90 | |
3170 | UNSPEC_FCMLA180 UNSPEC_FCMLA270]) | |
3171 | ||
6ad9571b | 3172 | (define_int_iterator SVE_WHILE [UNSPEC_WHILELE UNSPEC_WHILELO |
bad5e58a | 3173 | UNSPEC_WHILELS UNSPEC_WHILELT |
0a09a948 RS |
3174 | (UNSPEC_WHILEGE "TARGET_SVE2") |
3175 | (UNSPEC_WHILEGT "TARGET_SVE2") | |
3176 | (UNSPEC_WHILEHI "TARGET_SVE2") | |
3177 | (UNSPEC_WHILEHS "TARGET_SVE2") | |
bad5e58a RS |
3178 | (UNSPEC_WHILERW "TARGET_SVE2") |
3179 | (UNSPEC_WHILEWR "TARGET_SVE2")]) | |
624d0f07 | 3180 | |
58c036c8 RS |
3181 | (define_int_iterator SVE2_WHILE_PTR [UNSPEC_WHILERW UNSPEC_WHILEWR]) |
3182 | ||
c1c267df RS |
3183 | (define_int_iterator SVE_WHILE_ORDER [UNSPEC_WHILEGE UNSPEC_WHILEGT |
3184 | UNSPEC_WHILEHI UNSPEC_WHILEHS | |
3185 | UNSPEC_WHILELE UNSPEC_WHILELO | |
3186 | UNSPEC_WHILELS UNSPEC_WHILELT]) | |
3187 | ||
624d0f07 RS |
3188 | (define_int_iterator SVE_SHIFT_WIDE [UNSPEC_ASHIFT_WIDE |
3189 | UNSPEC_ASHIFTRT_WIDE | |
3190 | UNSPEC_LSHIFTRT_WIDE]) | |
3191 | ||
3192 | (define_int_iterator SVE_LDFF1_LDNF1 [UNSPEC_LDFF1 UNSPEC_LDNF1]) | |
3193 | ||
7bb4b7a5 ASDV |
3194 | (define_int_iterator SVE_PRED_LOAD [UNSPEC_PRED_X UNSPEC_LD1_SVE]) |
3195 | ||
3196 | (define_int_attr pred_load [(UNSPEC_PRED_X "_x") (UNSPEC_LD1_SVE "")]) | |
3197 | ||
9f0f7d80 RS |
3198 | (define_int_iterator LD1_COUNT [UNSPEC_LD1_COUNT UNSPEC_LDNT1_COUNT]) |
3199 | ||
3200 | (define_int_iterator ST1_COUNT [UNSPEC_ST1_COUNT UNSPEC_STNT1_COUNT]) | |
3201 | ||
0a09a948 RS |
3202 | (define_int_iterator SVE2_U32_UNARY [UNSPEC_URECPE UNSPEC_RSQRTE]) |
3203 | ||
3204 | (define_int_iterator SVE2_INT_UNARY_NARROWB [UNSPEC_SQXTNB | |
3205 | UNSPEC_SQXTUNB | |
3206 | UNSPEC_UQXTNB]) | |
3207 | ||
3208 | (define_int_iterator SVE2_INT_UNARY_NARROWT [UNSPEC_SQXTNT | |
3209 | UNSPEC_SQXTUNT | |
3210 | UNSPEC_UQXTNT]) | |
3211 | ||
3212 | (define_int_iterator SVE2_INT_BINARY [UNSPEC_SQDMULH | |
3213 | UNSPEC_SQRDMULH]) | |
3214 | ||
3215 | (define_int_iterator SVE2_INT_BINARY_LANE [UNSPEC_SQDMULH | |
3216 | UNSPEC_SQRDMULH]) | |
3217 | ||
3218 | (define_int_iterator SVE2_INT_BINARY_LONG [UNSPEC_SABDLB | |
3219 | UNSPEC_SABDLT | |
3220 | UNSPEC_SADDLB | |
3221 | UNSPEC_SADDLBT | |
3222 | UNSPEC_SADDLT | |
3223 | UNSPEC_SMULLB | |
3224 | UNSPEC_SMULLT | |
3225 | UNSPEC_SQDMULLB | |
3226 | UNSPEC_SQDMULLT | |
3227 | UNSPEC_SSUBLB | |
3228 | UNSPEC_SSUBLBT | |
3229 | UNSPEC_SSUBLT | |
3230 | UNSPEC_SSUBLTB | |
3231 | UNSPEC_UABDLB | |
3232 | UNSPEC_UABDLT | |
3233 | UNSPEC_UADDLB | |
3234 | UNSPEC_UADDLT | |
3235 | UNSPEC_UMULLB | |
3236 | UNSPEC_UMULLT | |
3237 | UNSPEC_USUBLB | |
3238 | UNSPEC_USUBLT]) | |
3239 | ||
3240 | (define_int_iterator SVE2_INT_BINARY_LONG_LANE [UNSPEC_SMULLB | |
3241 | UNSPEC_SMULLT | |
3242 | UNSPEC_SQDMULLB | |
3243 | UNSPEC_SQDMULLT | |
3244 | UNSPEC_UMULLB | |
3245 | UNSPEC_UMULLT]) | |
3246 | ||
3247 | (define_int_iterator SVE2_INT_BINARY_NARROWB [UNSPEC_ADDHNB | |
3248 | UNSPEC_RADDHNB | |
3249 | UNSPEC_RSUBHNB | |
3250 | UNSPEC_SUBHNB]) | |
3251 | ||
3252 | (define_int_iterator SVE2_INT_BINARY_NARROWT [UNSPEC_ADDHNT | |
3253 | UNSPEC_RADDHNT | |
3254 | UNSPEC_RSUBHNT | |
3255 | UNSPEC_SUBHNT]) | |
3256 | ||
3257 | (define_int_iterator SVE2_INT_BINARY_PAIR [UNSPEC_ADDP | |
3258 | UNSPEC_SMAXP | |
3259 | UNSPEC_SMINP | |
3260 | UNSPEC_UMAXP | |
3261 | UNSPEC_UMINP]) | |
3262 | ||
3263 | (define_int_iterator SVE2_FP_BINARY_PAIR [UNSPEC_FADDP | |
3264 | UNSPEC_FMAXP | |
3265 | UNSPEC_FMAXNMP | |
3266 | UNSPEC_FMINP | |
3267 | UNSPEC_FMINNMP]) | |
3268 | ||
3269 | (define_int_iterator SVE2_INT_BINARY_PAIR_LONG [UNSPEC_SADALP UNSPEC_UADALP]) | |
3270 | ||
3271 | (define_int_iterator SVE2_INT_BINARY_WIDE [UNSPEC_SADDWB | |
3272 | UNSPEC_SADDWT | |
3273 | UNSPEC_SSUBWB | |
3274 | UNSPEC_SSUBWT | |
3275 | UNSPEC_UADDWB | |
3276 | UNSPEC_UADDWT | |
3277 | UNSPEC_USUBWB | |
3278 | UNSPEC_USUBWT]) | |
3279 | ||
3280 | (define_int_iterator SVE2_INT_SHIFT_IMM_LONG [UNSPEC_SSHLLB | |
3281 | UNSPEC_SSHLLT | |
3282 | UNSPEC_USHLLB | |
3283 | UNSPEC_USHLLT]) | |
3284 | ||
3285 | (define_int_iterator SVE2_INT_SHIFT_IMM_NARROWB [UNSPEC_RSHRNB | |
3286 | UNSPEC_SHRNB | |
3287 | UNSPEC_SQRSHRNB | |
3288 | UNSPEC_SQRSHRUNB | |
3289 | UNSPEC_SQSHRNB | |
3290 | UNSPEC_SQSHRUNB | |
3291 | UNSPEC_UQRSHRNB | |
3292 | UNSPEC_UQSHRNB]) | |
3293 | ||
3294 | (define_int_iterator SVE2_INT_SHIFT_IMM_NARROWT [UNSPEC_RSHRNT | |
3295 | UNSPEC_SHRNT | |
3296 | UNSPEC_SQRSHRNT | |
3297 | UNSPEC_SQRSHRUNT | |
3298 | UNSPEC_SQSHRNT | |
3299 | UNSPEC_SQSHRUNT | |
3300 | UNSPEC_UQRSHRNT | |
3301 | UNSPEC_UQSHRNT]) | |
3302 | ||
c1c267df RS |
3303 | (define_int_iterator SVE2_INT_SHIFT_IMM_NARROWxN [UNSPEC_SQRSHR |
3304 | UNSPEC_SQRSHRN | |
3305 | UNSPEC_SQRSHRU | |
3306 | UNSPEC_SQRSHRUN | |
3307 | UNSPEC_UQRSHR | |
3308 | UNSPEC_UQRSHRN]) | |
3309 | ||
0a09a948 RS |
3310 | (define_int_iterator SVE2_INT_SHIFT_INSERT [UNSPEC_SLI UNSPEC_SRI]) |
3311 | ||
3312 | (define_int_iterator SVE2_INT_CADD [UNSPEC_CADD90 | |
3313 | UNSPEC_CADD270 | |
3314 | UNSPEC_SQCADD90 | |
3315 | UNSPEC_SQCADD270]) | |
3316 | ||
3317 | (define_int_iterator SVE2_INT_BITPERM [UNSPEC_BDEP UNSPEC_BEXT UNSPEC_BGRP]) | |
3318 | ||
3319 | (define_int_iterator SVE2_INT_TERNARY [UNSPEC_ADCLB | |
3320 | UNSPEC_ADCLT | |
3321 | UNSPEC_EORBT | |
3322 | UNSPEC_EORTB | |
3323 | UNSPEC_SBCLB | |
3324 | UNSPEC_SBCLT | |
3325 | UNSPEC_SQRDMLAH | |
3326 | UNSPEC_SQRDMLSH]) | |
3327 | ||
3328 | (define_int_iterator SVE2_INT_TERNARY_LANE [UNSPEC_SQRDMLAH | |
3329 | UNSPEC_SQRDMLSH]) | |
3330 | ||
3331 | (define_int_iterator SVE2_FP_TERNARY_LONG [UNSPEC_FMLALB | |
3332 | UNSPEC_FMLALT | |
3333 | UNSPEC_FMLSLB | |
3334 | UNSPEC_FMLSLT]) | |
3335 | ||
3336 | (define_int_iterator SVE2_FP_TERNARY_LONG_LANE [UNSPEC_FMLALB | |
3337 | UNSPEC_FMLALT | |
3338 | UNSPEC_FMLSLB | |
3339 | UNSPEC_FMLSLT]) | |
3340 | ||
3341 | (define_int_iterator SVE2_INT_CMLA [UNSPEC_CMLA | |
3342 | UNSPEC_CMLA90 | |
3343 | UNSPEC_CMLA180 | |
3344 | UNSPEC_CMLA270 | |
3345 | UNSPEC_SQRDCMLAH | |
3346 | UNSPEC_SQRDCMLAH90 | |
3347 | UNSPEC_SQRDCMLAH180 | |
3348 | UNSPEC_SQRDCMLAH270]) | |
3349 | ||
ad260343 TC |
3350 | ;; Unlike the normal CMLA instructions these represent the actual operation |
3351 | ;; to be performed. They will always need to be expanded into multiple | |
3352 | ;; sequences consisting of CMLA. | |
3353 | (define_int_iterator SVE2_INT_CMLA_OP [UNSPEC_CMLA | |
3354 | UNSPEC_CMLA_CONJ | |
3355 | UNSPEC_CMLA180 | |
3356 | UNSPEC_CMLA180_CONJ]) | |
3357 | ||
3358 | ;; Unlike the normal CMLA instructions these represent the actual operation | |
3359 | ;; to be performed. They will always need to be expanded into multiple | |
3360 | ;; sequences consisting of CMLA. | |
3361 | (define_int_iterator SVE2_INT_CMUL_OP [UNSPEC_CMUL | |
3362 | UNSPEC_CMUL_CONJ]) | |
3363 | ||
84747acf TC |
3364 | ;; Same as SVE2_INT_CADD but exclude the saturating instructions |
3365 | (define_int_iterator SVE2_INT_CADD_OP [UNSPEC_CADD90 | |
3366 | UNSPEC_CADD270]) | |
3367 | ||
0a09a948 RS |
3368 | (define_int_iterator SVE2_INT_CDOT [UNSPEC_CDOT |
3369 | UNSPEC_CDOT90 | |
3370 | UNSPEC_CDOT180 | |
3371 | UNSPEC_CDOT270]) | |
3372 | ||
3373 | (define_int_iterator SVE2_INT_ADD_BINARY_LONG [UNSPEC_SABDLB | |
3374 | UNSPEC_SABDLT | |
3375 | UNSPEC_SMULLB | |
3376 | UNSPEC_SMULLT | |
3377 | UNSPEC_UABDLB | |
3378 | UNSPEC_UABDLT | |
3379 | UNSPEC_UMULLB | |
3380 | UNSPEC_UMULLT]) | |
3381 | ||
3382 | (define_int_iterator SVE2_INT_QADD_BINARY_LONG [UNSPEC_SQDMULLB | |
3383 | UNSPEC_SQDMULLBT | |
3384 | UNSPEC_SQDMULLT]) | |
3385 | ||
3386 | (define_int_iterator SVE2_INT_SUB_BINARY_LONG [UNSPEC_SMULLB | |
3387 | UNSPEC_SMULLT | |
3388 | UNSPEC_UMULLB | |
3389 | UNSPEC_UMULLT]) | |
3390 | ||
3391 | (define_int_iterator SVE2_INT_QSUB_BINARY_LONG [UNSPEC_SQDMULLB | |
3392 | UNSPEC_SQDMULLBT | |
3393 | UNSPEC_SQDMULLT]) | |
3394 | ||
3395 | (define_int_iterator SVE2_INT_ADD_BINARY_LONG_LANE [UNSPEC_SMULLB | |
3396 | UNSPEC_SMULLT | |
3397 | UNSPEC_UMULLB | |
3398 | UNSPEC_UMULLT]) | |
3399 | ||
3400 | (define_int_iterator SVE2_INT_QADD_BINARY_LONG_LANE [UNSPEC_SQDMULLB | |
3401 | UNSPEC_SQDMULLT]) | |
3402 | ||
3403 | (define_int_iterator SVE2_INT_SUB_BINARY_LONG_LANE [UNSPEC_SMULLB | |
3404 | UNSPEC_SMULLT | |
3405 | UNSPEC_UMULLB | |
3406 | UNSPEC_UMULLT]) | |
3407 | ||
3408 | (define_int_iterator SVE2_INT_QSUB_BINARY_LONG_LANE [UNSPEC_SQDMULLB | |
3409 | UNSPEC_SQDMULLT]) | |
3410 | ||
3411 | (define_int_iterator SVE2_COND_INT_UNARY_FP [UNSPEC_COND_FLOGB]) | |
3412 | ||
3413 | (define_int_iterator SVE2_COND_FP_UNARY_LONG [UNSPEC_COND_FCVTLT]) | |
3414 | ||
3415 | (define_int_iterator SVE2_COND_FP_UNARY_NARROWB [UNSPEC_COND_FCVTX]) | |
3416 | ||
3417 | (define_int_iterator SVE2_COND_INT_BINARY [UNSPEC_SHADD | |
3418 | UNSPEC_SHSUB | |
3419 | UNSPEC_SQRSHL | |
3420 | UNSPEC_SRHADD | |
3421 | UNSPEC_SRSHL | |
3422 | UNSPEC_SUQADD | |
3423 | UNSPEC_UHADD | |
3424 | UNSPEC_UHSUB | |
3425 | UNSPEC_UQRSHL | |
3426 | UNSPEC_URHADD | |
3427 | UNSPEC_URSHL | |
3428 | UNSPEC_USQADD]) | |
3429 | ||
3430 | (define_int_iterator SVE2_COND_INT_BINARY_NOREV [UNSPEC_SUQADD | |
3431 | UNSPEC_USQADD]) | |
3432 | ||
3433 | (define_int_iterator SVE2_COND_INT_BINARY_REV [UNSPEC_SHADD | |
3434 | UNSPEC_SHSUB | |
3435 | UNSPEC_SQRSHL | |
3436 | UNSPEC_SRHADD | |
3437 | UNSPEC_SRSHL | |
3438 | UNSPEC_UHADD | |
3439 | UNSPEC_UHSUB | |
3440 | UNSPEC_UQRSHL | |
3441 | UNSPEC_URHADD | |
3442 | UNSPEC_URSHL]) | |
3443 | ||
3444 | (define_int_iterator SVE2_COND_INT_SHIFT [UNSPEC_SQSHL | |
3445 | UNSPEC_UQSHL]) | |
3446 | ||
3447 | (define_int_iterator SVE2_MATCH [UNSPEC_MATCH UNSPEC_NMATCH]) | |
3448 | ||
3449 | (define_int_iterator SVE2_PMULL [UNSPEC_PMULLB UNSPEC_PMULLT]) | |
3450 | ||
3451 | (define_int_iterator SVE2_PMULL_PAIR [UNSPEC_PMULLB_PAIR UNSPEC_PMULLT_PAIR]) | |
3452 | ||
c1c267df RS |
3453 | (define_int_iterator SVE_QCVTxN [UNSPEC_SQCVT UNSPEC_SQCVTN |
3454 | UNSPEC_SQCVTU UNSPEC_SQCVTUN | |
3455 | UNSPEC_UQCVT UNSPEC_UQCVTN]) | |
3456 | ||
3457 | (define_int_iterator SVE2_SFx24_UNARY [UNSPEC_FRINTA UNSPEC_FRINTM | |
3458 | UNSPEC_FRINTN UNSPEC_FRINTP]) | |
3459 | ||
3460 | (define_int_iterator SVE2_x24_PERMUTE [UNSPEC_ZIP UNSPEC_UZP]) | |
3461 | (define_int_iterator SVE2_x24_PERMUTEQ [UNSPEC_ZIPQ UNSPEC_UZPQ]) | |
3462 | ||
9d63f43b TC |
3463 | (define_int_iterator FCADD [UNSPEC_FCADD90 |
3464 | UNSPEC_FCADD270]) | |
3465 | ||
3466 | (define_int_iterator FCMLA [UNSPEC_FCMLA | |
3467 | UNSPEC_FCMLA90 | |
3468 | UNSPEC_FCMLA180 | |
3469 | UNSPEC_FCMLA270]) | |
3470 | ||
10bd1d96 KT |
3471 | (define_int_iterator FRINTNZX [UNSPEC_FRINT32Z UNSPEC_FRINT32X |
3472 | UNSPEC_FRINT64Z UNSPEC_FRINT64X]) | |
3473 | ||
624d0f07 RS |
3474 | (define_int_iterator SVE_BRK_UNARY [UNSPEC_BRKA UNSPEC_BRKB]) |
3475 | ||
6bec6664 RS |
3476 | (define_int_iterator SVE_BRKP [UNSPEC_BRKPA UNSPEC_BRKPB]) |
3477 | ||
624d0f07 RS |
3478 | (define_int_iterator SVE_BRK_BINARY [UNSPEC_BRKN UNSPEC_BRKPA UNSPEC_BRKPB]) |
3479 | ||
3480 | (define_int_iterator SVE_PITER [UNSPEC_PFIRST UNSPEC_PNEXT]) | |
3481 | ||
36696774 RS |
3482 | (define_int_iterator MATMUL [UNSPEC_SMATMUL UNSPEC_UMATMUL |
3483 | UNSPEC_USMATMUL]) | |
3484 | ||
3485 | (define_int_iterator FMMLA [UNSPEC_FMMLA]) | |
3486 | ||
f78335df DB |
3487 | (define_int_iterator BF_MLA [UNSPEC_BFMLALB |
3488 | UNSPEC_BFMLALT]) | |
3489 | ||
ad260343 TC |
3490 | (define_int_iterator FCMLA_OP [UNSPEC_FCMLA |
3491 | UNSPEC_FCMLA180 | |
3492 | UNSPEC_FCMLA_CONJ | |
3493 | UNSPEC_FCMLA180_CONJ]) | |
3494 | ||
3495 | (define_int_iterator FCMUL_OP [UNSPEC_FCMUL | |
3496 | UNSPEC_FCMUL_CONJ]) | |
3497 | ||
c1c267df RS |
3498 | (define_int_iterator UNSPEC_REVD_ONLY [UNSPEC_REVD]) |
3499 | ||
4f6ab953 RS |
3500 | (define_int_iterator SME_LD1 [UNSPEC_SME_LD1_HOR UNSPEC_SME_LD1_VER]) |
3501 | (define_int_iterator SME_READ [UNSPEC_SME_READ_HOR UNSPEC_SME_READ_VER]) | |
3502 | (define_int_iterator SME_ST1 [UNSPEC_SME_ST1_HOR UNSPEC_SME_ST1_VER]) | |
3503 | (define_int_iterator SME_WRITE [UNSPEC_SME_WRITE_HOR UNSPEC_SME_WRITE_VER]) | |
3504 | ||
3505 | (define_int_iterator SME_BINARY_SDI [UNSPEC_SME_ADDHA UNSPEC_SME_ADDVA]) | |
3506 | ||
3507 | (define_int_iterator SME_INT_MOP [UNSPEC_SME_SMOPA UNSPEC_SME_SMOPS | |
3508 | UNSPEC_SME_SUMOPA UNSPEC_SME_SUMOPS | |
3509 | UNSPEC_SME_UMOPA UNSPEC_SME_UMOPS | |
3510 | UNSPEC_SME_USMOPA UNSPEC_SME_USMOPS]) | |
3511 | ||
c1c267df RS |
3512 | (define_int_iterator SME2_INT_MOP [UNSPEC_SME_SMOPA UNSPEC_SME_SMOPS |
3513 | UNSPEC_SME_UMOPA UNSPEC_SME_UMOPS]) | |
3514 | ||
4f6ab953 RS |
3515 | (define_int_iterator SME_FP_MOP [UNSPEC_SME_FMOPA UNSPEC_SME_FMOPS]) |
3516 | ||
c1c267df RS |
3517 | (define_int_iterator SME2_BMOP [UNSPEC_SME_BMOPA UNSPEC_SME_BMOPS]) |
3518 | ||
3519 | (define_int_iterator SME_BINARY_SLICE_SDI [UNSPEC_SME_ADD UNSPEC_SME_SUB]) | |
3520 | ||
3521 | (define_int_iterator SME_BINARY_SLICE_SDF [UNSPEC_SME_FADD UNSPEC_SME_FSUB]) | |
3522 | ||
3523 | (define_int_iterator SME_BINARY_WRITE_SLICE_SDI [UNSPEC_SME_ADD_WRITE | |
3524 | UNSPEC_SME_SUB_WRITE]) | |
3525 | ||
3526 | (define_int_iterator SME_INT_DOTPROD [UNSPEC_SME_SDOT UNSPEC_SME_UDOT | |
3527 | UNSPEC_SME_USDOT]) | |
3528 | ||
3529 | (define_int_iterator SME_INT_DOTPROD_LANE [UNSPEC_SME_SDOT UNSPEC_SME_SVDOT | |
3530 | UNSPEC_SME_UDOT UNSPEC_SME_UVDOT | |
3531 | UNSPEC_SME_SUDOT UNSPEC_SME_SUVDOT | |
3532 | UNSPEC_SME_USDOT UNSPEC_SME_USVDOT]) | |
3533 | ||
3534 | (define_int_iterator SME_FP_DOTPROD [UNSPEC_SME_FDOT]) | |
3535 | ||
3536 | (define_int_iterator SME_FP_DOTPROD_LANE [UNSPEC_SME_FDOT UNSPEC_SME_FVDOT]) | |
3537 | ||
3538 | (define_int_iterator SME_INT_TERNARY_SLICE [UNSPEC_SME_SMLA UNSPEC_SME_SMLS | |
3539 | UNSPEC_SME_UMLA UNSPEC_SME_UMLS]) | |
3540 | ||
3541 | (define_int_iterator SME_FP_TERNARY_SLICE [UNSPEC_SME_FMLA UNSPEC_SME_FMLS]) | |
3542 | ||
d81cb613 MW |
3543 | ;; Iterators for atomic operations. |
3544 | ||
3545 | (define_int_iterator ATOMIC_LDOP | |
3546 | [UNSPECV_ATOMIC_LDOP_OR UNSPECV_ATOMIC_LDOP_BIC | |
3547 | UNSPECV_ATOMIC_LDOP_XOR UNSPECV_ATOMIC_LDOP_PLUS]) | |
3548 | ||
3549 | (define_int_attr atomic_ldop | |
3550 | [(UNSPECV_ATOMIC_LDOP_OR "set") (UNSPECV_ATOMIC_LDOP_BIC "clr") | |
3551 | (UNSPECV_ATOMIC_LDOP_XOR "eor") (UNSPECV_ATOMIC_LDOP_PLUS "add")]) | |
3552 | ||
7803ec5e RH |
3553 | (define_int_attr atomic_ldoptab |
3554 | [(UNSPECV_ATOMIC_LDOP_OR "ior") (UNSPECV_ATOMIC_LDOP_BIC "bic") | |
3555 | (UNSPECV_ATOMIC_LDOP_XOR "xor") (UNSPECV_ATOMIC_LDOP_PLUS "add")]) | |
3556 | ||
b096a6eb RS |
3557 | (define_int_iterator SUBDI_BITS [8 16 32]) |
3558 | ||
c1c267df RS |
3559 | (define_int_iterator BHSD_BITS [8 16 32 64]) |
3560 | ||
3561 | (define_int_iterator LUTI_BITS [2 4]) | |
3562 | ||
43e9d192 IB |
3563 | ;; ------------------------------------------------------------------- |
3564 | ;; Int Iterators Attributes. | |
3565 | ;; ------------------------------------------------------------------- | |
43cacb12 RS |
3566 | |
3567 | ;; The optab associated with an operation. Note that for ANDF, IORF | |
3568 | ;; and XORF, the optab pattern is not actually defined; we just use this | |
3569 | ;; name for consistency with the integer patterns. | |
3570 | (define_int_attr optab [(UNSPEC_ANDF "and") | |
3571 | (UNSPEC_IORF "ior") | |
898f07b0 | 3572 | (UNSPEC_XORF "xor") |
624d0f07 RS |
3573 | (UNSPEC_SADDV "sadd") |
3574 | (UNSPEC_UADDV "uadd") | |
898f07b0 RS |
3575 | (UNSPEC_ANDV "and") |
3576 | (UNSPEC_IORV "ior") | |
0972596e | 3577 | (UNSPEC_XORV "xor") |
624d0f07 RS |
3578 | (UNSPEC_FRECPE "frecpe") |
3579 | (UNSPEC_FRECPS "frecps") | |
3580 | (UNSPEC_RSQRTE "frsqrte") | |
3581 | (UNSPEC_RSQRTS "frsqrts") | |
d7a09c44 | 3582 | (UNSPEC_REVB "revb") |
c1c267df | 3583 | (UNSPEC_REVD "revd") |
d7a09c44 RS |
3584 | (UNSPEC_REVH "revh") |
3585 | (UNSPEC_REVW "revw") | |
b0760a40 RS |
3586 | (UNSPEC_UMAXV "umax") |
3587 | (UNSPEC_UMINV "umin") | |
3588 | (UNSPEC_SMAXV "smax") | |
3589 | (UNSPEC_SMINV "smin") | |
0a09a948 RS |
3590 | (UNSPEC_CADD90 "cadd90") |
3591 | (UNSPEC_CADD270 "cadd270") | |
3592 | (UNSPEC_CDOT "cdot") | |
3593 | (UNSPEC_CDOT90 "cdot90") | |
3594 | (UNSPEC_CDOT180 "cdot180") | |
3595 | (UNSPEC_CDOT270 "cdot270") | |
3596 | (UNSPEC_CMLA "cmla") | |
3597 | (UNSPEC_CMLA90 "cmla90") | |
3598 | (UNSPEC_CMLA180 "cmla180") | |
3599 | (UNSPEC_CMLA270 "cmla270") | |
b0760a40 RS |
3600 | (UNSPEC_FADDV "plus") |
3601 | (UNSPEC_FMAXNMV "smax") | |
3602 | (UNSPEC_FMAXV "smax_nan") | |
3603 | (UNSPEC_FMINNMV "smin") | |
3604 | (UNSPEC_FMINV "smin_nan") | |
624d0f07 RS |
3605 | (UNSPEC_SMUL_HIGHPART "smulh") |
3606 | (UNSPEC_UMUL_HIGHPART "umulh") | |
3607 | (UNSPEC_FMLA "fma") | |
3608 | (UNSPEC_FMLS "fnma") | |
3609 | (UNSPEC_FCMLA "fcmla") | |
3610 | (UNSPEC_FCMLA90 "fcmla90") | |
3611 | (UNSPEC_FCMLA180 "fcmla180") | |
3612 | (UNSPEC_FCMLA270 "fcmla270") | |
3613 | (UNSPEC_FEXPA "fexpa") | |
3614 | (UNSPEC_FTSMUL "ftsmul") | |
3615 | (UNSPEC_FTSSEL "ftssel") | |
9f0f7d80 RS |
3616 | (UNSPEC_LD1_COUNT "ld1") |
3617 | (UNSPEC_LDNT1_COUNT "ldnt1") | |
0a09a948 RS |
3618 | (UNSPEC_PMULLB "pmullb") |
3619 | (UNSPEC_PMULLB_PAIR "pmullb_pair") | |
3620 | (UNSPEC_PMULLT "pmullt") | |
3621 | (UNSPEC_PMULLT_PAIR "pmullt_pair") | |
36696774 | 3622 | (UNSPEC_SMATMUL "smatmul") |
c1c267df RS |
3623 | (UNSPEC_UZP "uzp") |
3624 | (UNSPEC_UZPQ "uzpq") | |
3625 | (UNSPEC_ZIP "zip") | |
3626 | (UNSPEC_ZIPQ "zipq") | |
3627 | (UNSPEC_SME_ADD "add") | |
3628 | (UNSPEC_SME_ADD_WRITE "add_write") | |
4f6ab953 RS |
3629 | (UNSPEC_SME_ADDHA "addha") |
3630 | (UNSPEC_SME_ADDVA "addva") | |
c1c267df RS |
3631 | (UNSPEC_SME_BMOPA "bmopa") |
3632 | (UNSPEC_SME_BMOPS "bmops") | |
3633 | (UNSPEC_SME_FADD "fadd") | |
3634 | (UNSPEC_SME_FDOT "fdot") | |
3635 | (UNSPEC_SME_FVDOT "fvdot") | |
3636 | (UNSPEC_SME_FMLA "fmla") | |
3637 | (UNSPEC_SME_FMLS "fmls") | |
4f6ab953 RS |
3638 | (UNSPEC_SME_FMOPA "fmopa") |
3639 | (UNSPEC_SME_FMOPS "fmops") | |
c1c267df | 3640 | (UNSPEC_SME_FSUB "fsub") |
4f6ab953 RS |
3641 | (UNSPEC_SME_LD1_HOR "ld1_hor") |
3642 | (UNSPEC_SME_LD1_VER "ld1_ver") | |
3643 | (UNSPEC_SME_READ_HOR "read_hor") | |
3644 | (UNSPEC_SME_READ_VER "read_ver") | |
c1c267df RS |
3645 | (UNSPEC_SME_SDOT "sdot") |
3646 | (UNSPEC_SME_SVDOT "svdot") | |
3647 | (UNSPEC_SME_SMLA "smla") | |
3648 | (UNSPEC_SME_SMLS "smls") | |
4f6ab953 RS |
3649 | (UNSPEC_SME_SMOPA "smopa") |
3650 | (UNSPEC_SME_SMOPS "smops") | |
3651 | (UNSPEC_SME_ST1_HOR "st1_hor") | |
3652 | (UNSPEC_SME_ST1_VER "st1_ver") | |
c1c267df RS |
3653 | (UNSPEC_SME_SUB "sub") |
3654 | (UNSPEC_SME_SUB_WRITE "sub_write") | |
3655 | (UNSPEC_SME_SUDOT "sudot") | |
3656 | (UNSPEC_SME_SUVDOT "suvdot") | |
4f6ab953 RS |
3657 | (UNSPEC_SME_SUMOPA "sumopa") |
3658 | (UNSPEC_SME_SUMOPS "sumops") | |
c1c267df RS |
3659 | (UNSPEC_SME_UDOT "udot") |
3660 | (UNSPEC_SME_UVDOT "uvdot") | |
3661 | (UNSPEC_SME_UMLA "umla") | |
3662 | (UNSPEC_SME_UMLS "umls") | |
4f6ab953 RS |
3663 | (UNSPEC_SME_UMOPA "umopa") |
3664 | (UNSPEC_SME_UMOPS "umops") | |
c1c267df RS |
3665 | (UNSPEC_SME_USDOT "usdot") |
3666 | (UNSPEC_SME_USVDOT "usvdot") | |
4f6ab953 RS |
3667 | (UNSPEC_SME_USMOPA "usmopa") |
3668 | (UNSPEC_SME_USMOPS "usmops") | |
3669 | (UNSPEC_SME_WRITE_HOR "write_hor") | |
3670 | (UNSPEC_SME_WRITE_VER "write_ver") | |
0a09a948 RS |
3671 | (UNSPEC_SQCADD90 "sqcadd90") |
3672 | (UNSPEC_SQCADD270 "sqcadd270") | |
c1c267df RS |
3673 | (UNSPEC_SQCVT "sqcvt") |
3674 | (UNSPEC_SQCVTN "sqcvtn") | |
3675 | (UNSPEC_SQCVTU "sqcvtu") | |
3676 | (UNSPEC_SQCVTUN "sqcvtun") | |
0a09a948 RS |
3677 | (UNSPEC_SQRDCMLAH "sqrdcmlah") |
3678 | (UNSPEC_SQRDCMLAH90 "sqrdcmlah90") | |
3679 | (UNSPEC_SQRDCMLAH180 "sqrdcmlah180") | |
3680 | (UNSPEC_SQRDCMLAH270 "sqrdcmlah270") | |
9f0f7d80 RS |
3681 | (UNSPEC_ST1_COUNT "st1") |
3682 | (UNSPEC_STNT1_COUNT "stnt1") | |
36696774 RS |
3683 | (UNSPEC_TRN1Q "trn1q") |
3684 | (UNSPEC_TRN2Q "trn2q") | |
3685 | (UNSPEC_UMATMUL "umatmul") | |
c1c267df RS |
3686 | (UNSPEC_UQCVT "uqcvt") |
3687 | (UNSPEC_UQCVTN "uqcvtn") | |
36696774 RS |
3688 | (UNSPEC_USMATMUL "usmatmul") |
3689 | (UNSPEC_UZP1Q "uzp1q") | |
3690 | (UNSPEC_UZP2Q "uzp2q") | |
58c036c8 RS |
3691 | (UNSPEC_WHILERW "vec_check_raw_alias") |
3692 | (UNSPEC_WHILEWR "vec_check_war_alias") | |
36696774 RS |
3693 | (UNSPEC_ZIP1Q "zip1q") |
3694 | (UNSPEC_ZIP2Q "zip2q") | |
d45b20a5 | 3695 | (UNSPEC_COND_FABS "abs") |
cb18e86d | 3696 | (UNSPEC_COND_FADD "add") |
624d0f07 RS |
3697 | (UNSPEC_COND_FCADD90 "cadd90") |
3698 | (UNSPEC_COND_FCADD270 "cadd270") | |
3699 | (UNSPEC_COND_FCMLA "fcmla") | |
3700 | (UNSPEC_COND_FCMLA90 "fcmla90") | |
3701 | (UNSPEC_COND_FCMLA180 "fcmla180") | |
3702 | (UNSPEC_COND_FCMLA270 "fcmla270") | |
99361551 RS |
3703 | (UNSPEC_COND_FCVT "fcvt") |
3704 | (UNSPEC_COND_FCVTZS "fix_trunc") | |
3705 | (UNSPEC_COND_FCVTZU "fixuns_trunc") | |
cb18e86d | 3706 | (UNSPEC_COND_FDIV "div") |
6d331688 | 3707 | (UNSPEC_COND_FMAX "fmax_nan") |
cb18e86d | 3708 | (UNSPEC_COND_FMAXNM "smax") |
6d331688 | 3709 | (UNSPEC_COND_FMIN "fmin_nan") |
cb18e86d | 3710 | (UNSPEC_COND_FMINNM "smin") |
b41d1f6e RS |
3711 | (UNSPEC_COND_FMLA "fma") |
3712 | (UNSPEC_COND_FMLS "fnma") | |
cb18e86d | 3713 | (UNSPEC_COND_FMUL "mul") |
624d0f07 | 3714 | (UNSPEC_COND_FMULX "mulx") |
d45b20a5 | 3715 | (UNSPEC_COND_FNEG "neg") |
b41d1f6e | 3716 | (UNSPEC_COND_FNMLA "fnms") |
cb18e86d | 3717 | (UNSPEC_COND_FNMLS "fms") |
624d0f07 | 3718 | (UNSPEC_COND_FRECPX "frecpx") |
d45b20a5 RS |
3719 | (UNSPEC_COND_FRINTA "round") |
3720 | (UNSPEC_COND_FRINTI "nearbyint") | |
3721 | (UNSPEC_COND_FRINTM "floor") | |
3722 | (UNSPEC_COND_FRINTN "frintn") | |
3723 | (UNSPEC_COND_FRINTP "ceil") | |
3724 | (UNSPEC_COND_FRINTX "rint") | |
3725 | (UNSPEC_COND_FRINTZ "btrunc") | |
624d0f07 | 3726 | (UNSPEC_COND_FSCALE "fscale") |
d45b20a5 | 3727 | (UNSPEC_COND_FSQRT "sqrt") |
99361551 RS |
3728 | (UNSPEC_COND_FSUB "sub") |
3729 | (UNSPEC_COND_SCVTF "float") | |
3730 | (UNSPEC_COND_UCVTF "floatuns")]) | |
43cacb12 | 3731 | |
6d331688 RS |
3732 | (define_int_attr fmaxmin [(UNSPEC_FMAX "fmax_nan") |
3733 | (UNSPEC_FMAXNM "fmax") | |
e32b9eb3 | 3734 | (UNSPEC_FMAXNMV "fmax") |
6d331688 RS |
3735 | (UNSPEC_FMIN "fmin_nan") |
3736 | (UNSPEC_FMINNM "fmin") | |
e32b9eb3 | 3737 | (UNSPEC_FMINNMV "fmin") |
6d331688 RS |
3738 | (UNSPEC_COND_FMAXNM "fmax") |
3739 | (UNSPEC_COND_FMINNM "fmin")]) | |
998eaf97 JG |
3740 | |
3741 | (define_int_attr maxmin_uns_op [(UNSPEC_UMAXV "umax") | |
3742 | (UNSPEC_UMINV "umin") | |
3743 | (UNSPEC_SMAXV "smax") | |
3744 | (UNSPEC_SMINV "smin") | |
3745 | (UNSPEC_FMAX "fmax") | |
3746 | (UNSPEC_FMAXNMV "fmaxnm") | |
3747 | (UNSPEC_FMAXV "fmax") | |
3748 | (UNSPEC_FMIN "fmin") | |
3749 | (UNSPEC_FMINNMV "fminnm") | |
1efafef3 TC |
3750 | (UNSPEC_FMINV "fmin") |
3751 | (UNSPEC_FMAXNM "fmaxnm") | |
3752 | (UNSPEC_FMINNM "fminnm")]) | |
202d0c11 | 3753 | |
624d0f07 RS |
3754 | (define_code_attr binqops_op [(ss_plus "sqadd") |
3755 | (us_plus "uqadd") | |
3756 | (ss_minus "sqsub") | |
3757 | (us_minus "uqsub")]) | |
3758 | ||
3759 | (define_code_attr binqops_op_rev [(ss_plus "sqsub") | |
3760 | (ss_minus "sqadd")]) | |
3761 | ||
43cacb12 RS |
3762 | ;; The SVE logical instruction that implements an unspec. |
3763 | (define_int_attr logicalf_op [(UNSPEC_ANDF "and") | |
3764 | (UNSPEC_IORF "orr") | |
3765 | (UNSPEC_XORF "eor")]) | |
3766 | ||
624d0f07 RS |
3767 | (define_int_attr last_op [(UNSPEC_CLASTA "after_last") |
3768 | (UNSPEC_CLASTB "last") | |
3769 | (UNSPEC_LASTA "after_last") | |
3770 | (UNSPEC_LASTB "last")]) | |
3771 | ||
43cacb12 | 3772 | ;; "s" for signed operations and "u" for unsigned ones. |
624d0f07 RS |
3773 | (define_int_attr su [(UNSPEC_SADDV "s") |
3774 | (UNSPEC_UADDV "u") | |
3775 | (UNSPEC_UNPACKSHI "s") | |
43cacb12 RS |
3776 | (UNSPEC_UNPACKUHI "u") |
3777 | (UNSPEC_UNPACKSLO "s") | |
11e9443f RS |
3778 | (UNSPEC_UNPACKULO "u") |
3779 | (UNSPEC_SMUL_HIGHPART "s") | |
99361551 RS |
3780 | (UNSPEC_UMUL_HIGHPART "u") |
3781 | (UNSPEC_COND_FCVTZS "s") | |
3782 | (UNSPEC_COND_FCVTZU "u") | |
3783 | (UNSPEC_COND_SCVTF "s") | |
58cc9876 | 3784 | (UNSPEC_COND_UCVTF "u") |
58cc9876 YW |
3785 | (UNSPEC_SMULHS "s") (UNSPEC_UMULHS "u") |
3786 | (UNSPEC_SMULHRS "s") (UNSPEC_UMULHRS "u")]) | |
43cacb12 | 3787 | |
43e9d192 IB |
3788 | (define_int_attr sur [(UNSPEC_SHADD "s") (UNSPEC_UHADD "u") |
3789 | (UNSPEC_SRHADD "sr") (UNSPEC_URHADD "ur") | |
3790 | (UNSPEC_SHSUB "s") (UNSPEC_UHSUB "u") | |
75add2d0 | 3791 | (UNSPEC_SADALP "s") (UNSPEC_UADALP "u") |
43e9d192 IB |
3792 | (UNSPEC_USQADD "us") (UNSPEC_SUQADD "su") |
3793 | (UNSPEC_SSLI "s") (UNSPEC_USLI "u") | |
3794 | (UNSPEC_SSRI "s") (UNSPEC_USRI "u") | |
3795 | (UNSPEC_USRA "u") (UNSPEC_SSRA "s") | |
43e9d192 IB |
3796 | (UNSPEC_URSHR "ur") (UNSPEC_SRSHR "sr") |
3797 | (UNSPEC_SQSHLU "s") (UNSPEC_SQSHL "s") | |
3798 | (UNSPEC_UQSHL "u") | |
43e9d192 IB |
3799 | (UNSPEC_USHL "u") (UNSPEC_SSHL "s") |
3800 | (UNSPEC_USHLL "u") (UNSPEC_SSHLL "s") | |
3801 | (UNSPEC_URSHL "ur") (UNSPEC_SRSHL "sr") | |
3802 | (UNSPEC_UQRSHL "u") (UNSPEC_SQRSHL "s") | |
7a08d813 | 3803 | (UNSPEC_SDOT "s") (UNSPEC_UDOT "u") |
8c197c85 | 3804 | (UNSPEC_USDOT "us") (UNSPEC_SUDOT "su") |
36696774 RS |
3805 | (UNSPEC_SMATMUL "s") (UNSPEC_UMATMUL "u") |
3806 | (UNSPEC_USMATMUL "us") | |
43e9d192 IB |
3807 | ]) |
3808 | ||
3809 | (define_int_attr r [(UNSPEC_SQDMULH "") (UNSPEC_SQRDMULH "r") | |
43e9d192 IB |
3810 | (UNSPEC_SQSHL "") (UNSPEC_UQSHL "") |
3811 | (UNSPEC_SQRSHL "r")(UNSPEC_UQRSHL "r") | |
58cc9876 YW |
3812 | (UNSPEC_SMULHS "") (UNSPEC_UMULHS "") |
3813 | (UNSPEC_SMULHRS "r") (UNSPEC_UMULHRS "r") | |
43e9d192 IB |
3814 | ]) |
3815 | ||
3816 | (define_int_attr lr [(UNSPEC_SSLI "l") (UNSPEC_USLI "l") | |
0a09a948 RS |
3817 | (UNSPEC_SSRI "r") (UNSPEC_USRI "r") |
3818 | (UNSPEC_SQSHL "l") (UNSPEC_UQSHL "l") | |
3819 | (UNSPEC_SQSHLU "l") | |
3820 | (UNSPEC_SRSHR "r") (UNSPEC_URSHR "r") | |
3821 | (UNSPEC_ASRD "r") | |
3822 | (UNSPEC_SLI "l") (UNSPEC_SRI "r")]) | |
43e9d192 IB |
3823 | |
3824 | (define_int_attr u [(UNSPEC_SQSHLU "u") (UNSPEC_SQSHL "") (UNSPEC_UQSHL "") | |
42addb5a RS |
3825 | (UNSPEC_SHADD "") (UNSPEC_UHADD "u") |
3826 | (UNSPEC_SRHADD "") (UNSPEC_URHADD "u")]) | |
43e9d192 | 3827 | |
624d0f07 RS |
3828 | (define_int_attr fn [(UNSPEC_LDFF1 "f") (UNSPEC_LDNF1 "n")]) |
3829 | ||
3830 | (define_int_attr ab [(UNSPEC_CLASTA "a") (UNSPEC_CLASTB "b") | |
3831 | (UNSPEC_LASTA "a") (UNSPEC_LASTB "b")]) | |
3832 | ||
f78335df DB |
3833 | (define_int_attr bt [(UNSPEC_BFMLALB "b") (UNSPEC_BFMLALT "t")]) |
3834 | ||
43e9d192 IB |
3835 | (define_int_attr addsub [(UNSPEC_SHADD "add") |
3836 | (UNSPEC_UHADD "add") | |
3837 | (UNSPEC_SRHADD "add") | |
3838 | (UNSPEC_URHADD "add") | |
3839 | (UNSPEC_SHSUB "sub") | |
46579775 | 3840 | (UNSPEC_UHSUB "sub")]) |
43e9d192 | 3841 | |
2d57b12e YW |
3842 | ;; BSL variants: first commutative operand. |
3843 | (define_int_attr bsl_1st [(1 "w") (2 "0")]) | |
3844 | ||
3845 | ;; BSL variants: second commutative operand. | |
3846 | (define_int_attr bsl_2nd [(1 "0") (2 "w")]) | |
3847 | ||
3848 | ;; BSL variants: duplicated input operand. | |
3849 | (define_int_attr bsl_dup [(1 "1") (2 "2")]) | |
3850 | ||
3851 | ;; BSL variants: operand which requires preserving via movprfx. | |
3852 | (define_int_attr bsl_mov [(1 "2") (2 "1")]) | |
3853 | ||
cb23a30c JG |
3854 | (define_int_attr offsetlr [(UNSPEC_SSLI "") (UNSPEC_USLI "") |
3855 | (UNSPEC_SSRI "offset_") | |
3856 | (UNSPEC_USRI "offset_")]) | |
43e9d192 | 3857 | |
42fc9a7f JG |
3858 | ;; Standard pattern names for floating-point rounding instructions. |
3859 | (define_int_attr frint_pattern [(UNSPEC_FRINTZ "btrunc") | |
3860 | (UNSPEC_FRINTP "ceil") | |
3861 | (UNSPEC_FRINTM "floor") | |
3862 | (UNSPEC_FRINTI "nearbyint") | |
3863 | (UNSPEC_FRINTX "rint") | |
0659ce6f | 3864 | (UNSPEC_FRINTA "round") |
16ce822e | 3865 | (UNSPEC_FRINTN "roundeven")]) |
42fc9a7f JG |
3866 | |
3867 | ;; frint suffix for floating-point rounding instructions. | |
3868 | (define_int_attr frint_suffix [(UNSPEC_FRINTZ "z") (UNSPEC_FRINTP "p") | |
3869 | (UNSPEC_FRINTM "m") (UNSPEC_FRINTI "i") | |
0659ce6f JG |
3870 | (UNSPEC_FRINTX "x") (UNSPEC_FRINTA "a") |
3871 | (UNSPEC_FRINTN "n")]) | |
42fc9a7f JG |
3872 | |
3873 | (define_int_attr fcvt_pattern [(UNSPEC_FRINTZ "btrunc") (UNSPEC_FRINTA "round") | |
ce966824 JG |
3874 | (UNSPEC_FRINTP "ceil") (UNSPEC_FRINTM "floor") |
3875 | (UNSPEC_FRINTN "frintn")]) | |
42fc9a7f | 3876 | |
3f598afe JW |
3877 | (define_int_attr fcvt_fixed_insn [(UNSPEC_SCVTF "scvtf") |
3878 | (UNSPEC_UCVTF "ucvtf") | |
3879 | (UNSPEC_FCVTZS "fcvtzs") | |
3880 | (UNSPEC_FCVTZU "fcvtzu")]) | |
3881 | ||
db58fd89 | 3882 | ;; Pointer authentication mnemonic prefix. |
8fc16d72 ST |
3883 | (define_int_attr pauth_mnem_prefix [(UNSPEC_PACIASP "pacia") |
3884 | (UNSPEC_PACIBSP "pacib") | |
3885 | (UNSPEC_PACIA1716 "pacia") | |
3886 | (UNSPEC_PACIB1716 "pacib") | |
3887 | (UNSPEC_AUTIASP "autia") | |
3888 | (UNSPEC_AUTIBSP "autib") | |
3889 | (UNSPEC_AUTIA1716 "autia") | |
3890 | (UNSPEC_AUTIB1716 "autib")]) | |
3891 | ||
3892 | (define_int_attr pauth_key [(UNSPEC_PACIASP "AARCH64_KEY_A") | |
3893 | (UNSPEC_PACIBSP "AARCH64_KEY_B") | |
3894 | (UNSPEC_PACIA1716 "AARCH64_KEY_A") | |
3895 | (UNSPEC_PACIB1716 "AARCH64_KEY_B") | |
3896 | (UNSPEC_AUTIASP "AARCH64_KEY_A") | |
3897 | (UNSPEC_AUTIBSP "AARCH64_KEY_B") | |
3898 | (UNSPEC_AUTIA1716 "AARCH64_KEY_A") | |
3899 | (UNSPEC_AUTIB1716 "AARCH64_KEY_B")]) | |
3900 | ||
3901 | ;; Pointer authentication HINT number for NOP space instructions using A and | |
3902 | ;; B key. | |
3903 | (define_int_attr pauth_hint_num [(UNSPEC_PACIASP "25") | |
3904 | (UNSPEC_PACIBSP "27") | |
3905 | (UNSPEC_AUTIASP "29") | |
3906 | (UNSPEC_AUTIBSP "31") | |
3907 | (UNSPEC_PACIA1716 "8") | |
3908 | (UNSPEC_PACIB1716 "10") | |
3909 | (UNSPEC_AUTIA1716 "12") | |
3910 | (UNSPEC_AUTIB1716 "14")]) | |
db58fd89 | 3911 | |
3e2751ce | 3912 | (define_int_attr perm_insn [(UNSPEC_ZIP1 "zip1") (UNSPEC_ZIP2 "zip2") |
36696774 | 3913 | (UNSPEC_ZIP1Q "zip1") (UNSPEC_ZIP2Q "zip2") |
3e2751ce | 3914 | (UNSPEC_TRN1 "trn1") (UNSPEC_TRN2 "trn2") |
36696774 RS |
3915 | (UNSPEC_TRN1Q "trn1") (UNSPEC_TRN2Q "trn2") |
3916 | (UNSPEC_UZP1 "uzp1") (UNSPEC_UZP2 "uzp2") | |
c1c267df RS |
3917 | (UNSPEC_UZP1Q "uzp1") (UNSPEC_UZP2Q "uzp2") |
3918 | (UNSPEC_UZP "uzp") (UNSPEC_UZPQ "uzp") | |
3919 | (UNSPEC_ZIP "zip") (UNSPEC_ZIPQ "zip")]) | |
cc4d934f | 3920 | |
923fcec3 AL |
3921 | ; op code for REV instructions (size within which elements are reversed). |
3922 | (define_int_attr rev_op [(UNSPEC_REV64 "64") (UNSPEC_REV32 "32") | |
3923 | (UNSPEC_REV16 "16")]) | |
3924 | ||
3e2751ce | 3925 | (define_int_attr perm_hilo [(UNSPEC_UNPACKSHI "hi") (UNSPEC_UNPACKUHI "hi") |
c2ef4708 | 3926 | (UNSPEC_UNPACKSLO "lo") (UNSPEC_UNPACKULO "lo")]) |
0050faf8 | 3927 | |
9bfb28ed RS |
3928 | ;; Return true if the associated optab refers to the high-numbered lanes, |
3929 | ;; false if it refers to the low-numbered lanes. The convention is for | |
3930 | ;; "hi" to refer to the low-numbered lanes (the first ones in memory) | |
3931 | ;; for big-endian. | |
3932 | (define_int_attr hi_lanes_optab [(UNSPEC_UNPACKSHI "!BYTES_BIG_ENDIAN") | |
3933 | (UNSPEC_UNPACKUHI "!BYTES_BIG_ENDIAN") | |
3934 | (UNSPEC_UNPACKSLO "BYTES_BIG_ENDIAN") | |
3935 | (UNSPEC_UNPACKULO "BYTES_BIG_ENDIAN")]) | |
3936 | ||
5d357f26 KT |
3937 | (define_int_attr crc_variant [(UNSPEC_CRC32B "crc32b") (UNSPEC_CRC32H "crc32h") |
3938 | (UNSPEC_CRC32W "crc32w") (UNSPEC_CRC32X "crc32x") | |
3939 | (UNSPEC_CRC32CB "crc32cb") (UNSPEC_CRC32CH "crc32ch") | |
3940 | (UNSPEC_CRC32CW "crc32cw") (UNSPEC_CRC32CX "crc32cx")]) | |
3941 | ||
3942 | (define_int_attr crc_mode [(UNSPEC_CRC32B "QI") (UNSPEC_CRC32H "HI") | |
3943 | (UNSPEC_CRC32W "SI") (UNSPEC_CRC32X "DI") | |
3944 | (UNSPEC_CRC32CB "QI") (UNSPEC_CRC32CH "HI") | |
3945 | (UNSPEC_CRC32CW "SI") (UNSPEC_CRC32CX "DI")]) | |
3946 | ||
5a7a4e80 TB |
3947 | (define_int_attr aes_op [(UNSPEC_AESE "e") (UNSPEC_AESD "d")]) |
3948 | (define_int_attr aesmc_op [(UNSPEC_AESMC "mc") (UNSPEC_AESIMC "imc")]) | |
30442682 TB |
3949 | |
3950 | (define_int_attr sha1_op [(UNSPEC_SHA1C "c") (UNSPEC_SHA1P "p") | |
3951 | (UNSPEC_SHA1M "m")]) | |
b9cb0a44 TB |
3952 | |
3953 | (define_int_attr sha256_op [(UNSPEC_SHA256H "") (UNSPEC_SHA256H2 "2")]) | |
57b26d65 MW |
3954 | |
3955 | (define_int_attr rdma_as [(UNSPEC_SQRDMLAH "a") (UNSPEC_SQRDMLSH "s")]) | |
27086ea3 MC |
3956 | |
3957 | (define_int_attr sha512_op [(UNSPEC_SHA512H "") (UNSPEC_SHA512H2 "2")]) | |
3958 | ||
3959 | (define_int_attr sm3tt_op [(UNSPEC_SM3TT1A "1a") (UNSPEC_SM3TT1B "1b") | |
3960 | (UNSPEC_SM3TT2A "2a") (UNSPEC_SM3TT2B "2b")]) | |
3961 | ||
3962 | (define_int_attr sm3part_op [(UNSPEC_SM3PARTW1 "1") (UNSPEC_SM3PARTW2 "2")]) | |
3963 | ||
3964 | (define_int_attr f16mac1 [(UNSPEC_FMLAL "a") (UNSPEC_FMLSL "s") | |
3965 | (UNSPEC_FMLAL2 "a") (UNSPEC_FMLSL2 "s")]) | |
43cacb12 | 3966 | |
10bd1d96 KT |
3967 | (define_int_attr frintnzs_op [(UNSPEC_FRINT32Z "frint32z") (UNSPEC_FRINT32X "frint32x") |
3968 | (UNSPEC_FRINT64Z "frint64z") (UNSPEC_FRINT64X "frint64x")]) | |
3969 | ||
43cacb12 | 3970 | ;; The condition associated with an UNSPEC_COND_<xx>. |
624d0f07 RS |
3971 | (define_int_attr cmp_op [(UNSPEC_COND_CMPEQ_WIDE "eq") |
3972 | (UNSPEC_COND_CMPGE_WIDE "ge") | |
3973 | (UNSPEC_COND_CMPGT_WIDE "gt") | |
3974 | (UNSPEC_COND_CMPHI_WIDE "hi") | |
3975 | (UNSPEC_COND_CMPHS_WIDE "hs") | |
3976 | (UNSPEC_COND_CMPLE_WIDE "le") | |
3977 | (UNSPEC_COND_CMPLO_WIDE "lo") | |
3978 | (UNSPEC_COND_CMPLS_WIDE "ls") | |
3979 | (UNSPEC_COND_CMPLT_WIDE "lt") | |
3980 | (UNSPEC_COND_CMPNE_WIDE "ne") | |
3981 | (UNSPEC_COND_FCMEQ "eq") | |
cb18e86d RS |
3982 | (UNSPEC_COND_FCMGE "ge") |
3983 | (UNSPEC_COND_FCMGT "gt") | |
3984 | (UNSPEC_COND_FCMLE "le") | |
3985 | (UNSPEC_COND_FCMLT "lt") | |
4a942af6 | 3986 | (UNSPEC_COND_FCMNE "ne") |
0a09a948 RS |
3987 | (UNSPEC_WHILEGE "ge") |
3988 | (UNSPEC_WHILEGT "gt") | |
3989 | (UNSPEC_WHILEHI "hi") | |
3990 | (UNSPEC_WHILEHS "hs") | |
6ad9571b RS |
3991 | (UNSPEC_WHILELE "le") |
3992 | (UNSPEC_WHILELO "lo") | |
3993 | (UNSPEC_WHILELS "ls") | |
3994 | (UNSPEC_WHILELT "lt") | |
58c036c8 RS |
3995 | (UNSPEC_WHILERW "rw") |
3996 | (UNSPEC_WHILEWR "wr")]) | |
624d0f07 | 3997 | |
0a09a948 RS |
3998 | (define_int_attr while_optab_cmp [(UNSPEC_WHILEGE "ge") |
3999 | (UNSPEC_WHILEGT "gt") | |
4000 | (UNSPEC_WHILEHI "ugt") | |
4001 | (UNSPEC_WHILEHS "uge") | |
4002 | (UNSPEC_WHILELE "le") | |
6ad9571b RS |
4003 | (UNSPEC_WHILELO "ult") |
4004 | (UNSPEC_WHILELS "ule") | |
bad5e58a RS |
4005 | (UNSPEC_WHILELT "lt") |
4006 | (UNSPEC_WHILERW "rw") | |
4007 | (UNSPEC_WHILEWR "wr")]) | |
624d0f07 | 4008 | |
58c036c8 RS |
4009 | (define_int_attr raw_war [(UNSPEC_WHILERW "raw") |
4010 | (UNSPEC_WHILEWR "war")]) | |
4011 | ||
624d0f07 RS |
4012 | (define_int_attr brk_op [(UNSPEC_BRKA "a") (UNSPEC_BRKB "b") |
4013 | (UNSPEC_BRKN "n") | |
4014 | (UNSPEC_BRKPA "pa") (UNSPEC_BRKPB "pb")]) | |
4015 | ||
4016 | (define_int_attr sve_pred_op [(UNSPEC_PFIRST "pfirst") (UNSPEC_PNEXT "pnext")]) | |
cb18e86d | 4017 | |
0a09a948 RS |
4018 | (define_int_attr sve_int_op [(UNSPEC_ADCLB "adclb") |
4019 | (UNSPEC_ADCLT "adclt") | |
4020 | (UNSPEC_ADDHNB "addhnb") | |
4021 | (UNSPEC_ADDHNT "addhnt") | |
4022 | (UNSPEC_ADDP "addp") | |
4023 | (UNSPEC_ANDV "andv") | |
624d0f07 | 4024 | (UNSPEC_ASHIFTRT_WIDE "asr") |
0a09a948 RS |
4025 | (UNSPEC_ASHIFT_WIDE "lsl") |
4026 | (UNSPEC_ASRD "asrd") | |
4027 | (UNSPEC_BDEP "bdep") | |
4028 | (UNSPEC_BEXT "bext") | |
4029 | (UNSPEC_BGRP "bgrp") | |
4030 | (UNSPEC_CADD90 "cadd") | |
4031 | (UNSPEC_CADD270 "cadd") | |
4032 | (UNSPEC_CDOT "cdot") | |
4033 | (UNSPEC_CDOT90 "cdot") | |
4034 | (UNSPEC_CDOT180 "cdot") | |
4035 | (UNSPEC_CDOT270 "cdot") | |
4036 | (UNSPEC_CMLA "cmla") | |
4037 | (UNSPEC_CMLA90 "cmla") | |
4038 | (UNSPEC_CMLA180 "cmla") | |
4039 | (UNSPEC_CMLA270 "cmla") | |
4040 | (UNSPEC_EORBT "eorbt") | |
4041 | (UNSPEC_EORTB "eortb") | |
4042 | (UNSPEC_IORV "orv") | |
624d0f07 | 4043 | (UNSPEC_LSHIFTRT_WIDE "lsr") |
0a09a948 RS |
4044 | (UNSPEC_MATCH "match") |
4045 | (UNSPEC_NMATCH "nmatch") | |
4046 | (UNSPEC_PMULLB "pmullb") | |
4047 | (UNSPEC_PMULLB_PAIR "pmullb") | |
4048 | (UNSPEC_PMULLT "pmullt") | |
4049 | (UNSPEC_PMULLT_PAIR "pmullt") | |
4050 | (UNSPEC_RADDHNB "raddhnb") | |
4051 | (UNSPEC_RADDHNT "raddhnt") | |
d7a09c44 RS |
4052 | (UNSPEC_REVB "revb") |
4053 | (UNSPEC_REVH "revh") | |
0a09a948 RS |
4054 | (UNSPEC_REVW "revw") |
4055 | (UNSPEC_RSHRNB "rshrnb") | |
4056 | (UNSPEC_RSHRNT "rshrnt") | |
4057 | (UNSPEC_RSQRTE "ursqrte") | |
4058 | (UNSPEC_RSUBHNB "rsubhnb") | |
4059 | (UNSPEC_RSUBHNT "rsubhnt") | |
4060 | (UNSPEC_SABDLB "sabdlb") | |
4061 | (UNSPEC_SABDLT "sabdlt") | |
4062 | (UNSPEC_SADALP "sadalp") | |
4063 | (UNSPEC_SADDLB "saddlb") | |
4064 | (UNSPEC_SADDLBT "saddlbt") | |
4065 | (UNSPEC_SADDLT "saddlt") | |
4066 | (UNSPEC_SADDWB "saddwb") | |
4067 | (UNSPEC_SADDWT "saddwt") | |
4068 | (UNSPEC_SBCLB "sbclb") | |
4069 | (UNSPEC_SBCLT "sbclt") | |
4070 | (UNSPEC_SHADD "shadd") | |
4071 | (UNSPEC_SHRNB "shrnb") | |
4072 | (UNSPEC_SHRNT "shrnt") | |
4073 | (UNSPEC_SHSUB "shsub") | |
4074 | (UNSPEC_SLI "sli") | |
4075 | (UNSPEC_SMAXP "smaxp") | |
4076 | (UNSPEC_SMAXV "smaxv") | |
4077 | (UNSPEC_SMINP "sminp") | |
4078 | (UNSPEC_SMINV "sminv") | |
4079 | (UNSPEC_SMUL_HIGHPART "smulh") | |
4080 | (UNSPEC_SMULLB "smullb") | |
4081 | (UNSPEC_SMULLT "smullt") | |
4082 | (UNSPEC_SQCADD90 "sqcadd") | |
4083 | (UNSPEC_SQCADD270 "sqcadd") | |
4084 | (UNSPEC_SQDMULH "sqdmulh") | |
4085 | (UNSPEC_SQDMULLB "sqdmullb") | |
4086 | (UNSPEC_SQDMULLBT "sqdmullbt") | |
4087 | (UNSPEC_SQDMULLT "sqdmullt") | |
4088 | (UNSPEC_SQRDCMLAH "sqrdcmlah") | |
4089 | (UNSPEC_SQRDCMLAH90 "sqrdcmlah") | |
4090 | (UNSPEC_SQRDCMLAH180 "sqrdcmlah") | |
4091 | (UNSPEC_SQRDCMLAH270 "sqrdcmlah") | |
4092 | (UNSPEC_SQRDMLAH "sqrdmlah") | |
4093 | (UNSPEC_SQRDMLSH "sqrdmlsh") | |
4094 | (UNSPEC_SQRDMULH "sqrdmulh") | |
4095 | (UNSPEC_SQRSHL "sqrshl") | |
c1c267df RS |
4096 | (UNSPEC_SQRSHR "sqrshr") |
4097 | (UNSPEC_SQRSHRN "sqrshrn") | |
0a09a948 RS |
4098 | (UNSPEC_SQRSHRNB "sqrshrnb") |
4099 | (UNSPEC_SQRSHRNT "sqrshrnt") | |
c1c267df RS |
4100 | (UNSPEC_SQRSHRU "sqrshru") |
4101 | (UNSPEC_SQRSHRUN "sqrshrun") | |
0a09a948 RS |
4102 | (UNSPEC_SQRSHRUNB "sqrshrunb") |
4103 | (UNSPEC_SQRSHRUNT "sqrshrunt") | |
4104 | (UNSPEC_SQSHL "sqshl") | |
4105 | (UNSPEC_SQSHLU "sqshlu") | |
4106 | (UNSPEC_SQSHRNB "sqshrnb") | |
4107 | (UNSPEC_SQSHRNT "sqshrnt") | |
4108 | (UNSPEC_SQSHRUNB "sqshrunb") | |
4109 | (UNSPEC_SQSHRUNT "sqshrunt") | |
4110 | (UNSPEC_SQXTNB "sqxtnb") | |
4111 | (UNSPEC_SQXTNT "sqxtnt") | |
4112 | (UNSPEC_SQXTUNB "sqxtunb") | |
4113 | (UNSPEC_SQXTUNT "sqxtunt") | |
4114 | (UNSPEC_SRHADD "srhadd") | |
4115 | (UNSPEC_SRI "sri") | |
4116 | (UNSPEC_SRSHL "srshl") | |
4117 | (UNSPEC_SRSHR "srshr") | |
4118 | (UNSPEC_SSHLLB "sshllb") | |
4119 | (UNSPEC_SSHLLT "sshllt") | |
4120 | (UNSPEC_SSUBLB "ssublb") | |
4121 | (UNSPEC_SSUBLBT "ssublbt") | |
4122 | (UNSPEC_SSUBLT "ssublt") | |
4123 | (UNSPEC_SSUBLTB "ssubltb") | |
4124 | (UNSPEC_SSUBWB "ssubwb") | |
4125 | (UNSPEC_SSUBWT "ssubwt") | |
4126 | (UNSPEC_SUBHNB "subhnb") | |
4127 | (UNSPEC_SUBHNT "subhnt") | |
4128 | (UNSPEC_SUQADD "suqadd") | |
4129 | (UNSPEC_UABDLB "uabdlb") | |
4130 | (UNSPEC_UABDLT "uabdlt") | |
4131 | (UNSPEC_UADALP "uadalp") | |
4132 | (UNSPEC_UADDLB "uaddlb") | |
4133 | (UNSPEC_UADDLT "uaddlt") | |
4134 | (UNSPEC_UADDWB "uaddwb") | |
4135 | (UNSPEC_UADDWT "uaddwt") | |
4136 | (UNSPEC_UHADD "uhadd") | |
4137 | (UNSPEC_UHSUB "uhsub") | |
4138 | (UNSPEC_UMAXP "umaxp") | |
4139 | (UNSPEC_UMAXV "umaxv") | |
4140 | (UNSPEC_UMINP "uminp") | |
4141 | (UNSPEC_UMINV "uminv") | |
4142 | (UNSPEC_UMUL_HIGHPART "umulh") | |
4143 | (UNSPEC_UMULLB "umullb") | |
4144 | (UNSPEC_UMULLT "umullt") | |
4145 | (UNSPEC_UQRSHL "uqrshl") | |
c1c267df RS |
4146 | (UNSPEC_UQRSHR "uqrshr") |
4147 | (UNSPEC_UQRSHRN "uqrshrn") | |
0a09a948 RS |
4148 | (UNSPEC_UQRSHRNB "uqrshrnb") |
4149 | (UNSPEC_UQRSHRNT "uqrshrnt") | |
4150 | (UNSPEC_UQSHL "uqshl") | |
4151 | (UNSPEC_UQSHRNB "uqshrnb") | |
4152 | (UNSPEC_UQSHRNT "uqshrnt") | |
4153 | (UNSPEC_UQXTNB "uqxtnb") | |
4154 | (UNSPEC_UQXTNT "uqxtnt") | |
4155 | (UNSPEC_URECPE "urecpe") | |
4156 | (UNSPEC_URHADD "urhadd") | |
4157 | (UNSPEC_URSHL "urshl") | |
4158 | (UNSPEC_URSHR "urshr") | |
4159 | (UNSPEC_USHLLB "ushllb") | |
4160 | (UNSPEC_USHLLT "ushllt") | |
4161 | (UNSPEC_USQADD "usqadd") | |
4162 | (UNSPEC_USUBLB "usublb") | |
4163 | (UNSPEC_USUBLT "usublt") | |
4164 | (UNSPEC_USUBWB "usubwb") | |
4165 | (UNSPEC_USUBWT "usubwt") | |
4166 | (UNSPEC_XORV "eorv")]) | |
4167 | ||
4168 | (define_int_attr sve_int_op_rev [(UNSPEC_SHADD "shadd") | |
4169 | (UNSPEC_SHSUB "shsubr") | |
4170 | (UNSPEC_SQRSHL "sqrshlr") | |
4171 | (UNSPEC_SRHADD "srhadd") | |
4172 | (UNSPEC_SRSHL "srshlr") | |
4173 | (UNSPEC_UHADD "uhadd") | |
4174 | (UNSPEC_UHSUB "uhsubr") | |
4175 | (UNSPEC_UQRSHL "uqrshlr") | |
4176 | (UNSPEC_URHADD "urhadd") | |
4177 | (UNSPEC_URSHL "urshlr")]) | |
4178 | ||
4179 | (define_int_attr sve_int_add_op [(UNSPEC_SABDLB "sabalb") | |
4180 | (UNSPEC_SABDLT "sabalt") | |
4181 | (UNSPEC_SMULLB "smlalb") | |
4182 | (UNSPEC_SMULLT "smlalt") | |
4183 | (UNSPEC_UABDLB "uabalb") | |
4184 | (UNSPEC_UABDLT "uabalt") | |
4185 | (UNSPEC_UMULLB "umlalb") | |
4186 | (UNSPEC_UMULLT "umlalt")]) | |
4187 | ||
4188 | (define_int_attr sve_int_qadd_op [(UNSPEC_SQDMULLB "sqdmlalb") | |
4189 | (UNSPEC_SQDMULLBT "sqdmlalbt") | |
4190 | (UNSPEC_SQDMULLT "sqdmlalt")]) | |
4191 | ||
4192 | (define_int_attr sve_int_sub_op [(UNSPEC_SMULLB "smlslb") | |
4193 | (UNSPEC_SMULLT "smlslt") | |
4194 | (UNSPEC_UMULLB "umlslb") | |
4195 | (UNSPEC_UMULLT "umlslt")]) | |
4196 | ||
4197 | (define_int_attr sve_int_qsub_op [(UNSPEC_SQDMULLB "sqdmlslb") | |
4198 | (UNSPEC_SQDMULLBT "sqdmlslbt") | |
4199 | (UNSPEC_SQDMULLT "sqdmlslt")]) | |
b0760a40 | 4200 | |
896dff99 RS |
4201 | (define_int_attr sve_fp_op [(UNSPEC_BFDOT "bfdot") |
4202 | (UNSPEC_BFMLALB "bfmlalb") | |
4203 | (UNSPEC_BFMLALT "bfmlalt") | |
c1c267df RS |
4204 | (UNSPEC_BFMLSLB "bfmlslb") |
4205 | (UNSPEC_BFMLSLT "bfmlslt") | |
896dff99 RS |
4206 | (UNSPEC_BFMMLA "bfmmla") |
4207 | (UNSPEC_FRECPE "frecpe") | |
624d0f07 RS |
4208 | (UNSPEC_FRECPS "frecps") |
4209 | (UNSPEC_RSQRTE "frsqrte") | |
4210 | (UNSPEC_RSQRTS "frsqrts") | |
0a09a948 | 4211 | (UNSPEC_FADDP "faddp") |
624d0f07 | 4212 | (UNSPEC_FADDV "faddv") |
36696774 | 4213 | (UNSPEC_FEXPA "fexpa") |
0a09a948 | 4214 | (UNSPEC_FMAXNMP "fmaxnmp") |
b0760a40 | 4215 | (UNSPEC_FMAXNMV "fmaxnmv") |
0a09a948 | 4216 | (UNSPEC_FMAXP "fmaxp") |
b0760a40 | 4217 | (UNSPEC_FMAXV "fmaxv") |
0a09a948 | 4218 | (UNSPEC_FMINNMP "fminnmp") |
b0760a40 | 4219 | (UNSPEC_FMINNMV "fminnmv") |
0a09a948 | 4220 | (UNSPEC_FMINP "fminp") |
b0760a40 | 4221 | (UNSPEC_FMINV "fminv") |
624d0f07 | 4222 | (UNSPEC_FMLA "fmla") |
0a09a948 RS |
4223 | (UNSPEC_FMLALB "fmlalb") |
4224 | (UNSPEC_FMLALT "fmlalt") | |
624d0f07 | 4225 | (UNSPEC_FMLS "fmls") |
0a09a948 RS |
4226 | (UNSPEC_FMLSLB "fmlslb") |
4227 | (UNSPEC_FMLSLT "fmlslt") | |
36696774 | 4228 | (UNSPEC_FMMLA "fmmla") |
624d0f07 RS |
4229 | (UNSPEC_FTSMUL "ftsmul") |
4230 | (UNSPEC_FTSSEL "ftssel") | |
b0760a40 | 4231 | (UNSPEC_COND_FABS "fabs") |
d45b20a5 | 4232 | (UNSPEC_COND_FADD "fadd") |
0a09a948 RS |
4233 | (UNSPEC_COND_FCVTLT "fcvtlt") |
4234 | (UNSPEC_COND_FCVTX "fcvtx") | |
cb18e86d | 4235 | (UNSPEC_COND_FDIV "fdiv") |
0a09a948 | 4236 | (UNSPEC_COND_FLOGB "flogb") |
624d0f07 | 4237 | (UNSPEC_COND_FMAX "fmax") |
cb18e86d | 4238 | (UNSPEC_COND_FMAXNM "fmaxnm") |
624d0f07 | 4239 | (UNSPEC_COND_FMIN "fmin") |
cb18e86d RS |
4240 | (UNSPEC_COND_FMINNM "fminnm") |
4241 | (UNSPEC_COND_FMUL "fmul") | |
624d0f07 | 4242 | (UNSPEC_COND_FMULX "fmulx") |
d45b20a5 | 4243 | (UNSPEC_COND_FNEG "fneg") |
624d0f07 | 4244 | (UNSPEC_COND_FRECPX "frecpx") |
d45b20a5 RS |
4245 | (UNSPEC_COND_FRINTA "frinta") |
4246 | (UNSPEC_COND_FRINTI "frinti") | |
4247 | (UNSPEC_COND_FRINTM "frintm") | |
4248 | (UNSPEC_COND_FRINTN "frintn") | |
4249 | (UNSPEC_COND_FRINTP "frintp") | |
4250 | (UNSPEC_COND_FRINTX "frintx") | |
4251 | (UNSPEC_COND_FRINTZ "frintz") | |
624d0f07 | 4252 | (UNSPEC_COND_FSCALE "fscale") |
d45b20a5 | 4253 | (UNSPEC_COND_FSQRT "fsqrt") |
cb18e86d RS |
4254 | (UNSPEC_COND_FSUB "fsub")]) |
4255 | ||
4256 | (define_int_attr sve_fp_op_rev [(UNSPEC_COND_FADD "fadd") | |
4257 | (UNSPEC_COND_FDIV "fdivr") | |
624d0f07 | 4258 | (UNSPEC_COND_FMAX "fmax") |
cb18e86d | 4259 | (UNSPEC_COND_FMAXNM "fmaxnm") |
624d0f07 | 4260 | (UNSPEC_COND_FMIN "fmin") |
cb18e86d RS |
4261 | (UNSPEC_COND_FMINNM "fminnm") |
4262 | (UNSPEC_COND_FMUL "fmul") | |
624d0f07 | 4263 | (UNSPEC_COND_FMULX "fmulx") |
cb18e86d | 4264 | (UNSPEC_COND_FSUB "fsubr")]) |
a08acce8 | 4265 | |
c1c267df RS |
4266 | (define_int_attr sme_int_op [(UNSPEC_SME_ADD_WRITE "add") |
4267 | (UNSPEC_SME_SUB_WRITE "sub")]) | |
4268 | ||
0a09a948 RS |
4269 | (define_int_attr rot [(UNSPEC_CADD90 "90") |
4270 | (UNSPEC_CADD270 "270") | |
4271 | (UNSPEC_CDOT "0") | |
4272 | (UNSPEC_CDOT90 "90") | |
4273 | (UNSPEC_CDOT180 "180") | |
4274 | (UNSPEC_CDOT270 "270") | |
4275 | (UNSPEC_CMLA "0") | |
4276 | (UNSPEC_CMLA90 "90") | |
4277 | (UNSPEC_CMLA180 "180") | |
4278 | (UNSPEC_CMLA270 "270") | |
4279 | (UNSPEC_FCADD90 "90") | |
9d63f43b TC |
4280 | (UNSPEC_FCADD270 "270") |
4281 | (UNSPEC_FCMLA "0") | |
4282 | (UNSPEC_FCMLA90 "90") | |
4283 | (UNSPEC_FCMLA180 "180") | |
624d0f07 | 4284 | (UNSPEC_FCMLA270 "270") |
0a09a948 RS |
4285 | (UNSPEC_SQCADD90 "90") |
4286 | (UNSPEC_SQCADD270 "270") | |
4287 | (UNSPEC_SQRDCMLAH "0") | |
4288 | (UNSPEC_SQRDCMLAH90 "90") | |
4289 | (UNSPEC_SQRDCMLAH180 "180") | |
4290 | (UNSPEC_SQRDCMLAH270 "270") | |
624d0f07 RS |
4291 | (UNSPEC_COND_FCADD90 "90") |
4292 | (UNSPEC_COND_FCADD270 "270") | |
4293 | (UNSPEC_COND_FCMLA "0") | |
4294 | (UNSPEC_COND_FCMLA90 "90") | |
4295 | (UNSPEC_COND_FCMLA180 "180") | |
ad260343 TC |
4296 | (UNSPEC_COND_FCMLA270 "270") |
4297 | (UNSPEC_FCMUL "0") | |
4298 | (UNSPEC_FCMUL_CONJ "180")]) | |
4299 | ||
4300 | ;; A conjucate is a negation of the imaginary component | |
4301 | ;; The number in the unspecs are the rotation component of the instruction, e.g | |
4302 | ;; FCMLA180 means use the instruction with #180. | |
4303 | ;; The iterator is used to produce the right name mangling for the function. | |
4304 | (define_int_attr conj_op [(UNSPEC_FCMLA180 "") | |
4305 | (UNSPEC_FCMLA180_CONJ "_conj") | |
4306 | (UNSPEC_FCMLA "") | |
4307 | (UNSPEC_FCMLA_CONJ "_conj") | |
4308 | (UNSPEC_FCMUL "") | |
4309 | (UNSPEC_FCMUL_CONJ "_conj") | |
4310 | (UNSPEC_CMLA "") | |
4311 | (UNSPEC_CMLA180 "") | |
4312 | (UNSPEC_CMLA180_CONJ "_conj") | |
4313 | (UNSPEC_CMLA_CONJ "_conj") | |
4314 | (UNSPEC_CMUL "") | |
4315 | (UNSPEC_CMUL_CONJ "_conj")]) | |
4316 | ||
4317 | ;; The complex operations when performed on a real complex number require two | |
4318 | ;; instructions to perform the operation. e.g. complex multiplication requires | |
4319 | ;; two FCMUL with a particular rotation value. | |
4320 | ;; | |
4321 | ;; These values can be looked up in rotsplit1 and rotsplit2. as an example | |
4322 | ;; FCMUL needs the first instruction to use #0 and the second #90. | |
4323 | (define_int_attr rotsplit1 [(UNSPEC_FCMLA "0") | |
4324 | (UNSPEC_FCMLA_CONJ "0") | |
4325 | (UNSPEC_FCMUL "0") | |
4326 | (UNSPEC_FCMUL_CONJ "0") | |
4327 | (UNSPEC_FCMLA180 "180") | |
4328 | (UNSPEC_FCMLA180_CONJ "180")]) | |
4329 | ||
4330 | (define_int_attr rotsplit2 [(UNSPEC_FCMLA "90") | |
4331 | (UNSPEC_FCMLA_CONJ "270") | |
4332 | (UNSPEC_FCMUL "90") | |
4333 | (UNSPEC_FCMUL_CONJ "270") | |
4334 | (UNSPEC_FCMLA180 "270") | |
4335 | (UNSPEC_FCMLA180_CONJ "90")]) | |
4336 | ||
4337 | ;; SVE has slightly different namings from NEON so we have to split these | |
4338 | ;; iterators. | |
4339 | (define_int_attr sve_rot1 [(UNSPEC_FCMLA "") | |
4340 | (UNSPEC_FCMLA_CONJ "") | |
4341 | (UNSPEC_FCMUL "") | |
4342 | (UNSPEC_FCMUL_CONJ "") | |
4343 | (UNSPEC_FCMLA180 "180") | |
4344 | (UNSPEC_FCMLA180_CONJ "180") | |
4345 | (UNSPEC_CMLA "") | |
4346 | (UNSPEC_CMLA_CONJ "") | |
4347 | (UNSPEC_CMUL "") | |
4348 | (UNSPEC_CMUL_CONJ "") | |
4349 | (UNSPEC_CMLA180 "180") | |
4350 | (UNSPEC_CMLA180_CONJ "180")]) | |
4351 | ||
4352 | (define_int_attr sve_rot2 [(UNSPEC_FCMLA "90") | |
4353 | (UNSPEC_FCMLA_CONJ "270") | |
4354 | (UNSPEC_FCMUL "90") | |
4355 | (UNSPEC_FCMUL_CONJ "270") | |
4356 | (UNSPEC_FCMLA180 "270") | |
4357 | (UNSPEC_FCMLA180_CONJ "90") | |
4358 | (UNSPEC_CMLA "90") | |
4359 | (UNSPEC_CMLA_CONJ "270") | |
4360 | (UNSPEC_CMUL "90") | |
4361 | (UNSPEC_CMUL_CONJ "270") | |
4362 | (UNSPEC_CMLA180 "270") | |
4363 | (UNSPEC_CMLA180_CONJ "90")]) | |
4364 | ||
4365 | ||
4366 | (define_int_attr fcmac1 [(UNSPEC_FCMLA "a") (UNSPEC_FCMLA_CONJ "a") | |
4367 | (UNSPEC_FCMLA180 "s") (UNSPEC_FCMLA180_CONJ "s") | |
4368 | (UNSPEC_CMLA "a") (UNSPEC_CMLA_CONJ "a") | |
4369 | (UNSPEC_CMLA180 "s") (UNSPEC_CMLA180_CONJ "s")]) | |
9d63f43b | 4370 | |
b41d1f6e RS |
4371 | (define_int_attr sve_fmla_op [(UNSPEC_COND_FMLA "fmla") |
4372 | (UNSPEC_COND_FMLS "fmls") | |
4373 | (UNSPEC_COND_FNMLA "fnmla") | |
4374 | (UNSPEC_COND_FNMLS "fnmls")]) | |
4375 | ||
4376 | (define_int_attr sve_fmad_op [(UNSPEC_COND_FMLA "fmad") | |
4377 | (UNSPEC_COND_FMLS "fmsb") | |
4378 | (UNSPEC_COND_FNMLA "fnmad") | |
4379 | (UNSPEC_COND_FNMLS "fnmsb")]) | |
0254ed79 | 4380 | |
624d0f07 RS |
4381 | ;; The register constraint to use for the final operand in a binary BRK. |
4382 | (define_int_attr brk_reg_con [(UNSPEC_BRKN "0") | |
4383 | (UNSPEC_BRKPA "Upa") (UNSPEC_BRKPB "Upa")]) | |
4384 | ||
4385 | ;; The register number to print for the above. | |
4386 | (define_int_attr brk_reg_opno [(UNSPEC_BRKN "0") | |
4387 | (UNSPEC_BRKPA "3") (UNSPEC_BRKPB "3")]) | |
4388 | ||
0254ed79 RS |
4389 | ;; The predicate to use for the first input operand in a floating-point |
4390 | ;; <optab><mode>3 pattern. | |
4391 | (define_int_attr sve_pred_fp_rhs1_operand | |
4392 | [(UNSPEC_COND_FADD "register_operand") | |
4393 | (UNSPEC_COND_FDIV "register_operand") | |
624d0f07 | 4394 | (UNSPEC_COND_FMAX "register_operand") |
0254ed79 | 4395 | (UNSPEC_COND_FMAXNM "register_operand") |
624d0f07 | 4396 | (UNSPEC_COND_FMIN "register_operand") |
0254ed79 RS |
4397 | (UNSPEC_COND_FMINNM "register_operand") |
4398 | (UNSPEC_COND_FMUL "register_operand") | |
624d0f07 | 4399 | (UNSPEC_COND_FMULX "register_operand") |
0254ed79 RS |
4400 | (UNSPEC_COND_FSUB "aarch64_sve_float_arith_operand")]) |
4401 | ||
4402 | ;; The predicate to use for the second input operand in a floating-point | |
4403 | ;; <optab><mode>3 pattern. | |
4404 | (define_int_attr sve_pred_fp_rhs2_operand | |
4405 | [(UNSPEC_COND_FADD "aarch64_sve_float_arith_with_sub_operand") | |
4406 | (UNSPEC_COND_FDIV "register_operand") | |
624d0f07 | 4407 | (UNSPEC_COND_FMAX "aarch64_sve_float_maxmin_operand") |
75079ddf | 4408 | (UNSPEC_COND_FMAXNM "aarch64_sve_float_maxmin_operand") |
624d0f07 | 4409 | (UNSPEC_COND_FMIN "aarch64_sve_float_maxmin_operand") |
75079ddf | 4410 | (UNSPEC_COND_FMINNM "aarch64_sve_float_maxmin_operand") |
0254ed79 | 4411 | (UNSPEC_COND_FMUL "aarch64_sve_float_mul_operand") |
624d0f07 | 4412 | (UNSPEC_COND_FMULX "register_operand") |
0254ed79 | 4413 | (UNSPEC_COND_FSUB "register_operand")]) |
a19ba9e1 RS |
4414 | |
4415 | ;; Likewise for immediates only. | |
4416 | (define_int_attr sve_pred_fp_rhs2_immediate | |
624d0f07 RS |
4417 | [(UNSPEC_COND_FMAX "aarch64_sve_float_maxmin_immediate") |
4418 | (UNSPEC_COND_FMAXNM "aarch64_sve_float_maxmin_immediate") | |
4419 | (UNSPEC_COND_FMIN "aarch64_sve_float_maxmin_immediate") | |
a19ba9e1 RS |
4420 | (UNSPEC_COND_FMINNM "aarch64_sve_float_maxmin_immediate") |
4421 | (UNSPEC_COND_FMUL "aarch64_sve_float_mul_immediate")]) | |
d7a09c44 | 4422 | |
624d0f07 RS |
4423 | ;; The maximum number of element bits that an instruction can handle. |
4424 | (define_int_attr max_elem_bits [(UNSPEC_UADDV "64") (UNSPEC_SADDV "32") | |
4425 | (UNSPEC_PFIRST "8") (UNSPEC_PNEXT "64")]) | |
4426 | ||
d7a09c44 | 4427 | ;; The minimum number of element bits that an instruction can handle. |
c2f0aaf7 | 4428 | (define_int_attr min_elem_bits [(UNSPEC_REVB "16") |
d7a09c44 RS |
4429 | (UNSPEC_REVH "32") |
4430 | (UNSPEC_REVW "64")]) | |
58c036c8 RS |
4431 | |
4432 | (define_int_attr unspec [(UNSPEC_WHILERW "UNSPEC_WHILERW") | |
4433 | (UNSPEC_WHILEWR "UNSPEC_WHILEWR")]) | |
0d7e5fa6 | 4434 | |
4f6ab953 RS |
4435 | (define_int_attr hv [(UNSPEC_SME_LD1_HOR "h") |
4436 | (UNSPEC_SME_LD1_VER "v") | |
4437 | (UNSPEC_SME_READ_HOR "h") | |
4438 | (UNSPEC_SME_READ_VER "v") | |
4439 | (UNSPEC_SME_ST1_HOR "h") | |
4440 | (UNSPEC_SME_ST1_VER "v") | |
4441 | (UNSPEC_SME_WRITE_HOR "h") | |
4442 | (UNSPEC_SME_WRITE_VER "v")]) | |
4443 | ||
c1c267df RS |
4444 | (define_int_attr has_16bit_form [(UNSPEC_SME_SDOT "true") |
4445 | (UNSPEC_SME_SVDOT "true") | |
4446 | (UNSPEC_SME_UDOT "true") | |
4447 | (UNSPEC_SME_UVDOT "true") | |
4448 | (UNSPEC_SME_SUDOT "false") | |
4449 | (UNSPEC_SME_SUVDOT "false") | |
4450 | (UNSPEC_SME_USDOT "false") | |
4451 | (UNSPEC_SME_USVDOT "false")]) | |
4452 | ||
0d7e5fa6 AC |
4453 | ;; Iterators and attributes for fpcr fpsr getter setters |
4454 | ||
4455 | (define_int_iterator GET_FPSCR | |
4456 | [UNSPECV_GET_FPSR UNSPECV_GET_FPCR]) | |
4457 | ||
4458 | (define_int_iterator SET_FPSCR | |
4459 | [UNSPECV_SET_FPSR UNSPECV_SET_FPCR]) | |
4460 | ||
4461 | (define_int_attr fpscr_name | |
4462 | [(UNSPECV_GET_FPSR "fpsr") | |
4463 | (UNSPECV_SET_FPSR "fpsr") | |
4464 | (UNSPECV_GET_FPCR "fpcr") | |
4465 | (UNSPECV_SET_FPCR "fpcr")]) | |
b096a6eb | 4466 | |
c1c267df | 4467 | (define_int_attr bits_etype [(8 "b") (16 "h") (32 "s") (64 "d")]) |
bfefed6c SJ |
4468 | |
4469 | ;; Iterators and attributes for faminmax | |
4470 | ||
4471 | (define_int_iterator FAMINMAX_UNS [UNSPEC_FAMAX UNSPEC_FAMIN]) | |
4472 | ||
4473 | (define_int_attr faminmax_uns_op | |
4474 | [(UNSPEC_FAMAX "famax") (UNSPEC_FAMIN "famin")]) | |
c1fb78fb SJ |
4475 | |
4476 | (define_code_attr faminmax_op | |
4477 | [(smax "famax") (smin "famin")]) |