]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/aarch64/iterators.md
Fix missing files from previous commit.
[thirdparty/gcc.git] / gcc / config / aarch64 / iterators.md
CommitLineData
43e9d192 1;; Machine description for AArch64 architecture.
8d9254fc 2;; Copyright (C) 2009-2020 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
JW
32;; Iterator for HI, SI, DI, some instructions can only work on these modes.
33(define_mode_iterator GPI_I16 [(HI "AARCH64_ISA_F16") SI DI])
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
JW
57;; Iterator for all scalar floating point modes (HF, SF, DF)
58(define_mode_iterator GPF_F16 [(HF "AARCH64_ISA_F16") SF DF])
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
09fcd8e1
RR
66;; Iterator for all scalar floating point modes (HF, SF, DF and TF)
67(define_mode_iterator GPF_TF_F16 [HF SF DF TF])
c2ec330c 68
abbe1ed2
SMW
69;; Iterator for all scalar floating point modes suitable for moving, including
70;; special BF type (HF, SF, DF, TF and BF)
71(define_mode_iterator GPF_TF_F16_MOV [HF BF SF DF TF])
72
922f9c25
AL
73;; Double vector modes.
74(define_mode_iterator VDF [V2SF V4HF])
75
b4f50fd4
RR
76;; Iterator for all scalar floating point modes (SF, DF and TF)
77(define_mode_iterator GPF_TF [SF DF TF])
78
43cacb12 79;; Integer Advanced SIMD modes.
43e9d192
IB
80(define_mode_iterator VDQ_I [V8QI V16QI V4HI V8HI V2SI V4SI V2DI])
81
43cacb12 82;; Advanced SIMD and scalar, 64 & 128-bit container, all integer modes.
43e9d192
IB
83(define_mode_iterator VSDQ_I [V8QI V16QI V4HI V8HI V2SI V4SI V2DI QI HI SI DI])
84
43cacb12
RS
85;; Advanced SIMD and scalar, 64 & 128-bit container: all Advanced SIMD
86;; integer modes; 64-bit scalar integer mode.
43e9d192
IB
87(define_mode_iterator VSDQ_I_DI [V8QI V16QI V4HI V8HI V2SI V4SI V2DI DI])
88
89;; Double vector modes.
e603cd43 90(define_mode_iterator VD [V8QI V4HI V4HF V2SI V2SF V4BF])
43e9d192 91
abbe1ed2
SMW
92;; Double vector modes suitable for moving. Includes BFmode.
93(define_mode_iterator VDMOV [V8QI V4HI V4HF V4BF V2SI V2SF])
94
dfe1da23
JW
95;; All modes stored in registers d0-d31.
96(define_mode_iterator DREG [V8QI V4HI V4HF V2SI V2SF DF])
97
98;; Copy of the above.
99(define_mode_iterator DREG2 [V8QI V4HI V4HF V2SI V2SF DF])
100
43cacb12 101;; Advanced SIMD, 64-bit container, all integer modes.
43e9d192
IB
102(define_mode_iterator VD_BHSI [V8QI V4HI V2SI])
103
104;; 128 and 64-bit container; 8, 16, 32-bit vector integer modes
105(define_mode_iterator VDQ_BHSI [V8QI V16QI V4HI V8HI V2SI V4SI])
106
107;; Quad vector modes.
e603cd43 108(define_mode_iterator VQ [V16QI V8HI V4SI V2DI V8HF V4SF V2DF V8BF])
43e9d192 109
9f5361c8 110;; Copy of the above.
e603cd43 111(define_mode_iterator VQ2 [V16QI V8HI V4SI V2DI V8HF V8BF V4SF V2DF])
9f5361c8 112
abbe1ed2
SMW
113;; Quad vector modes suitable for moving. Includes BFmode.
114(define_mode_iterator VQMOV [V16QI V8HI V4SI V2DI V8HF V8BF V4SF V2DF])
115
116;; VQMOV without 2-element modes.
117(define_mode_iterator VQMOV_NO2E [V16QI V8HI V4SI V8HF V8BF V4SF])
118
d21052eb
TC
119;; Quad integer vector modes.
120(define_mode_iterator VQ_I [V16QI V8HI V4SI V2DI])
121
51437269 122;; VQ without 2 element modes.
e603cd43 123(define_mode_iterator VQ_NO2E [V16QI V8HI V4SI V8HF V4SF V8BF])
51437269
GW
124
125;; Quad vector with only 2 element modes.
126(define_mode_iterator VQ_2E [V2DI V2DF])
127
f275d73a
SMW
128;; BFmode vector modes.
129(define_mode_iterator VBF [V4BF V8BF])
130
28514dda
YZ
131;; This mode iterator allows :P to be used for patterns that operate on
132;; addresses in different modes. In LP64, only DI will match, while in
133;; ILP32, either can match.
134(define_mode_iterator P [(SI "ptr_mode == SImode || Pmode == SImode")
135 (DI "ptr_mode == DImode || Pmode == DImode")])
136
43e9d192
IB
137;; This mode iterator allows :PTR to be used for patterns that operate on
138;; pointer-sized quantities. Exactly one of the two alternatives will match.
28514dda 139(define_mode_iterator PTR [(SI "ptr_mode == SImode") (DI "ptr_mode == DImode")])
43e9d192 140
43cacb12 141;; Advanced SIMD Float modes suitable for moving, loading and storing.
8ea6c1b8
MI
142(define_mode_iterator VDQF_F16 [V4HF V8HF V2SF V4SF V2DF
143 V4BF V8BF])
862abc04 144
43cacb12 145;; Advanced SIMD Float modes.
43e9d192 146(define_mode_iterator VDQF [V2SF V4SF V2DF])
daef0a8c
JW
147(define_mode_iterator VHSDF [(V4HF "TARGET_SIMD_F16INST")
148 (V8HF "TARGET_SIMD_F16INST")
149 V2SF V4SF V2DF])
43e9d192 150
43cacb12 151;; Advanced SIMD Float modes, and DF.
daef0a8c
JW
152(define_mode_iterator VHSDF_DF [(V4HF "TARGET_SIMD_F16INST")
153 (V8HF "TARGET_SIMD_F16INST")
154 V2SF V4SF V2DF DF])
d7f33f07
JW
155(define_mode_iterator VHSDF_HSDF [(V4HF "TARGET_SIMD_F16INST")
156 (V8HF "TARGET_SIMD_F16INST")
157 V2SF V4SF V2DF
158 (HF "TARGET_SIMD_F16INST")
159 SF DF])
f421c516 160
10bd1d96
KT
161;; Scalar and vetor modes for SF, DF.
162(define_mode_iterator VSFDF [V2SF V4SF V2DF DF SF])
163
43cacb12 164;; Advanced SIMD single Float modes.
828e70c1
JG
165(define_mode_iterator VDQSF [V2SF V4SF])
166
03873eb9
AL
167;; Quad vector Float modes with half/single elements.
168(define_mode_iterator VQ_HSF [V8HF V4SF])
169
fc21784d
JG
170;; Modes suitable to use as the return type of a vcond expression.
171(define_mode_iterator VDQF_COND [V2SF V2SI V4SF V4SI V2DF V2DI])
172
43cacb12 173;; All scalar and Advanced SIMD Float modes.
889b9412
JG
174(define_mode_iterator VALLF [V2SF V4SF V2DF SF DF])
175
43cacb12 176;; Advanced SIMD Float modes with 2 elements.
43e9d192
IB
177(define_mode_iterator V2F [V2SF V2DF])
178
43cacb12 179;; All Advanced SIMD modes on which we support any arithmetic operations.
43e9d192
IB
180(define_mode_iterator VALL [V8QI V16QI V4HI V8HI V2SI V4SI V2DI V2SF V4SF V2DF])
181
43cacb12 182;; All Advanced SIMD modes suitable for moving, loading, and storing.
71a11456 183(define_mode_iterator VALL_F16 [V8QI V16QI V4HI V8HI V2SI V4SI V2DI
8ea6c1b8 184 V4HF V8HF V4BF V8BF V2SF V4SF V2DF])
71a11456 185
abbe1ed2
SMW
186;; All Advanced SIMD modes suitable for moving, loading, and storing,
187;; including special Bfloat vector types.
188(define_mode_iterator VALL_F16MOV [V8QI V16QI V4HI V8HI V2SI V4SI V2DI
189 V4HF V8HF V4BF V8BF V2SF V4SF V2DF])
190
88119b46
KT
191;; The VALL_F16 modes except the 128-bit 2-element ones.
192(define_mode_iterator VALL_F16_NO_V2Q [V8QI V16QI V4HI V8HI V2SI V4SI
193 V4HF V8HF V2SF V4SF])
194
43cacb12 195;; All Advanced SIMD modes barring HF modes, plus DI.
a50344cb
TB
196(define_mode_iterator VALLDI [V8QI V16QI V4HI V8HI V2SI V4SI V2DI V2SF V4SF V2DF DI])
197
43cacb12 198;; All Advanced SIMD modes and DI.
71a11456 199(define_mode_iterator VALLDI_F16 [V8QI V16QI V4HI V8HI V2SI V4SI V2DI
8ea6c1b8 200 V4HF V8HF V4BF V8BF V2SF V4SF V2DF DI])
71a11456 201
43cacb12 202;; All Advanced SIMD modes, plus DI and DF.
e603cd43 203(define_mode_iterator VALLDIF [V8QI V16QI V4HI V8HI V2SI V4SI V4BF V8BF
7c369485 204 V2DI V4HF V8HF V2SF V4SF V2DF DI DF])
46e778c4 205
43cacb12 206;; Advanced SIMD modes for Integer reduction across lanes.
92835317
TB
207(define_mode_iterator VDQV [V8QI V16QI V4HI V8HI V4SI V2DI])
208
43cacb12 209;; Advanced SIMD modes (except V2DI) for Integer reduction across lanes.
92835317 210(define_mode_iterator VDQV_S [V8QI V16QI V4HI V8HI V4SI])
43e9d192 211
9921bbf9
WD
212;; Advanced SIMD modes for Integer reduction across lanes (zero/sign extended).
213(define_mode_iterator VDQV_E [V8QI V16QI V4HI V8HI])
214
43e9d192
IB
215;; All double integer narrow-able modes.
216(define_mode_iterator VDN [V4HI V2SI DI])
217
218;; All quad integer narrow-able modes.
219(define_mode_iterator VQN [V8HI V4SI V2DI])
220
43cacb12
RS
221;; Advanced SIMD and scalar 128-bit container: narrowable 16, 32, 64-bit
222;; integer modes
43e9d192
IB
223(define_mode_iterator VSQN_HSDI [V8HI V4SI V2DI HI SI DI])
224
225;; All quad integer widen-able modes.
226(define_mode_iterator VQW [V16QI V8HI V4SI])
227
228;; Double vector modes for combines.
e603cd43 229(define_mode_iterator VDC [V8QI V4HI V4BF V4HF V2SI V2SF DI DF])
43e9d192 230
43cacb12 231;; Advanced SIMD modes except double int.
43e9d192 232(define_mode_iterator VDQIF [V8QI V16QI V4HI V8HI V2SI V4SI V2SF V4SF V2DF])
703bbcdf
JW
233(define_mode_iterator VDQIF_F16 [V8QI V16QI V4HI V8HI V2SI V4SI
234 V4HF V8HF V2SF V4SF V2DF])
43e9d192 235
43cacb12 236;; Advanced SIMD modes for S type.
58a3bd25
FY
237(define_mode_iterator VDQ_SI [V2SI V4SI])
238
43cacb12 239;; Advanced SIMD modes for S and D.
2644d4d9
JW
240(define_mode_iterator VDQ_SDI [V2SI V4SI V2DI])
241
43cacb12 242;; Advanced SIMD modes for H, S and D.
33d72b63
JW
243(define_mode_iterator VDQ_HSDI [(V4HI "TARGET_SIMD_F16INST")
244 (V8HI "TARGET_SIMD_F16INST")
245 V2SI V4SI V2DI])
246
43cacb12 247;; Scalar and Advanced SIMD modes for S and D.
2644d4d9
JW
248(define_mode_iterator VSDQ_SDI [V2SI V4SI V2DI SI DI])
249
43cacb12 250;; Scalar and Advanced SIMD modes for S and D, Advanced SIMD modes for H.
33d72b63
JW
251(define_mode_iterator VSDQ_HSDI [(V4HI "TARGET_SIMD_F16INST")
252 (V8HI "TARGET_SIMD_F16INST")
68ad28c3
JW
253 V2SI V4SI V2DI
254 (HI "TARGET_SIMD_F16INST")
255 SI DI])
33d72b63 256
43cacb12 257;; Advanced SIMD modes for Q and H types.
66adb8eb
JG
258(define_mode_iterator VDQQH [V8QI V16QI V4HI V8HI])
259
43cacb12 260;; Advanced SIMD modes for H and S types.
43e9d192
IB
261(define_mode_iterator VDQHS [V4HI V8HI V2SI V4SI])
262
43cacb12 263;; Advanced SIMD modes for H, S and D types.
c7f28cd5
KT
264(define_mode_iterator VDQHSD [V4HI V8HI V2SI V4SI V2DI])
265
43cacb12 266;; Advanced SIMD and scalar integer modes for H and S.
43e9d192
IB
267(define_mode_iterator VSDQ_HSI [V4HI V8HI V2SI V4SI HI SI])
268
43cacb12 269;; Advanced SIMD and scalar 64-bit container: 16, 32-bit integer modes.
43e9d192
IB
270(define_mode_iterator VSD_HSI [V4HI V2SI HI SI])
271
43cacb12 272;; Advanced SIMD 64-bit container: 16, 32-bit integer modes.
43e9d192
IB
273(define_mode_iterator VD_HSI [V4HI V2SI])
274
275;; Scalar 64-bit container: 16, 32-bit integer modes
276(define_mode_iterator SD_HSI [HI SI])
277
43cacb12 278;; Advanced SIMD 64-bit container: 16, 32-bit integer modes.
43e9d192
IB
279(define_mode_iterator VQ_HSI [V8HI V4SI])
280
281;; All byte modes.
282(define_mode_iterator VB [V8QI V16QI])
283
5e32e83b
JW
284;; 2 and 4 lane SI modes.
285(define_mode_iterator VS [V2SI V4SI])
286
43e9d192
IB
287(define_mode_iterator TX [TI TF])
288
43cacb12 289;; Advanced SIMD opaque structure modes.
43e9d192
IB
290(define_mode_iterator VSTRUCT [OI CI XI])
291
292;; Double scalar modes
293(define_mode_iterator DX [DI DF])
294
dfe1da23
JW
295;; Duplicate of the above
296(define_mode_iterator DX2 [DI DF])
297
298;; Single scalar modes
299(define_mode_iterator SX [SI SF])
300
301;; Duplicate of the above
302(define_mode_iterator SX2 [SI SF])
303
304;; Single and double integer and float modes
305(define_mode_iterator DSX [DF DI SF SI])
306
307
43cacb12 308;; Modes available for Advanced SIMD <f>mul lane operations.
ab2e8f01
JW
309(define_mode_iterator VMUL [V4HI V8HI V2SI V4SI
310 (V4HF "TARGET_SIMD_F16INST")
311 (V8HF "TARGET_SIMD_F16INST")
312 V2SF V4SF V2DF])
779aea46 313
43cacb12
RS
314;; Modes available for Advanced SIMD <f>mul lane operations changing lane
315;; count.
779aea46
JG
316(define_mode_iterator VMUL_CHANGE_NLANES [V4HI V8HI V2SI V4SI V2SF V4SF])
317
95eb5537 318;; Iterators for single modes, for "@" patterns.
0a09a948 319(define_mode_iterator VNx16QI_ONLY [VNx16QI])
624d0f07 320(define_mode_iterator VNx8HI_ONLY [VNx8HI])
896dff99 321(define_mode_iterator VNx8BF_ONLY [VNx8BF])
95eb5537 322(define_mode_iterator VNx4SI_ONLY [VNx4SI])
0a09a948 323(define_mode_iterator VNx4SF_ONLY [VNx4SF])
624d0f07 324(define_mode_iterator VNx2DI_ONLY [VNx2DI])
95eb5537
RS
325(define_mode_iterator VNx2DF_ONLY [VNx2DF])
326
9f4cbab8
RS
327;; All SVE vector structure modes.
328(define_mode_iterator SVE_STRUCT [VNx32QI VNx16HI VNx8SI VNx4DI
02fcd8ac 329 VNx16BF VNx16HF VNx8SF VNx4DF
9f4cbab8 330 VNx48QI VNx24HI VNx12SI VNx6DI
02fcd8ac 331 VNx24BF VNx24HF VNx12SF VNx6DF
9f4cbab8 332 VNx64QI VNx32HI VNx16SI VNx8DI
02fcd8ac 333 VNx32BF VNx32HF VNx16SF VNx8DF])
0a09a948 334
f75cdd2c
RS
335;; All fully-packed SVE vector modes.
336(define_mode_iterator SVE_FULL [VNx16QI VNx8HI VNx4SI VNx2DI
02fcd8ac 337 VNx8BF VNx8HF VNx4SF VNx2DF])
f75cdd2c
RS
338
339;; All fully-packed SVE integer vector modes.
340(define_mode_iterator SVE_FULL_I [VNx16QI VNx8HI VNx4SI VNx2DI])
43cacb12 341
f75cdd2c
RS
342;; All fully-packed SVE floating-point vector modes.
343(define_mode_iterator SVE_FULL_F [VNx8HF VNx4SF VNx2DF])
43cacb12 344
0a09a948
RS
345;; Fully-packed SVE integer vector modes that have 8-bit or 16-bit elements.
346(define_mode_iterator SVE_FULL_BHI [VNx16QI VNx8HI])
347
f75cdd2c
RS
348;; Fully-packed SVE integer vector modes that have 8-bit, 16-bit or 32-bit
349;; elements.
350(define_mode_iterator SVE_FULL_BHSI [VNx16QI VNx8HI VNx4SI])
43cacb12 351
f75cdd2c 352;; Fully-packed SVE vector modes that have 16-bit, 32-bit or 64-bit elements.
02fcd8ac
RS
353(define_mode_iterator SVE_FULL_HSD [VNx8HI VNx4SI VNx2DI
354 VNx8BF VNx8HF VNx4SF VNx2DF])
95eb5537 355
f75cdd2c
RS
356;; Fully-packed SVE integer vector modes that have 16-bit, 32-bit or 64-bit
357;; elements.
358(define_mode_iterator SVE_FULL_HSDI [VNx8HI VNx4SI VNx2DI])
95eb5537 359
0a09a948
RS
360;; Fully-packed SVE integer vector modes that have 16-bit or 32-bit
361;; elements.
362(define_mode_iterator SVE_FULL_HSI [VNx8HI VNx4SI])
363
f75cdd2c
RS
364;; Fully-packed SVE floating-point vector modes that have 16-bit or 32-bit
365;; elements.
366(define_mode_iterator SVE_FULL_HSF [VNx8HF VNx4SF])
a70965b1 367
0a09a948
RS
368;; Fully-packed SVE integer vector modes that have 16-bit or 64-bit elements.
369(define_mode_iterator SVE_FULL_HDI [VNx8HI VNx2DI])
370
f75cdd2c
RS
371;; Fully-packed SVE vector modes that have 32-bit or 64-bit elements.
372(define_mode_iterator SVE_FULL_SD [VNx4SI VNx2DI VNx4SF VNx2DF])
43cacb12 373
f75cdd2c
RS
374;; Fully-packed SVE integer vector modes that have 32-bit or 64-bit elements.
375(define_mode_iterator SVE_FULL_SDI [VNx4SI VNx2DI])
bfaa08b7 376
f75cdd2c
RS
377;; Fully-packed SVE floating-point vector modes that have 32-bit or 64-bit
378;; elements.
379(define_mode_iterator SVE_FULL_SDF [VNx4SF VNx2DF])
bfaa08b7 380
36696774
RS
381;; Same, but with the appropriate conditions for FMMLA support.
382(define_mode_iterator SVE_MATMULF [(VNx4SF "TARGET_SVE_F32MM")
383 (VNx2DF "TARGET_SVE_F64MM")])
384
f75cdd2c
RS
385;; Fully-packed SVE vector modes that have 32-bit elements.
386(define_mode_iterator SVE_FULL_S [VNx4SI VNx4SF])
43cacb12 387
f75cdd2c
RS
388;; Fully-packed SVE vector modes that have 64-bit elements.
389(define_mode_iterator SVE_FULL_D [VNx2DI VNx2DF])
43cacb12 390
6544cb52
RS
391;; All partial SVE integer modes.
392(define_mode_iterator SVE_PARTIAL_I [VNx8QI VNx4QI VNx2QI
393 VNx4HI VNx2HI
394 VNx2SI])
624d0f07 395
cc68f7c2
RS
396;; All SVE vector modes.
397(define_mode_iterator SVE_ALL [VNx16QI VNx8QI VNx4QI VNx2QI
398 VNx8HI VNx4HI VNx2HI
399 VNx8HF VNx4HF VNx2HF
02fcd8ac 400 VNx8BF
cc68f7c2
RS
401 VNx4SI VNx2SI
402 VNx4SF VNx2SF
403 VNx2DI
404 VNx2DF])
405
406;; All SVE integer vector modes.
407(define_mode_iterator SVE_I [VNx16QI VNx8QI VNx4QI VNx2QI
408 VNx8HI VNx4HI VNx2HI
409 VNx4SI VNx2SI
410 VNx2DI])
411
e58703e2
RS
412;; SVE integer vector modes whose elements are 16 bits or wider.
413(define_mode_iterator SVE_HSDI [VNx8HI VNx4HI VNx2HI
414 VNx4SI VNx2SI
415 VNx2DI])
416
f8186eea
RS
417;; SVE modes with 2 or 4 elements.
418(define_mode_iterator SVE_24 [VNx2QI VNx2HI VNx2HF VNx2SI VNx2SF VNx2DI VNx2DF
419 VNx4QI VNx4HI VNx4HF VNx4SI VNx4SF])
420
421;; SVE modes with 2 elements.
422(define_mode_iterator SVE_2 [VNx2QI VNx2HI VNx2HF VNx2SI VNx2SF VNx2DI VNx2DF])
423
87a80d27
RS
424;; SVE integer modes with 2 elements, excluding the widest element.
425(define_mode_iterator SVE_2BHSI [VNx2QI VNx2HI VNx2SI])
426
427;; SVE integer modes with 2 elements, excluding the narrowest element.
428(define_mode_iterator SVE_2HSDI [VNx2HI VNx2SI VNx2DI])
429
f8186eea
RS
430;; SVE modes with 4 elements.
431(define_mode_iterator SVE_4 [VNx4QI VNx4HI VNx4HF VNx4SI VNx4SF])
432
87a80d27
RS
433;; SVE integer modes with 4 elements, excluding the widest element.
434(define_mode_iterator SVE_4BHI [VNx4QI VNx4HI])
435
436;; SVE integer modes with 4 elements, excluding the narrowest element.
437(define_mode_iterator SVE_4HSI [VNx4HI VNx4SI])
438
0a09a948
RS
439;; SVE integer modes that can form the input to an SVE2 PMULL[BT] instruction.
440(define_mode_iterator SVE2_PMULL_PAIR_I [VNx16QI VNx4SI
441 (VNx2DI "TARGET_SVE2_AES")])
442
624d0f07
RS
443;; Modes involved in extending or truncating SVE data, for 8 elements per
444;; 128-bit block.
445(define_mode_iterator VNx8_NARROW [VNx8QI])
446(define_mode_iterator VNx8_WIDE [VNx8HI])
447
448;; ...same for 4 elements per 128-bit block.
449(define_mode_iterator VNx4_NARROW [VNx4QI VNx4HI])
450(define_mode_iterator VNx4_WIDE [VNx4SI])
451
452;; ...same for 2 elements per 128-bit block.
453(define_mode_iterator VNx2_NARROW [VNx2QI VNx2HI VNx2SI])
454(define_mode_iterator VNx2_WIDE [VNx2DI])
455
43cacb12
RS
456;; All SVE predicate modes.
457(define_mode_iterator PRED_ALL [VNx16BI VNx8BI VNx4BI VNx2BI])
458
459;; SVE predicate modes that control 8-bit, 16-bit or 32-bit elements.
460(define_mode_iterator PRED_BHS [VNx16BI VNx8BI VNx4BI])
461
624d0f07
RS
462;; SVE predicate modes that control 16-bit, 32-bit or 64-bit elements.
463(define_mode_iterator PRED_HSD [VNx8BI VNx4BI VNx2BI])
464
1f520d34
DB
465;; Bfloat16 modes to which V4SF can be converted
466(define_mode_iterator V4SF_TO_BF [V4BF V8BF])
467
43e9d192
IB
468;; ------------------------------------------------------------------
469;; Unspec enumerations for Advance SIMD. These could well go into
470;; aarch64.md but for their use in int_iterators here.
471;; ------------------------------------------------------------------
472
473(define_c_enum "unspec"
474 [
475 UNSPEC_ASHIFT_SIGNED ; Used in aarch-simd.md.
476 UNSPEC_ASHIFT_UNSIGNED ; Used in aarch64-simd.md.
285398d2 477 UNSPEC_ABS ; Used in aarch64-simd.md.
998eaf97
JG
478 UNSPEC_FMAX ; Used in aarch64-simd.md.
479 UNSPEC_FMAXNMV ; Used in aarch64-simd.md.
43e9d192 480 UNSPEC_FMAXV ; Used in aarch64-simd.md.
998eaf97
JG
481 UNSPEC_FMIN ; Used in aarch64-simd.md.
482 UNSPEC_FMINNMV ; Used in aarch64-simd.md.
43e9d192
IB
483 UNSPEC_FMINV ; Used in aarch64-simd.md.
484 UNSPEC_FADDV ; Used in aarch64-simd.md.
f5156c3e 485 UNSPEC_ADDV ; Used in aarch64-simd.md.
43e9d192
IB
486 UNSPEC_SMAXV ; Used in aarch64-simd.md.
487 UNSPEC_SMINV ; Used in aarch64-simd.md.
488 UNSPEC_UMAXV ; Used in aarch64-simd.md.
489 UNSPEC_UMINV ; Used in aarch64-simd.md.
490 UNSPEC_SHADD ; Used in aarch64-simd.md.
491 UNSPEC_UHADD ; Used in aarch64-simd.md.
492 UNSPEC_SRHADD ; Used in aarch64-simd.md.
493 UNSPEC_URHADD ; Used in aarch64-simd.md.
494 UNSPEC_SHSUB ; Used in aarch64-simd.md.
495 UNSPEC_UHSUB ; Used in aarch64-simd.md.
43e9d192
IB
496 UNSPEC_ADDHN ; Used in aarch64-simd.md.
497 UNSPEC_RADDHN ; Used in aarch64-simd.md.
498 UNSPEC_SUBHN ; Used in aarch64-simd.md.
499 UNSPEC_RSUBHN ; Used in aarch64-simd.md.
500 UNSPEC_ADDHN2 ; Used in aarch64-simd.md.
501 UNSPEC_RADDHN2 ; Used in aarch64-simd.md.
502 UNSPEC_SUBHN2 ; Used in aarch64-simd.md.
503 UNSPEC_RSUBHN2 ; Used in aarch64-simd.md.
504 UNSPEC_SQDMULH ; Used in aarch64-simd.md.
505 UNSPEC_SQRDMULH ; Used in aarch64-simd.md.
506 UNSPEC_PMUL ; Used in aarch64-simd.md.
496ea87d 507 UNSPEC_FMULX ; Used in aarch64-simd.md.
43e9d192
IB
508 UNSPEC_USQADD ; Used in aarch64-simd.md.
509 UNSPEC_SUQADD ; Used in aarch64-simd.md.
510 UNSPEC_SQXTUN ; Used in aarch64-simd.md.
511 UNSPEC_SQXTN ; Used in aarch64-simd.md.
512 UNSPEC_UQXTN ; Used in aarch64-simd.md.
513 UNSPEC_SSRA ; Used in aarch64-simd.md.
514 UNSPEC_USRA ; Used in aarch64-simd.md.
515 UNSPEC_SRSRA ; Used in aarch64-simd.md.
516 UNSPEC_URSRA ; Used in aarch64-simd.md.
517 UNSPEC_SRSHR ; Used in aarch64-simd.md.
518 UNSPEC_URSHR ; Used in aarch64-simd.md.
519 UNSPEC_SQSHLU ; Used in aarch64-simd.md.
520 UNSPEC_SQSHL ; Used in aarch64-simd.md.
521 UNSPEC_UQSHL ; Used in aarch64-simd.md.
522 UNSPEC_SQSHRUN ; Used in aarch64-simd.md.
523 UNSPEC_SQRSHRUN ; Used in aarch64-simd.md.
524 UNSPEC_SQSHRN ; Used in aarch64-simd.md.
525 UNSPEC_UQSHRN ; Used in aarch64-simd.md.
526 UNSPEC_SQRSHRN ; Used in aarch64-simd.md.
527 UNSPEC_UQRSHRN ; Used in aarch64-simd.md.
528 UNSPEC_SSHL ; Used in aarch64-simd.md.
529 UNSPEC_USHL ; Used in aarch64-simd.md.
530 UNSPEC_SRSHL ; Used in aarch64-simd.md.
531 UNSPEC_URSHL ; Used in aarch64-simd.md.
532 UNSPEC_SQRSHL ; Used in aarch64-simd.md.
533 UNSPEC_UQRSHL ; Used in aarch64-simd.md.
43e9d192
IB
534 UNSPEC_SSLI ; Used in aarch64-simd.md.
535 UNSPEC_USLI ; Used in aarch64-simd.md.
536 UNSPEC_SSRI ; Used in aarch64-simd.md.
537 UNSPEC_USRI ; Used in aarch64-simd.md.
538 UNSPEC_SSHLL ; Used in aarch64-simd.md.
539 UNSPEC_USHLL ; Used in aarch64-simd.md.
540 UNSPEC_ADDP ; Used in aarch64-simd.md.
88b08073 541 UNSPEC_TBL ; Used in vector permute patterns.
9371aecc 542 UNSPEC_TBX ; Used in vector permute patterns.
88b08073 543 UNSPEC_CONCAT ; Used in vector permute patterns.
3f8334a5
RS
544
545 ;; The following permute unspecs are generated directly by
546 ;; aarch64_expand_vec_perm_const, so any changes to the underlying
547 ;; instructions would need a corresponding change there.
cc4d934f
JG
548 UNSPEC_ZIP1 ; Used in vector permute patterns.
549 UNSPEC_ZIP2 ; Used in vector permute patterns.
550 UNSPEC_UZP1 ; Used in vector permute patterns.
551 UNSPEC_UZP2 ; Used in vector permute patterns.
552 UNSPEC_TRN1 ; Used in vector permute patterns.
553 UNSPEC_TRN2 ; Used in vector permute patterns.
3f8334a5 554 UNSPEC_EXT ; Used in vector permute patterns.
923fcec3
AL
555 UNSPEC_REV64 ; Used in vector reverse patterns (permute).
556 UNSPEC_REV32 ; Used in vector reverse patterns (permute).
557 UNSPEC_REV16 ; Used in vector reverse patterns (permute).
3f8334a5 558
5a7a4e80
TB
559 UNSPEC_AESE ; Used in aarch64-simd.md.
560 UNSPEC_AESD ; Used in aarch64-simd.md.
561 UNSPEC_AESMC ; Used in aarch64-simd.md.
562 UNSPEC_AESIMC ; Used in aarch64-simd.md.
30442682
TB
563 UNSPEC_SHA1C ; Used in aarch64-simd.md.
564 UNSPEC_SHA1M ; Used in aarch64-simd.md.
565 UNSPEC_SHA1P ; Used in aarch64-simd.md.
566 UNSPEC_SHA1H ; Used in aarch64-simd.md.
567 UNSPEC_SHA1SU0 ; Used in aarch64-simd.md.
568 UNSPEC_SHA1SU1 ; Used in aarch64-simd.md.
b9cb0a44
TB
569 UNSPEC_SHA256H ; Used in aarch64-simd.md.
570 UNSPEC_SHA256H2 ; Used in aarch64-simd.md.
571 UNSPEC_SHA256SU0 ; Used in aarch64-simd.md.
572 UNSPEC_SHA256SU1 ; Used in aarch64-simd.md.
7baa225d
TB
573 UNSPEC_PMULL ; Used in aarch64-simd.md.
574 UNSPEC_PMULL2 ; Used in aarch64-simd.md.
668046d1 575 UNSPEC_REV_REGLIST ; Used in aarch64-simd.md.
9c004c58 576 UNSPEC_VEC_SHR ; Used in aarch64-simd.md.
57b26d65
MW
577 UNSPEC_SQRDMLAH ; Used in aarch64-simd.md.
578 UNSPEC_SQRDMLSH ; Used in aarch64-simd.md.
202d0c11
DS
579 UNSPEC_FMAXNM ; Used in aarch64-simd.md.
580 UNSPEC_FMINNM ; Used in aarch64-simd.md.
7a08d813
TC
581 UNSPEC_SDOT ; Used in aarch64-simd.md.
582 UNSPEC_UDOT ; Used in aarch64-simd.md.
27086ea3
MC
583 UNSPEC_SM3SS1 ; Used in aarch64-simd.md.
584 UNSPEC_SM3TT1A ; Used in aarch64-simd.md.
585 UNSPEC_SM3TT1B ; Used in aarch64-simd.md.
586 UNSPEC_SM3TT2A ; Used in aarch64-simd.md.
587 UNSPEC_SM3TT2B ; Used in aarch64-simd.md.
588 UNSPEC_SM3PARTW1 ; Used in aarch64-simd.md.
589 UNSPEC_SM3PARTW2 ; Used in aarch64-simd.md.
590 UNSPEC_SM4E ; Used in aarch64-simd.md.
591 UNSPEC_SM4EKEY ; Used in aarch64-simd.md.
592 UNSPEC_SHA512H ; Used in aarch64-simd.md.
593 UNSPEC_SHA512H2 ; Used in aarch64-simd.md.
594 UNSPEC_SHA512SU0 ; Used in aarch64-simd.md.
595 UNSPEC_SHA512SU1 ; Used in aarch64-simd.md.
596 UNSPEC_FMLAL ; Used in aarch64-simd.md.
597 UNSPEC_FMLSL ; Used in aarch64-simd.md.
598 UNSPEC_FMLAL2 ; Used in aarch64-simd.md.
599 UNSPEC_FMLSL2 ; Used in aarch64-simd.md.
624d0f07 600 UNSPEC_ADR ; Used in aarch64-sve.md.
43cacb12 601 UNSPEC_SEL ; Used in aarch64-sve.md.
624d0f07
RS
602 UNSPEC_BRKA ; Used in aarch64-sve.md.
603 UNSPEC_BRKB ; Used in aarch64-sve.md.
604 UNSPEC_BRKN ; Used in aarch64-sve.md.
605 UNSPEC_BRKPA ; Used in aarch64-sve.md.
606 UNSPEC_BRKPB ; Used in aarch64-sve.md.
607 UNSPEC_PFIRST ; Used in aarch64-sve.md.
608 UNSPEC_PNEXT ; Used in aarch64-sve.md.
609 UNSPEC_CNTP ; Used in aarch64-sve.md.
610 UNSPEC_SADDV ; Used in aarch64-sve.md.
611 UNSPEC_UADDV ; Used in aarch64-sve.md.
898f07b0
RS
612 UNSPEC_ANDV ; Used in aarch64-sve.md.
613 UNSPEC_IORV ; Used in aarch64-sve.md.
614 UNSPEC_XORV ; Used in aarch64-sve.md.
43cacb12
RS
615 UNSPEC_ANDF ; Used in aarch64-sve.md.
616 UNSPEC_IORF ; Used in aarch64-sve.md.
617 UNSPEC_XORF ; Used in aarch64-sve.md.
d7a09c44
RS
618 UNSPEC_REVB ; Used in aarch64-sve.md.
619 UNSPEC_REVH ; Used in aarch64-sve.md.
620 UNSPEC_REVW ; Used in aarch64-sve.md.
11e9443f
RS
621 UNSPEC_SMUL_HIGHPART ; Used in aarch64-sve.md.
622 UNSPEC_UMUL_HIGHPART ; Used in aarch64-sve.md.
624d0f07
RS
623 UNSPEC_FMLA ; Used in aarch64-sve.md.
624 UNSPEC_FMLS ; Used in aarch64-sve.md.
625 UNSPEC_FEXPA ; Used in aarch64-sve.md.
36696774 626 UNSPEC_FMMLA ; Used in aarch64-sve.md.
624d0f07
RS
627 UNSPEC_FTMAD ; Used in aarch64-sve.md.
628 UNSPEC_FTSMUL ; Used in aarch64-sve.md.
629 UNSPEC_FTSSEL ; Used in aarch64-sve.md.
36696774
RS
630 UNSPEC_SMATMUL ; Used in aarch64-sve.md.
631 UNSPEC_UMATMUL ; Used in aarch64-sve.md.
632 UNSPEC_USMATMUL ; Used in aarch64-sve.md.
633 UNSPEC_TRN1Q ; Used in aarch64-sve.md.
634 UNSPEC_TRN2Q ; Used in aarch64-sve.md.
635 UNSPEC_UZP1Q ; Used in aarch64-sve.md.
636 UNSPEC_UZP2Q ; Used in aarch64-sve.md.
637 UNSPEC_ZIP1Q ; Used in aarch64-sve.md.
638 UNSPEC_ZIP2Q ; Used in aarch64-sve.md.
624d0f07
RS
639 UNSPEC_COND_CMPEQ_WIDE ; Used in aarch64-sve.md.
640 UNSPEC_COND_CMPGE_WIDE ; Used in aarch64-sve.md.
641 UNSPEC_COND_CMPGT_WIDE ; Used in aarch64-sve.md.
642 UNSPEC_COND_CMPHI_WIDE ; Used in aarch64-sve.md.
643 UNSPEC_COND_CMPHS_WIDE ; Used in aarch64-sve.md.
644 UNSPEC_COND_CMPLE_WIDE ; Used in aarch64-sve.md.
645 UNSPEC_COND_CMPLO_WIDE ; Used in aarch64-sve.md.
646 UNSPEC_COND_CMPLS_WIDE ; Used in aarch64-sve.md.
647 UNSPEC_COND_CMPLT_WIDE ; Used in aarch64-sve.md.
648 UNSPEC_COND_CMPNE_WIDE ; Used in aarch64-sve.md.
d45b20a5 649 UNSPEC_COND_FABS ; Used in aarch64-sve.md.
cb18e86d 650 UNSPEC_COND_FADD ; Used in aarch64-sve.md.
624d0f07
RS
651 UNSPEC_COND_FCADD90 ; Used in aarch64-sve.md.
652 UNSPEC_COND_FCADD270 ; Used in aarch64-sve.md.
cb18e86d
RS
653 UNSPEC_COND_FCMEQ ; Used in aarch64-sve.md.
654 UNSPEC_COND_FCMGE ; Used in aarch64-sve.md.
655 UNSPEC_COND_FCMGT ; Used in aarch64-sve.md.
624d0f07
RS
656 UNSPEC_COND_FCMLA ; Used in aarch64-sve.md.
657 UNSPEC_COND_FCMLA90 ; Used in aarch64-sve.md.
658 UNSPEC_COND_FCMLA180 ; Used in aarch64-sve.md.
659 UNSPEC_COND_FCMLA270 ; Used in aarch64-sve.md.
cb18e86d
RS
660 UNSPEC_COND_FCMLE ; Used in aarch64-sve.md.
661 UNSPEC_COND_FCMLT ; Used in aarch64-sve.md.
662 UNSPEC_COND_FCMNE ; Used in aarch64-sve.md.
4a942af6 663 UNSPEC_COND_FCMUO ; Used in aarch64-sve.md.
99361551
RS
664 UNSPEC_COND_FCVT ; Used in aarch64-sve.md.
665 UNSPEC_COND_FCVTZS ; Used in aarch64-sve.md.
666 UNSPEC_COND_FCVTZU ; Used in aarch64-sve.md.
cb18e86d 667 UNSPEC_COND_FDIV ; Used in aarch64-sve.md.
624d0f07 668 UNSPEC_COND_FMAX ; Used in aarch64-sve.md.
cb18e86d 669 UNSPEC_COND_FMAXNM ; Used in aarch64-sve.md.
624d0f07 670 UNSPEC_COND_FMIN ; Used in aarch64-sve.md.
cb18e86d 671 UNSPEC_COND_FMINNM ; Used in aarch64-sve.md.
b41d1f6e
RS
672 UNSPEC_COND_FMLA ; Used in aarch64-sve.md.
673 UNSPEC_COND_FMLS ; Used in aarch64-sve.md.
cb18e86d 674 UNSPEC_COND_FMUL ; Used in aarch64-sve.md.
624d0f07 675 UNSPEC_COND_FMULX ; Used in aarch64-sve.md.
d45b20a5 676 UNSPEC_COND_FNEG ; Used in aarch64-sve.md.
b41d1f6e
RS
677 UNSPEC_COND_FNMLA ; Used in aarch64-sve.md.
678 UNSPEC_COND_FNMLS ; Used in aarch64-sve.md.
624d0f07 679 UNSPEC_COND_FRECPX ; Used in aarch64-sve.md.
d45b20a5
RS
680 UNSPEC_COND_FRINTA ; Used in aarch64-sve.md.
681 UNSPEC_COND_FRINTI ; Used in aarch64-sve.md.
682 UNSPEC_COND_FRINTM ; Used in aarch64-sve.md.
683 UNSPEC_COND_FRINTN ; Used in aarch64-sve.md.
684 UNSPEC_COND_FRINTP ; Used in aarch64-sve.md.
685 UNSPEC_COND_FRINTX ; Used in aarch64-sve.md.
686 UNSPEC_COND_FRINTZ ; Used in aarch64-sve.md.
624d0f07 687 UNSPEC_COND_FSCALE ; Used in aarch64-sve.md.
d45b20a5 688 UNSPEC_COND_FSQRT ; Used in aarch64-sve.md.
cb18e86d 689 UNSPEC_COND_FSUB ; Used in aarch64-sve.md.
99361551
RS
690 UNSPEC_COND_SCVTF ; Used in aarch64-sve.md.
691 UNSPEC_COND_UCVTF ; Used in aarch64-sve.md.
624d0f07 692 UNSPEC_LASTA ; Used in aarch64-sve.md.
43cacb12 693 UNSPEC_LASTB ; Used in aarch64-sve.md.
624d0f07
RS
694 UNSPEC_ASHIFT_WIDE ; Used in aarch64-sve.md.
695 UNSPEC_ASHIFTRT_WIDE ; Used in aarch64-sve.md.
696 UNSPEC_LSHIFTRT_WIDE ; Used in aarch64-sve.md.
697 UNSPEC_LDFF1 ; Used in aarch64-sve.md.
698 UNSPEC_LDNF1 ; Used in aarch64-sve.md.
9d63f43b
TC
699 UNSPEC_FCADD90 ; Used in aarch64-simd.md.
700 UNSPEC_FCADD270 ; Used in aarch64-simd.md.
701 UNSPEC_FCMLA ; Used in aarch64-simd.md.
702 UNSPEC_FCMLA90 ; Used in aarch64-simd.md.
703 UNSPEC_FCMLA180 ; Used in aarch64-simd.md.
704 UNSPEC_FCMLA270 ; Used in aarch64-simd.md.
0a09a948
RS
705 UNSPEC_ASRD ; Used in aarch64-sve.md.
706 UNSPEC_ADCLB ; Used in aarch64-sve2.md.
707 UNSPEC_ADCLT ; Used in aarch64-sve2.md.
708 UNSPEC_ADDHNB ; Used in aarch64-sve2.md.
709 UNSPEC_ADDHNT ; Used in aarch64-sve2.md.
710 UNSPEC_BDEP ; Used in aarch64-sve2.md.
711 UNSPEC_BEXT ; Used in aarch64-sve2.md.
712 UNSPEC_BGRP ; Used in aarch64-sve2.md.
713 UNSPEC_CADD270 ; Used in aarch64-sve2.md.
714 UNSPEC_CADD90 ; Used in aarch64-sve2.md.
715 UNSPEC_CDOT ; Used in aarch64-sve2.md.
716 UNSPEC_CDOT180 ; Used in aarch64-sve2.md.
717 UNSPEC_CDOT270 ; Used in aarch64-sve2.md.
718 UNSPEC_CDOT90 ; Used in aarch64-sve2.md.
719 UNSPEC_CMLA ; Used in aarch64-sve2.md.
720 UNSPEC_CMLA180 ; Used in aarch64-sve2.md.
721 UNSPEC_CMLA270 ; Used in aarch64-sve2.md.
722 UNSPEC_CMLA90 ; Used in aarch64-sve2.md.
723 UNSPEC_COND_FCVTLT ; Used in aarch64-sve2.md.
724 UNSPEC_COND_FCVTNT ; Used in aarch64-sve2.md.
725 UNSPEC_COND_FCVTX ; Used in aarch64-sve2.md.
726 UNSPEC_COND_FCVTXNT ; Used in aarch64-sve2.md.
727 UNSPEC_COND_FLOGB ; Used in aarch64-sve2.md.
728 UNSPEC_EORBT ; Used in aarch64-sve2.md.
729 UNSPEC_EORTB ; Used in aarch64-sve2.md.
730 UNSPEC_FADDP ; Used in aarch64-sve2.md.
731 UNSPEC_FMAXNMP ; Used in aarch64-sve2.md.
732 UNSPEC_FMAXP ; Used in aarch64-sve2.md.
733 UNSPEC_FMINNMP ; Used in aarch64-sve2.md.
734 UNSPEC_FMINP ; Used in aarch64-sve2.md.
735 UNSPEC_FMLALB ; Used in aarch64-sve2.md.
736 UNSPEC_FMLALT ; Used in aarch64-sve2.md.
737 UNSPEC_FMLSLB ; Used in aarch64-sve2.md.
738 UNSPEC_FMLSLT ; Used in aarch64-sve2.md.
739 UNSPEC_HISTCNT ; Used in aarch64-sve2.md.
740 UNSPEC_HISTSEG ; Used in aarch64-sve2.md.
741 UNSPEC_MATCH ; Used in aarch64-sve2.md.
742 UNSPEC_NMATCH ; Used in aarch64-sve2.md.
743 UNSPEC_PMULLB ; Used in aarch64-sve2.md.
744 UNSPEC_PMULLB_PAIR ; Used in aarch64-sve2.md.
745 UNSPEC_PMULLT ; Used in aarch64-sve2.md.
746 UNSPEC_PMULLT_PAIR ; Used in aarch64-sve2.md.
747 UNSPEC_RADDHNB ; Used in aarch64-sve2.md.
748 UNSPEC_RADDHNT ; Used in aarch64-sve2.md.
749 UNSPEC_RSHRNB ; Used in aarch64-sve2.md.
750 UNSPEC_RSHRNT ; Used in aarch64-sve2.md.
751 UNSPEC_RSUBHNB ; Used in aarch64-sve2.md.
752 UNSPEC_RSUBHNT ; Used in aarch64-sve2.md.
753 UNSPEC_SABDLB ; Used in aarch64-sve2.md.
754 UNSPEC_SABDLT ; Used in aarch64-sve2.md.
755 UNSPEC_SADDLB ; Used in aarch64-sve2.md.
756 UNSPEC_SADDLBT ; Used in aarch64-sve2.md.
757 UNSPEC_SADDLT ; Used in aarch64-sve2.md.
758 UNSPEC_SADDWB ; Used in aarch64-sve2.md.
759 UNSPEC_SADDWT ; Used in aarch64-sve2.md.
760 UNSPEC_SBCLB ; Used in aarch64-sve2.md.
761 UNSPEC_SBCLT ; Used in aarch64-sve2.md.
762 UNSPEC_SHRNB ; Used in aarch64-sve2.md.
763 UNSPEC_SHRNT ; Used in aarch64-sve2.md.
764 UNSPEC_SLI ; Used in aarch64-sve2.md.
765 UNSPEC_SMAXP ; Used in aarch64-sve2.md.
766 UNSPEC_SMINP ; Used in aarch64-sve2.md.
58cc9876 767 UNSPEC_SMULHRS ; Used in aarch64-sve2.md.
0a09a948
RS
768 UNSPEC_SMULHS ; Used in aarch64-sve2.md.
769 UNSPEC_SMULLB ; Used in aarch64-sve2.md.
770 UNSPEC_SMULLT ; Used in aarch64-sve2.md.
771 UNSPEC_SQCADD270 ; Used in aarch64-sve2.md.
772 UNSPEC_SQCADD90 ; Used in aarch64-sve2.md.
773 UNSPEC_SQDMULLB ; Used in aarch64-sve2.md.
774 UNSPEC_SQDMULLBT ; Used in aarch64-sve2.md.
775 UNSPEC_SQDMULLT ; Used in aarch64-sve2.md.
776 UNSPEC_SQRDCMLAH ; Used in aarch64-sve2.md.
777 UNSPEC_SQRDCMLAH180 ; Used in aarch64-sve2.md.
778 UNSPEC_SQRDCMLAH270 ; Used in aarch64-sve2.md.
779 UNSPEC_SQRDCMLAH90 ; Used in aarch64-sve2.md.
780 UNSPEC_SQRSHRNB ; Used in aarch64-sve2.md.
781 UNSPEC_SQRSHRNT ; Used in aarch64-sve2.md.
782 UNSPEC_SQRSHRUNB ; Used in aarch64-sve2.md.
783 UNSPEC_SQRSHRUNT ; Used in aarch64-sve2.md.
784 UNSPEC_SQSHRNB ; Used in aarch64-sve2.md.
785 UNSPEC_SQSHRNT ; Used in aarch64-sve2.md.
786 UNSPEC_SQSHRUNB ; Used in aarch64-sve2.md.
787 UNSPEC_SQSHRUNT ; Used in aarch64-sve2.md.
788 UNSPEC_SQXTNB ; Used in aarch64-sve2.md.
789 UNSPEC_SQXTNT ; Used in aarch64-sve2.md.
790 UNSPEC_SQXTUNB ; Used in aarch64-sve2.md.
791 UNSPEC_SQXTUNT ; Used in aarch64-sve2.md.
792 UNSPEC_SRI ; Used in aarch64-sve2.md.
793 UNSPEC_SSHLLB ; Used in aarch64-sve2.md.
794 UNSPEC_SSHLLT ; Used in aarch64-sve2.md.
795 UNSPEC_SSUBLB ; Used in aarch64-sve2.md.
796 UNSPEC_SSUBLBT ; Used in aarch64-sve2.md.
797 UNSPEC_SSUBLT ; Used in aarch64-sve2.md.
798 UNSPEC_SSUBLTB ; Used in aarch64-sve2.md.
799 UNSPEC_SSUBWB ; Used in aarch64-sve2.md.
800 UNSPEC_SSUBWT ; Used in aarch64-sve2.md.
801 UNSPEC_SUBHNB ; Used in aarch64-sve2.md.
802 UNSPEC_SUBHNT ; Used in aarch64-sve2.md.
803 UNSPEC_TBL2 ; Used in aarch64-sve2.md.
804 UNSPEC_UABDLB ; Used in aarch64-sve2.md.
805 UNSPEC_UABDLT ; Used in aarch64-sve2.md.
806 UNSPEC_UADDLB ; Used in aarch64-sve2.md.
807 UNSPEC_UADDLT ; Used in aarch64-sve2.md.
808 UNSPEC_UADDWB ; Used in aarch64-sve2.md.
809 UNSPEC_UADDWT ; Used in aarch64-sve2.md.
810 UNSPEC_UMAXP ; Used in aarch64-sve2.md.
811 UNSPEC_UMINP ; Used in aarch64-sve2.md.
58cc9876 812 UNSPEC_UMULHRS ; Used in aarch64-sve2.md.
0a09a948
RS
813 UNSPEC_UMULHS ; Used in aarch64-sve2.md.
814 UNSPEC_UMULLB ; Used in aarch64-sve2.md.
815 UNSPEC_UMULLT ; Used in aarch64-sve2.md.
816 UNSPEC_UQRSHRNB ; Used in aarch64-sve2.md.
817 UNSPEC_UQRSHRNT ; Used in aarch64-sve2.md.
818 UNSPEC_UQSHRNB ; Used in aarch64-sve2.md.
819 UNSPEC_UQSHRNT ; Used in aarch64-sve2.md.
820 UNSPEC_UQXTNB ; Used in aarch64-sve2.md.
821 UNSPEC_UQXTNT ; Used in aarch64-sve2.md.
822 UNSPEC_USHLLB ; Used in aarch64-sve2.md.
823 UNSPEC_USHLLT ; Used in aarch64-sve2.md.
824 UNSPEC_USUBLB ; Used in aarch64-sve2.md.
825 UNSPEC_USUBLT ; Used in aarch64-sve2.md.
826 UNSPEC_USUBWB ; Used in aarch64-sve2.md.
827 UNSPEC_USUBWT ; Used in aarch64-sve2.md.
8c197c85
SMW
828 UNSPEC_USDOT ; Used in aarch64-simd.md.
829 UNSPEC_SUDOT ; Used in aarch64-simd.md.
f275d73a 830 UNSPEC_BFDOT ; Used in aarch64-simd.md.
896dff99
RS
831 UNSPEC_BFMLALB ; Used in aarch64-sve.md.
832 UNSPEC_BFMLALT ; Used in aarch64-sve.md.
833 UNSPEC_BFMMLA ; Used in aarch64-sve.md.
1f520d34
DB
834 UNSPEC_BFCVTN ; Used in aarch64-simd.md.
835 UNSPEC_BFCVTN2 ; Used in aarch64-simd.md.
836 UNSPEC_BFCVT ; Used in aarch64-simd.md.
43e9d192
IB
837])
838
d81cb613
MW
839;; ------------------------------------------------------------------
840;; Unspec enumerations for Atomics. They are here so that they can be
841;; used in the int_iterators for atomic operations.
842;; ------------------------------------------------------------------
843
844(define_c_enum "unspecv"
845 [
846 UNSPECV_LX ; Represent a load-exclusive.
847 UNSPECV_SX ; Represent a store-exclusive.
848 UNSPECV_LDA ; Represent an atomic load or load-acquire.
849 UNSPECV_STL ; Represent an atomic store or store-release.
850 UNSPECV_ATOMIC_CMPSW ; Represent an atomic compare swap.
851 UNSPECV_ATOMIC_EXCHG ; Represent an atomic exchange.
852 UNSPECV_ATOMIC_CAS ; Represent an atomic CAS.
853 UNSPECV_ATOMIC_SWP ; Represent an atomic SWP.
854 UNSPECV_ATOMIC_OP ; Represent an atomic operation.
d81cb613
MW
855 UNSPECV_ATOMIC_LDOP_OR ; Represent an atomic load-or
856 UNSPECV_ATOMIC_LDOP_BIC ; Represent an atomic load-bic
857 UNSPECV_ATOMIC_LDOP_XOR ; Represent an atomic load-xor
858 UNSPECV_ATOMIC_LDOP_PLUS ; Represent an atomic load-add
859])
860
43e9d192
IB
861;; -------------------------------------------------------------------
862;; Mode attributes
863;; -------------------------------------------------------------------
864
865257c4
RS
865;; "e" for signaling operations, "" for quiet operations.
866(define_mode_attr e [(CCFP "") (CCFPE "e")])
867
43e9d192
IB
868;; In GPI templates, a string like "%<w>0" will expand to "%w0" in the
869;; 32-bit version and "%x0" in the 64-bit version.
870(define_mode_attr w [(QI "w") (HI "w") (SI "w") (DI "x") (SF "s") (DF "d")])
871
db46a2e6
JG
872;; The size of access, in bytes.
873(define_mode_attr ldst_sz [(SI "4") (DI "8")])
874;; Likewise for load/store pair.
875(define_mode_attr ldpstp_sz [(SI "8") (DI "16")])
876
0d35c5c2 877;; For inequal width int to float conversion
d7f33f07
JW
878(define_mode_attr w1 [(HF "w") (SF "w") (DF "x")])
879(define_mode_attr w2 [(HF "x") (SF "x") (DF "w")])
0d35c5c2 880
22be0d08
MC
881;; For width of fp registers in fcvt instruction
882(define_mode_attr fpw [(DI "s") (SI "d")])
883
2b8568fe
KT
884(define_mode_attr short_mask [(HI "65535") (QI "255")])
885
051d0e2f
SN
886;; For constraints used in scalar immediate vector moves
887(define_mode_attr hq [(HI "h") (QI "q")])
888
ef22810a
RH
889;; For doubling width of an integer mode
890(define_mode_attr DWI [(QI "HI") (HI "SI") (SI "DI") (DI "TI")])
891
22be0d08
MC
892(define_mode_attr fcvt_change_mode [(SI "df") (DI "sf")])
893
894(define_mode_attr FCVT_CHANGE_MODE [(SI "DF") (DI "SF")])
895
43e9d192
IB
896;; For scalar usage of vector/FP registers
897(define_mode_attr v [(QI "b") (HI "h") (SI "s") (DI "d")
d7f33f07 898 (HF "h") (SF "s") (DF "d")
43e9d192
IB
899 (V8QI "") (V16QI "")
900 (V4HI "") (V8HI "")
901 (V2SI "") (V4SI "")
902 (V2DI "") (V2SF "")
daef0a8c
JW
903 (V4SF "") (V4HF "")
904 (V8HF "") (V2DF "")])
43e9d192
IB
905
906;; For scalar usage of vector/FP registers, narrowing
907(define_mode_attr vn2 [(QI "") (HI "b") (SI "h") (DI "s")
908 (V8QI "") (V16QI "")
909 (V4HI "") (V8HI "")
910 (V2SI "") (V4SI "")
911 (V2DI "") (V2SF "")
912 (V4SF "") (V2DF "")])
913
914;; For scalar usage of vector/FP registers, widening
915(define_mode_attr vw2 [(DI "") (QI "h") (HI "s") (SI "d")
916 (V8QI "") (V16QI "")
917 (V4HI "") (V8HI "")
918 (V2SI "") (V4SI "")
919 (V2DI "") (V2SF "")
920 (V4SF "") (V2DF "")])
921
89fdc743
IB
922;; Register Type Name and Vector Arrangement Specifier for when
923;; we are doing scalar for DI and SIMD for SI (ignoring all but
924;; lane 0).
925(define_mode_attr rtn [(DI "d") (SI "")])
926(define_mode_attr vas [(DI "") (SI ".2s")])
927
7ac29c0f
RS
928;; Map a vector to the number of units in it, if the size of the mode
929;; is constant.
930(define_mode_attr nunits [(V8QI "8") (V16QI "16")
931 (V4HI "4") (V8HI "8")
932 (V2SI "2") (V4SI "4")
933 (V2DI "2")
934 (V4HF "4") (V8HF "8")
abbe1ed2 935 (V4BF "4") (V8BF "8")
7ac29c0f
RS
936 (V2SF "2") (V4SF "4")
937 (V1DF "1") (V2DF "2")
938 (DI "1") (DF "1")])
939
b187677b
RS
940;; Map a mode to the number of bits in it, if the size of the mode
941;; is constant.
942(define_mode_attr bitsize [(V8QI "64") (V16QI "128")
943 (V4HI "64") (V8HI "128")
944 (V2SI "64") (V4SI "128")
945 (V2DI "128")])
946
22be0d08
MC
947;; Map a floating point or integer mode to the appropriate register name prefix
948(define_mode_attr s [(HF "h") (SF "s") (DF "d") (SI "s") (DI "d")])
43e9d192
IB
949
950;; Give the length suffix letter for a sign- or zero-extension.
951(define_mode_attr size [(QI "b") (HI "h") (SI "w")])
952
953;; Give the number of bits in the mode
954(define_mode_attr sizen [(QI "8") (HI "16") (SI "32") (DI "64")])
955
956;; Give the ordinal of the MSB in the mode
315fdae8
RE
957(define_mode_attr sizem1 [(QI "#7") (HI "#15") (SI "#31") (DI "#63")
958 (HF "#15") (SF "#31") (DF "#63")])
43e9d192 959
95eb5537
RS
960;; The number of bits in a vector element, or controlled by a predicate
961;; element.
d7a09c44
RS
962(define_mode_attr elem_bits [(VNx16BI "8") (VNx8BI "16")
963 (VNx4BI "32") (VNx2BI "64")
964 (VNx16QI "8") (VNx8HI "16")
965 (VNx4SI "32") (VNx2DI "64")
95eb5537
RS
966 (VNx8HF "16") (VNx4SF "32") (VNx2DF "64")])
967
43e9d192
IB
968;; Attribute to describe constants acceptable in logical operations
969(define_mode_attr lconst [(SI "K") (DI "L")])
970
43fd192f
MC
971;; Attribute to describe constants acceptable in logical and operations
972(define_mode_attr lconst2 [(SI "UsO") (DI "UsP")])
973
43e9d192
IB
974;; Map a mode to a specific constraint character.
975(define_mode_attr cmode [(QI "q") (HI "h") (SI "s") (DI "d")])
976
0603375c
KT
977;; Map modes to Usg and Usj constraints for SISD right shifts
978(define_mode_attr cmode_simd [(SI "g") (DI "j")])
979
43e9d192
IB
980(define_mode_attr Vtype [(V8QI "8b") (V16QI "16b")
981 (V4HI "4h") (V8HI "8h")
8ea6c1b8 982 (V4BF "4h") (V8BF "8h")
43e9d192
IB
983 (V2SI "2s") (V4SI "4s")
984 (DI "1d") (DF "1d")
985 (V2DI "2d") (V2SF "2s")
7c369485
AL
986 (V4SF "4s") (V2DF "2d")
987 (V4HF "4h") (V8HF "8h")])
43e9d192 988
0b839322
WD
989;; Map mode to type used in widening multiplies.
990(define_mode_attr Vcondtype [(V4HI "4h") (V8HI "4h") (V2SI "2s") (V4SI "2s")])
991
992;; Map lane mode to name
993(define_mode_attr Qlane [(V4HI "_v4hi") (V8HI "q_v4hi")
994 (V2SI "_v2si") (V4SI "q_v2si")])
995
c7f28cd5
KT
996(define_mode_attr Vrevsuff [(V4HI "16") (V8HI "16") (V2SI "32")
997 (V4SI "32") (V2DI "64")])
998
43e9d192
IB
999(define_mode_attr Vmtype [(V8QI ".8b") (V16QI ".16b")
1000 (V4HI ".4h") (V8HI ".8h")
1001 (V2SI ".2s") (V4SI ".4s")
71a11456 1002 (V2DI ".2d") (V4HF ".4h")
cf9c3bff
RS
1003 (V8HF ".8h") (V4BF ".4h")
1004 (V8BF ".8h") (V2SF ".2s")
43e9d192
IB
1005 (V4SF ".4s") (V2DF ".2d")
1006 (DI "") (SI "")
1007 (HI "") (QI "")
d7f33f07
JW
1008 (TI "") (HF "")
1009 (SF "") (DF "")])
43e9d192
IB
1010
1011;; Register suffix narrowed modes for VQN.
1012(define_mode_attr Vmntype [(V8HI ".8b") (V4SI ".4h")
1013 (V2DI ".2s")
1014 (DI "") (SI "")
1015 (HI "")])
1016
1017;; Mode-to-individual element type mapping.
cc68f7c2
RS
1018(define_mode_attr Vetype [(V8QI "b") (V16QI "b")
1019 (V4HI "h") (V8HI "h")
1020 (V2SI "s") (V4SI "s")
1021 (V2DI "d")
1022 (V4HF "h") (V8HF "h")
1023 (V2SF "s") (V4SF "s")
1024 (V2DF "d")
1025 (VNx16BI "b") (VNx8BI "h") (VNx4BI "s") (VNx2BI "d")
1026 (VNx16QI "b") (VNx8QI "b") (VNx4QI "b") (VNx2QI "b")
1027 (VNx8HI "h") (VNx4HI "h") (VNx2HI "h")
1028 (VNx8HF "h") (VNx4HF "h") (VNx2HF "h")
02fcd8ac 1029 (VNx8BF "h")
cc68f7c2
RS
1030 (VNx4SI "s") (VNx2SI "s")
1031 (VNx4SF "s") (VNx2SF "s")
1032 (VNx2DI "d")
1033 (VNx2DF "d")
8ea6c1b8 1034 (BF "h") (V4BF "h") (V8BF "h")
cc68f7c2
RS
1035 (HF "h")
1036 (SF "s") (DF "d")
1037 (QI "b") (HI "h")
1038 (SI "s") (DI "d")])
43e9d192 1039
9feeafd7
AM
1040;; Like Vetype, but map to types that are a quarter of the element size.
1041(define_mode_attr Vetype_fourth [(VNx4SI "b") (VNx2DI "h")])
1042
43cacb12 1043;; Equivalent of "size" for a vector element.
cc68f7c2
RS
1044(define_mode_attr Vesize [(VNx16QI "b") (VNx8QI "b") (VNx4QI "b") (VNx2QI "b")
1045 (VNx8HI "h") (VNx4HI "h") (VNx2HI "h")
1046 (VNx8HF "h") (VNx4HF "h") (VNx2HF "h")
02fcd8ac 1047 (VNx8BF "h")
cc68f7c2
RS
1048 (VNx4SI "w") (VNx2SI "w")
1049 (VNx4SF "w") (VNx2SF "w")
1050 (VNx2DI "d")
1051 (VNx2DF "d")
9f4cbab8
RS
1052 (VNx32QI "b") (VNx48QI "b") (VNx64QI "b")
1053 (VNx16HI "h") (VNx24HI "h") (VNx32HI "h")
1054 (VNx16HF "h") (VNx24HF "h") (VNx32HF "h")
02fcd8ac 1055 (VNx16BF "h") (VNx24BF "h") (VNx32BF "h")
9f4cbab8
RS
1056 (VNx8SI "w") (VNx12SI "w") (VNx16SI "w")
1057 (VNx8SF "w") (VNx12SF "w") (VNx16SF "w")
1058 (VNx4DI "d") (VNx6DI "d") (VNx8DI "d")
1059 (VNx4DF "d") (VNx6DF "d") (VNx8DF "d")])
43cacb12 1060
cc68f7c2
RS
1061;; The Z register suffix for an SVE mode's element container, i.e. the
1062;; Vetype of full SVE modes that have the same number of elements.
1063(define_mode_attr Vctype [(VNx16QI "b") (VNx8QI "h") (VNx4QI "s") (VNx2QI "d")
1064 (VNx8HI "h") (VNx4HI "s") (VNx2HI "d")
1065 (VNx8HF "h") (VNx4HF "s") (VNx2HF "d")
02fcd8ac 1066 (VNx8BF "h")
cc68f7c2
RS
1067 (VNx4SI "s") (VNx2SI "d")
1068 (VNx4SF "s") (VNx2SF "d")
1069 (VNx2DI "d")
1070 (VNx2DF "d")])
1071
daef0a8c
JW
1072;; Vetype is used everywhere in scheduling type and assembly output,
1073;; sometimes they are not the same, for example HF modes on some
1074;; instructions. stype is defined to represent scheduling type
1075;; more accurately.
1076(define_mode_attr stype [(V8QI "b") (V16QI "b") (V4HI "s") (V8HI "s")
1077 (V2SI "s") (V4SI "s") (V2DI "d") (V4HF "s")
1078 (V8HF "s") (V2SF "s") (V4SF "s") (V2DF "d")
1079 (HF "s") (SF "s") (DF "d") (QI "b") (HI "s")
1080 (SI "s") (DI "d")])
1081
43e9d192
IB
1082;; Mode-to-bitwise operation type mapping.
1083(define_mode_attr Vbtype [(V8QI "8b") (V16QI "16b")
1084 (V4HI "8b") (V8HI "16b")
1085 (V2SI "8b") (V4SI "16b")
7c369485
AL
1086 (V2DI "16b") (V4HF "8b")
1087 (V8HF "16b") (V2SF "8b")
46e778c4 1088 (V4SF "16b") (V2DF "16b")
fe82d1f2 1089 (DI "8b") (DF "8b")
abbe1ed2
SMW
1090 (SI "8b") (SF "8b")
1091 (V4BF "8b") (V8BF "16b")])
43e9d192
IB
1092
1093;; Define element mode for each vector mode.
cc68f7c2
RS
1094(define_mode_attr VEL [(V8QI "QI") (V16QI "QI")
1095 (V4HI "HI") (V8HI "HI")
1096 (V2SI "SI") (V4SI "SI")
1097 (DI "DI") (V2DI "DI")
1098 (V4HF "HF") (V8HF "HF")
1099 (V2SF "SF") (V4SF "SF")
1100 (DF "DF") (V2DF "DF")
1101 (SI "SI") (HI "HI")
1102 (QI "QI")
8ea6c1b8 1103 (V4BF "BF") (V8BF "BF")
cc68f7c2
RS
1104 (VNx16QI "QI") (VNx8QI "QI") (VNx4QI "QI") (VNx2QI "QI")
1105 (VNx8HI "HI") (VNx4HI "HI") (VNx2HI "HI")
1106 (VNx8HF "HF") (VNx4HF "HF") (VNx2HF "HF")
02fcd8ac 1107 (VNx8BF "BF")
cc68f7c2
RS
1108 (VNx4SI "SI") (VNx2SI "SI")
1109 (VNx4SF "SF") (VNx2SF "SF")
1110 (VNx2DI "DI")
1111 (VNx2DF "DF")])
43e9d192 1112
ff03930a 1113;; Define element mode for each vector mode (lower case).
cc68f7c2
RS
1114(define_mode_attr Vel [(V8QI "qi") (V16QI "qi")
1115 (V4HI "hi") (V8HI "hi")
1116 (V2SI "si") (V4SI "si")
1117 (DI "di") (V2DI "di")
1118 (V4HF "hf") (V8HF "hf")
1119 (V2SF "sf") (V4SF "sf")
1120 (V2DF "df") (DF "df")
1121 (SI "si") (HI "hi")
1122 (QI "qi")
8ea6c1b8 1123 (V4BF "bf") (V8BF "bf")
cc68f7c2
RS
1124 (VNx16QI "qi") (VNx8QI "qi") (VNx4QI "qi") (VNx2QI "qi")
1125 (VNx8HI "hi") (VNx4HI "hi") (VNx2HI "hi")
1126 (VNx8HF "hf") (VNx4HF "hf") (VNx2HF "hf")
02fcd8ac 1127 (VNx8BF "bf")
cc68f7c2
RS
1128 (VNx4SI "si") (VNx2SI "si")
1129 (VNx4SF "sf") (VNx2SF "sf")
1130 (VNx2DI "di")
1131 (VNx2DF "df")])
ff03930a 1132
43cacb12
RS
1133;; Element mode with floating-point values replaced by like-sized integers.
1134(define_mode_attr VEL_INT [(VNx16QI "QI")
02fcd8ac 1135 (VNx8HI "HI") (VNx8HF "HI") (VNx8BF "HI")
43cacb12
RS
1136 (VNx4SI "SI") (VNx4SF "SI")
1137 (VNx2DI "DI") (VNx2DF "DI")])
1138
1139;; Gives the mode of the 128-bit lowpart of an SVE vector.
1140(define_mode_attr V128 [(VNx16QI "V16QI")
02fcd8ac 1141 (VNx8HI "V8HI") (VNx8HF "V8HF") (VNx8BF "V8BF")
43cacb12
RS
1142 (VNx4SI "V4SI") (VNx4SF "V4SF")
1143 (VNx2DI "V2DI") (VNx2DF "V2DF")])
1144
1145;; ...and again in lower case.
1146(define_mode_attr v128 [(VNx16QI "v16qi")
02fcd8ac 1147 (VNx8HI "v8hi") (VNx8HF "v8hf") (VNx8BF "v8bf")
43cacb12
RS
1148 (VNx4SI "v4si") (VNx4SF "v4sf")
1149 (VNx2DI "v2di") (VNx2DF "v2df")])
1150
278821f2
KT
1151;; 64-bit container modes the inner or scalar source mode.
1152(define_mode_attr VCOND [(HI "V4HI") (SI "V2SI")
1153 (V4HI "V4HI") (V8HI "V4HI")
b7d7d917
TB
1154 (V2SI "V2SI") (V4SI "V2SI")
1155 (DI "DI") (V2DI "DI")
1156 (V2SF "V2SF") (V4SF "V2SF")
1157 (V2DF "DF")])
1158
278821f2 1159;; 128-bit container modes the inner or scalar source mode.
b7d7d917
TB
1160(define_mode_attr VCONQ [(V8QI "V16QI") (V16QI "V16QI")
1161 (V4HI "V8HI") (V8HI "V8HI")
1162 (V2SI "V4SI") (V4SI "V4SI")
1163 (DI "V2DI") (V2DI "V2DI")
71a11456 1164 (V4HF "V8HF") (V8HF "V8HF")
b7d7d917
TB
1165 (V2SF "V2SF") (V4SF "V4SF")
1166 (V2DF "V2DF") (SI "V4SI")
1167 (HI "V8HI") (QI "V16QI")])
1168
43e9d192
IB
1169;; Half modes of all vector modes.
1170(define_mode_attr VHALF [(V8QI "V4QI") (V16QI "V8QI")
1171 (V4HI "V2HI") (V8HI "V4HI")
1172 (V2SI "SI") (V4SI "V2SI")
1173 (V2DI "DI") (V2SF "SF")
71a11456 1174 (V4SF "V2SF") (V4HF "V2HF")
abbe1ed2
SMW
1175 (V8HF "V4HF") (V2DF "DF")
1176 (V8BF "V4BF")])
43e9d192 1177
b1b49824
MC
1178;; Half modes of all vector modes, in lower-case.
1179(define_mode_attr Vhalf [(V8QI "v4qi") (V16QI "v8qi")
1180 (V4HI "v2hi") (V8HI "v4hi")
abbe1ed2 1181 (V8HF "v4hf") (V8BF "v4bf")
b1b49824
MC
1182 (V2SI "si") (V4SI "v2si")
1183 (V2DI "di") (V2SF "sf")
1184 (V4SF "v2sf") (V2DF "df")])
1185
43e9d192
IB
1186;; Double modes of vector modes.
1187(define_mode_attr VDBL [(V8QI "V16QI") (V4HI "V8HI")
e603cd43 1188 (V4HF "V8HF") (V4BF "V8BF")
43e9d192
IB
1189 (V2SI "V4SI") (V2SF "V4SF")
1190 (SI "V2SI") (DI "V2DI")
1191 (DF "V2DF")])
1192
922f9c25
AL
1193;; Register suffix for double-length mode.
1194(define_mode_attr Vdtype [(V4HF "8h") (V2SF "4s")])
1195
43e9d192
IB
1196;; Double modes of vector modes (lower case).
1197(define_mode_attr Vdbl [(V8QI "v16qi") (V4HI "v8hi")
e603cd43 1198 (V4HF "v8hf") (V4BF "v8bf")
43e9d192 1199 (V2SI "v4si") (V2SF "v4sf")
8b033a8a
SN
1200 (SI "v2si") (DI "v2di")
1201 (DF "v2df")])
43e9d192 1202
b1b49824
MC
1203;; Modes with double-width elements.
1204(define_mode_attr VDBLW [(V8QI "V4HI") (V16QI "V8HI")
1205 (V4HI "V2SI") (V8HI "V4SI")
1206 (V2SI "DI") (V4SI "V2DI")])
1207
43e9d192
IB
1208;; Narrowed modes for VDN.
1209(define_mode_attr VNARROWD [(V4HI "V8QI") (V2SI "V4HI")
1210 (DI "V2SI")])
1211
1212;; Narrowed double-modes for VQN (Used for XTN).
1213(define_mode_attr VNARROWQ [(V8HI "V8QI") (V4SI "V4HI")
1214 (V2DI "V2SI")
1215 (DI "SI") (SI "HI")
1216 (HI "QI")])
9c437a10
RS
1217(define_mode_attr Vnarrowq [(V8HI "v8qi") (V4SI "v4hi")
1218 (V2DI "v2si")])
43e9d192
IB
1219
1220;; Narrowed quad-modes for VQN (Used for XTN2).
1221(define_mode_attr VNARROWQ2 [(V8HI "V16QI") (V4SI "V8HI")
1222 (V2DI "V4SI")])
1223
0a09a948
RS
1224;; Narrowed modes of vector modes.
1225(define_mode_attr VNARROW [(VNx8HI "VNx16QI")
1226 (VNx4SI "VNx8HI") (VNx4SF "VNx8HF")
1227 (VNx2DI "VNx4SI") (VNx2DF "VNx4SF")])
1228
43e9d192
IB
1229;; Register suffix narrowed modes for VQN.
1230(define_mode_attr Vntype [(V8HI "8b") (V4SI "4h")
1231 (V2DI "2s")])
1232
1233;; Register suffix narrowed modes for VQN.
1234(define_mode_attr V2ntype [(V8HI "16b") (V4SI "8h")
1235 (V2DI "4s")])
1236
1237;; Widened modes of vector modes.
43cacb12
RS
1238(define_mode_attr VWIDE [(V8QI "V8HI") (V4HI "V4SI")
1239 (V2SI "V2DI") (V16QI "V8HI")
1240 (V8HI "V4SI") (V4SI "V2DI")
1241 (HI "SI") (SI "DI")
1242 (V8HF "V4SF") (V4SF "V2DF")
1243 (V4HF "V4SF") (V2SF "V2DF")
1244 (VNx8HF "VNx4SF") (VNx4SF "VNx2DF")
1245 (VNx16QI "VNx8HI") (VNx8HI "VNx4SI")
1246 (VNx4SI "VNx2DI")
1247 (VNx16BI "VNx8BI") (VNx8BI "VNx4BI")
1248 (VNx4BI "VNx2BI")])
1249
1250;; Predicate mode associated with VWIDE.
1251(define_mode_attr VWIDE_PRED [(VNx8HF "VNx4BI") (VNx4SF "VNx2BI")])
43e9d192 1252
03873eb9 1253;; Widened modes of vector modes, lowercase
43cacb12
RS
1254(define_mode_attr Vwide [(V2SF "v2df") (V4HF "v4sf")
1255 (VNx16QI "vnx8hi") (VNx8HI "vnx4si")
1256 (VNx4SI "vnx2di")
1257 (VNx8HF "vnx4sf") (VNx4SF "vnx2df")
1258 (VNx16BI "vnx8bi") (VNx8BI "vnx4bi")
1259 (VNx4BI "vnx2bi")])
03873eb9
AL
1260
1261;; Widened mode register suffixes for VD_BHSI/VQW/VQ_HSF.
43e9d192
IB
1262(define_mode_attr Vwtype [(V8QI "8h") (V4HI "4s")
1263 (V2SI "2d") (V16QI "8h")
03873eb9
AL
1264 (V8HI "4s") (V4SI "2d")
1265 (V8HF "4s") (V4SF "2d")])
43e9d192 1266
0a09a948
RS
1267;; SVE vector after narrowing.
1268(define_mode_attr Ventype [(VNx8HI "b")
1269 (VNx4SI "h") (VNx4SF "h")
1270 (VNx2DI "s") (VNx2DF "s")])
1271
1272;; SVE vector after widening.
43cacb12
RS
1273(define_mode_attr Vewtype [(VNx16QI "h")
1274 (VNx8HI "s") (VNx8HF "s")
0a09a948
RS
1275 (VNx4SI "d") (VNx4SF "d")
1276 (VNx2DI "q")])
43cacb12 1277
43e9d192
IB
1278;; Widened mode register suffixes for VDW/VQW.
1279(define_mode_attr Vmwtype [(V8QI ".8h") (V4HI ".4s")
1280 (V2SI ".2d") (V16QI ".8h")
1281 (V8HI ".4s") (V4SI ".2d")
922f9c25 1282 (V4HF ".4s") (V2SF ".2d")
43e9d192
IB
1283 (SI "") (HI "")])
1284
03873eb9 1285;; Lower part register suffixes for VQW/VQ_HSF.
43e9d192 1286(define_mode_attr Vhalftype [(V16QI "8b") (V8HI "4h")
03873eb9
AL
1287 (V4SI "2s") (V8HF "4h")
1288 (V4SF "2s")])
43e9d192
IB
1289
1290;; Define corresponding core/FP element mode for each vector mode.
cc68f7c2
RS
1291(define_mode_attr vw [(V8QI "w") (V16QI "w")
1292 (V4HI "w") (V8HI "w")
1293 (V2SI "w") (V4SI "w")
1294 (DI "x") (V2DI "x")
1295 (V2SF "s") (V4SF "s")
1296 (V2DF "d")])
43e9d192 1297
66adb8eb
JG
1298;; Corresponding core element mode for each vector mode. This is a
1299;; variation on <vw> mapping FP modes to GP regs.
cc68f7c2
RS
1300(define_mode_attr vwcore [(V8QI "w") (V16QI "w")
1301 (V4HI "w") (V8HI "w")
1302 (V2SI "w") (V4SI "w")
1303 (DI "x") (V2DI "x")
1304 (V4HF "w") (V8HF "w")
1305 (V2SF "w") (V4SF "w")
1306 (V2DF "x")
1307 (VNx16QI "w") (VNx8QI "w") (VNx4QI "w") (VNx2QI "w")
1308 (VNx8HI "w") (VNx4HI "w") (VNx2HI "w")
1309 (VNx8HF "w") (VNx4HF "w") (VNx2HF "w")
02fcd8ac 1310 (VNx8BF "w")
cc68f7c2
RS
1311 (VNx4SI "w") (VNx2SI "w")
1312 (VNx4SF "w") (VNx2SF "w")
1313 (VNx2DI "x")
1314 (VNx2DF "x")])
66adb8eb 1315
30f8bf3d
RS
1316;; Like vwcore, but for the container mode rather than the element mode.
1317(define_mode_attr vccore [(VNx16QI "w") (VNx8QI "w") (VNx4QI "w") (VNx2QI "x")
1318 (VNx8HI "w") (VNx4HI "w") (VNx2HI "x")
1319 (VNx4SI "w") (VNx2SI "x")
1320 (VNx2DI "x")])
1321
43e9d192
IB
1322;; Double vector types for ALLX.
1323(define_mode_attr Vallxd [(QI "8b") (HI "4h") (SI "2s")])
1324
5f565314
RS
1325;; Mode with floating-point values replaced by like-sized integers.
1326(define_mode_attr V_INT_EQUIV [(V8QI "V8QI") (V16QI "V16QI")
1327 (V4HI "V4HI") (V8HI "V8HI")
1328 (V2SI "V2SI") (V4SI "V4SI")
1329 (DI "DI") (V2DI "V2DI")
1330 (V4HF "V4HI") (V8HF "V8HI")
e603cd43 1331 (V4BF "V4HI") (V8BF "V8HI")
5f565314 1332 (V2SF "V2SI") (V4SF "V4SI")
43cacb12 1333 (DF "DI") (V2DF "V2DI")
dfe1da23
JW
1334 (SF "SI") (SI "SI")
1335 (HF "HI")
43cacb12
RS
1336 (VNx16QI "VNx16QI")
1337 (VNx8HI "VNx8HI") (VNx8HF "VNx8HI")
02fcd8ac 1338 (VNx8BF "VNx8HI")
43cacb12
RS
1339 (VNx4SI "VNx4SI") (VNx4SF "VNx4SI")
1340 (VNx2DI "VNx2DI") (VNx2DF "VNx2DI")
1341])
5f565314
RS
1342
1343;; Lower case mode with floating-point values replaced by like-sized integers.
1344(define_mode_attr v_int_equiv [(V8QI "v8qi") (V16QI "v16qi")
1345 (V4HI "v4hi") (V8HI "v8hi")
1346 (V2SI "v2si") (V4SI "v4si")
1347 (DI "di") (V2DI "v2di")
1348 (V4HF "v4hi") (V8HF "v8hi")
e603cd43 1349 (V4BF "v4hi") (V8BF "v8hi")
5f565314 1350 (V2SF "v2si") (V4SF "v4si")
43cacb12
RS
1351 (DF "di") (V2DF "v2di")
1352 (SF "si")
1353 (VNx16QI "vnx16qi")
1354 (VNx8HI "vnx8hi") (VNx8HF "vnx8hi")
02fcd8ac 1355 (VNx8BF "vnx8hi")
43cacb12
RS
1356 (VNx4SI "vnx4si") (VNx4SF "vnx4si")
1357 (VNx2DI "vnx2di") (VNx2DF "vnx2di")
1358])
1359
1360;; Floating-point equivalent of selected modes.
a70965b1 1361(define_mode_attr V_FP_EQUIV [(VNx8HI "VNx8HF") (VNx8HF "VNx8HF")
02fcd8ac 1362 (VNx8BF "VNx8HF")
a70965b1 1363 (VNx4SI "VNx4SF") (VNx4SF "VNx4SF")
43cacb12 1364 (VNx2DI "VNx2DF") (VNx2DF "VNx2DF")])
a70965b1 1365(define_mode_attr v_fp_equiv [(VNx8HI "vnx8hf") (VNx8HF "vnx8hf")
02fcd8ac 1366 (VNx8BF "vnx8hf")
a70965b1 1367 (VNx4SI "vnx4sf") (VNx4SF "vnx4sf")
43cacb12 1368 (VNx2DI "vnx2df") (VNx2DF "vnx2df")])
70c67693 1369
f8186eea
RS
1370;; Maps full and partial vector modes of any element type to a full-vector
1371;; integer mode with the same number of units.
1372(define_mode_attr V_INT_CONTAINER [(VNx16QI "VNx16QI") (VNx8QI "VNx8HI")
1373 (VNx4QI "VNx4SI") (VNx2QI "VNx2DI")
1374 (VNx8HI "VNx8HI") (VNx4HI "VNx4SI")
1375 (VNx2HI "VNx2DI")
1376 (VNx4SI "VNx4SI") (VNx2SI "VNx2DI")
1377 (VNx2DI "VNx2DI")
1378 (VNx8HF "VNx8HI") (VNx4HF "VNx4SI")
1379 (VNx2HF "VNx2DI")
3261d8ba 1380 (VNx4SF "VNx4SI") (VNx2SF "VNx2DI")
f8186eea
RS
1381 (VNx2DF "VNx2DI")])
1382
1383;; Lower-case version of V_INT_CONTAINER.
1384(define_mode_attr v_int_container [(VNx16QI "vnx16qi") (VNx8QI "vnx8hi")
1385 (VNx4QI "vnx4si") (VNx2QI "vnx2di")
1386 (VNx8HI "vnx8hi") (VNx4HI "vnx4si")
1387 (VNx2HI "vnx2di")
1388 (VNx4SI "vnx4si") (VNx2SI "vnx2di")
1389 (VNx2DI "vnx2di")
1390 (VNx8HF "vnx8hi") (VNx4HF "vnx4si")
1391 (VNx2HF "vnx2di")
1392 (VNx4SF "vnx4si") (VNx2SF "vnx2di")
1393 (VNx2DF "vnx2di")])
1394
6c553b76
BC
1395;; Mode for vector conditional operations where the comparison has
1396;; different type from the lhs.
1397(define_mode_attr V_cmp_mixed [(V2SI "V2SF") (V4SI "V4SF")
1398 (V2DI "V2DF") (V2SF "V2SI")
1399 (V4SF "V4SI") (V2DF "V2DI")])
1400
1401(define_mode_attr v_cmp_mixed [(V2SI "v2sf") (V4SI "v4sf")
1402 (V2DI "v2df") (V2SF "v2si")
1403 (V4SF "v4si") (V2DF "v2di")])
1404
cb23a30c
JG
1405;; Lower case element modes (as used in shift immediate patterns).
1406(define_mode_attr ve_mode [(V8QI "qi") (V16QI "qi")
1407 (V4HI "hi") (V8HI "hi")
1408 (V2SI "si") (V4SI "si")
1409 (DI "di") (V2DI "di")
1410 (QI "qi") (HI "hi")
1411 (SI "si")])
1412
43e9d192
IB
1413;; Vm for lane instructions is restricted to FP_LO_REGS.
1414(define_mode_attr vwx [(V4HI "x") (V8HI "x") (HI "x")
1415 (V2SI "w") (V4SI "w") (SI "w")])
1416
1417(define_mode_attr Vendreg [(OI "T") (CI "U") (XI "V")])
1418
97755701
AL
1419;; This is both the number of Q-Registers needed to hold the corresponding
1420;; opaque large integer mode, and the number of elements touched by the
1421;; ld..._lane and st..._lane operations.
43e9d192
IB
1422(define_mode_attr nregs [(OI "2") (CI "3") (XI "4")])
1423
0462169c
SN
1424;; Mode for atomic operation suffixes
1425(define_mode_attr atomic_sfx
1426 [(QI "b") (HI "h") (SI "") (DI "")])
1427
3f598afe 1428(define_mode_attr fcvt_target [(V2DF "v2di") (V4SF "v4si") (V2SF "v2si")
2644d4d9 1429 (V2DI "v2df") (V4SI "v4sf") (V2SI "v2sf")
daef0a8c
JW
1430 (SF "si") (DF "di") (SI "sf") (DI "df")
1431 (V4HF "v4hi") (V8HF "v8hi") (V4HI "v4hf")
68ad28c3 1432 (V8HI "v8hf") (HF "hi") (HI "hf")])
3f598afe 1433(define_mode_attr FCVT_TARGET [(V2DF "V2DI") (V4SF "V4SI") (V2SF "V2SI")
2644d4d9 1434 (V2DI "V2DF") (V4SI "V4SF") (V2SI "V2SF")
daef0a8c
JW
1435 (SF "SI") (DF "DI") (SI "SF") (DI "DF")
1436 (V4HF "V4HI") (V8HF "V8HI") (V4HI "V4HF")
68ad28c3 1437 (V8HI "V8HF") (HF "HI") (HI "HF")])
3f598afe 1438
0d35c5c2
VP
1439
1440;; for the inequal width integer to fp conversions
d7f33f07
JW
1441(define_mode_attr fcvt_iesize [(HF "di") (SF "di") (DF "si")])
1442(define_mode_attr FCVT_IESIZE [(HF "DI") (SF "DI") (DF "SI")])
42fc9a7f 1443
91bd4114
JG
1444(define_mode_attr VSWAP_WIDTH [(V8QI "V16QI") (V16QI "V8QI")
1445 (V4HI "V8HI") (V8HI "V4HI")
8ea6c1b8 1446 (V8BF "V4BF") (V4BF "V8BF")
91bd4114
JG
1447 (V2SI "V4SI") (V4SI "V2SI")
1448 (DI "V2DI") (V2DI "DI")
1449 (V2SF "V4SF") (V4SF "V2SF")
862abc04 1450 (V4HF "V8HF") (V8HF "V4HF")
91bd4114
JG
1451 (DF "V2DF") (V2DF "DF")])
1452
1453(define_mode_attr vswap_width_name [(V8QI "to_128") (V16QI "to_64")
1454 (V4HI "to_128") (V8HI "to_64")
1455 (V2SI "to_128") (V4SI "to_64")
1456 (DI "to_128") (V2DI "to_64")
862abc04 1457 (V4HF "to_128") (V8HF "to_64")
91bd4114 1458 (V2SF "to_128") (V4SF "to_64")
8ea6c1b8 1459 (V4BF "to_128") (V8BF "to_64")
91bd4114
JG
1460 (DF "to_128") (V2DF "to_64")])
1461
779aea46 1462;; For certain vector-by-element multiplication instructions we must
6d06971d 1463;; constrain the 16-bit cases to use only V0-V15. This is covered by
779aea46
JG
1464;; the 'x' constraint. All other modes may use the 'w' constraint.
1465(define_mode_attr h_con [(V2SI "w") (V4SI "w")
1466 (V4HI "x") (V8HI "x")
6d06971d 1467 (V4HF "x") (V8HF "x")
779aea46
JG
1468 (V2SF "w") (V4SF "w")
1469 (V2DF "w") (DF "w")])
1470
1471;; Defined to 'f' for types whose element type is a float type.
1472(define_mode_attr f [(V8QI "") (V16QI "")
1473 (V4HI "") (V8HI "")
1474 (V2SI "") (V4SI "")
1475 (DI "") (V2DI "")
ab2e8f01 1476 (V4HF "f") (V8HF "f")
779aea46
JG
1477 (V2SF "f") (V4SF "f")
1478 (V2DF "f") (DF "f")])
1479
0f686aa9
JG
1480;; Defined to '_fp' for types whose element type is a float type.
1481(define_mode_attr fp [(V8QI "") (V16QI "")
1482 (V4HI "") (V8HI "")
1483 (V2SI "") (V4SI "")
1484 (DI "") (V2DI "")
ab2e8f01 1485 (V4HF "_fp") (V8HF "_fp")
0f686aa9
JG
1486 (V2SF "_fp") (V4SF "_fp")
1487 (V2DF "_fp") (DF "_fp")
1488 (SF "_fp")])
1489
a9e66678
JG
1490;; Defined to '_q' for 128-bit types.
1491(define_mode_attr q [(V8QI "") (V16QI "_q")
0f686aa9 1492 (V4HI "") (V8HI "_q")
8ea6c1b8 1493 (V4BF "") (V8BF "_q")
0f686aa9
JG
1494 (V2SI "") (V4SI "_q")
1495 (DI "") (V2DI "_q")
71a11456 1496 (V4HF "") (V8HF "_q")
abbe1ed2 1497 (V4BF "") (V8BF "_q")
0f686aa9
JG
1498 (V2SF "") (V4SF "_q")
1499 (V2DF "_q")
d7f33f07 1500 (QI "") (HI "") (SI "") (DI "") (HF "") (SF "") (DF "")])
a9e66678 1501
92835317
TB
1502(define_mode_attr vp [(V8QI "v") (V16QI "v")
1503 (V4HI "v") (V8HI "v")
1504 (V2SI "p") (V4SI "v")
703bbcdf
JW
1505 (V2DI "p") (V2DF "p")
1506 (V2SF "p") (V4SF "v")
1507 (V4HF "v") (V8HF "v")])
92835317 1508
9feeafd7
AM
1509(define_mode_attr vsi2qi [(V2SI "v8qi") (V4SI "v16qi")
1510 (VNx4SI "vnx16qi") (VNx2DI "vnx8hi")])
1511(define_mode_attr VSI2QI [(V2SI "V8QI") (V4SI "V16QI")
1512 (VNx4SI "VNx16QI") (VNx2DI "VNx8HI")])
5e32e83b 1513
7a08d813
TC
1514
1515;; Register suffix for DOTPROD input types from the return type.
1516(define_mode_attr Vdottype [(V2SI "8b") (V4SI "16b")])
1517
f275d73a
SMW
1518;; Register suffix for BFDOT input types from the return type.
1519(define_mode_attr Vbfdottype [(V2SF "4h") (V4SF "8h")])
1520
cd78b3dd 1521;; Sum of lengths of instructions needed to move vector registers of a mode.
668046d1
DS
1522(define_mode_attr insn_count [(OI "8") (CI "12") (XI "16")])
1523
1b1e81f8
JW
1524;; -fpic small model GOT reloc modifers: gotpage_lo15/lo14 for ILP64/32.
1525;; No need of iterator for -fPIC as it use got_lo12 for both modes.
1526(define_mode_attr got_modifier [(SI "gotpage_lo14") (DI "gotpage_lo15")])
1527
27086ea3
MC
1528;; Width of 2nd and 3rd arguments to fp16 vector multiply add/sub
1529(define_mode_attr VFMLA_W [(V2SF "V4HF") (V4SF "V8HF")])
1530
f275d73a
SMW
1531;; Width of 2nd and 3rd arguments to bf16 vector multiply add/sub
1532(define_mode_attr VBFMLA_W [(V2SF "V4BF") (V4SF "V8BF")])
1533
27086ea3
MC
1534(define_mode_attr VFMLA_SEL_W [(V2SF "V2HF") (V4SF "V4HF")])
1535
1536(define_mode_attr f16quad [(V2SF "") (V4SF "q")])
1537
f275d73a 1538(define_mode_attr isquadop [(V8QI "") (V16QI "q") (V4BF "") (V8BF "q")])
8c197c85 1539
27086ea3
MC
1540(define_code_attr f16mac [(plus "a") (minus "s")])
1541
8544ed6e
KT
1542;; Map smax to smin and umax to umin.
1543(define_code_attr max_opp [(smax "smin") (umax "umin")])
1544
a9fad8fe
AM
1545;; Same as above, but louder.
1546(define_code_attr MAX_OPP [(smax "SMIN") (umax "UMIN")])
1547
9f4cbab8
RS
1548;; The number of subvectors in an SVE_STRUCT.
1549(define_mode_attr vector_count [(VNx32QI "2") (VNx16HI "2")
1550 (VNx8SI "2") (VNx4DI "2")
02fcd8ac 1551 (VNx16BF "2")
9f4cbab8
RS
1552 (VNx16HF "2") (VNx8SF "2") (VNx4DF "2")
1553 (VNx48QI "3") (VNx24HI "3")
1554 (VNx12SI "3") (VNx6DI "3")
02fcd8ac 1555 (VNx24BF "3")
9f4cbab8
RS
1556 (VNx24HF "3") (VNx12SF "3") (VNx6DF "3")
1557 (VNx64QI "4") (VNx32HI "4")
1558 (VNx16SI "4") (VNx8DI "4")
02fcd8ac 1559 (VNx32BF "4")
9f4cbab8
RS
1560 (VNx32HF "4") (VNx16SF "4") (VNx8DF "4")])
1561
1562;; The number of instruction bytes needed for an SVE_STRUCT move. This is
1563;; equal to vector_count * 4.
1564(define_mode_attr insn_length [(VNx32QI "8") (VNx16HI "8")
1565 (VNx8SI "8") (VNx4DI "8")
02fcd8ac 1566 (VNx16BF "8")
9f4cbab8
RS
1567 (VNx16HF "8") (VNx8SF "8") (VNx4DF "8")
1568 (VNx48QI "12") (VNx24HI "12")
1569 (VNx12SI "12") (VNx6DI "12")
02fcd8ac 1570 (VNx24BF "12")
9f4cbab8
RS
1571 (VNx24HF "12") (VNx12SF "12") (VNx6DF "12")
1572 (VNx64QI "16") (VNx32HI "16")
1573 (VNx16SI "16") (VNx8DI "16")
02fcd8ac 1574 (VNx32BF "16")
9f4cbab8
RS
1575 (VNx32HF "16") (VNx16SF "16") (VNx8DF "16")])
1576
1577;; The type of a subvector in an SVE_STRUCT.
1578(define_mode_attr VSINGLE [(VNx32QI "VNx16QI")
1579 (VNx16HI "VNx8HI") (VNx16HF "VNx8HF")
02fcd8ac 1580 (VNx16BF "VNx8BF")
9f4cbab8
RS
1581 (VNx8SI "VNx4SI") (VNx8SF "VNx4SF")
1582 (VNx4DI "VNx2DI") (VNx4DF "VNx2DF")
1583 (VNx48QI "VNx16QI")
1584 (VNx24HI "VNx8HI") (VNx24HF "VNx8HF")
02fcd8ac 1585 (VNx24BF "VNx8BF")
9f4cbab8
RS
1586 (VNx12SI "VNx4SI") (VNx12SF "VNx4SF")
1587 (VNx6DI "VNx2DI") (VNx6DF "VNx2DF")
1588 (VNx64QI "VNx16QI")
1589 (VNx32HI "VNx8HI") (VNx32HF "VNx8HF")
02fcd8ac 1590 (VNx32BF "VNx8BF")
9f4cbab8
RS
1591 (VNx16SI "VNx4SI") (VNx16SF "VNx4SF")
1592 (VNx8DI "VNx2DI") (VNx8DF "VNx2DF")])
1593
1594;; ...and again in lower case.
1595(define_mode_attr vsingle [(VNx32QI "vnx16qi")
1596 (VNx16HI "vnx8hi") (VNx16HF "vnx8hf")
02fcd8ac 1597 (VNx16BF "vnx8bf")
9f4cbab8
RS
1598 (VNx8SI "vnx4si") (VNx8SF "vnx4sf")
1599 (VNx4DI "vnx2di") (VNx4DF "vnx2df")
1600 (VNx48QI "vnx16qi")
1601 (VNx24HI "vnx8hi") (VNx24HF "vnx8hf")
02fcd8ac 1602 (VNx24BF "vnx8bf")
9f4cbab8
RS
1603 (VNx12SI "vnx4si") (VNx12SF "vnx4sf")
1604 (VNx6DI "vnx2di") (VNx6DF "vnx2df")
1605 (VNx64QI "vnx16qi")
1606 (VNx32HI "vnx8hi") (VNx32HF "vnx8hf")
02fcd8ac 1607 (VNx32BF "vnx8bf")
9f4cbab8
RS
1608 (VNx16SI "vnx4si") (VNx16SF "vnx4sf")
1609 (VNx8DI "vnx2di") (VNx8DF "vnx2df")])
1610
1611;; The predicate mode associated with an SVE data mode. For structure modes
1612;; this is equivalent to the <VPRED> of the subvector mode.
cc68f7c2
RS
1613(define_mode_attr VPRED [(VNx16QI "VNx16BI") (VNx8QI "VNx8BI")
1614 (VNx4QI "VNx4BI") (VNx2QI "VNx2BI")
1615 (VNx8HI "VNx8BI") (VNx4HI "VNx4BI") (VNx2HI "VNx2BI")
1616 (VNx8HF "VNx8BI") (VNx4HF "VNx4BI") (VNx2HF "VNx2BI")
02fcd8ac 1617 (VNx8BF "VNx8BI")
cc68f7c2
RS
1618 (VNx4SI "VNx4BI") (VNx2SI "VNx2BI")
1619 (VNx4SF "VNx4BI") (VNx2SF "VNx2BI")
1620 (VNx2DI "VNx2BI")
1621 (VNx2DF "VNx2BI")
9f4cbab8
RS
1622 (VNx32QI "VNx16BI")
1623 (VNx16HI "VNx8BI") (VNx16HF "VNx8BI")
02fcd8ac 1624 (VNx16BF "VNx8BI")
9f4cbab8
RS
1625 (VNx8SI "VNx4BI") (VNx8SF "VNx4BI")
1626 (VNx4DI "VNx2BI") (VNx4DF "VNx2BI")
1627 (VNx48QI "VNx16BI")
1628 (VNx24HI "VNx8BI") (VNx24HF "VNx8BI")
02fcd8ac 1629 (VNx24BF "VNx8BI")
9f4cbab8
RS
1630 (VNx12SI "VNx4BI") (VNx12SF "VNx4BI")
1631 (VNx6DI "VNx2BI") (VNx6DF "VNx2BI")
1632 (VNx64QI "VNx16BI")
1633 (VNx32HI "VNx8BI") (VNx32HF "VNx8BI")
02fcd8ac 1634 (VNx32BF "VNx8BI")
9f4cbab8
RS
1635 (VNx16SI "VNx4BI") (VNx16SF "VNx4BI")
1636 (VNx8DI "VNx2BI") (VNx8DF "VNx2BI")])
43cacb12
RS
1637
1638;; ...and again in lower case.
cc68f7c2
RS
1639(define_mode_attr vpred [(VNx16QI "vnx16bi") (VNx8QI "vnx8bi")
1640 (VNx4QI "vnx4bi") (VNx2QI "vnx2bi")
1641 (VNx8HI "vnx8bi") (VNx4HI "vnx4bi") (VNx2HI "vnx2bi")
1642 (VNx8HF "vnx8bi") (VNx4HF "vnx4bi") (VNx2HF "vnx2bi")
02fcd8ac 1643 (VNx8BF "vnx8bi")
cc68f7c2
RS
1644 (VNx4SI "vnx4bi") (VNx2SI "vnx2bi")
1645 (VNx4SF "vnx4bi") (VNx2SF "vnx2bi")
1646 (VNx2DI "vnx2bi")
1647 (VNx2DF "vnx2bi")
9f4cbab8
RS
1648 (VNx32QI "vnx16bi")
1649 (VNx16HI "vnx8bi") (VNx16HF "vnx8bi")
02fcd8ac 1650 (VNx16BF "vnx8bi")
9f4cbab8
RS
1651 (VNx8SI "vnx4bi") (VNx8SF "vnx4bi")
1652 (VNx4DI "vnx2bi") (VNx4DF "vnx2bi")
1653 (VNx48QI "vnx16bi")
1654 (VNx24HI "vnx8bi") (VNx24HF "vnx8bi")
02fcd8ac 1655 (VNx24BF "vnx8bi")
9f4cbab8
RS
1656 (VNx12SI "vnx4bi") (VNx12SF "vnx4bi")
1657 (VNx6DI "vnx2bi") (VNx6DF "vnx2bi")
1658 (VNx64QI "vnx16bi")
1659 (VNx32HI "vnx8bi") (VNx32HF "vnx4bi")
02fcd8ac 1660 (VNx32BF "vnx8bi")
9f4cbab8
RS
1661 (VNx16SI "vnx4bi") (VNx16SF "vnx4bi")
1662 (VNx8DI "vnx2bi") (VNx8DF "vnx2bi")])
43cacb12 1663
0a09a948
RS
1664(define_mode_attr VDOUBLE [(VNx16QI "VNx32QI")
1665 (VNx8HI "VNx16HI") (VNx8HF "VNx16HF")
02fcd8ac 1666 (VNx8BF "VNx16BF")
0a09a948
RS
1667 (VNx4SI "VNx8SI") (VNx4SF "VNx8SF")
1668 (VNx2DI "VNx4DI") (VNx2DF "VNx4DF")])
1669
9d63f43b
TC
1670;; On AArch64 the By element instruction doesn't have a 2S variant.
1671;; However because the instruction always selects a pair of values
1672;; The normal 3SAME instruction can be used here instead.
1673(define_mode_attr FCMLA_maybe_lane [(V2SF "<Vtype>") (V4SF "<Vetype>[%4]")
1674 (V4HF "<Vetype>[%4]") (V8HF "<Vetype>[%4]")
1675 ])
1676
34467289
RS
1677;; The number of bytes controlled by a predicate
1678(define_mode_attr data_bytes [(VNx16BI "1") (VNx8BI "2")
1679 (VNx4BI "4") (VNx2BI "8")])
1680
624d0f07
RS
1681;; Two-nybble mask for partial vector modes: nunits, byte size.
1682(define_mode_attr self_mask [(VNx8QI "0x81")
1683 (VNx4QI "0x41")
1684 (VNx2QI "0x21")
1685 (VNx4HI "0x42")
1686 (VNx2HI "0x22")
1687 (VNx2SI "0x24")])
1688
e58703e2
RS
1689;; For SVE_HSDI vector modes, the mask of narrower modes, encoded as above.
1690(define_mode_attr narrower_mask [(VNx8HI "0x81") (VNx4HI "0x41")
1691 (VNx2HI "0x21")
1692 (VNx4SI "0x43") (VNx2SI "0x23")
624d0f07
RS
1693 (VNx2DI "0x27")])
1694
1695;; The constraint to use for an SVE [SU]DOT, FMUL, FMLA or FMLS lane index.
0a09a948 1696(define_mode_attr sve_lane_con [(VNx8HI "y") (VNx4SI "y") (VNx2DI "x")
624d0f07
RS
1697 (VNx8HF "y") (VNx4SF "y") (VNx2DF "x")])
1698
1699;; The constraint to use for an SVE FCMLA lane index.
1700(define_mode_attr sve_lane_pair_con [(VNx8HF "y") (VNx4SF "x")])
1701
43e9d192
IB
1702;; -------------------------------------------------------------------
1703;; Code Iterators
1704;; -------------------------------------------------------------------
1705
1706;; This code iterator allows the various shifts supported on the core
1707(define_code_iterator SHIFT [ashift ashiftrt lshiftrt rotatert])
1708
1709;; This code iterator allows the shifts supported in arithmetic instructions
1710(define_code_iterator ASHIFT [ashift ashiftrt lshiftrt])
1711
462e6f9a
ST
1712(define_code_iterator SHIFTRT [ashiftrt lshiftrt])
1713
43e9d192
IB
1714;; Code iterator for logical operations
1715(define_code_iterator LOGICAL [and ior xor])
1716
43cacb12
RS
1717;; LOGICAL without AND.
1718(define_code_iterator LOGICAL_OR [ior xor])
1719
84be6032
AL
1720;; Code iterator for logical operations whose :nlogical works on SIMD registers.
1721(define_code_iterator NLOGICAL [and ior])
1722
3204ac98
KT
1723;; Code iterator for unary negate and bitwise complement.
1724(define_code_iterator NEG_NOT [neg not])
1725
43e9d192
IB
1726;; Code iterator for sign/zero extension
1727(define_code_iterator ANY_EXTEND [sign_extend zero_extend])
87a80d27 1728(define_code_iterator ANY_EXTEND2 [sign_extend zero_extend])
43e9d192
IB
1729
1730;; All division operations (signed/unsigned)
1731(define_code_iterator ANY_DIV [div udiv])
1732
1733;; Code iterator for sign/zero extraction
1734(define_code_iterator ANY_EXTRACT [sign_extract zero_extract])
1735
1736;; Code iterator for equality comparisons
1737(define_code_iterator EQL [eq ne])
1738
1739;; Code iterator for less-than and greater/equal-to
1740(define_code_iterator LTGE [lt ge])
1741
1742;; Iterator for __sync_<op> operations that where the operation can be
1743;; represented directly RTL. This is all of the sync operations bar
1744;; nand.
0462169c 1745(define_code_iterator atomic_op [plus minus ior xor and])
43e9d192
IB
1746
1747;; Iterator for integer conversions
1748(define_code_iterator FIXUORS [fix unsigned_fix])
1749
1709ff9b
JG
1750;; Iterator for float conversions
1751(define_code_iterator FLOATUORS [float unsigned_float])
1752
43e9d192
IB
1753;; Code iterator for variants of vector max and min.
1754(define_code_iterator MAXMIN [smax smin umax umin])
1755
998eaf97
JG
1756(define_code_iterator FMAXMIN [smax smin])
1757
8544ed6e
KT
1758;; Signed and unsigned max operations.
1759(define_code_iterator USMAX [smax umax])
1760
dd550c99 1761;; Code iterator for plus and minus.
43e9d192
IB
1762(define_code_iterator ADDSUB [plus minus])
1763
1764;; Code iterator for variants of vector saturating binary ops.
1765(define_code_iterator BINQOPS [ss_plus us_plus ss_minus us_minus])
1766
1767;; Code iterator for variants of vector saturating unary ops.
1768(define_code_iterator UNQOPS [ss_neg ss_abs])
1769
1770;; Code iterator for signed variants of vector saturating binary ops.
1771(define_code_iterator SBINQOPS [ss_plus ss_minus])
1772
624d0f07
RS
1773;; Code iterator for unsigned variants of vector saturating binary ops.
1774(define_code_iterator UBINQOPS [us_plus us_minus])
1775
1776;; Modular and saturating addition.
1777(define_code_iterator ANY_PLUS [plus ss_plus us_plus])
1778
1779;; Saturating addition.
1780(define_code_iterator SAT_PLUS [ss_plus us_plus])
1781
1782;; Modular and saturating subtraction.
1783(define_code_iterator ANY_MINUS [minus ss_minus us_minus])
1784
1785;; Saturating subtraction.
1786(define_code_iterator SAT_MINUS [ss_minus us_minus])
1787
889b9412
JG
1788;; Comparison operators for <F>CM.
1789(define_code_iterator COMPARISONS [lt le eq ge gt])
1790
1791;; Unsigned comparison operators.
1792(define_code_iterator UCOMPARISONS [ltu leu geu gtu])
1793
75dd5ace
JG
1794;; Unsigned comparison operators.
1795(define_code_iterator FAC_COMPARISONS [lt le ge gt])
1796
43cacb12 1797;; SVE integer unary operations.
0a09a948
RS
1798(define_code_iterator SVE_INT_UNARY [abs neg not clrsb clz popcount
1799 (ss_abs "TARGET_SVE2")
1800 (ss_neg "TARGET_SVE2")])
43cacb12 1801
a08acce8 1802;; SVE integer binary operations.
6c4fd4a9 1803(define_code_iterator SVE_INT_BINARY [plus minus mult smax umax smin umin
20103c0e 1804 ashift ashiftrt lshiftrt
0a09a948
RS
1805 and ior xor
1806 (ss_plus "TARGET_SVE2")
1807 (us_plus "TARGET_SVE2")
1808 (ss_minus "TARGET_SVE2")
1809 (us_minus "TARGET_SVE2")])
9d4ac06e 1810
a08acce8 1811;; SVE integer binary division operations.
c38f7319
RS
1812(define_code_iterator SVE_INT_BINARY_SD [div udiv])
1813
f8c22a8b
RS
1814;; SVE integer binary operations that have an immediate form.
1815(define_code_iterator SVE_INT_BINARY_IMM [mult smax smin umax umin])
1816
740c1ed7
RS
1817;; SVE floating-point operations with an unpredicated all-register form.
1818(define_code_iterator SVE_UNPRED_FP_BINARY [plus minus mult])
1819
f22d7973
RS
1820;; SVE integer comparisons.
1821(define_code_iterator SVE_INT_CMP [lt le eq ne ge gt ltu leu geu gtu])
1822
43e9d192
IB
1823;; -------------------------------------------------------------------
1824;; Code Attributes
1825;; -------------------------------------------------------------------
1826;; Map rtl objects to optab names
1827(define_code_attr optab [(ashift "ashl")
1828 (ashiftrt "ashr")
1829 (lshiftrt "lshr")
1830 (rotatert "rotr")
1831 (sign_extend "extend")
1832 (zero_extend "zero_extend")
1833 (sign_extract "extv")
1834 (zero_extract "extzv")
384be29f
JG
1835 (fix "fix")
1836 (unsigned_fix "fixuns")
1709ff9b
JG
1837 (float "float")
1838 (unsigned_float "floatuns")
bca5a997
RS
1839 (clrsb "clrsb")
1840 (clz "clz")
43cacb12 1841 (popcount "popcount")
43e9d192
IB
1842 (and "and")
1843 (ior "ior")
1844 (xor "xor")
1845 (not "one_cmpl")
1846 (neg "neg")
1847 (plus "add")
1848 (minus "sub")
6c4fd4a9 1849 (mult "mul")
c38f7319
RS
1850 (div "div")
1851 (udiv "udiv")
694e6b19
RS
1852 (ss_plus "ssadd")
1853 (us_plus "usadd")
1854 (ss_minus "sssub")
1855 (us_minus "ussub")
43e9d192
IB
1856 (ss_neg "qneg")
1857 (ss_abs "qabs")
43cacb12
RS
1858 (smin "smin")
1859 (smax "smax")
1860 (umin "umin")
1861 (umax "umax")
43e9d192
IB
1862 (eq "eq")
1863 (ne "ne")
1864 (lt "lt")
889b9412
JG
1865 (ge "ge")
1866 (le "le")
1867 (gt "gt")
1868 (ltu "ltu")
1869 (leu "leu")
1870 (geu "geu")
43cacb12 1871 (gtu "gtu")
d45b20a5 1872 (abs "abs")])
889b9412 1873
694e6b19
RS
1874(define_code_attr addsub [(ss_plus "add")
1875 (us_plus "add")
1876 (ss_minus "sub")
1877 (us_minus "sub")])
1878
889b9412
JG
1879;; For comparison operators we use the FCM* and CM* instructions.
1880;; As there are no CMLE or CMLT instructions which act on 3 vector
1881;; operands, we must use CMGE or CMGT and swap the order of the
1882;; source operands.
1883
1884(define_code_attr n_optab [(lt "gt") (le "ge") (eq "eq") (ge "ge") (gt "gt")
1885 (ltu "hi") (leu "hs") (geu "hs") (gtu "hi")])
1886(define_code_attr cmp_1 [(lt "2") (le "2") (eq "1") (ge "1") (gt "1")
1887 (ltu "2") (leu "2") (geu "1") (gtu "1")])
1888(define_code_attr cmp_2 [(lt "1") (le "1") (eq "2") (ge "2") (gt "2")
1889 (ltu "1") (leu "1") (geu "2") (gtu "2")])
1890
1891(define_code_attr CMP [(lt "LT") (le "LE") (eq "EQ") (ge "GE") (gt "GT")
714e1b3b
KT
1892 (ltu "LTU") (leu "LEU") (ne "NE") (geu "GEU")
1893 (gtu "GTU")])
43e9d192 1894
f22d7973
RS
1895;; The AArch64 condition associated with an rtl comparison code.
1896(define_code_attr cmp_op [(lt "lt")
1897 (le "le")
1898 (eq "eq")
1899 (ne "ne")
1900 (ge "ge")
1901 (gt "gt")
1902 (ltu "lo")
1903 (leu "ls")
1904 (geu "hs")
1905 (gtu "hi")])
1906
384be29f
JG
1907(define_code_attr fix_trunc_optab [(fix "fix_trunc")
1908 (unsigned_fix "fixuns_trunc")])
1909
43e9d192
IB
1910;; Optab prefix for sign/zero-extending operations
1911(define_code_attr su_optab [(sign_extend "") (zero_extend "u")
1912 (div "") (udiv "u")
1913 (fix "") (unsigned_fix "u")
1709ff9b 1914 (float "s") (unsigned_float "u")
43e9d192
IB
1915 (ss_plus "s") (us_plus "u")
1916 (ss_minus "s") (us_minus "u")])
1917
1918;; Similar for the instruction mnemonics
1919(define_code_attr shift [(ashift "lsl") (ashiftrt "asr")
1920 (lshiftrt "lsr") (rotatert "ror")])
1921
462e6f9a
ST
1922;; Op prefix for shift right and accumulate.
1923(define_code_attr sra_op [(ashiftrt "s") (lshiftrt "u")])
1924
43e9d192
IB
1925;; Map shift operators onto underlying bit-field instructions
1926(define_code_attr bfshift [(ashift "ubfiz") (ashiftrt "sbfx")
1927 (lshiftrt "ubfx") (rotatert "extr")])
1928
1929;; Logical operator instruction mnemonics
1930(define_code_attr logical [(and "and") (ior "orr") (xor "eor")])
1931
3204ac98
KT
1932;; Operation names for negate and bitwise complement.
1933(define_code_attr neg_not_op [(neg "neg") (not "not")])
1934
43cacb12 1935;; Similar, but when the second operand is inverted.
43e9d192
IB
1936(define_code_attr nlogical [(and "bic") (ior "orn") (xor "eon")])
1937
43cacb12
RS
1938;; Similar, but when both operands are inverted.
1939(define_code_attr logical_nn [(and "nor") (ior "nand")])
1940
43e9d192
IB
1941;; Sign- or zero-extending data-op
1942(define_code_attr su [(sign_extend "s") (zero_extend "u")
1943 (sign_extract "s") (zero_extract "u")
1944 (fix "s") (unsigned_fix "u")
998eaf97
JG
1945 (div "s") (udiv "u")
1946 (smax "s") (umax "u")
1947 (smin "s") (umin "u")])
43e9d192 1948
624d0f07
RS
1949;; "s" for signed ops, empty for unsigned ones.
1950(define_code_attr s [(sign_extend "s") (zero_extend "")])
1951
1952;; Map signed/unsigned ops to the corresponding extension.
1953(define_code_attr paired_extend [(ss_plus "sign_extend")
1954 (us_plus "zero_extend")
1955 (ss_minus "sign_extend")
1956 (us_minus "zero_extend")])
1957
43cacb12
RS
1958;; Whether a shift is left or right.
1959(define_code_attr lr [(ashift "l") (ashiftrt "r") (lshiftrt "r")])
1960
096e8448
JW
1961;; Emit conditional branch instructions.
1962(define_code_attr bcond [(eq "beq") (ne "bne") (lt "bne") (ge "beq")])
1963
43e9d192
IB
1964;; Emit cbz/cbnz depending on comparison type.
1965(define_code_attr cbz [(eq "cbz") (ne "cbnz") (lt "cbnz") (ge "cbz")])
1966
973d2e01
TP
1967;; Emit inverted cbz/cbnz depending on comparison type.
1968(define_code_attr inv_cb [(eq "cbnz") (ne "cbz") (lt "cbz") (ge "cbnz")])
1969
43e9d192
IB
1970;; Emit tbz/tbnz depending on comparison type.
1971(define_code_attr tbz [(eq "tbz") (ne "tbnz") (lt "tbnz") (ge "tbz")])
1972
973d2e01
TP
1973;; Emit inverted tbz/tbnz depending on comparison type.
1974(define_code_attr inv_tb [(eq "tbnz") (ne "tbz") (lt "tbz") (ge "tbnz")])
1975
43e9d192 1976;; Max/min attributes.
998eaf97
JG
1977(define_code_attr maxmin [(smax "max")
1978 (smin "min")
1979 (umax "max")
1980 (umin "min")])
43e9d192
IB
1981
1982;; MLA/MLS attributes.
1983(define_code_attr as [(ss_plus "a") (ss_minus "s")])
1984
0462169c
SN
1985;; Atomic operations
1986(define_code_attr atomic_optab
1987 [(ior "or") (xor "xor") (and "and") (plus "add") (minus "sub")])
1988
1989(define_code_attr atomic_op_operand
1990 [(ior "aarch64_logical_operand")
1991 (xor "aarch64_logical_operand")
1992 (and "aarch64_logical_operand")
1993 (plus "aarch64_plus_operand")
1994 (minus "aarch64_plus_operand")])
43e9d192 1995
356c32e2
MW
1996;; Constants acceptable for atomic operations.
1997;; This definition must appear in this file before the iterators it refers to.
1998(define_code_attr const_atomic
1999 [(plus "IJ") (minus "IJ")
2000 (xor "<lconst_atomic>") (ior "<lconst_atomic>")
2001 (and "<lconst_atomic>")])
2002
2003;; Attribute to describe constants acceptable in atomic logical operations
2004(define_mode_attr lconst_atomic [(QI "K") (HI "K") (SI "K") (DI "L")])
2005
43cacb12
RS
2006;; The integer SVE instruction that implements an rtx code.
2007(define_code_attr sve_int_op [(plus "add")
9d4ac06e 2008 (minus "sub")
6c4fd4a9 2009 (mult "mul")
c38f7319
RS
2010 (div "sdiv")
2011 (udiv "udiv")
69c5fdcf 2012 (abs "abs")
43cacb12
RS
2013 (neg "neg")
2014 (smin "smin")
2015 (smax "smax")
2016 (umin "umin")
2017 (umax "umax")
20103c0e
RS
2018 (ashift "lsl")
2019 (ashiftrt "asr")
2020 (lshiftrt "lsr")
43cacb12
RS
2021 (and "and")
2022 (ior "orr")
2023 (xor "eor")
2024 (not "not")
bca5a997
RS
2025 (clrsb "cls")
2026 (clz "clz")
0a09a948
RS
2027 (popcount "cnt")
2028 (ss_plus "sqadd")
2029 (us_plus "uqadd")
2030 (ss_minus "sqsub")
2031 (us_minus "uqsub")
2032 (ss_neg "sqneg")
2033 (ss_abs "sqabs")])
43cacb12 2034
a08acce8 2035(define_code_attr sve_int_op_rev [(plus "add")
20103c0e
RS
2036 (minus "subr")
2037 (mult "mul")
2038 (div "sdivr")
2039 (udiv "udivr")
2040 (smin "smin")
2041 (smax "smax")
2042 (umin "umin")
2043 (umax "umax")
2044 (ashift "lslr")
2045 (ashiftrt "asrr")
2046 (lshiftrt "lsrr")
2047 (and "and")
2048 (ior "orr")
0a09a948
RS
2049 (xor "eor")
2050 (ss_plus "sqadd")
2051 (us_plus "uqadd")
2052 (ss_minus "sqsubr")
2053 (us_minus "uqsubr")])
a08acce8 2054
43cacb12
RS
2055;; The floating-point SVE instruction that implements an rtx code.
2056(define_code_attr sve_fp_op [(plus "fadd")
740c1ed7 2057 (minus "fsub")
d45b20a5 2058 (mult "fmul")])
43cacb12 2059
f22d7973 2060;; The SVE immediate constraint to use for an rtl code.
f8c22a8b
RS
2061(define_code_attr sve_imm_con [(mult "vsm")
2062 (smax "vsm")
2063 (smin "vsm")
2064 (umax "vsb")
2065 (umin "vsb")
2066 (eq "vsc")
f22d7973
RS
2067 (ne "vsc")
2068 (lt "vsc")
2069 (ge "vsc")
2070 (le "vsc")
2071 (gt "vsc")
2072 (ltu "vsd")
2073 (leu "vsd")
2074 (geu "vsd")
2075 (gtu "vsd")])
2076
f8c22a8b
RS
2077;; The prefix letter to use when printing an immediate operand.
2078(define_code_attr sve_imm_prefix [(mult "")
2079 (smax "")
2080 (smin "")
2081 (umax "D")
2082 (umin "D")])
2083
d113ece6
RS
2084;; The predicate to use for the second input operand in a cond_<optab><mode>
2085;; pattern.
2086(define_code_attr sve_pred_int_rhs2_operand
2087 [(plus "register_operand")
2088 (minus "register_operand")
2089 (mult "register_operand")
2090 (smax "register_operand")
2091 (umax "register_operand")
2092 (smin "register_operand")
2093 (umin "register_operand")
20103c0e
RS
2094 (ashift "aarch64_sve_lshift_operand")
2095 (ashiftrt "aarch64_sve_rshift_operand")
2096 (lshiftrt "aarch64_sve_rshift_operand")
d113ece6
RS
2097 (and "aarch64_sve_pred_and_operand")
2098 (ior "register_operand")
0a09a948
RS
2099 (xor "register_operand")
2100 (ss_plus "register_operand")
2101 (us_plus "register_operand")
2102 (ss_minus "register_operand")
2103 (us_minus "register_operand")])
d113ece6 2104
624d0f07
RS
2105(define_code_attr inc_dec [(minus "dec") (ss_minus "sqdec") (us_minus "uqdec")
2106 (plus "inc") (ss_plus "sqinc") (us_plus "uqinc")])
2107
43e9d192
IB
2108;; -------------------------------------------------------------------
2109;; Int Iterators.
2110;; -------------------------------------------------------------------
75add2d0
KT
2111
2112;; The unspec codes for the SABAL, UABAL AdvancedSIMD instructions.
2113(define_int_iterator ABAL [UNSPEC_SABAL UNSPEC_UABAL])
2114
2115;; The unspec codes for the SABDL2, UABDL2 AdvancedSIMD instructions.
2116(define_int_iterator ABDL2 [UNSPEC_SABDL2 UNSPEC_UABDL2])
2117
2118;; The unspec codes for the SADALP, UADALP AdvancedSIMD instructions.
2119(define_int_iterator ADALP [UNSPEC_SADALP UNSPEC_UADALP])
2120
43e9d192
IB
2121(define_int_iterator MAXMINV [UNSPEC_UMAXV UNSPEC_UMINV
2122 UNSPEC_SMAXV UNSPEC_SMINV])
2123
998eaf97
JG
2124(define_int_iterator FMAXMINV [UNSPEC_FMAXV UNSPEC_FMINV
2125 UNSPEC_FMAXNMV UNSPEC_FMINNMV])
43e9d192 2126
624d0f07
RS
2127(define_int_iterator SVE_INT_ADDV [UNSPEC_SADDV UNSPEC_UADDV])
2128
43cacb12
RS
2129(define_int_iterator LOGICALF [UNSPEC_ANDF UNSPEC_IORF UNSPEC_XORF])
2130
43e9d192
IB
2131(define_int_iterator HADDSUB [UNSPEC_SHADD UNSPEC_UHADD
2132 UNSPEC_SRHADD UNSPEC_URHADD
2e828dfe 2133 UNSPEC_SHSUB UNSPEC_UHSUB])
43e9d192 2134
42addb5a
RS
2135(define_int_iterator HADD [UNSPEC_SHADD UNSPEC_UHADD])
2136
2137(define_int_iterator RHADD [UNSPEC_SRHADD UNSPEC_URHADD])
2138
2d57b12e
YW
2139(define_int_iterator BSL_DUP [1 2])
2140
7a08d813 2141(define_int_iterator DOTPROD [UNSPEC_SDOT UNSPEC_UDOT])
43e9d192 2142
8c197c85 2143(define_int_iterator DOTPROD_I8MM [UNSPEC_USDOT UNSPEC_SUDOT])
36696774 2144(define_int_iterator DOTPROD_US_ONLY [UNSPEC_USDOT])
8c197c85 2145
43e9d192
IB
2146(define_int_iterator ADDSUBHN [UNSPEC_ADDHN UNSPEC_RADDHN
2147 UNSPEC_SUBHN UNSPEC_RSUBHN])
2148
2149(define_int_iterator ADDSUBHN2 [UNSPEC_ADDHN2 UNSPEC_RADDHN2
2150 UNSPEC_SUBHN2 UNSPEC_RSUBHN2])
2151
1efafef3
TC
2152(define_int_iterator FMAXMIN_UNS [UNSPEC_FMAX UNSPEC_FMIN
2153 UNSPEC_FMAXNM UNSPEC_FMINNM])
202d0c11 2154
8fc16d72
ST
2155(define_int_iterator PAUTH_LR_SP [UNSPEC_PACIASP UNSPEC_AUTIASP
2156 UNSPEC_PACIBSP UNSPEC_AUTIBSP])
db58fd89 2157
8fc16d72
ST
2158(define_int_iterator PAUTH_17_16 [UNSPEC_PACIA1716 UNSPEC_AUTIA1716
2159 UNSPEC_PACIB1716 UNSPEC_AUTIB1716])
db58fd89 2160
43e9d192
IB
2161(define_int_iterator VQDMULH [UNSPEC_SQDMULH UNSPEC_SQRDMULH])
2162
58cc9876
YW
2163(define_int_iterator MULHRS [UNSPEC_SMULHS UNSPEC_UMULHS
2164 UNSPEC_SMULHRS UNSPEC_UMULHRS])
2165
43e9d192
IB
2166(define_int_iterator USSUQADD [UNSPEC_SUQADD UNSPEC_USQADD])
2167
2168(define_int_iterator SUQMOVN [UNSPEC_SQXTN UNSPEC_UQXTN])
2169
2170(define_int_iterator VSHL [UNSPEC_SSHL UNSPEC_USHL
2171 UNSPEC_SRSHL UNSPEC_URSHL])
2172
2173(define_int_iterator VSHLL [UNSPEC_SSHLL UNSPEC_USHLL])
2174
2175(define_int_iterator VQSHL [UNSPEC_SQSHL UNSPEC_UQSHL
2176 UNSPEC_SQRSHL UNSPEC_UQRSHL])
2177
2178(define_int_iterator VSRA [UNSPEC_SSRA UNSPEC_USRA
2179 UNSPEC_SRSRA UNSPEC_URSRA])
2180
2181(define_int_iterator VSLRI [UNSPEC_SSLI UNSPEC_USLI
2182 UNSPEC_SSRI UNSPEC_USRI])
2183
2184
2185(define_int_iterator VRSHR_N [UNSPEC_SRSHR UNSPEC_URSHR])
2186
2187(define_int_iterator VQSHL_N [UNSPEC_SQSHLU UNSPEC_SQSHL UNSPEC_UQSHL])
2188
2189(define_int_iterator VQSHRN_N [UNSPEC_SQSHRUN UNSPEC_SQRSHRUN
2190 UNSPEC_SQSHRN UNSPEC_UQSHRN
2191 UNSPEC_SQRSHRN UNSPEC_UQRSHRN])
2192
57b26d65
MW
2193(define_int_iterator SQRDMLH_AS [UNSPEC_SQRDMLAH UNSPEC_SQRDMLSH])
2194
cc4d934f
JG
2195(define_int_iterator PERMUTE [UNSPEC_ZIP1 UNSPEC_ZIP2
2196 UNSPEC_TRN1 UNSPEC_TRN2
2197 UNSPEC_UZP1 UNSPEC_UZP2])
43e9d192 2198
36696774
RS
2199(define_int_iterator PERMUTEQ [UNSPEC_ZIP1Q UNSPEC_ZIP2Q
2200 UNSPEC_TRN1Q UNSPEC_TRN2Q
2201 UNSPEC_UZP1Q UNSPEC_UZP2Q])
2202
43cacb12
RS
2203(define_int_iterator OPTAB_PERMUTE [UNSPEC_ZIP1 UNSPEC_ZIP2
2204 UNSPEC_UZP1 UNSPEC_UZP2])
2205
923fcec3
AL
2206(define_int_iterator REVERSE [UNSPEC_REV64 UNSPEC_REV32 UNSPEC_REV16])
2207
42fc9a7f 2208(define_int_iterator FRINT [UNSPEC_FRINTZ UNSPEC_FRINTP UNSPEC_FRINTM
0659ce6f
JG
2209 UNSPEC_FRINTN UNSPEC_FRINTI UNSPEC_FRINTX
2210 UNSPEC_FRINTA])
42fc9a7f
JG
2211
2212(define_int_iterator FCVT [UNSPEC_FRINTZ UNSPEC_FRINTP UNSPEC_FRINTM
ce966824 2213 UNSPEC_FRINTA UNSPEC_FRINTN])
42fc9a7f 2214
3f598afe
JW
2215(define_int_iterator FCVT_F2FIXED [UNSPEC_FCVTZS UNSPEC_FCVTZU])
2216(define_int_iterator FCVT_FIXED2F [UNSPEC_SCVTF UNSPEC_UCVTF])
2217
5d357f26
KT
2218(define_int_iterator CRC [UNSPEC_CRC32B UNSPEC_CRC32H UNSPEC_CRC32W
2219 UNSPEC_CRC32X UNSPEC_CRC32CB UNSPEC_CRC32CH
2220 UNSPEC_CRC32CW UNSPEC_CRC32CX])
2221
5a7a4e80
TB
2222(define_int_iterator CRYPTO_AES [UNSPEC_AESE UNSPEC_AESD])
2223(define_int_iterator CRYPTO_AESMC [UNSPEC_AESMC UNSPEC_AESIMC])
2224
30442682
TB
2225(define_int_iterator CRYPTO_SHA1 [UNSPEC_SHA1C UNSPEC_SHA1M UNSPEC_SHA1P])
2226
b9cb0a44
TB
2227(define_int_iterator CRYPTO_SHA256 [UNSPEC_SHA256H UNSPEC_SHA256H2])
2228
27086ea3
MC
2229(define_int_iterator CRYPTO_SHA512 [UNSPEC_SHA512H UNSPEC_SHA512H2])
2230
2231(define_int_iterator CRYPTO_SM3TT [UNSPEC_SM3TT1A UNSPEC_SM3TT1B
2232 UNSPEC_SM3TT2A UNSPEC_SM3TT2B])
2233
2234(define_int_iterator CRYPTO_SM3PART [UNSPEC_SM3PARTW1 UNSPEC_SM3PARTW2])
2235
2236;; Iterators for fp16 operations
2237
2238(define_int_iterator VFMLA16_LOW [UNSPEC_FMLAL UNSPEC_FMLSL])
2239
2240(define_int_iterator VFMLA16_HIGH [UNSPEC_FMLAL2 UNSPEC_FMLSL2])
2241
43cacb12
RS
2242(define_int_iterator UNPACK [UNSPEC_UNPACKSHI UNSPEC_UNPACKUHI
2243 UNSPEC_UNPACKSLO UNSPEC_UNPACKULO])
2244
2245(define_int_iterator UNPACK_UNSIGNED [UNSPEC_UNPACKULO UNSPEC_UNPACKUHI])
2246
11e9443f
RS
2247(define_int_iterator MUL_HIGHPART [UNSPEC_SMUL_HIGHPART UNSPEC_UMUL_HIGHPART])
2248
624d0f07
RS
2249(define_int_iterator CLAST [UNSPEC_CLASTA UNSPEC_CLASTB])
2250
2251(define_int_iterator LAST [UNSPEC_LASTA UNSPEC_LASTB])
2252
2253(define_int_iterator SVE_INT_UNARY [UNSPEC_RBIT UNSPEC_REVB
2254 UNSPEC_REVH UNSPEC_REVW])
2255
2256(define_int_iterator SVE_FP_UNARY [UNSPEC_FRECPE UNSPEC_RSQRTE])
2257
2258(define_int_iterator SVE_FP_UNARY_INT [UNSPEC_FEXPA])
2259
0a09a948
RS
2260(define_int_iterator SVE_INT_SHIFT_IMM [UNSPEC_ASRD
2261 (UNSPEC_SQSHLU "TARGET_SVE2")
2262 (UNSPEC_SRSHR "TARGET_SVE2")
2263 (UNSPEC_URSHR "TARGET_SVE2")])
2264
624d0f07
RS
2265(define_int_iterator SVE_FP_BINARY [UNSPEC_FRECPS UNSPEC_RSQRTS])
2266
2267(define_int_iterator SVE_FP_BINARY_INT [UNSPEC_FTSMUL UNSPEC_FTSSEL])
d7a09c44 2268
896dff99
RS
2269(define_int_iterator SVE_BFLOAT_TERNARY_LONG [UNSPEC_BFDOT
2270 UNSPEC_BFMLALB
2271 UNSPEC_BFMLALT
2272 UNSPEC_BFMMLA])
2273
2274(define_int_iterator SVE_BFLOAT_TERNARY_LONG_LANE [UNSPEC_BFDOT
2275 UNSPEC_BFMLALB
2276 UNSPEC_BFMLALT])
2277
b0760a40
RS
2278(define_int_iterator SVE_INT_REDUCTION [UNSPEC_ANDV
2279 UNSPEC_IORV
2280 UNSPEC_SMAXV
2281 UNSPEC_SMINV
2282 UNSPEC_UMAXV
2283 UNSPEC_UMINV
2284 UNSPEC_XORV])
2285
2286(define_int_iterator SVE_FP_REDUCTION [UNSPEC_FADDV
2287 UNSPEC_FMAXV
2288 UNSPEC_FMAXNMV
2289 UNSPEC_FMINV
2290 UNSPEC_FMINNMV])
2291
d45b20a5
RS
2292(define_int_iterator SVE_COND_FP_UNARY [UNSPEC_COND_FABS
2293 UNSPEC_COND_FNEG
624d0f07 2294 UNSPEC_COND_FRECPX
d45b20a5
RS
2295 UNSPEC_COND_FRINTA
2296 UNSPEC_COND_FRINTI
2297 UNSPEC_COND_FRINTM
2298 UNSPEC_COND_FRINTN
2299 UNSPEC_COND_FRINTP
2300 UNSPEC_COND_FRINTX
2301 UNSPEC_COND_FRINTZ
2302 UNSPEC_COND_FSQRT])
2303
a0ee8352
RS
2304;; Same as SVE_COND_FP_UNARY, but without codes that have a dedicated
2305;; <optab><mode>2 expander.
2306(define_int_iterator SVE_COND_FP_UNARY_OPTAB [UNSPEC_COND_FABS
2307 UNSPEC_COND_FNEG
2308 UNSPEC_COND_FRECPX
2309 UNSPEC_COND_FRINTA
2310 UNSPEC_COND_FRINTI
2311 UNSPEC_COND_FRINTM
2312 UNSPEC_COND_FRINTN
2313 UNSPEC_COND_FRINTP
2314 UNSPEC_COND_FRINTX
2315 UNSPEC_COND_FRINTZ])
2316
95eb5537 2317(define_int_iterator SVE_COND_FCVT [UNSPEC_COND_FCVT])
99361551
RS
2318(define_int_iterator SVE_COND_FCVTI [UNSPEC_COND_FCVTZS UNSPEC_COND_FCVTZU])
2319(define_int_iterator SVE_COND_ICVTF [UNSPEC_COND_SCVTF UNSPEC_COND_UCVTF])
2320
cb18e86d
RS
2321(define_int_iterator SVE_COND_FP_BINARY [UNSPEC_COND_FADD
2322 UNSPEC_COND_FDIV
624d0f07 2323 UNSPEC_COND_FMAX
cb18e86d 2324 UNSPEC_COND_FMAXNM
624d0f07 2325 UNSPEC_COND_FMIN
cb18e86d
RS
2326 UNSPEC_COND_FMINNM
2327 UNSPEC_COND_FMUL
624d0f07 2328 UNSPEC_COND_FMULX
cb18e86d 2329 UNSPEC_COND_FSUB])
0d2b3bca 2330
04f307cb
RS
2331;; Same as SVE_COND_FP_BINARY, but without codes that have a dedicated
2332;; <optab><mode>3 expander.
2333(define_int_iterator SVE_COND_FP_BINARY_OPTAB [UNSPEC_COND_FADD
2334 UNSPEC_COND_FMAX
2335 UNSPEC_COND_FMAXNM
2336 UNSPEC_COND_FMIN
2337 UNSPEC_COND_FMINNM
2338 UNSPEC_COND_FMUL
2339 UNSPEC_COND_FMULX
2340 UNSPEC_COND_FSUB])
2341
624d0f07
RS
2342(define_int_iterator SVE_COND_FP_BINARY_INT [UNSPEC_COND_FSCALE])
2343
2344(define_int_iterator SVE_COND_FP_ADD [UNSPEC_COND_FADD])
2345(define_int_iterator SVE_COND_FP_SUB [UNSPEC_COND_FSUB])
2346(define_int_iterator SVE_COND_FP_MUL [UNSPEC_COND_FMUL])
2347
2348(define_int_iterator SVE_COND_FP_BINARY_I1 [UNSPEC_COND_FMAX
2349 UNSPEC_COND_FMAXNM
2350 UNSPEC_COND_FMIN
a19ba9e1
RS
2351 UNSPEC_COND_FMINNM
2352 UNSPEC_COND_FMUL])
2353
624d0f07
RS
2354(define_int_iterator SVE_COND_FP_BINARY_REG [UNSPEC_COND_FDIV
2355 UNSPEC_COND_FMULX])
2356
2357(define_int_iterator SVE_COND_FCADD [UNSPEC_COND_FCADD90
2358 UNSPEC_COND_FCADD270])
2359
2360(define_int_iterator SVE_COND_FP_MAXMIN [UNSPEC_COND_FMAX
2361 UNSPEC_COND_FMAXNM
2362 UNSPEC_COND_FMIN
2363 UNSPEC_COND_FMINNM])
0254ed79 2364
214c42fa
RS
2365;; Floating-point max/min operations that correspond to optabs,
2366;; as opposed to those that are internal to the port.
2367(define_int_iterator SVE_COND_FP_MAXMIN_PUBLIC [UNSPEC_COND_FMAXNM
2368 UNSPEC_COND_FMINNM])
2369
b41d1f6e
RS
2370(define_int_iterator SVE_COND_FP_TERNARY [UNSPEC_COND_FMLA
2371 UNSPEC_COND_FMLS
2372 UNSPEC_COND_FNMLA
2373 UNSPEC_COND_FNMLS])
2374
624d0f07
RS
2375(define_int_iterator SVE_COND_FCMLA [UNSPEC_COND_FCMLA
2376 UNSPEC_COND_FCMLA90
2377 UNSPEC_COND_FCMLA180
2378 UNSPEC_COND_FCMLA270])
2379
2380(define_int_iterator SVE_COND_INT_CMP_WIDE [UNSPEC_COND_CMPEQ_WIDE
2381 UNSPEC_COND_CMPGE_WIDE
2382 UNSPEC_COND_CMPGT_WIDE
2383 UNSPEC_COND_CMPHI_WIDE
2384 UNSPEC_COND_CMPHS_WIDE
2385 UNSPEC_COND_CMPLE_WIDE
2386 UNSPEC_COND_CMPLO_WIDE
2387 UNSPEC_COND_CMPLS_WIDE
2388 UNSPEC_COND_CMPLT_WIDE
2389 UNSPEC_COND_CMPNE_WIDE])
2390
4a942af6
RS
2391;; SVE FP comparisons that accept #0.0.
2392(define_int_iterator SVE_COND_FP_CMP_I0 [UNSPEC_COND_FCMEQ
2393 UNSPEC_COND_FCMGE
2394 UNSPEC_COND_FCMGT
2395 UNSPEC_COND_FCMLE
2396 UNSPEC_COND_FCMLT
2397 UNSPEC_COND_FCMNE])
43cacb12 2398
42b4e87d
RS
2399(define_int_iterator SVE_COND_FP_ABS_CMP [UNSPEC_COND_FCMGE
2400 UNSPEC_COND_FCMGT
2401 UNSPEC_COND_FCMLE
2402 UNSPEC_COND_FCMLT])
2403
624d0f07
RS
2404(define_int_iterator SVE_FP_TERNARY_LANE [UNSPEC_FMLA UNSPEC_FMLS])
2405
2406(define_int_iterator SVE_CFP_TERNARY_LANE [UNSPEC_FCMLA UNSPEC_FCMLA90
2407 UNSPEC_FCMLA180 UNSPEC_FCMLA270])
2408
6ad9571b 2409(define_int_iterator SVE_WHILE [UNSPEC_WHILELE UNSPEC_WHILELO
bad5e58a 2410 UNSPEC_WHILELS UNSPEC_WHILELT
0a09a948
RS
2411 (UNSPEC_WHILEGE "TARGET_SVE2")
2412 (UNSPEC_WHILEGT "TARGET_SVE2")
2413 (UNSPEC_WHILEHI "TARGET_SVE2")
2414 (UNSPEC_WHILEHS "TARGET_SVE2")
bad5e58a
RS
2415 (UNSPEC_WHILERW "TARGET_SVE2")
2416 (UNSPEC_WHILEWR "TARGET_SVE2")])
624d0f07 2417
58c036c8
RS
2418(define_int_iterator SVE2_WHILE_PTR [UNSPEC_WHILERW UNSPEC_WHILEWR])
2419
624d0f07
RS
2420(define_int_iterator SVE_SHIFT_WIDE [UNSPEC_ASHIFT_WIDE
2421 UNSPEC_ASHIFTRT_WIDE
2422 UNSPEC_LSHIFTRT_WIDE])
2423
2424(define_int_iterator SVE_LDFF1_LDNF1 [UNSPEC_LDFF1 UNSPEC_LDNF1])
2425
0a09a948
RS
2426(define_int_iterator SVE2_U32_UNARY [UNSPEC_URECPE UNSPEC_RSQRTE])
2427
2428(define_int_iterator SVE2_INT_UNARY_NARROWB [UNSPEC_SQXTNB
2429 UNSPEC_SQXTUNB
2430 UNSPEC_UQXTNB])
2431
2432(define_int_iterator SVE2_INT_UNARY_NARROWT [UNSPEC_SQXTNT
2433 UNSPEC_SQXTUNT
2434 UNSPEC_UQXTNT])
2435
2436(define_int_iterator SVE2_INT_BINARY [UNSPEC_SQDMULH
2437 UNSPEC_SQRDMULH])
2438
2439(define_int_iterator SVE2_INT_BINARY_LANE [UNSPEC_SQDMULH
2440 UNSPEC_SQRDMULH])
2441
2442(define_int_iterator SVE2_INT_BINARY_LONG [UNSPEC_SABDLB
2443 UNSPEC_SABDLT
2444 UNSPEC_SADDLB
2445 UNSPEC_SADDLBT
2446 UNSPEC_SADDLT
2447 UNSPEC_SMULLB
2448 UNSPEC_SMULLT
2449 UNSPEC_SQDMULLB
2450 UNSPEC_SQDMULLT
2451 UNSPEC_SSUBLB
2452 UNSPEC_SSUBLBT
2453 UNSPEC_SSUBLT
2454 UNSPEC_SSUBLTB
2455 UNSPEC_UABDLB
2456 UNSPEC_UABDLT
2457 UNSPEC_UADDLB
2458 UNSPEC_UADDLT
2459 UNSPEC_UMULLB
2460 UNSPEC_UMULLT
2461 UNSPEC_USUBLB
2462 UNSPEC_USUBLT])
2463
2464(define_int_iterator SVE2_INT_BINARY_LONG_LANE [UNSPEC_SMULLB
2465 UNSPEC_SMULLT
2466 UNSPEC_SQDMULLB
2467 UNSPEC_SQDMULLT
2468 UNSPEC_UMULLB
2469 UNSPEC_UMULLT])
2470
2471(define_int_iterator SVE2_INT_BINARY_NARROWB [UNSPEC_ADDHNB
2472 UNSPEC_RADDHNB
2473 UNSPEC_RSUBHNB
2474 UNSPEC_SUBHNB])
2475
2476(define_int_iterator SVE2_INT_BINARY_NARROWT [UNSPEC_ADDHNT
2477 UNSPEC_RADDHNT
2478 UNSPEC_RSUBHNT
2479 UNSPEC_SUBHNT])
2480
2481(define_int_iterator SVE2_INT_BINARY_PAIR [UNSPEC_ADDP
2482 UNSPEC_SMAXP
2483 UNSPEC_SMINP
2484 UNSPEC_UMAXP
2485 UNSPEC_UMINP])
2486
2487(define_int_iterator SVE2_FP_BINARY_PAIR [UNSPEC_FADDP
2488 UNSPEC_FMAXP
2489 UNSPEC_FMAXNMP
2490 UNSPEC_FMINP
2491 UNSPEC_FMINNMP])
2492
2493(define_int_iterator SVE2_INT_BINARY_PAIR_LONG [UNSPEC_SADALP UNSPEC_UADALP])
2494
2495(define_int_iterator SVE2_INT_BINARY_WIDE [UNSPEC_SADDWB
2496 UNSPEC_SADDWT
2497 UNSPEC_SSUBWB
2498 UNSPEC_SSUBWT
2499 UNSPEC_UADDWB
2500 UNSPEC_UADDWT
2501 UNSPEC_USUBWB
2502 UNSPEC_USUBWT])
2503
2504(define_int_iterator SVE2_INT_SHIFT_IMM_LONG [UNSPEC_SSHLLB
2505 UNSPEC_SSHLLT
2506 UNSPEC_USHLLB
2507 UNSPEC_USHLLT])
2508
2509(define_int_iterator SVE2_INT_SHIFT_IMM_NARROWB [UNSPEC_RSHRNB
2510 UNSPEC_SHRNB
2511 UNSPEC_SQRSHRNB
2512 UNSPEC_SQRSHRUNB
2513 UNSPEC_SQSHRNB
2514 UNSPEC_SQSHRUNB
2515 UNSPEC_UQRSHRNB
2516 UNSPEC_UQSHRNB])
2517
2518(define_int_iterator SVE2_INT_SHIFT_IMM_NARROWT [UNSPEC_RSHRNT
2519 UNSPEC_SHRNT
2520 UNSPEC_SQRSHRNT
2521 UNSPEC_SQRSHRUNT
2522 UNSPEC_SQSHRNT
2523 UNSPEC_SQSHRUNT
2524 UNSPEC_UQRSHRNT
2525 UNSPEC_UQSHRNT])
2526
2527(define_int_iterator SVE2_INT_SHIFT_INSERT [UNSPEC_SLI UNSPEC_SRI])
2528
2529(define_int_iterator SVE2_INT_CADD [UNSPEC_CADD90
2530 UNSPEC_CADD270
2531 UNSPEC_SQCADD90
2532 UNSPEC_SQCADD270])
2533
2534(define_int_iterator SVE2_INT_BITPERM [UNSPEC_BDEP UNSPEC_BEXT UNSPEC_BGRP])
2535
2536(define_int_iterator SVE2_INT_TERNARY [UNSPEC_ADCLB
2537 UNSPEC_ADCLT
2538 UNSPEC_EORBT
2539 UNSPEC_EORTB
2540 UNSPEC_SBCLB
2541 UNSPEC_SBCLT
2542 UNSPEC_SQRDMLAH
2543 UNSPEC_SQRDMLSH])
2544
2545(define_int_iterator SVE2_INT_TERNARY_LANE [UNSPEC_SQRDMLAH
2546 UNSPEC_SQRDMLSH])
2547
2548(define_int_iterator SVE2_FP_TERNARY_LONG [UNSPEC_FMLALB
2549 UNSPEC_FMLALT
2550 UNSPEC_FMLSLB
2551 UNSPEC_FMLSLT])
2552
2553(define_int_iterator SVE2_FP_TERNARY_LONG_LANE [UNSPEC_FMLALB
2554 UNSPEC_FMLALT
2555 UNSPEC_FMLSLB
2556 UNSPEC_FMLSLT])
2557
2558(define_int_iterator SVE2_INT_CMLA [UNSPEC_CMLA
2559 UNSPEC_CMLA90
2560 UNSPEC_CMLA180
2561 UNSPEC_CMLA270
2562 UNSPEC_SQRDCMLAH
2563 UNSPEC_SQRDCMLAH90
2564 UNSPEC_SQRDCMLAH180
2565 UNSPEC_SQRDCMLAH270])
2566
2567(define_int_iterator SVE2_INT_CDOT [UNSPEC_CDOT
2568 UNSPEC_CDOT90
2569 UNSPEC_CDOT180
2570 UNSPEC_CDOT270])
2571
2572(define_int_iterator SVE2_INT_ADD_BINARY_LONG [UNSPEC_SABDLB
2573 UNSPEC_SABDLT
2574 UNSPEC_SMULLB
2575 UNSPEC_SMULLT
2576 UNSPEC_UABDLB
2577 UNSPEC_UABDLT
2578 UNSPEC_UMULLB
2579 UNSPEC_UMULLT])
2580
2581(define_int_iterator SVE2_INT_QADD_BINARY_LONG [UNSPEC_SQDMULLB
2582 UNSPEC_SQDMULLBT
2583 UNSPEC_SQDMULLT])
2584
2585(define_int_iterator SVE2_INT_SUB_BINARY_LONG [UNSPEC_SMULLB
2586 UNSPEC_SMULLT
2587 UNSPEC_UMULLB
2588 UNSPEC_UMULLT])
2589
2590(define_int_iterator SVE2_INT_QSUB_BINARY_LONG [UNSPEC_SQDMULLB
2591 UNSPEC_SQDMULLBT
2592 UNSPEC_SQDMULLT])
2593
2594(define_int_iterator SVE2_INT_ADD_BINARY_LONG_LANE [UNSPEC_SMULLB
2595 UNSPEC_SMULLT
2596 UNSPEC_UMULLB
2597 UNSPEC_UMULLT])
2598
2599(define_int_iterator SVE2_INT_QADD_BINARY_LONG_LANE [UNSPEC_SQDMULLB
2600 UNSPEC_SQDMULLT])
2601
2602(define_int_iterator SVE2_INT_SUB_BINARY_LONG_LANE [UNSPEC_SMULLB
2603 UNSPEC_SMULLT
2604 UNSPEC_UMULLB
2605 UNSPEC_UMULLT])
2606
2607(define_int_iterator SVE2_INT_QSUB_BINARY_LONG_LANE [UNSPEC_SQDMULLB
2608 UNSPEC_SQDMULLT])
2609
2610(define_int_iterator SVE2_COND_INT_UNARY_FP [UNSPEC_COND_FLOGB])
2611
2612(define_int_iterator SVE2_COND_FP_UNARY_LONG [UNSPEC_COND_FCVTLT])
2613
2614(define_int_iterator SVE2_COND_FP_UNARY_NARROWB [UNSPEC_COND_FCVTX])
2615
2616(define_int_iterator SVE2_COND_INT_BINARY [UNSPEC_SHADD
2617 UNSPEC_SHSUB
2618 UNSPEC_SQRSHL
2619 UNSPEC_SRHADD
2620 UNSPEC_SRSHL
2621 UNSPEC_SUQADD
2622 UNSPEC_UHADD
2623 UNSPEC_UHSUB
2624 UNSPEC_UQRSHL
2625 UNSPEC_URHADD
2626 UNSPEC_URSHL
2627 UNSPEC_USQADD])
2628
2629(define_int_iterator SVE2_COND_INT_BINARY_NOREV [UNSPEC_SUQADD
2630 UNSPEC_USQADD])
2631
2632(define_int_iterator SVE2_COND_INT_BINARY_REV [UNSPEC_SHADD
2633 UNSPEC_SHSUB
2634 UNSPEC_SQRSHL
2635 UNSPEC_SRHADD
2636 UNSPEC_SRSHL
2637 UNSPEC_UHADD
2638 UNSPEC_UHSUB
2639 UNSPEC_UQRSHL
2640 UNSPEC_URHADD
2641 UNSPEC_URSHL])
2642
2643(define_int_iterator SVE2_COND_INT_SHIFT [UNSPEC_SQSHL
2644 UNSPEC_UQSHL])
2645
2646(define_int_iterator SVE2_MATCH [UNSPEC_MATCH UNSPEC_NMATCH])
2647
2648(define_int_iterator SVE2_PMULL [UNSPEC_PMULLB UNSPEC_PMULLT])
2649
2650(define_int_iterator SVE2_PMULL_PAIR [UNSPEC_PMULLB_PAIR UNSPEC_PMULLT_PAIR])
2651
9d63f43b
TC
2652(define_int_iterator FCADD [UNSPEC_FCADD90
2653 UNSPEC_FCADD270])
2654
2655(define_int_iterator FCMLA [UNSPEC_FCMLA
2656 UNSPEC_FCMLA90
2657 UNSPEC_FCMLA180
2658 UNSPEC_FCMLA270])
2659
10bd1d96
KT
2660(define_int_iterator FRINTNZX [UNSPEC_FRINT32Z UNSPEC_FRINT32X
2661 UNSPEC_FRINT64Z UNSPEC_FRINT64X])
2662
624d0f07
RS
2663(define_int_iterator SVE_BRK_UNARY [UNSPEC_BRKA UNSPEC_BRKB])
2664
2665(define_int_iterator SVE_BRK_BINARY [UNSPEC_BRKN UNSPEC_BRKPA UNSPEC_BRKPB])
2666
2667(define_int_iterator SVE_PITER [UNSPEC_PFIRST UNSPEC_PNEXT])
2668
36696774
RS
2669(define_int_iterator MATMUL [UNSPEC_SMATMUL UNSPEC_UMATMUL
2670 UNSPEC_USMATMUL])
2671
2672(define_int_iterator FMMLA [UNSPEC_FMMLA])
2673
f78335df
DB
2674(define_int_iterator BF_MLA [UNSPEC_BFMLALB
2675 UNSPEC_BFMLALT])
2676
d81cb613
MW
2677;; Iterators for atomic operations.
2678
2679(define_int_iterator ATOMIC_LDOP
2680 [UNSPECV_ATOMIC_LDOP_OR UNSPECV_ATOMIC_LDOP_BIC
2681 UNSPECV_ATOMIC_LDOP_XOR UNSPECV_ATOMIC_LDOP_PLUS])
2682
2683(define_int_attr atomic_ldop
2684 [(UNSPECV_ATOMIC_LDOP_OR "set") (UNSPECV_ATOMIC_LDOP_BIC "clr")
2685 (UNSPECV_ATOMIC_LDOP_XOR "eor") (UNSPECV_ATOMIC_LDOP_PLUS "add")])
2686
7803ec5e
RH
2687(define_int_attr atomic_ldoptab
2688 [(UNSPECV_ATOMIC_LDOP_OR "ior") (UNSPECV_ATOMIC_LDOP_BIC "bic")
2689 (UNSPECV_ATOMIC_LDOP_XOR "xor") (UNSPECV_ATOMIC_LDOP_PLUS "add")])
2690
43e9d192
IB
2691;; -------------------------------------------------------------------
2692;; Int Iterators Attributes.
2693;; -------------------------------------------------------------------
43cacb12
RS
2694
2695;; The optab associated with an operation. Note that for ANDF, IORF
2696;; and XORF, the optab pattern is not actually defined; we just use this
2697;; name for consistency with the integer patterns.
2698(define_int_attr optab [(UNSPEC_ANDF "and")
2699 (UNSPEC_IORF "ior")
898f07b0 2700 (UNSPEC_XORF "xor")
624d0f07
RS
2701 (UNSPEC_SADDV "sadd")
2702 (UNSPEC_UADDV "uadd")
898f07b0
RS
2703 (UNSPEC_ANDV "and")
2704 (UNSPEC_IORV "ior")
0972596e 2705 (UNSPEC_XORV "xor")
624d0f07
RS
2706 (UNSPEC_FRECPE "frecpe")
2707 (UNSPEC_FRECPS "frecps")
2708 (UNSPEC_RSQRTE "frsqrte")
2709 (UNSPEC_RSQRTS "frsqrts")
2710 (UNSPEC_RBIT "rbit")
d7a09c44
RS
2711 (UNSPEC_REVB "revb")
2712 (UNSPEC_REVH "revh")
2713 (UNSPEC_REVW "revw")
b0760a40
RS
2714 (UNSPEC_UMAXV "umax")
2715 (UNSPEC_UMINV "umin")
2716 (UNSPEC_SMAXV "smax")
2717 (UNSPEC_SMINV "smin")
0a09a948
RS
2718 (UNSPEC_CADD90 "cadd90")
2719 (UNSPEC_CADD270 "cadd270")
2720 (UNSPEC_CDOT "cdot")
2721 (UNSPEC_CDOT90 "cdot90")
2722 (UNSPEC_CDOT180 "cdot180")
2723 (UNSPEC_CDOT270 "cdot270")
2724 (UNSPEC_CMLA "cmla")
2725 (UNSPEC_CMLA90 "cmla90")
2726 (UNSPEC_CMLA180 "cmla180")
2727 (UNSPEC_CMLA270 "cmla270")
b0760a40
RS
2728 (UNSPEC_FADDV "plus")
2729 (UNSPEC_FMAXNMV "smax")
2730 (UNSPEC_FMAXV "smax_nan")
2731 (UNSPEC_FMINNMV "smin")
2732 (UNSPEC_FMINV "smin_nan")
624d0f07
RS
2733 (UNSPEC_SMUL_HIGHPART "smulh")
2734 (UNSPEC_UMUL_HIGHPART "umulh")
2735 (UNSPEC_FMLA "fma")
2736 (UNSPEC_FMLS "fnma")
2737 (UNSPEC_FCMLA "fcmla")
2738 (UNSPEC_FCMLA90 "fcmla90")
2739 (UNSPEC_FCMLA180 "fcmla180")
2740 (UNSPEC_FCMLA270 "fcmla270")
2741 (UNSPEC_FEXPA "fexpa")
2742 (UNSPEC_FTSMUL "ftsmul")
2743 (UNSPEC_FTSSEL "ftssel")
0a09a948
RS
2744 (UNSPEC_PMULLB "pmullb")
2745 (UNSPEC_PMULLB_PAIR "pmullb_pair")
2746 (UNSPEC_PMULLT "pmullt")
2747 (UNSPEC_PMULLT_PAIR "pmullt_pair")
36696774 2748 (UNSPEC_SMATMUL "smatmul")
0a09a948
RS
2749 (UNSPEC_SQCADD90 "sqcadd90")
2750 (UNSPEC_SQCADD270 "sqcadd270")
2751 (UNSPEC_SQRDCMLAH "sqrdcmlah")
2752 (UNSPEC_SQRDCMLAH90 "sqrdcmlah90")
2753 (UNSPEC_SQRDCMLAH180 "sqrdcmlah180")
2754 (UNSPEC_SQRDCMLAH270 "sqrdcmlah270")
36696774
RS
2755 (UNSPEC_TRN1Q "trn1q")
2756 (UNSPEC_TRN2Q "trn2q")
2757 (UNSPEC_UMATMUL "umatmul")
2758 (UNSPEC_USMATMUL "usmatmul")
2759 (UNSPEC_UZP1Q "uzp1q")
2760 (UNSPEC_UZP2Q "uzp2q")
58c036c8
RS
2761 (UNSPEC_WHILERW "vec_check_raw_alias")
2762 (UNSPEC_WHILEWR "vec_check_war_alias")
36696774
RS
2763 (UNSPEC_ZIP1Q "zip1q")
2764 (UNSPEC_ZIP2Q "zip2q")
d45b20a5 2765 (UNSPEC_COND_FABS "abs")
cb18e86d 2766 (UNSPEC_COND_FADD "add")
624d0f07
RS
2767 (UNSPEC_COND_FCADD90 "cadd90")
2768 (UNSPEC_COND_FCADD270 "cadd270")
2769 (UNSPEC_COND_FCMLA "fcmla")
2770 (UNSPEC_COND_FCMLA90 "fcmla90")
2771 (UNSPEC_COND_FCMLA180 "fcmla180")
2772 (UNSPEC_COND_FCMLA270 "fcmla270")
99361551
RS
2773 (UNSPEC_COND_FCVT "fcvt")
2774 (UNSPEC_COND_FCVTZS "fix_trunc")
2775 (UNSPEC_COND_FCVTZU "fixuns_trunc")
cb18e86d 2776 (UNSPEC_COND_FDIV "div")
624d0f07 2777 (UNSPEC_COND_FMAX "smax_nan")
cb18e86d 2778 (UNSPEC_COND_FMAXNM "smax")
624d0f07 2779 (UNSPEC_COND_FMIN "smin_nan")
cb18e86d 2780 (UNSPEC_COND_FMINNM "smin")
b41d1f6e
RS
2781 (UNSPEC_COND_FMLA "fma")
2782 (UNSPEC_COND_FMLS "fnma")
cb18e86d 2783 (UNSPEC_COND_FMUL "mul")
624d0f07 2784 (UNSPEC_COND_FMULX "mulx")
d45b20a5 2785 (UNSPEC_COND_FNEG "neg")
b41d1f6e 2786 (UNSPEC_COND_FNMLA "fnms")
cb18e86d 2787 (UNSPEC_COND_FNMLS "fms")
624d0f07 2788 (UNSPEC_COND_FRECPX "frecpx")
d45b20a5
RS
2789 (UNSPEC_COND_FRINTA "round")
2790 (UNSPEC_COND_FRINTI "nearbyint")
2791 (UNSPEC_COND_FRINTM "floor")
2792 (UNSPEC_COND_FRINTN "frintn")
2793 (UNSPEC_COND_FRINTP "ceil")
2794 (UNSPEC_COND_FRINTX "rint")
2795 (UNSPEC_COND_FRINTZ "btrunc")
624d0f07 2796 (UNSPEC_COND_FSCALE "fscale")
d45b20a5 2797 (UNSPEC_COND_FSQRT "sqrt")
99361551
RS
2798 (UNSPEC_COND_FSUB "sub")
2799 (UNSPEC_COND_SCVTF "float")
2800 (UNSPEC_COND_UCVTF "floatuns")])
43cacb12 2801
998eaf97
JG
2802(define_int_attr maxmin_uns [(UNSPEC_UMAXV "umax")
2803 (UNSPEC_UMINV "umin")
2804 (UNSPEC_SMAXV "smax")
2805 (UNSPEC_SMINV "smin")
2806 (UNSPEC_FMAX "smax_nan")
2807 (UNSPEC_FMAXNMV "smax")
2808 (UNSPEC_FMAXV "smax_nan")
2809 (UNSPEC_FMIN "smin_nan")
2810 (UNSPEC_FMINNMV "smin")
1efafef3
TC
2811 (UNSPEC_FMINV "smin_nan")
2812 (UNSPEC_FMAXNM "fmax")
214c42fa 2813 (UNSPEC_FMINNM "fmin")
624d0f07 2814 (UNSPEC_COND_FMAX "fmax_nan")
214c42fa 2815 (UNSPEC_COND_FMAXNM "fmax")
624d0f07 2816 (UNSPEC_COND_FMIN "fmin_nan")
214c42fa 2817 (UNSPEC_COND_FMINNM "fmin")])
998eaf97
JG
2818
2819(define_int_attr maxmin_uns_op [(UNSPEC_UMAXV "umax")
2820 (UNSPEC_UMINV "umin")
2821 (UNSPEC_SMAXV "smax")
2822 (UNSPEC_SMINV "smin")
2823 (UNSPEC_FMAX "fmax")
2824 (UNSPEC_FMAXNMV "fmaxnm")
2825 (UNSPEC_FMAXV "fmax")
2826 (UNSPEC_FMIN "fmin")
2827 (UNSPEC_FMINNMV "fminnm")
1efafef3
TC
2828 (UNSPEC_FMINV "fmin")
2829 (UNSPEC_FMAXNM "fmaxnm")
2830 (UNSPEC_FMINNM "fminnm")])
202d0c11 2831
624d0f07
RS
2832(define_code_attr binqops_op [(ss_plus "sqadd")
2833 (us_plus "uqadd")
2834 (ss_minus "sqsub")
2835 (us_minus "uqsub")])
2836
2837(define_code_attr binqops_op_rev [(ss_plus "sqsub")
2838 (ss_minus "sqadd")])
2839
43cacb12
RS
2840;; The SVE logical instruction that implements an unspec.
2841(define_int_attr logicalf_op [(UNSPEC_ANDF "and")
2842 (UNSPEC_IORF "orr")
2843 (UNSPEC_XORF "eor")])
2844
624d0f07
RS
2845(define_int_attr last_op [(UNSPEC_CLASTA "after_last")
2846 (UNSPEC_CLASTB "last")
2847 (UNSPEC_LASTA "after_last")
2848 (UNSPEC_LASTB "last")])
2849
43cacb12 2850;; "s" for signed operations and "u" for unsigned ones.
624d0f07
RS
2851(define_int_attr su [(UNSPEC_SADDV "s")
2852 (UNSPEC_UADDV "u")
2853 (UNSPEC_UNPACKSHI "s")
43cacb12
RS
2854 (UNSPEC_UNPACKUHI "u")
2855 (UNSPEC_UNPACKSLO "s")
11e9443f
RS
2856 (UNSPEC_UNPACKULO "u")
2857 (UNSPEC_SMUL_HIGHPART "s")
99361551
RS
2858 (UNSPEC_UMUL_HIGHPART "u")
2859 (UNSPEC_COND_FCVTZS "s")
2860 (UNSPEC_COND_FCVTZU "u")
2861 (UNSPEC_COND_SCVTF "s")
58cc9876 2862 (UNSPEC_COND_UCVTF "u")
58cc9876
YW
2863 (UNSPEC_SMULHS "s") (UNSPEC_UMULHS "u")
2864 (UNSPEC_SMULHRS "s") (UNSPEC_UMULHRS "u")])
43cacb12 2865
43e9d192
IB
2866(define_int_attr sur [(UNSPEC_SHADD "s") (UNSPEC_UHADD "u")
2867 (UNSPEC_SRHADD "sr") (UNSPEC_URHADD "ur")
2868 (UNSPEC_SHSUB "s") (UNSPEC_UHSUB "u")
43e9d192 2869 (UNSPEC_ADDHN "") (UNSPEC_RADDHN "r")
75add2d0
KT
2870 (UNSPEC_SABAL "s") (UNSPEC_UABAL "u")
2871 (UNSPEC_SABDL2 "s") (UNSPEC_UABDL2 "u")
2872 (UNSPEC_SADALP "s") (UNSPEC_UADALP "u")
43e9d192
IB
2873 (UNSPEC_SUBHN "") (UNSPEC_RSUBHN "r")
2874 (UNSPEC_ADDHN2 "") (UNSPEC_RADDHN2 "r")
2875 (UNSPEC_SUBHN2 "") (UNSPEC_RSUBHN2 "r")
2876 (UNSPEC_SQXTN "s") (UNSPEC_UQXTN "u")
2877 (UNSPEC_USQADD "us") (UNSPEC_SUQADD "su")
2878 (UNSPEC_SSLI "s") (UNSPEC_USLI "u")
2879 (UNSPEC_SSRI "s") (UNSPEC_USRI "u")
2880 (UNSPEC_USRA "u") (UNSPEC_SSRA "s")
2881 (UNSPEC_URSRA "ur") (UNSPEC_SRSRA "sr")
2882 (UNSPEC_URSHR "ur") (UNSPEC_SRSHR "sr")
2883 (UNSPEC_SQSHLU "s") (UNSPEC_SQSHL "s")
2884 (UNSPEC_UQSHL "u")
2885 (UNSPEC_SQSHRUN "s") (UNSPEC_SQRSHRUN "s")
2886 (UNSPEC_SQSHRN "s") (UNSPEC_UQSHRN "u")
2887 (UNSPEC_SQRSHRN "s") (UNSPEC_UQRSHRN "u")
2888 (UNSPEC_USHL "u") (UNSPEC_SSHL "s")
2889 (UNSPEC_USHLL "u") (UNSPEC_SSHLL "s")
2890 (UNSPEC_URSHL "ur") (UNSPEC_SRSHL "sr")
2891 (UNSPEC_UQRSHL "u") (UNSPEC_SQRSHL "s")
7a08d813 2892 (UNSPEC_SDOT "s") (UNSPEC_UDOT "u")
8c197c85 2893 (UNSPEC_USDOT "us") (UNSPEC_SUDOT "su")
36696774
RS
2894 (UNSPEC_SMATMUL "s") (UNSPEC_UMATMUL "u")
2895 (UNSPEC_USMATMUL "us")
43e9d192
IB
2896])
2897
2898(define_int_attr r [(UNSPEC_SQDMULH "") (UNSPEC_SQRDMULH "r")
2899 (UNSPEC_SQSHRUN "") (UNSPEC_SQRSHRUN "r")
2900 (UNSPEC_SQSHRN "") (UNSPEC_UQSHRN "")
2901 (UNSPEC_SQRSHRN "r") (UNSPEC_UQRSHRN "r")
2902 (UNSPEC_SQSHL "") (UNSPEC_UQSHL "")
2903 (UNSPEC_SQRSHL "r")(UNSPEC_UQRSHL "r")
58cc9876
YW
2904 (UNSPEC_SMULHS "") (UNSPEC_UMULHS "")
2905 (UNSPEC_SMULHRS "r") (UNSPEC_UMULHRS "r")
43e9d192
IB
2906])
2907
2908(define_int_attr lr [(UNSPEC_SSLI "l") (UNSPEC_USLI "l")
0a09a948
RS
2909 (UNSPEC_SSRI "r") (UNSPEC_USRI "r")
2910 (UNSPEC_SQSHL "l") (UNSPEC_UQSHL "l")
2911 (UNSPEC_SQSHLU "l")
2912 (UNSPEC_SRSHR "r") (UNSPEC_URSHR "r")
2913 (UNSPEC_ASRD "r")
2914 (UNSPEC_SLI "l") (UNSPEC_SRI "r")])
43e9d192
IB
2915
2916(define_int_attr u [(UNSPEC_SQSHLU "u") (UNSPEC_SQSHL "") (UNSPEC_UQSHL "")
2917 (UNSPEC_SQSHRUN "u") (UNSPEC_SQRSHRUN "u")
42addb5a
RS
2918 (UNSPEC_SQSHRN "") (UNSPEC_UQSHRN "")
2919 (UNSPEC_SQRSHRN "") (UNSPEC_UQRSHRN "")
2920 (UNSPEC_SHADD "") (UNSPEC_UHADD "u")
2921 (UNSPEC_SRHADD "") (UNSPEC_URHADD "u")])
43e9d192 2922
624d0f07
RS
2923(define_int_attr fn [(UNSPEC_LDFF1 "f") (UNSPEC_LDNF1 "n")])
2924
2925(define_int_attr ab [(UNSPEC_CLASTA "a") (UNSPEC_CLASTB "b")
2926 (UNSPEC_LASTA "a") (UNSPEC_LASTB "b")])
2927
f78335df
DB
2928(define_int_attr bt [(UNSPEC_BFMLALB "b") (UNSPEC_BFMLALT "t")])
2929
43e9d192
IB
2930(define_int_attr addsub [(UNSPEC_SHADD "add")
2931 (UNSPEC_UHADD "add")
2932 (UNSPEC_SRHADD "add")
2933 (UNSPEC_URHADD "add")
2934 (UNSPEC_SHSUB "sub")
2935 (UNSPEC_UHSUB "sub")
43e9d192
IB
2936 (UNSPEC_ADDHN "add")
2937 (UNSPEC_SUBHN "sub")
2938 (UNSPEC_RADDHN "add")
2939 (UNSPEC_RSUBHN "sub")
2940 (UNSPEC_ADDHN2 "add")
2941 (UNSPEC_SUBHN2 "sub")
2942 (UNSPEC_RADDHN2 "add")
2943 (UNSPEC_RSUBHN2 "sub")])
2944
2d57b12e
YW
2945;; BSL variants: first commutative operand.
2946(define_int_attr bsl_1st [(1 "w") (2 "0")])
2947
2948;; BSL variants: second commutative operand.
2949(define_int_attr bsl_2nd [(1 "0") (2 "w")])
2950
2951;; BSL variants: duplicated input operand.
2952(define_int_attr bsl_dup [(1 "1") (2 "2")])
2953
2954;; BSL variants: operand which requires preserving via movprfx.
2955(define_int_attr bsl_mov [(1 "2") (2 "1")])
2956
cb23a30c
JG
2957(define_int_attr offsetlr [(UNSPEC_SSLI "") (UNSPEC_USLI "")
2958 (UNSPEC_SSRI "offset_")
2959 (UNSPEC_USRI "offset_")])
43e9d192 2960
42fc9a7f
JG
2961;; Standard pattern names for floating-point rounding instructions.
2962(define_int_attr frint_pattern [(UNSPEC_FRINTZ "btrunc")
2963 (UNSPEC_FRINTP "ceil")
2964 (UNSPEC_FRINTM "floor")
2965 (UNSPEC_FRINTI "nearbyint")
2966 (UNSPEC_FRINTX "rint")
0659ce6f
JG
2967 (UNSPEC_FRINTA "round")
2968 (UNSPEC_FRINTN "frintn")])
42fc9a7f
JG
2969
2970;; frint suffix for floating-point rounding instructions.
2971(define_int_attr frint_suffix [(UNSPEC_FRINTZ "z") (UNSPEC_FRINTP "p")
2972 (UNSPEC_FRINTM "m") (UNSPEC_FRINTI "i")
0659ce6f
JG
2973 (UNSPEC_FRINTX "x") (UNSPEC_FRINTA "a")
2974 (UNSPEC_FRINTN "n")])
42fc9a7f
JG
2975
2976(define_int_attr fcvt_pattern [(UNSPEC_FRINTZ "btrunc") (UNSPEC_FRINTA "round")
ce966824
JG
2977 (UNSPEC_FRINTP "ceil") (UNSPEC_FRINTM "floor")
2978 (UNSPEC_FRINTN "frintn")])
42fc9a7f 2979
3f598afe
JW
2980(define_int_attr fcvt_fixed_insn [(UNSPEC_SCVTF "scvtf")
2981 (UNSPEC_UCVTF "ucvtf")
2982 (UNSPEC_FCVTZS "fcvtzs")
2983 (UNSPEC_FCVTZU "fcvtzu")])
2984
db58fd89 2985;; Pointer authentication mnemonic prefix.
8fc16d72
ST
2986(define_int_attr pauth_mnem_prefix [(UNSPEC_PACIASP "pacia")
2987 (UNSPEC_PACIBSP "pacib")
2988 (UNSPEC_PACIA1716 "pacia")
2989 (UNSPEC_PACIB1716 "pacib")
2990 (UNSPEC_AUTIASP "autia")
2991 (UNSPEC_AUTIBSP "autib")
2992 (UNSPEC_AUTIA1716 "autia")
2993 (UNSPEC_AUTIB1716 "autib")])
2994
2995(define_int_attr pauth_key [(UNSPEC_PACIASP "AARCH64_KEY_A")
2996 (UNSPEC_PACIBSP "AARCH64_KEY_B")
2997 (UNSPEC_PACIA1716 "AARCH64_KEY_A")
2998 (UNSPEC_PACIB1716 "AARCH64_KEY_B")
2999 (UNSPEC_AUTIASP "AARCH64_KEY_A")
3000 (UNSPEC_AUTIBSP "AARCH64_KEY_B")
3001 (UNSPEC_AUTIA1716 "AARCH64_KEY_A")
3002 (UNSPEC_AUTIB1716 "AARCH64_KEY_B")])
3003
3004;; Pointer authentication HINT number for NOP space instructions using A and
3005;; B key.
3006(define_int_attr pauth_hint_num [(UNSPEC_PACIASP "25")
3007 (UNSPEC_PACIBSP "27")
3008 (UNSPEC_AUTIASP "29")
3009 (UNSPEC_AUTIBSP "31")
3010 (UNSPEC_PACIA1716 "8")
3011 (UNSPEC_PACIB1716 "10")
3012 (UNSPEC_AUTIA1716 "12")
3013 (UNSPEC_AUTIB1716 "14")])
db58fd89 3014
3e2751ce 3015(define_int_attr perm_insn [(UNSPEC_ZIP1 "zip1") (UNSPEC_ZIP2 "zip2")
36696774 3016 (UNSPEC_ZIP1Q "zip1") (UNSPEC_ZIP2Q "zip2")
3e2751ce 3017 (UNSPEC_TRN1 "trn1") (UNSPEC_TRN2 "trn2")
36696774
RS
3018 (UNSPEC_TRN1Q "trn1") (UNSPEC_TRN2Q "trn2")
3019 (UNSPEC_UZP1 "uzp1") (UNSPEC_UZP2 "uzp2")
3020 (UNSPEC_UZP1Q "uzp1") (UNSPEC_UZP2Q "uzp2")])
cc4d934f 3021
923fcec3
AL
3022; op code for REV instructions (size within which elements are reversed).
3023(define_int_attr rev_op [(UNSPEC_REV64 "64") (UNSPEC_REV32 "32")
3024 (UNSPEC_REV16 "16")])
3025
3e2751ce 3026(define_int_attr perm_hilo [(UNSPEC_UNPACKSHI "hi") (UNSPEC_UNPACKUHI "hi")
43cacb12 3027 (UNSPEC_UNPACKSLO "lo") (UNSPEC_UNPACKULO "lo")])
0050faf8 3028
9bfb28ed
RS
3029;; Return true if the associated optab refers to the high-numbered lanes,
3030;; false if it refers to the low-numbered lanes. The convention is for
3031;; "hi" to refer to the low-numbered lanes (the first ones in memory)
3032;; for big-endian.
3033(define_int_attr hi_lanes_optab [(UNSPEC_UNPACKSHI "!BYTES_BIG_ENDIAN")
3034 (UNSPEC_UNPACKUHI "!BYTES_BIG_ENDIAN")
3035 (UNSPEC_UNPACKSLO "BYTES_BIG_ENDIAN")
3036 (UNSPEC_UNPACKULO "BYTES_BIG_ENDIAN")])
3037
5d357f26
KT
3038(define_int_attr crc_variant [(UNSPEC_CRC32B "crc32b") (UNSPEC_CRC32H "crc32h")
3039 (UNSPEC_CRC32W "crc32w") (UNSPEC_CRC32X "crc32x")
3040 (UNSPEC_CRC32CB "crc32cb") (UNSPEC_CRC32CH "crc32ch")
3041 (UNSPEC_CRC32CW "crc32cw") (UNSPEC_CRC32CX "crc32cx")])
3042
3043(define_int_attr crc_mode [(UNSPEC_CRC32B "QI") (UNSPEC_CRC32H "HI")
3044 (UNSPEC_CRC32W "SI") (UNSPEC_CRC32X "DI")
3045 (UNSPEC_CRC32CB "QI") (UNSPEC_CRC32CH "HI")
3046 (UNSPEC_CRC32CW "SI") (UNSPEC_CRC32CX "DI")])
3047
5a7a4e80
TB
3048(define_int_attr aes_op [(UNSPEC_AESE "e") (UNSPEC_AESD "d")])
3049(define_int_attr aesmc_op [(UNSPEC_AESMC "mc") (UNSPEC_AESIMC "imc")])
30442682
TB
3050
3051(define_int_attr sha1_op [(UNSPEC_SHA1C "c") (UNSPEC_SHA1P "p")
3052 (UNSPEC_SHA1M "m")])
b9cb0a44
TB
3053
3054(define_int_attr sha256_op [(UNSPEC_SHA256H "") (UNSPEC_SHA256H2 "2")])
57b26d65
MW
3055
3056(define_int_attr rdma_as [(UNSPEC_SQRDMLAH "a") (UNSPEC_SQRDMLSH "s")])
27086ea3
MC
3057
3058(define_int_attr sha512_op [(UNSPEC_SHA512H "") (UNSPEC_SHA512H2 "2")])
3059
3060(define_int_attr sm3tt_op [(UNSPEC_SM3TT1A "1a") (UNSPEC_SM3TT1B "1b")
3061 (UNSPEC_SM3TT2A "2a") (UNSPEC_SM3TT2B "2b")])
3062
3063(define_int_attr sm3part_op [(UNSPEC_SM3PARTW1 "1") (UNSPEC_SM3PARTW2 "2")])
3064
3065(define_int_attr f16mac1 [(UNSPEC_FMLAL "a") (UNSPEC_FMLSL "s")
3066 (UNSPEC_FMLAL2 "a") (UNSPEC_FMLSL2 "s")])
43cacb12 3067
10bd1d96
KT
3068(define_int_attr frintnzs_op [(UNSPEC_FRINT32Z "frint32z") (UNSPEC_FRINT32X "frint32x")
3069 (UNSPEC_FRINT64Z "frint64z") (UNSPEC_FRINT64X "frint64x")])
3070
43cacb12 3071;; The condition associated with an UNSPEC_COND_<xx>.
624d0f07
RS
3072(define_int_attr cmp_op [(UNSPEC_COND_CMPEQ_WIDE "eq")
3073 (UNSPEC_COND_CMPGE_WIDE "ge")
3074 (UNSPEC_COND_CMPGT_WIDE "gt")
3075 (UNSPEC_COND_CMPHI_WIDE "hi")
3076 (UNSPEC_COND_CMPHS_WIDE "hs")
3077 (UNSPEC_COND_CMPLE_WIDE "le")
3078 (UNSPEC_COND_CMPLO_WIDE "lo")
3079 (UNSPEC_COND_CMPLS_WIDE "ls")
3080 (UNSPEC_COND_CMPLT_WIDE "lt")
3081 (UNSPEC_COND_CMPNE_WIDE "ne")
3082 (UNSPEC_COND_FCMEQ "eq")
cb18e86d
RS
3083 (UNSPEC_COND_FCMGE "ge")
3084 (UNSPEC_COND_FCMGT "gt")
3085 (UNSPEC_COND_FCMLE "le")
3086 (UNSPEC_COND_FCMLT "lt")
4a942af6 3087 (UNSPEC_COND_FCMNE "ne")
0a09a948
RS
3088 (UNSPEC_WHILEGE "ge")
3089 (UNSPEC_WHILEGT "gt")
3090 (UNSPEC_WHILEHI "hi")
3091 (UNSPEC_WHILEHS "hs")
6ad9571b
RS
3092 (UNSPEC_WHILELE "le")
3093 (UNSPEC_WHILELO "lo")
3094 (UNSPEC_WHILELS "ls")
3095 (UNSPEC_WHILELT "lt")
58c036c8
RS
3096 (UNSPEC_WHILERW "rw")
3097 (UNSPEC_WHILEWR "wr")])
624d0f07 3098
0a09a948
RS
3099(define_int_attr while_optab_cmp [(UNSPEC_WHILEGE "ge")
3100 (UNSPEC_WHILEGT "gt")
3101 (UNSPEC_WHILEHI "ugt")
3102 (UNSPEC_WHILEHS "uge")
3103 (UNSPEC_WHILELE "le")
6ad9571b
RS
3104 (UNSPEC_WHILELO "ult")
3105 (UNSPEC_WHILELS "ule")
bad5e58a
RS
3106 (UNSPEC_WHILELT "lt")
3107 (UNSPEC_WHILERW "rw")
3108 (UNSPEC_WHILEWR "wr")])
624d0f07 3109
58c036c8
RS
3110(define_int_attr raw_war [(UNSPEC_WHILERW "raw")
3111 (UNSPEC_WHILEWR "war")])
3112
624d0f07
RS
3113(define_int_attr brk_op [(UNSPEC_BRKA "a") (UNSPEC_BRKB "b")
3114 (UNSPEC_BRKN "n")
3115 (UNSPEC_BRKPA "pa") (UNSPEC_BRKPB "pb")])
3116
3117(define_int_attr sve_pred_op [(UNSPEC_PFIRST "pfirst") (UNSPEC_PNEXT "pnext")])
cb18e86d 3118
0a09a948
RS
3119(define_int_attr sve_int_op [(UNSPEC_ADCLB "adclb")
3120 (UNSPEC_ADCLT "adclt")
3121 (UNSPEC_ADDHNB "addhnb")
3122 (UNSPEC_ADDHNT "addhnt")
3123 (UNSPEC_ADDP "addp")
3124 (UNSPEC_ANDV "andv")
624d0f07 3125 (UNSPEC_ASHIFTRT_WIDE "asr")
0a09a948
RS
3126 (UNSPEC_ASHIFT_WIDE "lsl")
3127 (UNSPEC_ASRD "asrd")
3128 (UNSPEC_BDEP "bdep")
3129 (UNSPEC_BEXT "bext")
3130 (UNSPEC_BGRP "bgrp")
3131 (UNSPEC_CADD90 "cadd")
3132 (UNSPEC_CADD270 "cadd")
3133 (UNSPEC_CDOT "cdot")
3134 (UNSPEC_CDOT90 "cdot")
3135 (UNSPEC_CDOT180 "cdot")
3136 (UNSPEC_CDOT270 "cdot")
3137 (UNSPEC_CMLA "cmla")
3138 (UNSPEC_CMLA90 "cmla")
3139 (UNSPEC_CMLA180 "cmla")
3140 (UNSPEC_CMLA270 "cmla")
3141 (UNSPEC_EORBT "eorbt")
3142 (UNSPEC_EORTB "eortb")
3143 (UNSPEC_IORV "orv")
624d0f07 3144 (UNSPEC_LSHIFTRT_WIDE "lsr")
0a09a948
RS
3145 (UNSPEC_MATCH "match")
3146 (UNSPEC_NMATCH "nmatch")
3147 (UNSPEC_PMULLB "pmullb")
3148 (UNSPEC_PMULLB_PAIR "pmullb")
3149 (UNSPEC_PMULLT "pmullt")
3150 (UNSPEC_PMULLT_PAIR "pmullt")
3151 (UNSPEC_RADDHNB "raddhnb")
3152 (UNSPEC_RADDHNT "raddhnt")
624d0f07 3153 (UNSPEC_RBIT "rbit")
d7a09c44
RS
3154 (UNSPEC_REVB "revb")
3155 (UNSPEC_REVH "revh")
0a09a948
RS
3156 (UNSPEC_REVW "revw")
3157 (UNSPEC_RSHRNB "rshrnb")
3158 (UNSPEC_RSHRNT "rshrnt")
3159 (UNSPEC_RSQRTE "ursqrte")
3160 (UNSPEC_RSUBHNB "rsubhnb")
3161 (UNSPEC_RSUBHNT "rsubhnt")
3162 (UNSPEC_SABDLB "sabdlb")
3163 (UNSPEC_SABDLT "sabdlt")
3164 (UNSPEC_SADALP "sadalp")
3165 (UNSPEC_SADDLB "saddlb")
3166 (UNSPEC_SADDLBT "saddlbt")
3167 (UNSPEC_SADDLT "saddlt")
3168 (UNSPEC_SADDWB "saddwb")
3169 (UNSPEC_SADDWT "saddwt")
3170 (UNSPEC_SBCLB "sbclb")
3171 (UNSPEC_SBCLT "sbclt")
3172 (UNSPEC_SHADD "shadd")
3173 (UNSPEC_SHRNB "shrnb")
3174 (UNSPEC_SHRNT "shrnt")
3175 (UNSPEC_SHSUB "shsub")
3176 (UNSPEC_SLI "sli")
3177 (UNSPEC_SMAXP "smaxp")
3178 (UNSPEC_SMAXV "smaxv")
3179 (UNSPEC_SMINP "sminp")
3180 (UNSPEC_SMINV "sminv")
3181 (UNSPEC_SMUL_HIGHPART "smulh")
3182 (UNSPEC_SMULLB "smullb")
3183 (UNSPEC_SMULLT "smullt")
3184 (UNSPEC_SQCADD90 "sqcadd")
3185 (UNSPEC_SQCADD270 "sqcadd")
3186 (UNSPEC_SQDMULH "sqdmulh")
3187 (UNSPEC_SQDMULLB "sqdmullb")
3188 (UNSPEC_SQDMULLBT "sqdmullbt")
3189 (UNSPEC_SQDMULLT "sqdmullt")
3190 (UNSPEC_SQRDCMLAH "sqrdcmlah")
3191 (UNSPEC_SQRDCMLAH90 "sqrdcmlah")
3192 (UNSPEC_SQRDCMLAH180 "sqrdcmlah")
3193 (UNSPEC_SQRDCMLAH270 "sqrdcmlah")
3194 (UNSPEC_SQRDMLAH "sqrdmlah")
3195 (UNSPEC_SQRDMLSH "sqrdmlsh")
3196 (UNSPEC_SQRDMULH "sqrdmulh")
3197 (UNSPEC_SQRSHL "sqrshl")
3198 (UNSPEC_SQRSHRNB "sqrshrnb")
3199 (UNSPEC_SQRSHRNT "sqrshrnt")
3200 (UNSPEC_SQRSHRUNB "sqrshrunb")
3201 (UNSPEC_SQRSHRUNT "sqrshrunt")
3202 (UNSPEC_SQSHL "sqshl")
3203 (UNSPEC_SQSHLU "sqshlu")
3204 (UNSPEC_SQSHRNB "sqshrnb")
3205 (UNSPEC_SQSHRNT "sqshrnt")
3206 (UNSPEC_SQSHRUNB "sqshrunb")
3207 (UNSPEC_SQSHRUNT "sqshrunt")
3208 (UNSPEC_SQXTNB "sqxtnb")
3209 (UNSPEC_SQXTNT "sqxtnt")
3210 (UNSPEC_SQXTUNB "sqxtunb")
3211 (UNSPEC_SQXTUNT "sqxtunt")
3212 (UNSPEC_SRHADD "srhadd")
3213 (UNSPEC_SRI "sri")
3214 (UNSPEC_SRSHL "srshl")
3215 (UNSPEC_SRSHR "srshr")
3216 (UNSPEC_SSHLLB "sshllb")
3217 (UNSPEC_SSHLLT "sshllt")
3218 (UNSPEC_SSUBLB "ssublb")
3219 (UNSPEC_SSUBLBT "ssublbt")
3220 (UNSPEC_SSUBLT "ssublt")
3221 (UNSPEC_SSUBLTB "ssubltb")
3222 (UNSPEC_SSUBWB "ssubwb")
3223 (UNSPEC_SSUBWT "ssubwt")
3224 (UNSPEC_SUBHNB "subhnb")
3225 (UNSPEC_SUBHNT "subhnt")
3226 (UNSPEC_SUQADD "suqadd")
3227 (UNSPEC_UABDLB "uabdlb")
3228 (UNSPEC_UABDLT "uabdlt")
3229 (UNSPEC_UADALP "uadalp")
3230 (UNSPEC_UADDLB "uaddlb")
3231 (UNSPEC_UADDLT "uaddlt")
3232 (UNSPEC_UADDWB "uaddwb")
3233 (UNSPEC_UADDWT "uaddwt")
3234 (UNSPEC_UHADD "uhadd")
3235 (UNSPEC_UHSUB "uhsub")
3236 (UNSPEC_UMAXP "umaxp")
3237 (UNSPEC_UMAXV "umaxv")
3238 (UNSPEC_UMINP "uminp")
3239 (UNSPEC_UMINV "uminv")
3240 (UNSPEC_UMUL_HIGHPART "umulh")
3241 (UNSPEC_UMULLB "umullb")
3242 (UNSPEC_UMULLT "umullt")
3243 (UNSPEC_UQRSHL "uqrshl")
3244 (UNSPEC_UQRSHRNB "uqrshrnb")
3245 (UNSPEC_UQRSHRNT "uqrshrnt")
3246 (UNSPEC_UQSHL "uqshl")
3247 (UNSPEC_UQSHRNB "uqshrnb")
3248 (UNSPEC_UQSHRNT "uqshrnt")
3249 (UNSPEC_UQXTNB "uqxtnb")
3250 (UNSPEC_UQXTNT "uqxtnt")
3251 (UNSPEC_URECPE "urecpe")
3252 (UNSPEC_URHADD "urhadd")
3253 (UNSPEC_URSHL "urshl")
3254 (UNSPEC_URSHR "urshr")
3255 (UNSPEC_USHLLB "ushllb")
3256 (UNSPEC_USHLLT "ushllt")
3257 (UNSPEC_USQADD "usqadd")
3258 (UNSPEC_USUBLB "usublb")
3259 (UNSPEC_USUBLT "usublt")
3260 (UNSPEC_USUBWB "usubwb")
3261 (UNSPEC_USUBWT "usubwt")
3262 (UNSPEC_XORV "eorv")])
3263
3264(define_int_attr sve_int_op_rev [(UNSPEC_SHADD "shadd")
3265 (UNSPEC_SHSUB "shsubr")
3266 (UNSPEC_SQRSHL "sqrshlr")
3267 (UNSPEC_SRHADD "srhadd")
3268 (UNSPEC_SRSHL "srshlr")
3269 (UNSPEC_UHADD "uhadd")
3270 (UNSPEC_UHSUB "uhsubr")
3271 (UNSPEC_UQRSHL "uqrshlr")
3272 (UNSPEC_URHADD "urhadd")
3273 (UNSPEC_URSHL "urshlr")])
3274
3275(define_int_attr sve_int_add_op [(UNSPEC_SABDLB "sabalb")
3276 (UNSPEC_SABDLT "sabalt")
3277 (UNSPEC_SMULLB "smlalb")
3278 (UNSPEC_SMULLT "smlalt")
3279 (UNSPEC_UABDLB "uabalb")
3280 (UNSPEC_UABDLT "uabalt")
3281 (UNSPEC_UMULLB "umlalb")
3282 (UNSPEC_UMULLT "umlalt")])
3283
3284(define_int_attr sve_int_qadd_op [(UNSPEC_SQDMULLB "sqdmlalb")
3285 (UNSPEC_SQDMULLBT "sqdmlalbt")
3286 (UNSPEC_SQDMULLT "sqdmlalt")])
3287
3288(define_int_attr sve_int_sub_op [(UNSPEC_SMULLB "smlslb")
3289 (UNSPEC_SMULLT "smlslt")
3290 (UNSPEC_UMULLB "umlslb")
3291 (UNSPEC_UMULLT "umlslt")])
3292
3293(define_int_attr sve_int_qsub_op [(UNSPEC_SQDMULLB "sqdmlslb")
3294 (UNSPEC_SQDMULLBT "sqdmlslbt")
3295 (UNSPEC_SQDMULLT "sqdmlslt")])
b0760a40 3296
896dff99
RS
3297(define_int_attr sve_fp_op [(UNSPEC_BFDOT "bfdot")
3298 (UNSPEC_BFMLALB "bfmlalb")
3299 (UNSPEC_BFMLALT "bfmlalt")
3300 (UNSPEC_BFMMLA "bfmmla")
3301 (UNSPEC_FRECPE "frecpe")
624d0f07
RS
3302 (UNSPEC_FRECPS "frecps")
3303 (UNSPEC_RSQRTE "frsqrte")
3304 (UNSPEC_RSQRTS "frsqrts")
0a09a948 3305 (UNSPEC_FADDP "faddp")
624d0f07 3306 (UNSPEC_FADDV "faddv")
36696774 3307 (UNSPEC_FEXPA "fexpa")
0a09a948 3308 (UNSPEC_FMAXNMP "fmaxnmp")
b0760a40 3309 (UNSPEC_FMAXNMV "fmaxnmv")
0a09a948 3310 (UNSPEC_FMAXP "fmaxp")
b0760a40 3311 (UNSPEC_FMAXV "fmaxv")
0a09a948 3312 (UNSPEC_FMINNMP "fminnmp")
b0760a40 3313 (UNSPEC_FMINNMV "fminnmv")
0a09a948 3314 (UNSPEC_FMINP "fminp")
b0760a40 3315 (UNSPEC_FMINV "fminv")
624d0f07 3316 (UNSPEC_FMLA "fmla")
0a09a948
RS
3317 (UNSPEC_FMLALB "fmlalb")
3318 (UNSPEC_FMLALT "fmlalt")
624d0f07 3319 (UNSPEC_FMLS "fmls")
0a09a948
RS
3320 (UNSPEC_FMLSLB "fmlslb")
3321 (UNSPEC_FMLSLT "fmlslt")
36696774 3322 (UNSPEC_FMMLA "fmmla")
624d0f07
RS
3323 (UNSPEC_FTSMUL "ftsmul")
3324 (UNSPEC_FTSSEL "ftssel")
b0760a40 3325 (UNSPEC_COND_FABS "fabs")
d45b20a5 3326 (UNSPEC_COND_FADD "fadd")
0a09a948
RS
3327 (UNSPEC_COND_FCVTLT "fcvtlt")
3328 (UNSPEC_COND_FCVTX "fcvtx")
cb18e86d 3329 (UNSPEC_COND_FDIV "fdiv")
0a09a948 3330 (UNSPEC_COND_FLOGB "flogb")
624d0f07 3331 (UNSPEC_COND_FMAX "fmax")
cb18e86d 3332 (UNSPEC_COND_FMAXNM "fmaxnm")
624d0f07 3333 (UNSPEC_COND_FMIN "fmin")
cb18e86d
RS
3334 (UNSPEC_COND_FMINNM "fminnm")
3335 (UNSPEC_COND_FMUL "fmul")
624d0f07 3336 (UNSPEC_COND_FMULX "fmulx")
d45b20a5 3337 (UNSPEC_COND_FNEG "fneg")
624d0f07 3338 (UNSPEC_COND_FRECPX "frecpx")
d45b20a5
RS
3339 (UNSPEC_COND_FRINTA "frinta")
3340 (UNSPEC_COND_FRINTI "frinti")
3341 (UNSPEC_COND_FRINTM "frintm")
3342 (UNSPEC_COND_FRINTN "frintn")
3343 (UNSPEC_COND_FRINTP "frintp")
3344 (UNSPEC_COND_FRINTX "frintx")
3345 (UNSPEC_COND_FRINTZ "frintz")
624d0f07 3346 (UNSPEC_COND_FSCALE "fscale")
d45b20a5 3347 (UNSPEC_COND_FSQRT "fsqrt")
cb18e86d
RS
3348 (UNSPEC_COND_FSUB "fsub")])
3349
3350(define_int_attr sve_fp_op_rev [(UNSPEC_COND_FADD "fadd")
3351 (UNSPEC_COND_FDIV "fdivr")
624d0f07 3352 (UNSPEC_COND_FMAX "fmax")
cb18e86d 3353 (UNSPEC_COND_FMAXNM "fmaxnm")
624d0f07 3354 (UNSPEC_COND_FMIN "fmin")
cb18e86d
RS
3355 (UNSPEC_COND_FMINNM "fminnm")
3356 (UNSPEC_COND_FMUL "fmul")
624d0f07 3357 (UNSPEC_COND_FMULX "fmulx")
cb18e86d 3358 (UNSPEC_COND_FSUB "fsubr")])
a08acce8 3359
0a09a948
RS
3360(define_int_attr rot [(UNSPEC_CADD90 "90")
3361 (UNSPEC_CADD270 "270")
3362 (UNSPEC_CDOT "0")
3363 (UNSPEC_CDOT90 "90")
3364 (UNSPEC_CDOT180 "180")
3365 (UNSPEC_CDOT270 "270")
3366 (UNSPEC_CMLA "0")
3367 (UNSPEC_CMLA90 "90")
3368 (UNSPEC_CMLA180 "180")
3369 (UNSPEC_CMLA270 "270")
3370 (UNSPEC_FCADD90 "90")
9d63f43b
TC
3371 (UNSPEC_FCADD270 "270")
3372 (UNSPEC_FCMLA "0")
3373 (UNSPEC_FCMLA90 "90")
3374 (UNSPEC_FCMLA180 "180")
624d0f07 3375 (UNSPEC_FCMLA270 "270")
0a09a948
RS
3376 (UNSPEC_SQCADD90 "90")
3377 (UNSPEC_SQCADD270 "270")
3378 (UNSPEC_SQRDCMLAH "0")
3379 (UNSPEC_SQRDCMLAH90 "90")
3380 (UNSPEC_SQRDCMLAH180 "180")
3381 (UNSPEC_SQRDCMLAH270 "270")
624d0f07
RS
3382 (UNSPEC_COND_FCADD90 "90")
3383 (UNSPEC_COND_FCADD270 "270")
3384 (UNSPEC_COND_FCMLA "0")
3385 (UNSPEC_COND_FCMLA90 "90")
3386 (UNSPEC_COND_FCMLA180 "180")
3387 (UNSPEC_COND_FCMLA270 "270")])
9d63f43b 3388
b41d1f6e
RS
3389(define_int_attr sve_fmla_op [(UNSPEC_COND_FMLA "fmla")
3390 (UNSPEC_COND_FMLS "fmls")
3391 (UNSPEC_COND_FNMLA "fnmla")
3392 (UNSPEC_COND_FNMLS "fnmls")])
3393
3394(define_int_attr sve_fmad_op [(UNSPEC_COND_FMLA "fmad")
3395 (UNSPEC_COND_FMLS "fmsb")
3396 (UNSPEC_COND_FNMLA "fnmad")
3397 (UNSPEC_COND_FNMLS "fnmsb")])
0254ed79 3398
624d0f07
RS
3399;; The register constraint to use for the final operand in a binary BRK.
3400(define_int_attr brk_reg_con [(UNSPEC_BRKN "0")
3401 (UNSPEC_BRKPA "Upa") (UNSPEC_BRKPB "Upa")])
3402
3403;; The register number to print for the above.
3404(define_int_attr brk_reg_opno [(UNSPEC_BRKN "0")
3405 (UNSPEC_BRKPA "3") (UNSPEC_BRKPB "3")])
3406
0254ed79
RS
3407;; The predicate to use for the first input operand in a floating-point
3408;; <optab><mode>3 pattern.
3409(define_int_attr sve_pred_fp_rhs1_operand
3410 [(UNSPEC_COND_FADD "register_operand")
3411 (UNSPEC_COND_FDIV "register_operand")
624d0f07 3412 (UNSPEC_COND_FMAX "register_operand")
0254ed79 3413 (UNSPEC_COND_FMAXNM "register_operand")
624d0f07 3414 (UNSPEC_COND_FMIN "register_operand")
0254ed79
RS
3415 (UNSPEC_COND_FMINNM "register_operand")
3416 (UNSPEC_COND_FMUL "register_operand")
624d0f07 3417 (UNSPEC_COND_FMULX "register_operand")
0254ed79
RS
3418 (UNSPEC_COND_FSUB "aarch64_sve_float_arith_operand")])
3419
3420;; The predicate to use for the second input operand in a floating-point
3421;; <optab><mode>3 pattern.
3422(define_int_attr sve_pred_fp_rhs2_operand
3423 [(UNSPEC_COND_FADD "aarch64_sve_float_arith_with_sub_operand")
3424 (UNSPEC_COND_FDIV "register_operand")
624d0f07 3425 (UNSPEC_COND_FMAX "aarch64_sve_float_maxmin_operand")
75079ddf 3426 (UNSPEC_COND_FMAXNM "aarch64_sve_float_maxmin_operand")
624d0f07 3427 (UNSPEC_COND_FMIN "aarch64_sve_float_maxmin_operand")
75079ddf 3428 (UNSPEC_COND_FMINNM "aarch64_sve_float_maxmin_operand")
0254ed79 3429 (UNSPEC_COND_FMUL "aarch64_sve_float_mul_operand")
624d0f07 3430 (UNSPEC_COND_FMULX "register_operand")
0254ed79 3431 (UNSPEC_COND_FSUB "register_operand")])
a19ba9e1
RS
3432
3433;; Likewise for immediates only.
3434(define_int_attr sve_pred_fp_rhs2_immediate
624d0f07
RS
3435 [(UNSPEC_COND_FMAX "aarch64_sve_float_maxmin_immediate")
3436 (UNSPEC_COND_FMAXNM "aarch64_sve_float_maxmin_immediate")
3437 (UNSPEC_COND_FMIN "aarch64_sve_float_maxmin_immediate")
a19ba9e1
RS
3438 (UNSPEC_COND_FMINNM "aarch64_sve_float_maxmin_immediate")
3439 (UNSPEC_COND_FMUL "aarch64_sve_float_mul_immediate")])
d7a09c44 3440
624d0f07
RS
3441;; The maximum number of element bits that an instruction can handle.
3442(define_int_attr max_elem_bits [(UNSPEC_UADDV "64") (UNSPEC_SADDV "32")
3443 (UNSPEC_PFIRST "8") (UNSPEC_PNEXT "64")])
3444
d7a09c44 3445;; The minimum number of element bits that an instruction can handle.
624d0f07
RS
3446(define_int_attr min_elem_bits [(UNSPEC_RBIT "8")
3447 (UNSPEC_REVB "16")
d7a09c44
RS
3448 (UNSPEC_REVH "32")
3449 (UNSPEC_REVW "64")])
58c036c8
RS
3450
3451(define_int_attr unspec [(UNSPEC_WHILERW "UNSPEC_WHILERW")
3452 (UNSPEC_WHILEWR "UNSPEC_WHILEWR")])