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