Mercurial > hg > CbC > CbC_gcc
comparison gcc/config/aarch64/iterators.md @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children | 1830386684a0 |
comparison
equal
deleted
inserted
replaced
111:04ced10e8804 | 131:84e7813d76e9 |
---|---|
1 ;; Machine description for AArch64 architecture. | 1 ;; Machine description for AArch64 architecture. |
2 ;; Copyright (C) 2009-2017 Free Software Foundation, Inc. | 2 ;; Copyright (C) 2009-2018 Free Software Foundation, Inc. |
3 ;; Contributed by ARM Ltd. | 3 ;; Contributed by ARM Ltd. |
4 ;; | 4 ;; |
5 ;; This file is part of GCC. | 5 ;; This file is part of GCC. |
6 ;; | 6 ;; |
7 ;; GCC is free software; you can redistribute it and/or modify it | 7 ;; GCC is free software; you can redistribute it and/or modify it |
33 (define_mode_iterator SHORT [QI HI]) | 33 (define_mode_iterator SHORT [QI HI]) |
34 | 34 |
35 ;; Iterator for all integer modes (up to 64-bit) | 35 ;; Iterator for all integer modes (up to 64-bit) |
36 (define_mode_iterator ALLI [QI HI SI DI]) | 36 (define_mode_iterator ALLI [QI HI SI DI]) |
37 | 37 |
38 ;; Iterator for all integer modes (up to 128-bit) | |
39 (define_mode_iterator ALLI_TI [QI HI SI DI TI]) | |
40 | |
38 ;; Iterator for all integer modes that can be extended (up to 64-bit) | 41 ;; Iterator for all integer modes that can be extended (up to 64-bit) |
39 (define_mode_iterator ALLX [QI HI SI]) | 42 (define_mode_iterator ALLX [QI HI SI]) |
40 | 43 |
41 ;; Iterator for General Purpose Floating-point registers (32- and 64-bit modes) | 44 ;; Iterator for General Purpose Floating-point registers (32- and 64-bit modes) |
42 (define_mode_iterator GPF [SF DF]) | 45 (define_mode_iterator GPF [SF DF]) |
54 (define_mode_iterator VDF [V2SF V4HF]) | 57 (define_mode_iterator VDF [V2SF V4HF]) |
55 | 58 |
56 ;; Iterator for all scalar floating point modes (SF, DF and TF) | 59 ;; Iterator for all scalar floating point modes (SF, DF and TF) |
57 (define_mode_iterator GPF_TF [SF DF TF]) | 60 (define_mode_iterator GPF_TF [SF DF TF]) |
58 | 61 |
59 ;; Integer vector modes. | 62 ;; Integer Advanced SIMD modes. |
60 (define_mode_iterator VDQ_I [V8QI V16QI V4HI V8HI V2SI V4SI V2DI]) | 63 (define_mode_iterator VDQ_I [V8QI V16QI V4HI V8HI V2SI V4SI V2DI]) |
61 | 64 |
62 ;; vector and scalar, 64 & 128-bit container, all integer modes | 65 ;; Advanced SIMD and scalar, 64 & 128-bit container, all integer modes. |
63 (define_mode_iterator VSDQ_I [V8QI V16QI V4HI V8HI V2SI V4SI V2DI QI HI SI DI]) | 66 (define_mode_iterator VSDQ_I [V8QI V16QI V4HI V8HI V2SI V4SI V2DI QI HI SI DI]) |
64 | 67 |
65 ;; vector and scalar, 64 & 128-bit container: all vector integer modes; | 68 ;; Advanced SIMD and scalar, 64 & 128-bit container: all Advanced SIMD |
66 ;; 64-bit scalar integer mode | 69 ;; integer modes; 64-bit scalar integer mode. |
67 (define_mode_iterator VSDQ_I_DI [V8QI V16QI V4HI V8HI V2SI V4SI V2DI DI]) | 70 (define_mode_iterator VSDQ_I_DI [V8QI V16QI V4HI V8HI V2SI V4SI V2DI DI]) |
68 | 71 |
69 ;; Double vector modes. | 72 ;; Double vector modes. |
70 (define_mode_iterator VD [V8QI V4HI V4HF V2SI V2SF]) | 73 (define_mode_iterator VD [V8QI V4HI V4HF V2SI V2SF]) |
71 | 74 |
72 ;; vector, 64-bit container, all integer modes | 75 ;; All modes stored in registers d0-d31. |
76 (define_mode_iterator DREG [V8QI V4HI V4HF V2SI V2SF DF]) | |
77 | |
78 ;; Copy of the above. | |
79 (define_mode_iterator DREG2 [V8QI V4HI V4HF V2SI V2SF DF]) | |
80 | |
81 ;; Advanced SIMD, 64-bit container, all integer modes. | |
73 (define_mode_iterator VD_BHSI [V8QI V4HI V2SI]) | 82 (define_mode_iterator VD_BHSI [V8QI V4HI V2SI]) |
74 | 83 |
75 ;; 128 and 64-bit container; 8, 16, 32-bit vector integer modes | 84 ;; 128 and 64-bit container; 8, 16, 32-bit vector integer modes |
76 (define_mode_iterator VDQ_BHSI [V8QI V16QI V4HI V8HI V2SI V4SI]) | 85 (define_mode_iterator VDQ_BHSI [V8QI V16QI V4HI V8HI V2SI V4SI]) |
77 | 86 |
78 ;; Quad vector modes. | 87 ;; Quad vector modes. |
79 (define_mode_iterator VQ [V16QI V8HI V4SI V2DI V8HF V4SF V2DF]) | 88 (define_mode_iterator VQ [V16QI V8HI V4SI V2DI V8HF V4SF V2DF]) |
89 | |
90 ;; Copy of the above. | |
91 (define_mode_iterator VQ2 [V16QI V8HI V4SI V2DI V8HF V4SF V2DF]) | |
92 | |
93 ;; Quad integer vector modes. | |
94 (define_mode_iterator VQ_I [V16QI V8HI V4SI V2DI]) | |
80 | 95 |
81 ;; VQ without 2 element modes. | 96 ;; VQ without 2 element modes. |
82 (define_mode_iterator VQ_NO2E [V16QI V8HI V4SI V8HF V4SF]) | 97 (define_mode_iterator VQ_NO2E [V16QI V8HI V4SI V8HF V4SF]) |
83 | 98 |
84 ;; Quad vector with only 2 element modes. | 99 ;; Quad vector with only 2 element modes. |
92 | 107 |
93 ;; This mode iterator allows :PTR to be used for patterns that operate on | 108 ;; This mode iterator allows :PTR to be used for patterns that operate on |
94 ;; pointer-sized quantities. Exactly one of the two alternatives will match. | 109 ;; pointer-sized quantities. Exactly one of the two alternatives will match. |
95 (define_mode_iterator PTR [(SI "ptr_mode == SImode") (DI "ptr_mode == DImode")]) | 110 (define_mode_iterator PTR [(SI "ptr_mode == SImode") (DI "ptr_mode == DImode")]) |
96 | 111 |
97 ;; Vector Float modes suitable for moving, loading and storing. | 112 ;; Advanced SIMD Float modes suitable for moving, loading and storing. |
98 (define_mode_iterator VDQF_F16 [V4HF V8HF V2SF V4SF V2DF]) | 113 (define_mode_iterator VDQF_F16 [V4HF V8HF V2SF V4SF V2DF]) |
99 | 114 |
100 ;; Vector Float modes. | 115 ;; Advanced SIMD Float modes. |
101 (define_mode_iterator VDQF [V2SF V4SF V2DF]) | 116 (define_mode_iterator VDQF [V2SF V4SF V2DF]) |
102 (define_mode_iterator VHSDF [(V4HF "TARGET_SIMD_F16INST") | 117 (define_mode_iterator VHSDF [(V4HF "TARGET_SIMD_F16INST") |
103 (V8HF "TARGET_SIMD_F16INST") | 118 (V8HF "TARGET_SIMD_F16INST") |
104 V2SF V4SF V2DF]) | 119 V2SF V4SF V2DF]) |
105 | 120 |
106 ;; Vector Float modes, and DF. | 121 ;; Advanced SIMD Float modes, and DF. |
107 (define_mode_iterator VHSDF_DF [(V4HF "TARGET_SIMD_F16INST") | 122 (define_mode_iterator VHSDF_DF [(V4HF "TARGET_SIMD_F16INST") |
108 (V8HF "TARGET_SIMD_F16INST") | 123 (V8HF "TARGET_SIMD_F16INST") |
109 V2SF V4SF V2DF DF]) | 124 V2SF V4SF V2DF DF]) |
110 (define_mode_iterator VHSDF_HSDF [(V4HF "TARGET_SIMD_F16INST") | 125 (define_mode_iterator VHSDF_HSDF [(V4HF "TARGET_SIMD_F16INST") |
111 (V8HF "TARGET_SIMD_F16INST") | 126 (V8HF "TARGET_SIMD_F16INST") |
112 V2SF V4SF V2DF | 127 V2SF V4SF V2DF |
113 (HF "TARGET_SIMD_F16INST") | 128 (HF "TARGET_SIMD_F16INST") |
114 SF DF]) | 129 SF DF]) |
115 | 130 |
116 ;; Vector single Float modes. | 131 ;; Advanced SIMD single Float modes. |
117 (define_mode_iterator VDQSF [V2SF V4SF]) | 132 (define_mode_iterator VDQSF [V2SF V4SF]) |
118 | 133 |
119 ;; Quad vector Float modes with half/single elements. | 134 ;; Quad vector Float modes with half/single elements. |
120 (define_mode_iterator VQ_HSF [V8HF V4SF]) | 135 (define_mode_iterator VQ_HSF [V8HF V4SF]) |
121 | 136 |
122 ;; Modes suitable to use as the return type of a vcond expression. | 137 ;; Modes suitable to use as the return type of a vcond expression. |
123 (define_mode_iterator VDQF_COND [V2SF V2SI V4SF V4SI V2DF V2DI]) | 138 (define_mode_iterator VDQF_COND [V2SF V2SI V4SF V4SI V2DF V2DI]) |
124 | 139 |
125 ;; All Float modes. | 140 ;; All scalar and Advanced SIMD Float modes. |
126 (define_mode_iterator VALLF [V2SF V4SF V2DF SF DF]) | 141 (define_mode_iterator VALLF [V2SF V4SF V2DF SF DF]) |
127 | 142 |
128 ;; Vector Float modes with 2 elements. | 143 ;; Advanced SIMD Float modes with 2 elements. |
129 (define_mode_iterator V2F [V2SF V2DF]) | 144 (define_mode_iterator V2F [V2SF V2DF]) |
130 | 145 |
131 ;; All vector modes on which we support any arithmetic operations. | 146 ;; All Advanced SIMD modes on which we support any arithmetic operations. |
132 (define_mode_iterator VALL [V8QI V16QI V4HI V8HI V2SI V4SI V2DI V2SF V4SF V2DF]) | 147 (define_mode_iterator VALL [V8QI V16QI V4HI V8HI V2SI V4SI V2DI V2SF V4SF V2DF]) |
133 | 148 |
134 ;; All vector modes suitable for moving, loading, and storing. | 149 ;; All Advanced SIMD modes suitable for moving, loading, and storing. |
135 (define_mode_iterator VALL_F16 [V8QI V16QI V4HI V8HI V2SI V4SI V2DI | 150 (define_mode_iterator VALL_F16 [V8QI V16QI V4HI V8HI V2SI V4SI V2DI |
136 V4HF V8HF V2SF V4SF V2DF]) | 151 V4HF V8HF V2SF V4SF V2DF]) |
137 | 152 |
138 ;; The VALL_F16 modes except the 128-bit 2-element ones. | 153 ;; The VALL_F16 modes except the 128-bit 2-element ones. |
139 (define_mode_iterator VALL_F16_NO_V2Q [V8QI V16QI V4HI V8HI V2SI V4SI | 154 (define_mode_iterator VALL_F16_NO_V2Q [V8QI V16QI V4HI V8HI V2SI V4SI |
140 V4HF V8HF V2SF V4SF]) | 155 V4HF V8HF V2SF V4SF]) |
141 | 156 |
142 ;; All vector modes barring HF modes, plus DI. | 157 ;; All Advanced SIMD modes barring HF modes, plus DI. |
143 (define_mode_iterator VALLDI [V8QI V16QI V4HI V8HI V2SI V4SI V2DI V2SF V4SF V2DF DI]) | 158 (define_mode_iterator VALLDI [V8QI V16QI V4HI V8HI V2SI V4SI V2DI V2SF V4SF V2DF DI]) |
144 | 159 |
145 ;; All vector modes and DI. | 160 ;; All Advanced SIMD modes and DI. |
146 (define_mode_iterator VALLDI_F16 [V8QI V16QI V4HI V8HI V2SI V4SI V2DI | 161 (define_mode_iterator VALLDI_F16 [V8QI V16QI V4HI V8HI V2SI V4SI V2DI |
147 V4HF V8HF V2SF V4SF V2DF DI]) | 162 V4HF V8HF V2SF V4SF V2DF DI]) |
148 | 163 |
149 ;; All vector modes, plus DI and DF. | 164 ;; All Advanced SIMD modes, plus DI and DF. |
150 (define_mode_iterator VALLDIF [V8QI V16QI V4HI V8HI V2SI V4SI | 165 (define_mode_iterator VALLDIF [V8QI V16QI V4HI V8HI V2SI V4SI |
151 V2DI V4HF V8HF V2SF V4SF V2DF DI DF]) | 166 V2DI V4HF V8HF V2SF V4SF V2DF DI DF]) |
152 | 167 |
153 ;; Vector modes for Integer reduction across lanes. | 168 ;; Advanced SIMD modes for Integer reduction across lanes. |
154 (define_mode_iterator VDQV [V8QI V16QI V4HI V8HI V4SI V2DI]) | 169 (define_mode_iterator VDQV [V8QI V16QI V4HI V8HI V4SI V2DI]) |
155 | 170 |
156 ;; Vector modes(except V2DI) for Integer reduction across lanes. | 171 ;; Advanced SIMD modes (except V2DI) for Integer reduction across lanes. |
157 (define_mode_iterator VDQV_S [V8QI V16QI V4HI V8HI V4SI]) | 172 (define_mode_iterator VDQV_S [V8QI V16QI V4HI V8HI V4SI]) |
158 | 173 |
159 ;; All double integer narrow-able modes. | 174 ;; All double integer narrow-able modes. |
160 (define_mode_iterator VDN [V4HI V2SI DI]) | 175 (define_mode_iterator VDN [V4HI V2SI DI]) |
161 | 176 |
162 ;; All quad integer narrow-able modes. | 177 ;; All quad integer narrow-able modes. |
163 (define_mode_iterator VQN [V8HI V4SI V2DI]) | 178 (define_mode_iterator VQN [V8HI V4SI V2DI]) |
164 | 179 |
165 ;; Vector and scalar 128-bit container: narrowable 16, 32, 64-bit integer modes | 180 ;; Advanced SIMD and scalar 128-bit container: narrowable 16, 32, 64-bit |
181 ;; integer modes | |
166 (define_mode_iterator VSQN_HSDI [V8HI V4SI V2DI HI SI DI]) | 182 (define_mode_iterator VSQN_HSDI [V8HI V4SI V2DI HI SI DI]) |
167 | 183 |
168 ;; All quad integer widen-able modes. | 184 ;; All quad integer widen-able modes. |
169 (define_mode_iterator VQW [V16QI V8HI V4SI]) | 185 (define_mode_iterator VQW [V16QI V8HI V4SI]) |
170 | 186 |
171 ;; Double vector modes for combines. | 187 ;; Double vector modes for combines. |
172 (define_mode_iterator VDC [V8QI V4HI V4HF V2SI V2SF DI DF]) | 188 (define_mode_iterator VDC [V8QI V4HI V4HF V2SI V2SF DI DF]) |
173 | 189 |
174 ;; Vector modes except double int. | 190 ;; Advanced SIMD modes except double int. |
175 (define_mode_iterator VDQIF [V8QI V16QI V4HI V8HI V2SI V4SI V2SF V4SF V2DF]) | 191 (define_mode_iterator VDQIF [V8QI V16QI V4HI V8HI V2SI V4SI V2SF V4SF V2DF]) |
176 (define_mode_iterator VDQIF_F16 [V8QI V16QI V4HI V8HI V2SI V4SI | 192 (define_mode_iterator VDQIF_F16 [V8QI V16QI V4HI V8HI V2SI V4SI |
177 V4HF V8HF V2SF V4SF V2DF]) | 193 V4HF V8HF V2SF V4SF V2DF]) |
178 | 194 |
179 ;; Vector modes for S type. | 195 ;; Advanced SIMD modes for S type. |
180 (define_mode_iterator VDQ_SI [V2SI V4SI]) | 196 (define_mode_iterator VDQ_SI [V2SI V4SI]) |
181 | 197 |
182 ;; Vector modes for S and D | 198 ;; Advanced SIMD modes for S and D. |
183 (define_mode_iterator VDQ_SDI [V2SI V4SI V2DI]) | 199 (define_mode_iterator VDQ_SDI [V2SI V4SI V2DI]) |
184 | 200 |
185 ;; Vector modes for H, S and D | 201 ;; Advanced SIMD modes for H, S and D. |
186 (define_mode_iterator VDQ_HSDI [(V4HI "TARGET_SIMD_F16INST") | 202 (define_mode_iterator VDQ_HSDI [(V4HI "TARGET_SIMD_F16INST") |
187 (V8HI "TARGET_SIMD_F16INST") | 203 (V8HI "TARGET_SIMD_F16INST") |
188 V2SI V4SI V2DI]) | 204 V2SI V4SI V2DI]) |
189 | 205 |
190 ;; Scalar and Vector modes for S and D | 206 ;; Scalar and Advanced SIMD modes for S and D. |
191 (define_mode_iterator VSDQ_SDI [V2SI V4SI V2DI SI DI]) | 207 (define_mode_iterator VSDQ_SDI [V2SI V4SI V2DI SI DI]) |
192 | 208 |
193 ;; Scalar and Vector modes for S and D, Vector modes for H. | 209 ;; Scalar and Advanced SIMD modes for S and D, Advanced SIMD modes for H. |
194 (define_mode_iterator VSDQ_HSDI [(V4HI "TARGET_SIMD_F16INST") | 210 (define_mode_iterator VSDQ_HSDI [(V4HI "TARGET_SIMD_F16INST") |
195 (V8HI "TARGET_SIMD_F16INST") | 211 (V8HI "TARGET_SIMD_F16INST") |
196 V2SI V4SI V2DI | 212 V2SI V4SI V2DI |
197 (HI "TARGET_SIMD_F16INST") | 213 (HI "TARGET_SIMD_F16INST") |
198 SI DI]) | 214 SI DI]) |
199 | 215 |
200 ;; Vector modes for Q and H types. | 216 ;; Advanced SIMD modes for Q and H types. |
201 (define_mode_iterator VDQQH [V8QI V16QI V4HI V8HI]) | 217 (define_mode_iterator VDQQH [V8QI V16QI V4HI V8HI]) |
202 | 218 |
203 ;; Vector modes for H and S types. | 219 ;; Advanced SIMD modes for H and S types. |
204 (define_mode_iterator VDQHS [V4HI V8HI V2SI V4SI]) | 220 (define_mode_iterator VDQHS [V4HI V8HI V2SI V4SI]) |
205 | 221 |
206 ;; Vector modes for H, S and D types. | 222 ;; Advanced SIMD modes for H, S and D types. |
207 (define_mode_iterator VDQHSD [V4HI V8HI V2SI V4SI V2DI]) | 223 (define_mode_iterator VDQHSD [V4HI V8HI V2SI V4SI V2DI]) |
208 | 224 |
209 ;; Vector and scalar integer modes for H and S | 225 ;; Advanced SIMD and scalar integer modes for H and S. |
210 (define_mode_iterator VSDQ_HSI [V4HI V8HI V2SI V4SI HI SI]) | 226 (define_mode_iterator VSDQ_HSI [V4HI V8HI V2SI V4SI HI SI]) |
211 | 227 |
212 ;; Vector and scalar 64-bit container: 16, 32-bit integer modes | 228 ;; Advanced SIMD and scalar 64-bit container: 16, 32-bit integer modes. |
213 (define_mode_iterator VSD_HSI [V4HI V2SI HI SI]) | 229 (define_mode_iterator VSD_HSI [V4HI V2SI HI SI]) |
214 | 230 |
215 ;; Vector 64-bit container: 16, 32-bit integer modes | 231 ;; Advanced SIMD 64-bit container: 16, 32-bit integer modes. |
216 (define_mode_iterator VD_HSI [V4HI V2SI]) | 232 (define_mode_iterator VD_HSI [V4HI V2SI]) |
217 | 233 |
218 ;; Scalar 64-bit container: 16, 32-bit integer modes | 234 ;; Scalar 64-bit container: 16, 32-bit integer modes |
219 (define_mode_iterator SD_HSI [HI SI]) | 235 (define_mode_iterator SD_HSI [HI SI]) |
220 | 236 |
221 ;; Vector 64-bit container: 16, 32-bit integer modes | 237 ;; Advanced SIMD 64-bit container: 16, 32-bit integer modes. |
222 (define_mode_iterator VQ_HSI [V8HI V4SI]) | 238 (define_mode_iterator VQ_HSI [V8HI V4SI]) |
223 | 239 |
224 ;; All byte modes. | 240 ;; All byte modes. |
225 (define_mode_iterator VB [V8QI V16QI]) | 241 (define_mode_iterator VB [V8QI V16QI]) |
226 | 242 |
227 ;; 2 and 4 lane SI modes. | 243 ;; 2 and 4 lane SI modes. |
228 (define_mode_iterator VS [V2SI V4SI]) | 244 (define_mode_iterator VS [V2SI V4SI]) |
229 | 245 |
230 (define_mode_iterator TX [TI TF]) | 246 (define_mode_iterator TX [TI TF]) |
231 | 247 |
232 ;; Opaque structure modes. | 248 ;; Advanced SIMD opaque structure modes. |
233 (define_mode_iterator VSTRUCT [OI CI XI]) | 249 (define_mode_iterator VSTRUCT [OI CI XI]) |
234 | 250 |
235 ;; Double scalar modes | 251 ;; Double scalar modes |
236 (define_mode_iterator DX [DI DF]) | 252 (define_mode_iterator DX [DI DF]) |
237 | 253 |
238 ;; Modes available for <f>mul lane operations. | 254 ;; Duplicate of the above |
255 (define_mode_iterator DX2 [DI DF]) | |
256 | |
257 ;; Single scalar modes | |
258 (define_mode_iterator SX [SI SF]) | |
259 | |
260 ;; Duplicate of the above | |
261 (define_mode_iterator SX2 [SI SF]) | |
262 | |
263 ;; Single and double integer and float modes | |
264 (define_mode_iterator DSX [DF DI SF SI]) | |
265 | |
266 | |
267 ;; Modes available for Advanced SIMD <f>mul lane operations. | |
239 (define_mode_iterator VMUL [V4HI V8HI V2SI V4SI | 268 (define_mode_iterator VMUL [V4HI V8HI V2SI V4SI |
240 (V4HF "TARGET_SIMD_F16INST") | 269 (V4HF "TARGET_SIMD_F16INST") |
241 (V8HF "TARGET_SIMD_F16INST") | 270 (V8HF "TARGET_SIMD_F16INST") |
242 V2SF V4SF V2DF]) | 271 V2SF V4SF V2DF]) |
243 | 272 |
244 ;; Modes available for <f>mul lane operations changing lane count. | 273 ;; Modes available for Advanced SIMD <f>mul lane operations changing lane |
274 ;; count. | |
245 (define_mode_iterator VMUL_CHANGE_NLANES [V4HI V8HI V2SI V4SI V2SF V4SF]) | 275 (define_mode_iterator VMUL_CHANGE_NLANES [V4HI V8HI V2SI V4SI V2SF V4SF]) |
276 | |
277 ;; All SVE vector modes. | |
278 (define_mode_iterator SVE_ALL [VNx16QI VNx8HI VNx4SI VNx2DI | |
279 VNx8HF VNx4SF VNx2DF]) | |
280 | |
281 ;; All SVE vector structure modes. | |
282 (define_mode_iterator SVE_STRUCT [VNx32QI VNx16HI VNx8SI VNx4DI | |
283 VNx16HF VNx8SF VNx4DF | |
284 VNx48QI VNx24HI VNx12SI VNx6DI | |
285 VNx24HF VNx12SF VNx6DF | |
286 VNx64QI VNx32HI VNx16SI VNx8DI | |
287 VNx32HF VNx16SF VNx8DF]) | |
288 | |
289 ;; All SVE vector modes that have 8-bit or 16-bit elements. | |
290 (define_mode_iterator SVE_BH [VNx16QI VNx8HI VNx8HF]) | |
291 | |
292 ;; All SVE vector modes that have 8-bit, 16-bit or 32-bit elements. | |
293 (define_mode_iterator SVE_BHS [VNx16QI VNx8HI VNx4SI VNx8HF VNx4SF]) | |
294 | |
295 ;; All SVE integer vector modes that have 8-bit, 16-bit or 32-bit elements. | |
296 (define_mode_iterator SVE_BHSI [VNx16QI VNx8HI VNx4SI]) | |
297 | |
298 ;; All SVE integer vector modes that have 16-bit, 32-bit or 64-bit elements. | |
299 (define_mode_iterator SVE_HSDI [VNx16QI VNx8HI VNx4SI]) | |
300 | |
301 ;; All SVE floating-point vector modes that have 16-bit or 32-bit elements. | |
302 (define_mode_iterator SVE_HSF [VNx8HF VNx4SF]) | |
303 | |
304 ;; All SVE vector modes that have 32-bit or 64-bit elements. | |
305 (define_mode_iterator SVE_SD [VNx4SI VNx2DI VNx4SF VNx2DF]) | |
306 | |
307 ;; All SVE vector modes that have 32-bit elements. | |
308 (define_mode_iterator SVE_S [VNx4SI VNx4SF]) | |
309 | |
310 ;; All SVE vector modes that have 64-bit elements. | |
311 (define_mode_iterator SVE_D [VNx2DI VNx2DF]) | |
312 | |
313 ;; All SVE integer vector modes that have 32-bit or 64-bit elements. | |
314 (define_mode_iterator SVE_SDI [VNx4SI VNx2DI]) | |
315 | |
316 ;; All SVE integer vector modes. | |
317 (define_mode_iterator SVE_I [VNx16QI VNx8HI VNx4SI VNx2DI]) | |
318 | |
319 ;; All SVE floating-point vector modes. | |
320 (define_mode_iterator SVE_F [VNx8HF VNx4SF VNx2DF]) | |
321 | |
322 ;; All SVE predicate modes. | |
323 (define_mode_iterator PRED_ALL [VNx16BI VNx8BI VNx4BI VNx2BI]) | |
324 | |
325 ;; SVE predicate modes that control 8-bit, 16-bit or 32-bit elements. | |
326 (define_mode_iterator PRED_BHS [VNx16BI VNx8BI VNx4BI]) | |
246 | 327 |
247 ;; ------------------------------------------------------------------ | 328 ;; ------------------------------------------------------------------ |
248 ;; Unspec enumerations for Advance SIMD. These could well go into | 329 ;; Unspec enumerations for Advance SIMD. These could well go into |
249 ;; aarch64.md but for their use in int_iterators here. | 330 ;; aarch64.md but for their use in int_iterators here. |
250 ;; ------------------------------------------------------------------ | 331 ;; ------------------------------------------------------------------ |
320 UNSPEC_USHLL ; Used in aarch64-simd.md. | 401 UNSPEC_USHLL ; Used in aarch64-simd.md. |
321 UNSPEC_ADDP ; Used in aarch64-simd.md. | 402 UNSPEC_ADDP ; Used in aarch64-simd.md. |
322 UNSPEC_TBL ; Used in vector permute patterns. | 403 UNSPEC_TBL ; Used in vector permute patterns. |
323 UNSPEC_TBX ; Used in vector permute patterns. | 404 UNSPEC_TBX ; Used in vector permute patterns. |
324 UNSPEC_CONCAT ; Used in vector permute patterns. | 405 UNSPEC_CONCAT ; Used in vector permute patterns. |
406 | |
407 ;; The following permute unspecs are generated directly by | |
408 ;; aarch64_expand_vec_perm_const, so any changes to the underlying | |
409 ;; instructions would need a corresponding change there. | |
325 UNSPEC_ZIP1 ; Used in vector permute patterns. | 410 UNSPEC_ZIP1 ; Used in vector permute patterns. |
326 UNSPEC_ZIP2 ; Used in vector permute patterns. | 411 UNSPEC_ZIP2 ; Used in vector permute patterns. |
327 UNSPEC_UZP1 ; Used in vector permute patterns. | 412 UNSPEC_UZP1 ; Used in vector permute patterns. |
328 UNSPEC_UZP2 ; Used in vector permute patterns. | 413 UNSPEC_UZP2 ; Used in vector permute patterns. |
329 UNSPEC_TRN1 ; Used in vector permute patterns. | 414 UNSPEC_TRN1 ; Used in vector permute patterns. |
330 UNSPEC_TRN2 ; Used in vector permute patterns. | 415 UNSPEC_TRN2 ; Used in vector permute patterns. |
331 UNSPEC_EXT ; Used in aarch64-simd.md. | 416 UNSPEC_EXT ; Used in vector permute patterns. |
332 UNSPEC_REV64 ; Used in vector reverse patterns (permute). | 417 UNSPEC_REV64 ; Used in vector reverse patterns (permute). |
333 UNSPEC_REV32 ; Used in vector reverse patterns (permute). | 418 UNSPEC_REV32 ; Used in vector reverse patterns (permute). |
334 UNSPEC_REV16 ; Used in vector reverse patterns (permute). | 419 UNSPEC_REV16 ; Used in vector reverse patterns (permute). |
420 | |
335 UNSPEC_AESE ; Used in aarch64-simd.md. | 421 UNSPEC_AESE ; Used in aarch64-simd.md. |
336 UNSPEC_AESD ; Used in aarch64-simd.md. | 422 UNSPEC_AESD ; Used in aarch64-simd.md. |
337 UNSPEC_AESMC ; Used in aarch64-simd.md. | 423 UNSPEC_AESMC ; Used in aarch64-simd.md. |
338 UNSPEC_AESIMC ; Used in aarch64-simd.md. | 424 UNSPEC_AESIMC ; Used in aarch64-simd.md. |
339 UNSPEC_SHA1C ; Used in aarch64-simd.md. | 425 UNSPEC_SHA1C ; Used in aarch64-simd.md. |
354 UNSPEC_SQRDMLSH ; Used in aarch64-simd.md. | 440 UNSPEC_SQRDMLSH ; Used in aarch64-simd.md. |
355 UNSPEC_FMAXNM ; Used in aarch64-simd.md. | 441 UNSPEC_FMAXNM ; Used in aarch64-simd.md. |
356 UNSPEC_FMINNM ; Used in aarch64-simd.md. | 442 UNSPEC_FMINNM ; Used in aarch64-simd.md. |
357 UNSPEC_SDOT ; Used in aarch64-simd.md. | 443 UNSPEC_SDOT ; Used in aarch64-simd.md. |
358 UNSPEC_UDOT ; Used in aarch64-simd.md. | 444 UNSPEC_UDOT ; Used in aarch64-simd.md. |
445 UNSPEC_SM3SS1 ; Used in aarch64-simd.md. | |
446 UNSPEC_SM3TT1A ; Used in aarch64-simd.md. | |
447 UNSPEC_SM3TT1B ; Used in aarch64-simd.md. | |
448 UNSPEC_SM3TT2A ; Used in aarch64-simd.md. | |
449 UNSPEC_SM3TT2B ; Used in aarch64-simd.md. | |
450 UNSPEC_SM3PARTW1 ; Used in aarch64-simd.md. | |
451 UNSPEC_SM3PARTW2 ; Used in aarch64-simd.md. | |
452 UNSPEC_SM4E ; Used in aarch64-simd.md. | |
453 UNSPEC_SM4EKEY ; Used in aarch64-simd.md. | |
454 UNSPEC_SHA512H ; Used in aarch64-simd.md. | |
455 UNSPEC_SHA512H2 ; Used in aarch64-simd.md. | |
456 UNSPEC_SHA512SU0 ; Used in aarch64-simd.md. | |
457 UNSPEC_SHA512SU1 ; Used in aarch64-simd.md. | |
458 UNSPEC_FMLAL ; Used in aarch64-simd.md. | |
459 UNSPEC_FMLSL ; Used in aarch64-simd.md. | |
460 UNSPEC_FMLAL2 ; Used in aarch64-simd.md. | |
461 UNSPEC_FMLSL2 ; Used in aarch64-simd.md. | |
462 UNSPEC_SEL ; Used in aarch64-sve.md. | |
463 UNSPEC_ANDV ; Used in aarch64-sve.md. | |
464 UNSPEC_IORV ; Used in aarch64-sve.md. | |
465 UNSPEC_XORV ; Used in aarch64-sve.md. | |
466 UNSPEC_ANDF ; Used in aarch64-sve.md. | |
467 UNSPEC_IORF ; Used in aarch64-sve.md. | |
468 UNSPEC_XORF ; Used in aarch64-sve.md. | |
469 UNSPEC_SMUL_HIGHPART ; Used in aarch64-sve.md. | |
470 UNSPEC_UMUL_HIGHPART ; Used in aarch64-sve.md. | |
471 UNSPEC_COND_ADD ; Used in aarch64-sve.md. | |
472 UNSPEC_COND_SUB ; Used in aarch64-sve.md. | |
473 UNSPEC_COND_MUL ; Used in aarch64-sve.md. | |
474 UNSPEC_COND_DIV ; Used in aarch64-sve.md. | |
475 UNSPEC_COND_MAX ; Used in aarch64-sve.md. | |
476 UNSPEC_COND_MIN ; Used in aarch64-sve.md. | |
477 UNSPEC_COND_FMLA ; Used in aarch64-sve.md. | |
478 UNSPEC_COND_FMLS ; Used in aarch64-sve.md. | |
479 UNSPEC_COND_FNMLA ; Used in aarch64-sve.md. | |
480 UNSPEC_COND_FNMLS ; Used in aarch64-sve.md. | |
481 UNSPEC_COND_LT ; Used in aarch64-sve.md. | |
482 UNSPEC_COND_LE ; Used in aarch64-sve.md. | |
483 UNSPEC_COND_EQ ; Used in aarch64-sve.md. | |
484 UNSPEC_COND_NE ; Used in aarch64-sve.md. | |
485 UNSPEC_COND_GE ; Used in aarch64-sve.md. | |
486 UNSPEC_COND_GT ; Used in aarch64-sve.md. | |
487 UNSPEC_LASTB ; Used in aarch64-sve.md. | |
359 ]) | 488 ]) |
360 | 489 |
361 ;; ------------------------------------------------------------------ | 490 ;; ------------------------------------------------------------------ |
362 ;; Unspec enumerations for Atomics. They are here so that they can be | 491 ;; Unspec enumerations for Atomics. They are here so that they can be |
363 ;; used in the int_iterators for atomic operations. | 492 ;; used in the int_iterators for atomic operations. |
396 | 525 |
397 ;; For inequal width int to float conversion | 526 ;; For inequal width int to float conversion |
398 (define_mode_attr w1 [(HF "w") (SF "w") (DF "x")]) | 527 (define_mode_attr w1 [(HF "w") (SF "w") (DF "x")]) |
399 (define_mode_attr w2 [(HF "x") (SF "x") (DF "w")]) | 528 (define_mode_attr w2 [(HF "x") (SF "x") (DF "w")]) |
400 | 529 |
530 ;; For width of fp registers in fcvt instruction | |
531 (define_mode_attr fpw [(DI "s") (SI "d")]) | |
532 | |
401 (define_mode_attr short_mask [(HI "65535") (QI "255")]) | 533 (define_mode_attr short_mask [(HI "65535") (QI "255")]) |
402 | 534 |
403 ;; For constraints used in scalar immediate vector moves | 535 ;; For constraints used in scalar immediate vector moves |
404 (define_mode_attr hq [(HI "h") (QI "q")]) | 536 (define_mode_attr hq [(HI "h") (QI "q")]) |
405 | 537 |
406 ;; For doubling width of an integer mode | 538 ;; For doubling width of an integer mode |
407 (define_mode_attr DWI [(QI "HI") (HI "SI") (SI "DI") (DI "TI")]) | 539 (define_mode_attr DWI [(QI "HI") (HI "SI") (SI "DI") (DI "TI")]) |
540 | |
541 (define_mode_attr fcvt_change_mode [(SI "df") (DI "sf")]) | |
542 | |
543 (define_mode_attr FCVT_CHANGE_MODE [(SI "DF") (DI "SF")]) | |
408 | 544 |
409 ;; For scalar usage of vector/FP registers | 545 ;; For scalar usage of vector/FP registers |
410 (define_mode_attr v [(QI "b") (HI "h") (SI "s") (DI "d") | 546 (define_mode_attr v [(QI "b") (HI "h") (SI "s") (DI "d") |
411 (HF "h") (SF "s") (DF "d") | 547 (HF "h") (SF "s") (DF "d") |
412 (V8QI "") (V16QI "") | 548 (V8QI "") (V16QI "") |
436 ;; we are doing scalar for DI and SIMD for SI (ignoring all but | 572 ;; we are doing scalar for DI and SIMD for SI (ignoring all but |
437 ;; lane 0). | 573 ;; lane 0). |
438 (define_mode_attr rtn [(DI "d") (SI "")]) | 574 (define_mode_attr rtn [(DI "d") (SI "")]) |
439 (define_mode_attr vas [(DI "") (SI ".2s")]) | 575 (define_mode_attr vas [(DI "") (SI ".2s")]) |
440 | 576 |
441 ;; Map a floating point mode to the appropriate register name prefix | 577 ;; Map a vector to the number of units in it, if the size of the mode |
442 (define_mode_attr s [(HF "h") (SF "s") (DF "d")]) | 578 ;; is constant. |
579 (define_mode_attr nunits [(V8QI "8") (V16QI "16") | |
580 (V4HI "4") (V8HI "8") | |
581 (V2SI "2") (V4SI "4") | |
582 (V2DI "2") | |
583 (V4HF "4") (V8HF "8") | |
584 (V2SF "2") (V4SF "4") | |
585 (V1DF "1") (V2DF "2") | |
586 (DI "1") (DF "1")]) | |
587 | |
588 ;; Map a mode to the number of bits in it, if the size of the mode | |
589 ;; is constant. | |
590 (define_mode_attr bitsize [(V8QI "64") (V16QI "128") | |
591 (V4HI "64") (V8HI "128") | |
592 (V2SI "64") (V4SI "128") | |
593 (V2DI "128")]) | |
594 | |
595 ;; Map a floating point or integer mode to the appropriate register name prefix | |
596 (define_mode_attr s [(HF "h") (SF "s") (DF "d") (SI "s") (DI "d")]) | |
443 | 597 |
444 ;; Give the length suffix letter for a sign- or zero-extension. | 598 ;; Give the length suffix letter for a sign- or zero-extension. |
445 (define_mode_attr size [(QI "b") (HI "h") (SI "w")]) | 599 (define_mode_attr size [(QI "b") (HI "h") (SI "w")]) |
446 | 600 |
447 ;; Give the number of bits in the mode | 601 ;; Give the number of bits in the mode |
456 ;; Attribute to describe constants acceptable in logical and operations | 610 ;; Attribute to describe constants acceptable in logical and operations |
457 (define_mode_attr lconst2 [(SI "UsO") (DI "UsP")]) | 611 (define_mode_attr lconst2 [(SI "UsO") (DI "UsP")]) |
458 | 612 |
459 ;; Map a mode to a specific constraint character. | 613 ;; Map a mode to a specific constraint character. |
460 (define_mode_attr cmode [(QI "q") (HI "h") (SI "s") (DI "d")]) | 614 (define_mode_attr cmode [(QI "q") (HI "h") (SI "s") (DI "d")]) |
615 | |
616 ;; Map modes to Usg and Usj constraints for SISD right shifts | |
617 (define_mode_attr cmode_simd [(SI "g") (DI "j")]) | |
461 | 618 |
462 (define_mode_attr Vtype [(V8QI "8b") (V16QI "16b") | 619 (define_mode_attr Vtype [(V8QI "8b") (V16QI "16b") |
463 (V4HI "4h") (V8HI "8h") | 620 (V4HI "4h") (V8HI "8h") |
464 (V2SI "2s") (V4SI "4s") | 621 (V2SI "2s") (V4SI "4s") |
465 (DI "1d") (DF "1d") | 622 (DI "1d") (DF "1d") |
486 (V2DI ".2s") | 643 (V2DI ".2s") |
487 (DI "") (SI "") | 644 (DI "") (SI "") |
488 (HI "")]) | 645 (HI "")]) |
489 | 646 |
490 ;; Mode-to-individual element type mapping. | 647 ;; Mode-to-individual element type mapping. |
491 (define_mode_attr Vetype [(V8QI "b") (V16QI "b") | 648 (define_mode_attr Vetype [(V8QI "b") (V16QI "b") (VNx16QI "b") (VNx16BI "b") |
492 (V4HI "h") (V8HI "h") | 649 (V4HI "h") (V8HI "h") (VNx8HI "h") (VNx8BI "h") |
493 (V2SI "s") (V4SI "s") | 650 (V2SI "s") (V4SI "s") (VNx4SI "s") (VNx4BI "s") |
494 (V2DI "d") (V4HF "h") | 651 (V2DI "d") (VNx2DI "d") (VNx2BI "d") |
495 (V8HF "h") (V2SF "s") | 652 (V4HF "h") (V8HF "h") (VNx8HF "h") |
496 (V4SF "s") (V2DF "d") | 653 (V2SF "s") (V4SF "s") (VNx4SF "s") |
654 (V2DF "d") (VNx2DF "d") | |
497 (HF "h") | 655 (HF "h") |
498 (SF "s") (DF "d") | 656 (SF "s") (DF "d") |
499 (QI "b") (HI "h") | 657 (QI "b") (HI "h") |
500 (SI "s") (DI "d")]) | 658 (SI "s") (DI "d")]) |
659 | |
660 ;; Equivalent of "size" for a vector element. | |
661 (define_mode_attr Vesize [(VNx16QI "b") | |
662 (VNx8HI "h") (VNx8HF "h") | |
663 (VNx4SI "w") (VNx4SF "w") | |
664 (VNx2DI "d") (VNx2DF "d") | |
665 (VNx32QI "b") (VNx48QI "b") (VNx64QI "b") | |
666 (VNx16HI "h") (VNx24HI "h") (VNx32HI "h") | |
667 (VNx16HF "h") (VNx24HF "h") (VNx32HF "h") | |
668 (VNx8SI "w") (VNx12SI "w") (VNx16SI "w") | |
669 (VNx8SF "w") (VNx12SF "w") (VNx16SF "w") | |
670 (VNx4DI "d") (VNx6DI "d") (VNx8DI "d") | |
671 (VNx4DF "d") (VNx6DF "d") (VNx8DF "d")]) | |
501 | 672 |
502 ;; Vetype is used everywhere in scheduling type and assembly output, | 673 ;; Vetype is used everywhere in scheduling type and assembly output, |
503 ;; sometimes they are not the same, for example HF modes on some | 674 ;; sometimes they are not the same, for example HF modes on some |
504 ;; instructions. stype is defined to represent scheduling type | 675 ;; instructions. stype is defined to represent scheduling type |
505 ;; more accurately. | 676 ;; more accurately. |
518 (V4SF "16b") (V2DF "16b") | 689 (V4SF "16b") (V2DF "16b") |
519 (DI "8b") (DF "8b") | 690 (DI "8b") (DF "8b") |
520 (SI "8b")]) | 691 (SI "8b")]) |
521 | 692 |
522 ;; Define element mode for each vector mode. | 693 ;; Define element mode for each vector mode. |
523 (define_mode_attr VEL [(V8QI "QI") (V16QI "QI") | 694 (define_mode_attr VEL [(V8QI "QI") (V16QI "QI") (VNx16QI "QI") |
524 (V4HI "HI") (V8HI "HI") | 695 (V4HI "HI") (V8HI "HI") (VNx8HI "HI") |
525 (V2SI "SI") (V4SI "SI") | 696 (V2SI "SI") (V4SI "SI") (VNx4SI "SI") |
526 (DI "DI") (V2DI "DI") | 697 (DI "DI") (V2DI "DI") (VNx2DI "DI") |
527 (V4HF "HF") (V8HF "HF") | 698 (V4HF "HF") (V8HF "HF") (VNx8HF "HF") |
528 (V2SF "SF") (V4SF "SF") | 699 (V2SF "SF") (V4SF "SF") (VNx4SF "SF") |
529 (V2DF "DF") (DF "DF") | 700 (DF "DF") (V2DF "DF") (VNx2DF "DF") |
530 (SI "SI") (HI "HI") | 701 (SI "SI") (HI "HI") |
531 (QI "QI")]) | 702 (QI "QI")]) |
532 | 703 |
533 ;; Define element mode for each vector mode (lower case). | 704 ;; Define element mode for each vector mode (lower case). |
534 (define_mode_attr Vel [(V8QI "qi") (V16QI "qi") | 705 (define_mode_attr Vel [(V8QI "qi") (V16QI "qi") (VNx16QI "qi") |
535 (V4HI "hi") (V8HI "hi") | 706 (V4HI "hi") (V8HI "hi") (VNx8HI "hi") |
536 (V2SI "si") (V4SI "si") | 707 (V2SI "si") (V4SI "si") (VNx4SI "si") |
537 (DI "di") (V2DI "di") | 708 (DI "di") (V2DI "di") (VNx2DI "di") |
538 (V4HF "hf") (V8HF "hf") | 709 (V4HF "hf") (V8HF "hf") (VNx8HF "hf") |
539 (V2SF "sf") (V4SF "sf") | 710 (V2SF "sf") (V4SF "sf") (VNx4SF "sf") |
540 (V2DF "df") (DF "df") | 711 (V2DF "df") (DF "df") (VNx2DF "df") |
541 (SI "si") (HI "hi") | 712 (SI "si") (HI "hi") |
542 (QI "qi")]) | 713 (QI "qi")]) |
714 | |
715 ;; Element mode with floating-point values replaced by like-sized integers. | |
716 (define_mode_attr VEL_INT [(VNx16QI "QI") | |
717 (VNx8HI "HI") (VNx8HF "HI") | |
718 (VNx4SI "SI") (VNx4SF "SI") | |
719 (VNx2DI "DI") (VNx2DF "DI")]) | |
720 | |
721 ;; Gives the mode of the 128-bit lowpart of an SVE vector. | |
722 (define_mode_attr V128 [(VNx16QI "V16QI") | |
723 (VNx8HI "V8HI") (VNx8HF "V8HF") | |
724 (VNx4SI "V4SI") (VNx4SF "V4SF") | |
725 (VNx2DI "V2DI") (VNx2DF "V2DF")]) | |
726 | |
727 ;; ...and again in lower case. | |
728 (define_mode_attr v128 [(VNx16QI "v16qi") | |
729 (VNx8HI "v8hi") (VNx8HF "v8hf") | |
730 (VNx4SI "v4si") (VNx4SF "v4sf") | |
731 (VNx2DI "v2di") (VNx2DF "v2df")]) | |
543 | 732 |
544 ;; 64-bit container modes the inner or scalar source mode. | 733 ;; 64-bit container modes the inner or scalar source mode. |
545 (define_mode_attr VCOND [(HI "V4HI") (SI "V2SI") | 734 (define_mode_attr VCOND [(HI "V4HI") (SI "V2SI") |
546 (V4HI "V4HI") (V8HI "V4HI") | 735 (V4HI "V4HI") (V8HI "V4HI") |
547 (V2SI "V2SI") (V4SI "V2SI") | 736 (V2SI "V2SI") (V4SI "V2SI") |
617 ;; Register suffix narrowed modes for VQN. | 806 ;; Register suffix narrowed modes for VQN. |
618 (define_mode_attr V2ntype [(V8HI "16b") (V4SI "8h") | 807 (define_mode_attr V2ntype [(V8HI "16b") (V4SI "8h") |
619 (V2DI "4s")]) | 808 (V2DI "4s")]) |
620 | 809 |
621 ;; Widened modes of vector modes. | 810 ;; Widened modes of vector modes. |
622 (define_mode_attr VWIDE [(V8QI "V8HI") (V4HI "V4SI") | 811 (define_mode_attr VWIDE [(V8QI "V8HI") (V4HI "V4SI") |
623 (V2SI "V2DI") (V16QI "V8HI") | 812 (V2SI "V2DI") (V16QI "V8HI") |
624 (V8HI "V4SI") (V4SI "V2DI") | 813 (V8HI "V4SI") (V4SI "V2DI") |
625 (HI "SI") (SI "DI") | 814 (HI "SI") (SI "DI") |
626 (V8HF "V4SF") (V4SF "V2DF") | 815 (V8HF "V4SF") (V4SF "V2DF") |
627 (V4HF "V4SF") (V2SF "V2DF")] | 816 (V4HF "V4SF") (V2SF "V2DF") |
628 ) | 817 (VNx8HF "VNx4SF") (VNx4SF "VNx2DF") |
818 (VNx16QI "VNx8HI") (VNx8HI "VNx4SI") | |
819 (VNx4SI "VNx2DI") | |
820 (VNx16BI "VNx8BI") (VNx8BI "VNx4BI") | |
821 (VNx4BI "VNx2BI")]) | |
822 | |
823 ;; Predicate mode associated with VWIDE. | |
824 (define_mode_attr VWIDE_PRED [(VNx8HF "VNx4BI") (VNx4SF "VNx2BI")]) | |
629 | 825 |
630 ;; Widened modes of vector modes, lowercase | 826 ;; Widened modes of vector modes, lowercase |
631 (define_mode_attr Vwide [(V2SF "v2df") (V4HF "v4sf")]) | 827 (define_mode_attr Vwide [(V2SF "v2df") (V4HF "v4sf") |
828 (VNx16QI "vnx8hi") (VNx8HI "vnx4si") | |
829 (VNx4SI "vnx2di") | |
830 (VNx8HF "vnx4sf") (VNx4SF "vnx2df") | |
831 (VNx16BI "vnx8bi") (VNx8BI "vnx4bi") | |
832 (VNx4BI "vnx2bi")]) | |
632 | 833 |
633 ;; Widened mode register suffixes for VD_BHSI/VQW/VQ_HSF. | 834 ;; Widened mode register suffixes for VD_BHSI/VQW/VQ_HSF. |
634 (define_mode_attr Vwtype [(V8QI "8h") (V4HI "4s") | 835 (define_mode_attr Vwtype [(V8QI "8h") (V4HI "4s") |
635 (V2SI "2d") (V16QI "8h") | 836 (V2SI "2d") (V16QI "8h") |
636 (V8HI "4s") (V4SI "2d") | 837 (V8HI "4s") (V4SI "2d") |
637 (V8HF "4s") (V4SF "2d")]) | 838 (V8HF "4s") (V4SF "2d")]) |
839 | |
840 ;; SVE vector after widening | |
841 (define_mode_attr Vewtype [(VNx16QI "h") | |
842 (VNx8HI "s") (VNx8HF "s") | |
843 (VNx4SI "d") (VNx4SF "d")]) | |
638 | 844 |
639 ;; Widened mode register suffixes for VDW/VQW. | 845 ;; Widened mode register suffixes for VDW/VQW. |
640 (define_mode_attr Vmwtype [(V8QI ".8h") (V4HI ".4s") | 846 (define_mode_attr Vmwtype [(V8QI ".8h") (V4HI ".4s") |
641 (V2SI ".2d") (V16QI ".8h") | 847 (V2SI ".2d") (V16QI ".8h") |
642 (V8HI ".4s") (V4SI ".2d") | 848 (V8HI ".4s") (V4SI ".2d") |
647 (define_mode_attr Vhalftype [(V16QI "8b") (V8HI "4h") | 853 (define_mode_attr Vhalftype [(V16QI "8b") (V8HI "4h") |
648 (V4SI "2s") (V8HF "4h") | 854 (V4SI "2s") (V8HF "4h") |
649 (V4SF "2s")]) | 855 (V4SF "2s")]) |
650 | 856 |
651 ;; Define corresponding core/FP element mode for each vector mode. | 857 ;; Define corresponding core/FP element mode for each vector mode. |
652 (define_mode_attr vw [(V8QI "w") (V16QI "w") | 858 (define_mode_attr vw [(V8QI "w") (V16QI "w") (VNx16QI "w") |
653 (V4HI "w") (V8HI "w") | 859 (V4HI "w") (V8HI "w") (VNx8HI "w") |
654 (V2SI "w") (V4SI "w") | 860 (V2SI "w") (V4SI "w") (VNx4SI "w") |
655 (DI "x") (V2DI "x") | 861 (DI "x") (V2DI "x") (VNx2DI "x") |
656 (V2SF "s") (V4SF "s") | 862 (VNx8HF "h") |
657 (V2DF "d")]) | 863 (V2SF "s") (V4SF "s") (VNx4SF "s") |
864 (V2DF "d") (VNx2DF "d")]) | |
658 | 865 |
659 ;; Corresponding core element mode for each vector mode. This is a | 866 ;; Corresponding core element mode for each vector mode. This is a |
660 ;; variation on <vw> mapping FP modes to GP regs. | 867 ;; variation on <vw> mapping FP modes to GP regs. |
661 (define_mode_attr vwcore [(V8QI "w") (V16QI "w") | 868 (define_mode_attr vwcore [(V8QI "w") (V16QI "w") (VNx16QI "w") |
662 (V4HI "w") (V8HI "w") | 869 (V4HI "w") (V8HI "w") (VNx8HI "w") |
663 (V2SI "w") (V4SI "w") | 870 (V2SI "w") (V4SI "w") (VNx4SI "w") |
664 (DI "x") (V2DI "x") | 871 (DI "x") (V2DI "x") (VNx2DI "x") |
665 (V4HF "w") (V8HF "w") | 872 (V4HF "w") (V8HF "w") (VNx8HF "w") |
666 (V2SF "w") (V4SF "w") | 873 (V2SF "w") (V4SF "w") (VNx4SF "w") |
667 (V2DF "x")]) | 874 (V2DF "x") (VNx2DF "x")]) |
668 | 875 |
669 ;; Double vector types for ALLX. | 876 ;; Double vector types for ALLX. |
670 (define_mode_attr Vallxd [(QI "8b") (HI "4h") (SI "2s")]) | 877 (define_mode_attr Vallxd [(QI "8b") (HI "4h") (SI "2s")]) |
671 | 878 |
672 ;; Mode with floating-point values replaced by like-sized integers. | 879 ;; Mode with floating-point values replaced by like-sized integers. |
674 (V4HI "V4HI") (V8HI "V8HI") | 881 (V4HI "V4HI") (V8HI "V8HI") |
675 (V2SI "V2SI") (V4SI "V4SI") | 882 (V2SI "V2SI") (V4SI "V4SI") |
676 (DI "DI") (V2DI "V2DI") | 883 (DI "DI") (V2DI "V2DI") |
677 (V4HF "V4HI") (V8HF "V8HI") | 884 (V4HF "V4HI") (V8HF "V8HI") |
678 (V2SF "V2SI") (V4SF "V4SI") | 885 (V2SF "V2SI") (V4SF "V4SI") |
679 (V2DF "V2DI") (DF "DI") | 886 (DF "DI") (V2DF "V2DI") |
680 (SF "SI") (HF "HI")]) | 887 (SF "SI") (SI "SI") |
888 (HF "HI") | |
889 (VNx16QI "VNx16QI") | |
890 (VNx8HI "VNx8HI") (VNx8HF "VNx8HI") | |
891 (VNx4SI "VNx4SI") (VNx4SF "VNx4SI") | |
892 (VNx2DI "VNx2DI") (VNx2DF "VNx2DI") | |
893 ]) | |
681 | 894 |
682 ;; Lower case mode with floating-point values replaced by like-sized integers. | 895 ;; Lower case mode with floating-point values replaced by like-sized integers. |
683 (define_mode_attr v_int_equiv [(V8QI "v8qi") (V16QI "v16qi") | 896 (define_mode_attr v_int_equiv [(V8QI "v8qi") (V16QI "v16qi") |
684 (V4HI "v4hi") (V8HI "v8hi") | 897 (V4HI "v4hi") (V8HI "v8hi") |
685 (V2SI "v2si") (V4SI "v4si") | 898 (V2SI "v2si") (V4SI "v4si") |
686 (DI "di") (V2DI "v2di") | 899 (DI "di") (V2DI "v2di") |
687 (V4HF "v4hi") (V8HF "v8hi") | 900 (V4HF "v4hi") (V8HF "v8hi") |
688 (V2SF "v2si") (V4SF "v4si") | 901 (V2SF "v2si") (V4SF "v4si") |
689 (V2DF "v2di") (DF "di") | 902 (DF "di") (V2DF "v2di") |
690 (SF "si")]) | 903 (SF "si") |
904 (VNx16QI "vnx16qi") | |
905 (VNx8HI "vnx8hi") (VNx8HF "vnx8hi") | |
906 (VNx4SI "vnx4si") (VNx4SF "vnx4si") | |
907 (VNx2DI "vnx2di") (VNx2DF "vnx2di") | |
908 ]) | |
909 | |
910 ;; Floating-point equivalent of selected modes. | |
911 (define_mode_attr V_FP_EQUIV [(VNx4SI "VNx4SF") (VNx4SF "VNx4SF") | |
912 (VNx2DI "VNx2DF") (VNx2DF "VNx2DF")]) | |
913 (define_mode_attr v_fp_equiv [(VNx4SI "vnx4sf") (VNx4SF "vnx4sf") | |
914 (VNx2DI "vnx2df") (VNx2DF "vnx2df")]) | |
691 | 915 |
692 ;; Mode for vector conditional operations where the comparison has | 916 ;; Mode for vector conditional operations where the comparison has |
693 ;; different type from the lhs. | 917 ;; different type from the lhs. |
694 (define_mode_attr V_cmp_mixed [(V2SI "V2SF") (V4SI "V4SF") | 918 (define_mode_attr V_cmp_mixed [(V2SI "V2SF") (V4SI "V4SF") |
695 (V2DI "V2DF") (V2SF "V2SI") | 919 (V2DI "V2DF") (V2SF "V2SI") |
811 | 1035 |
812 ;; -fpic small model GOT reloc modifers: gotpage_lo15/lo14 for ILP64/32. | 1036 ;; -fpic small model GOT reloc modifers: gotpage_lo15/lo14 for ILP64/32. |
813 ;; No need of iterator for -fPIC as it use got_lo12 for both modes. | 1037 ;; No need of iterator for -fPIC as it use got_lo12 for both modes. |
814 (define_mode_attr got_modifier [(SI "gotpage_lo14") (DI "gotpage_lo15")]) | 1038 (define_mode_attr got_modifier [(SI "gotpage_lo14") (DI "gotpage_lo15")]) |
815 | 1039 |
1040 ;; Width of 2nd and 3rd arguments to fp16 vector multiply add/sub | |
1041 (define_mode_attr VFMLA_W [(V2SF "V4HF") (V4SF "V8HF")]) | |
1042 | |
1043 (define_mode_attr VFMLA_SEL_W [(V2SF "V2HF") (V4SF "V4HF")]) | |
1044 | |
1045 (define_mode_attr f16quad [(V2SF "") (V4SF "q")]) | |
1046 | |
1047 (define_code_attr f16mac [(plus "a") (minus "s")]) | |
1048 | |
1049 ;; The number of subvectors in an SVE_STRUCT. | |
1050 (define_mode_attr vector_count [(VNx32QI "2") (VNx16HI "2") | |
1051 (VNx8SI "2") (VNx4DI "2") | |
1052 (VNx16HF "2") (VNx8SF "2") (VNx4DF "2") | |
1053 (VNx48QI "3") (VNx24HI "3") | |
1054 (VNx12SI "3") (VNx6DI "3") | |
1055 (VNx24HF "3") (VNx12SF "3") (VNx6DF "3") | |
1056 (VNx64QI "4") (VNx32HI "4") | |
1057 (VNx16SI "4") (VNx8DI "4") | |
1058 (VNx32HF "4") (VNx16SF "4") (VNx8DF "4")]) | |
1059 | |
1060 ;; The number of instruction bytes needed for an SVE_STRUCT move. This is | |
1061 ;; equal to vector_count * 4. | |
1062 (define_mode_attr insn_length [(VNx32QI "8") (VNx16HI "8") | |
1063 (VNx8SI "8") (VNx4DI "8") | |
1064 (VNx16HF "8") (VNx8SF "8") (VNx4DF "8") | |
1065 (VNx48QI "12") (VNx24HI "12") | |
1066 (VNx12SI "12") (VNx6DI "12") | |
1067 (VNx24HF "12") (VNx12SF "12") (VNx6DF "12") | |
1068 (VNx64QI "16") (VNx32HI "16") | |
1069 (VNx16SI "16") (VNx8DI "16") | |
1070 (VNx32HF "16") (VNx16SF "16") (VNx8DF "16")]) | |
1071 | |
1072 ;; The type of a subvector in an SVE_STRUCT. | |
1073 (define_mode_attr VSINGLE [(VNx32QI "VNx16QI") | |
1074 (VNx16HI "VNx8HI") (VNx16HF "VNx8HF") | |
1075 (VNx8SI "VNx4SI") (VNx8SF "VNx4SF") | |
1076 (VNx4DI "VNx2DI") (VNx4DF "VNx2DF") | |
1077 (VNx48QI "VNx16QI") | |
1078 (VNx24HI "VNx8HI") (VNx24HF "VNx8HF") | |
1079 (VNx12SI "VNx4SI") (VNx12SF "VNx4SF") | |
1080 (VNx6DI "VNx2DI") (VNx6DF "VNx2DF") | |
1081 (VNx64QI "VNx16QI") | |
1082 (VNx32HI "VNx8HI") (VNx32HF "VNx8HF") | |
1083 (VNx16SI "VNx4SI") (VNx16SF "VNx4SF") | |
1084 (VNx8DI "VNx2DI") (VNx8DF "VNx2DF")]) | |
1085 | |
1086 ;; ...and again in lower case. | |
1087 (define_mode_attr vsingle [(VNx32QI "vnx16qi") | |
1088 (VNx16HI "vnx8hi") (VNx16HF "vnx8hf") | |
1089 (VNx8SI "vnx4si") (VNx8SF "vnx4sf") | |
1090 (VNx4DI "vnx2di") (VNx4DF "vnx2df") | |
1091 (VNx48QI "vnx16qi") | |
1092 (VNx24HI "vnx8hi") (VNx24HF "vnx8hf") | |
1093 (VNx12SI "vnx4si") (VNx12SF "vnx4sf") | |
1094 (VNx6DI "vnx2di") (VNx6DF "vnx2df") | |
1095 (VNx64QI "vnx16qi") | |
1096 (VNx32HI "vnx8hi") (VNx32HF "vnx8hf") | |
1097 (VNx16SI "vnx4si") (VNx16SF "vnx4sf") | |
1098 (VNx8DI "vnx2di") (VNx8DF "vnx2df")]) | |
1099 | |
1100 ;; The predicate mode associated with an SVE data mode. For structure modes | |
1101 ;; this is equivalent to the <VPRED> of the subvector mode. | |
1102 (define_mode_attr VPRED [(VNx16QI "VNx16BI") | |
1103 (VNx8HI "VNx8BI") (VNx8HF "VNx8BI") | |
1104 (VNx4SI "VNx4BI") (VNx4SF "VNx4BI") | |
1105 (VNx2DI "VNx2BI") (VNx2DF "VNx2BI") | |
1106 (VNx32QI "VNx16BI") | |
1107 (VNx16HI "VNx8BI") (VNx16HF "VNx8BI") | |
1108 (VNx8SI "VNx4BI") (VNx8SF "VNx4BI") | |
1109 (VNx4DI "VNx2BI") (VNx4DF "VNx2BI") | |
1110 (VNx48QI "VNx16BI") | |
1111 (VNx24HI "VNx8BI") (VNx24HF "VNx8BI") | |
1112 (VNx12SI "VNx4BI") (VNx12SF "VNx4BI") | |
1113 (VNx6DI "VNx2BI") (VNx6DF "VNx2BI") | |
1114 (VNx64QI "VNx16BI") | |
1115 (VNx32HI "VNx8BI") (VNx32HF "VNx8BI") | |
1116 (VNx16SI "VNx4BI") (VNx16SF "VNx4BI") | |
1117 (VNx8DI "VNx2BI") (VNx8DF "VNx2BI")]) | |
1118 | |
1119 ;; ...and again in lower case. | |
1120 (define_mode_attr vpred [(VNx16QI "vnx16bi") | |
1121 (VNx8HI "vnx8bi") (VNx8HF "vnx8bi") | |
1122 (VNx4SI "vnx4bi") (VNx4SF "vnx4bi") | |
1123 (VNx2DI "vnx2bi") (VNx2DF "vnx2bi") | |
1124 (VNx32QI "vnx16bi") | |
1125 (VNx16HI "vnx8bi") (VNx16HF "vnx8bi") | |
1126 (VNx8SI "vnx4bi") (VNx8SF "vnx4bi") | |
1127 (VNx4DI "vnx2bi") (VNx4DF "vnx2bi") | |
1128 (VNx48QI "vnx16bi") | |
1129 (VNx24HI "vnx8bi") (VNx24HF "vnx8bi") | |
1130 (VNx12SI "vnx4bi") (VNx12SF "vnx4bi") | |
1131 (VNx6DI "vnx2bi") (VNx6DF "vnx2bi") | |
1132 (VNx64QI "vnx16bi") | |
1133 (VNx32HI "vnx8bi") (VNx32HF "vnx4bi") | |
1134 (VNx16SI "vnx4bi") (VNx16SF "vnx4bi") | |
1135 (VNx8DI "vnx2bi") (VNx8DF "vnx2bi")]) | |
1136 | |
816 ;; ------------------------------------------------------------------- | 1137 ;; ------------------------------------------------------------------- |
817 ;; Code Iterators | 1138 ;; Code Iterators |
818 ;; ------------------------------------------------------------------- | 1139 ;; ------------------------------------------------------------------- |
819 | 1140 |
820 ;; This code iterator allows the various shifts supported on the core | 1141 ;; This code iterator allows the various shifts supported on the core |
823 ;; This code iterator allows the shifts supported in arithmetic instructions | 1144 ;; This code iterator allows the shifts supported in arithmetic instructions |
824 (define_code_iterator ASHIFT [ashift ashiftrt lshiftrt]) | 1145 (define_code_iterator ASHIFT [ashift ashiftrt lshiftrt]) |
825 | 1146 |
826 ;; Code iterator for logical operations | 1147 ;; Code iterator for logical operations |
827 (define_code_iterator LOGICAL [and ior xor]) | 1148 (define_code_iterator LOGICAL [and ior xor]) |
1149 | |
1150 ;; LOGICAL without AND. | |
1151 (define_code_iterator LOGICAL_OR [ior xor]) | |
828 | 1152 |
829 ;; Code iterator for logical operations whose :nlogical works on SIMD registers. | 1153 ;; Code iterator for logical operations whose :nlogical works on SIMD registers. |
830 (define_code_iterator NLOGICAL [and ior]) | 1154 (define_code_iterator NLOGICAL [and ior]) |
831 | 1155 |
832 ;; Code iterator for unary negate and bitwise complement. | 1156 ;; Code iterator for unary negate and bitwise complement. |
881 ;; Unsigned comparison operators. | 1205 ;; Unsigned comparison operators. |
882 (define_code_iterator UCOMPARISONS [ltu leu geu gtu]) | 1206 (define_code_iterator UCOMPARISONS [ltu leu geu gtu]) |
883 | 1207 |
884 ;; Unsigned comparison operators. | 1208 ;; Unsigned comparison operators. |
885 (define_code_iterator FAC_COMPARISONS [lt le ge gt]) | 1209 (define_code_iterator FAC_COMPARISONS [lt le ge gt]) |
1210 | |
1211 ;; SVE integer unary operations. | |
1212 (define_code_iterator SVE_INT_UNARY [neg not popcount]) | |
1213 | |
1214 ;; SVE floating-point unary operations. | |
1215 (define_code_iterator SVE_FP_UNARY [neg abs sqrt]) | |
1216 | |
1217 ;; SVE integer binary operations. | |
1218 (define_code_iterator SVE_INT_BINARY [plus minus mult smax umax smin umin | |
1219 and ior xor]) | |
1220 | |
1221 ;; SVE integer binary division operations. | |
1222 (define_code_iterator SVE_INT_BINARY_SD [div udiv]) | |
1223 | |
1224 ;; SVE integer comparisons. | |
1225 (define_code_iterator SVE_INT_CMP [lt le eq ne ge gt ltu leu geu gtu]) | |
1226 | |
1227 ;; SVE floating-point comparisons. | |
1228 (define_code_iterator SVE_FP_CMP [lt le eq ne ge gt]) | |
886 | 1229 |
887 ;; ------------------------------------------------------------------- | 1230 ;; ------------------------------------------------------------------- |
888 ;; Code Attributes | 1231 ;; Code Attributes |
889 ;; ------------------------------------------------------------------- | 1232 ;; ------------------------------------------------------------------- |
890 ;; Map rtl objects to optab names | 1233 ;; Map rtl objects to optab names |
898 (zero_extract "extzv") | 1241 (zero_extract "extzv") |
899 (fix "fix") | 1242 (fix "fix") |
900 (unsigned_fix "fixuns") | 1243 (unsigned_fix "fixuns") |
901 (float "float") | 1244 (float "float") |
902 (unsigned_float "floatuns") | 1245 (unsigned_float "floatuns") |
1246 (popcount "popcount") | |
903 (and "and") | 1247 (and "and") |
904 (ior "ior") | 1248 (ior "ior") |
905 (xor "xor") | 1249 (xor "xor") |
906 (not "one_cmpl") | 1250 (not "one_cmpl") |
907 (neg "neg") | 1251 (neg "neg") |
908 (plus "add") | 1252 (plus "add") |
909 (minus "sub") | 1253 (minus "sub") |
1254 (mult "mul") | |
1255 (div "div") | |
1256 (udiv "udiv") | |
910 (ss_plus "qadd") | 1257 (ss_plus "qadd") |
911 (us_plus "qadd") | 1258 (us_plus "qadd") |
912 (ss_minus "qsub") | 1259 (ss_minus "qsub") |
913 (us_minus "qsub") | 1260 (us_minus "qsub") |
914 (ss_neg "qneg") | 1261 (ss_neg "qneg") |
915 (ss_abs "qabs") | 1262 (ss_abs "qabs") |
1263 (smin "smin") | |
1264 (smax "smax") | |
1265 (umin "umin") | |
1266 (umax "umax") | |
916 (eq "eq") | 1267 (eq "eq") |
917 (ne "ne") | 1268 (ne "ne") |
918 (lt "lt") | 1269 (lt "lt") |
919 (ge "ge") | 1270 (ge "ge") |
920 (le "le") | 1271 (le "le") |
921 (gt "gt") | 1272 (gt "gt") |
922 (ltu "ltu") | 1273 (ltu "ltu") |
923 (leu "leu") | 1274 (leu "leu") |
924 (geu "geu") | 1275 (geu "geu") |
925 (gtu "gtu")]) | 1276 (gtu "gtu") |
1277 (abs "abs") | |
1278 (sqrt "sqrt")]) | |
926 | 1279 |
927 ;; For comparison operators we use the FCM* and CM* instructions. | 1280 ;; For comparison operators we use the FCM* and CM* instructions. |
928 ;; As there are no CMLE or CMLT instructions which act on 3 vector | 1281 ;; As there are no CMLE or CMLT instructions which act on 3 vector |
929 ;; operands, we must use CMGE or CMGT and swap the order of the | 1282 ;; operands, we must use CMGE or CMGT and swap the order of the |
930 ;; source operands. | 1283 ;; source operands. |
937 (ltu "1") (leu "1") (geu "2") (gtu "2")]) | 1290 (ltu "1") (leu "1") (geu "2") (gtu "2")]) |
938 | 1291 |
939 (define_code_attr CMP [(lt "LT") (le "LE") (eq "EQ") (ge "GE") (gt "GT") | 1292 (define_code_attr CMP [(lt "LT") (le "LE") (eq "EQ") (ge "GE") (gt "GT") |
940 (ltu "LTU") (leu "LEU") (ne "NE") (geu "GEU") | 1293 (ltu "LTU") (leu "LEU") (ne "NE") (geu "GEU") |
941 (gtu "GTU")]) | 1294 (gtu "GTU")]) |
1295 | |
1296 ;; The AArch64 condition associated with an rtl comparison code. | |
1297 (define_code_attr cmp_op [(lt "lt") | |
1298 (le "le") | |
1299 (eq "eq") | |
1300 (ne "ne") | |
1301 (ge "ge") | |
1302 (gt "gt") | |
1303 (ltu "lo") | |
1304 (leu "ls") | |
1305 (geu "hs") | |
1306 (gtu "hi")]) | |
942 | 1307 |
943 (define_code_attr fix_trunc_optab [(fix "fix_trunc") | 1308 (define_code_attr fix_trunc_optab [(fix "fix_trunc") |
944 (unsigned_fix "fixuns_trunc")]) | 1309 (unsigned_fix "fixuns_trunc")]) |
945 | 1310 |
946 ;; Optab prefix for sign/zero-extending operations | 1311 ;; Optab prefix for sign/zero-extending operations |
963 (define_code_attr logical [(and "and") (ior "orr") (xor "eor")]) | 1328 (define_code_attr logical [(and "and") (ior "orr") (xor "eor")]) |
964 | 1329 |
965 ;; Operation names for negate and bitwise complement. | 1330 ;; Operation names for negate and bitwise complement. |
966 (define_code_attr neg_not_op [(neg "neg") (not "not")]) | 1331 (define_code_attr neg_not_op [(neg "neg") (not "not")]) |
967 | 1332 |
968 ;; Similar, but when not(op) | 1333 ;; Similar, but when the second operand is inverted. |
969 (define_code_attr nlogical [(and "bic") (ior "orn") (xor "eon")]) | 1334 (define_code_attr nlogical [(and "bic") (ior "orn") (xor "eon")]) |
1335 | |
1336 ;; Similar, but when both operands are inverted. | |
1337 (define_code_attr logical_nn [(and "nor") (ior "nand")]) | |
970 | 1338 |
971 ;; Sign- or zero-extending data-op | 1339 ;; Sign- or zero-extending data-op |
972 (define_code_attr su [(sign_extend "s") (zero_extend "u") | 1340 (define_code_attr su [(sign_extend "s") (zero_extend "u") |
973 (sign_extract "s") (zero_extract "u") | 1341 (sign_extract "s") (zero_extract "u") |
974 (fix "s") (unsigned_fix "u") | 1342 (fix "s") (unsigned_fix "u") |
975 (div "s") (udiv "u") | 1343 (div "s") (udiv "u") |
976 (smax "s") (umax "u") | 1344 (smax "s") (umax "u") |
977 (smin "s") (umin "u")]) | 1345 (smin "s") (umin "u")]) |
978 | 1346 |
1347 ;; Whether a shift is left or right. | |
1348 (define_code_attr lr [(ashift "l") (ashiftrt "r") (lshiftrt "r")]) | |
1349 | |
979 ;; Emit conditional branch instructions. | 1350 ;; Emit conditional branch instructions. |
980 (define_code_attr bcond [(eq "beq") (ne "bne") (lt "bne") (ge "beq")]) | 1351 (define_code_attr bcond [(eq "beq") (ne "bne") (lt "bne") (ge "beq")]) |
981 | 1352 |
982 ;; Emit cbz/cbnz depending on comparison type. | 1353 ;; Emit cbz/cbnz depending on comparison type. |
983 (define_code_attr cbz [(eq "cbz") (ne "cbnz") (lt "cbnz") (ge "cbz")]) | 1354 (define_code_attr cbz [(eq "cbz") (ne "cbnz") (lt "cbnz") (ge "cbz")]) |
1019 (and "<lconst_atomic>")]) | 1390 (and "<lconst_atomic>")]) |
1020 | 1391 |
1021 ;; Attribute to describe constants acceptable in atomic logical operations | 1392 ;; Attribute to describe constants acceptable in atomic logical operations |
1022 (define_mode_attr lconst_atomic [(QI "K") (HI "K") (SI "K") (DI "L")]) | 1393 (define_mode_attr lconst_atomic [(QI "K") (HI "K") (SI "K") (DI "L")]) |
1023 | 1394 |
1395 ;; The integer SVE instruction that implements an rtx code. | |
1396 (define_code_attr sve_int_op [(plus "add") | |
1397 (minus "sub") | |
1398 (mult "mul") | |
1399 (div "sdiv") | |
1400 (udiv "udiv") | |
1401 (neg "neg") | |
1402 (smin "smin") | |
1403 (smax "smax") | |
1404 (umin "umin") | |
1405 (umax "umax") | |
1406 (and "and") | |
1407 (ior "orr") | |
1408 (xor "eor") | |
1409 (not "not") | |
1410 (popcount "cnt")]) | |
1411 | |
1412 (define_code_attr sve_int_op_rev [(plus "add") | |
1413 (minus "subr") | |
1414 (mult "mul") | |
1415 (div "sdivr") | |
1416 (udiv "udivr") | |
1417 (smin "smin") | |
1418 (smax "smax") | |
1419 (umin "umin") | |
1420 (umax "umax") | |
1421 (and "and") | |
1422 (ior "orr") | |
1423 (xor "eor")]) | |
1424 | |
1425 ;; The floating-point SVE instruction that implements an rtx code. | |
1426 (define_code_attr sve_fp_op [(plus "fadd") | |
1427 (neg "fneg") | |
1428 (abs "fabs") | |
1429 (sqrt "fsqrt")]) | |
1430 | |
1431 ;; The SVE immediate constraint to use for an rtl code. | |
1432 (define_code_attr sve_imm_con [(eq "vsc") | |
1433 (ne "vsc") | |
1434 (lt "vsc") | |
1435 (ge "vsc") | |
1436 (le "vsc") | |
1437 (gt "vsc") | |
1438 (ltu "vsd") | |
1439 (leu "vsd") | |
1440 (geu "vsd") | |
1441 (gtu "vsd")]) | |
1442 | |
1024 ;; ------------------------------------------------------------------- | 1443 ;; ------------------------------------------------------------------- |
1025 ;; Int Iterators. | 1444 ;; Int Iterators. |
1026 ;; ------------------------------------------------------------------- | 1445 ;; ------------------------------------------------------------------- |
1446 | |
1447 ;; The unspec codes for the SABAL, UABAL AdvancedSIMD instructions. | |
1448 (define_int_iterator ABAL [UNSPEC_SABAL UNSPEC_UABAL]) | |
1449 | |
1450 ;; The unspec codes for the SABDL2, UABDL2 AdvancedSIMD instructions. | |
1451 (define_int_iterator ABDL2 [UNSPEC_SABDL2 UNSPEC_UABDL2]) | |
1452 | |
1453 ;; The unspec codes for the SADALP, UADALP AdvancedSIMD instructions. | |
1454 (define_int_iterator ADALP [UNSPEC_SADALP UNSPEC_UADALP]) | |
1455 | |
1027 (define_int_iterator MAXMINV [UNSPEC_UMAXV UNSPEC_UMINV | 1456 (define_int_iterator MAXMINV [UNSPEC_UMAXV UNSPEC_UMINV |
1028 UNSPEC_SMAXV UNSPEC_SMINV]) | 1457 UNSPEC_SMAXV UNSPEC_SMINV]) |
1029 | 1458 |
1030 (define_int_iterator FMAXMINV [UNSPEC_FMAXV UNSPEC_FMINV | 1459 (define_int_iterator FMAXMINV [UNSPEC_FMAXV UNSPEC_FMINV |
1031 UNSPEC_FMAXNMV UNSPEC_FMINNMV]) | 1460 UNSPEC_FMAXNMV UNSPEC_FMINNMV]) |
1461 | |
1462 (define_int_iterator BITWISEV [UNSPEC_ANDV UNSPEC_IORV UNSPEC_XORV]) | |
1463 | |
1464 (define_int_iterator LOGICALF [UNSPEC_ANDF UNSPEC_IORF UNSPEC_XORF]) | |
1032 | 1465 |
1033 (define_int_iterator HADDSUB [UNSPEC_SHADD UNSPEC_UHADD | 1466 (define_int_iterator HADDSUB [UNSPEC_SHADD UNSPEC_UHADD |
1034 UNSPEC_SRHADD UNSPEC_URHADD | 1467 UNSPEC_SRHADD UNSPEC_URHADD |
1035 UNSPEC_SHSUB UNSPEC_UHSUB | 1468 UNSPEC_SHSUB UNSPEC_UHSUB |
1036 UNSPEC_SRHSUB UNSPEC_URHSUB]) | 1469 UNSPEC_SRHSUB UNSPEC_URHSUB]) |
1037 | 1470 |
1471 (define_int_iterator HADD [UNSPEC_SHADD UNSPEC_UHADD]) | |
1472 | |
1473 (define_int_iterator RHADD [UNSPEC_SRHADD UNSPEC_URHADD]) | |
1474 | |
1038 (define_int_iterator DOTPROD [UNSPEC_SDOT UNSPEC_UDOT]) | 1475 (define_int_iterator DOTPROD [UNSPEC_SDOT UNSPEC_UDOT]) |
1039 | 1476 |
1040 (define_int_iterator ADDSUBHN [UNSPEC_ADDHN UNSPEC_RADDHN | 1477 (define_int_iterator ADDSUBHN [UNSPEC_ADDHN UNSPEC_RADDHN |
1041 UNSPEC_SUBHN UNSPEC_RSUBHN]) | 1478 UNSPEC_SUBHN UNSPEC_RSUBHN]) |
1042 | 1479 |
1083 | 1520 |
1084 (define_int_iterator PERMUTE [UNSPEC_ZIP1 UNSPEC_ZIP2 | 1521 (define_int_iterator PERMUTE [UNSPEC_ZIP1 UNSPEC_ZIP2 |
1085 UNSPEC_TRN1 UNSPEC_TRN2 | 1522 UNSPEC_TRN1 UNSPEC_TRN2 |
1086 UNSPEC_UZP1 UNSPEC_UZP2]) | 1523 UNSPEC_UZP1 UNSPEC_UZP2]) |
1087 | 1524 |
1525 (define_int_iterator OPTAB_PERMUTE [UNSPEC_ZIP1 UNSPEC_ZIP2 | |
1526 UNSPEC_UZP1 UNSPEC_UZP2]) | |
1527 | |
1088 (define_int_iterator REVERSE [UNSPEC_REV64 UNSPEC_REV32 UNSPEC_REV16]) | 1528 (define_int_iterator REVERSE [UNSPEC_REV64 UNSPEC_REV32 UNSPEC_REV16]) |
1089 | 1529 |
1090 (define_int_iterator FRINT [UNSPEC_FRINTZ UNSPEC_FRINTP UNSPEC_FRINTM | 1530 (define_int_iterator FRINT [UNSPEC_FRINTZ UNSPEC_FRINTP UNSPEC_FRINTM |
1091 UNSPEC_FRINTN UNSPEC_FRINTI UNSPEC_FRINTX | 1531 UNSPEC_FRINTN UNSPEC_FRINTI UNSPEC_FRINTX |
1092 UNSPEC_FRINTA]) | 1532 UNSPEC_FRINTA]) |
1095 UNSPEC_FRINTA UNSPEC_FRINTN]) | 1535 UNSPEC_FRINTA UNSPEC_FRINTN]) |
1096 | 1536 |
1097 (define_int_iterator FCVT_F2FIXED [UNSPEC_FCVTZS UNSPEC_FCVTZU]) | 1537 (define_int_iterator FCVT_F2FIXED [UNSPEC_FCVTZS UNSPEC_FCVTZU]) |
1098 (define_int_iterator FCVT_FIXED2F [UNSPEC_SCVTF UNSPEC_UCVTF]) | 1538 (define_int_iterator FCVT_FIXED2F [UNSPEC_SCVTF UNSPEC_UCVTF]) |
1099 | 1539 |
1100 (define_int_iterator FRECP [UNSPEC_FRECPE UNSPEC_FRECPX]) | |
1101 | |
1102 (define_int_iterator CRC [UNSPEC_CRC32B UNSPEC_CRC32H UNSPEC_CRC32W | 1540 (define_int_iterator CRC [UNSPEC_CRC32B UNSPEC_CRC32H UNSPEC_CRC32W |
1103 UNSPEC_CRC32X UNSPEC_CRC32CB UNSPEC_CRC32CH | 1541 UNSPEC_CRC32X UNSPEC_CRC32CB UNSPEC_CRC32CH |
1104 UNSPEC_CRC32CW UNSPEC_CRC32CX]) | 1542 UNSPEC_CRC32CW UNSPEC_CRC32CX]) |
1105 | 1543 |
1106 (define_int_iterator CRYPTO_AES [UNSPEC_AESE UNSPEC_AESD]) | 1544 (define_int_iterator CRYPTO_AES [UNSPEC_AESE UNSPEC_AESD]) |
1108 | 1546 |
1109 (define_int_iterator CRYPTO_SHA1 [UNSPEC_SHA1C UNSPEC_SHA1M UNSPEC_SHA1P]) | 1547 (define_int_iterator CRYPTO_SHA1 [UNSPEC_SHA1C UNSPEC_SHA1M UNSPEC_SHA1P]) |
1110 | 1548 |
1111 (define_int_iterator CRYPTO_SHA256 [UNSPEC_SHA256H UNSPEC_SHA256H2]) | 1549 (define_int_iterator CRYPTO_SHA256 [UNSPEC_SHA256H UNSPEC_SHA256H2]) |
1112 | 1550 |
1551 (define_int_iterator CRYPTO_SHA512 [UNSPEC_SHA512H UNSPEC_SHA512H2]) | |
1552 | |
1553 (define_int_iterator CRYPTO_SM3TT [UNSPEC_SM3TT1A UNSPEC_SM3TT1B | |
1554 UNSPEC_SM3TT2A UNSPEC_SM3TT2B]) | |
1555 | |
1556 (define_int_iterator CRYPTO_SM3PART [UNSPEC_SM3PARTW1 UNSPEC_SM3PARTW2]) | |
1557 | |
1558 ;; Iterators for fp16 operations | |
1559 | |
1560 (define_int_iterator VFMLA16_LOW [UNSPEC_FMLAL UNSPEC_FMLSL]) | |
1561 | |
1562 (define_int_iterator VFMLA16_HIGH [UNSPEC_FMLAL2 UNSPEC_FMLSL2]) | |
1563 | |
1564 (define_int_iterator UNPACK [UNSPEC_UNPACKSHI UNSPEC_UNPACKUHI | |
1565 UNSPEC_UNPACKSLO UNSPEC_UNPACKULO]) | |
1566 | |
1567 (define_int_iterator UNPACK_UNSIGNED [UNSPEC_UNPACKULO UNSPEC_UNPACKUHI]) | |
1568 | |
1569 (define_int_iterator MUL_HIGHPART [UNSPEC_SMUL_HIGHPART UNSPEC_UMUL_HIGHPART]) | |
1570 | |
1571 (define_int_iterator SVE_COND_FP_BINARY [UNSPEC_COND_ADD UNSPEC_COND_SUB | |
1572 UNSPEC_COND_MUL UNSPEC_COND_DIV | |
1573 UNSPEC_COND_MAX UNSPEC_COND_MIN]) | |
1574 | |
1575 (define_int_iterator SVE_COND_FP_TERNARY [UNSPEC_COND_FMLA | |
1576 UNSPEC_COND_FMLS | |
1577 UNSPEC_COND_FNMLA | |
1578 UNSPEC_COND_FNMLS]) | |
1579 | |
1580 (define_int_iterator SVE_COND_FP_CMP [UNSPEC_COND_LT UNSPEC_COND_LE | |
1581 UNSPEC_COND_EQ UNSPEC_COND_NE | |
1582 UNSPEC_COND_GE UNSPEC_COND_GT]) | |
1583 | |
1113 ;; Iterators for atomic operations. | 1584 ;; Iterators for atomic operations. |
1114 | 1585 |
1115 (define_int_iterator ATOMIC_LDOP | 1586 (define_int_iterator ATOMIC_LDOP |
1116 [UNSPECV_ATOMIC_LDOP_OR UNSPECV_ATOMIC_LDOP_BIC | 1587 [UNSPECV_ATOMIC_LDOP_OR UNSPECV_ATOMIC_LDOP_BIC |
1117 UNSPECV_ATOMIC_LDOP_XOR UNSPECV_ATOMIC_LDOP_PLUS]) | 1588 UNSPECV_ATOMIC_LDOP_XOR UNSPECV_ATOMIC_LDOP_PLUS]) |
1121 (UNSPECV_ATOMIC_LDOP_XOR "eor") (UNSPECV_ATOMIC_LDOP_PLUS "add")]) | 1592 (UNSPECV_ATOMIC_LDOP_XOR "eor") (UNSPECV_ATOMIC_LDOP_PLUS "add")]) |
1122 | 1593 |
1123 ;; ------------------------------------------------------------------- | 1594 ;; ------------------------------------------------------------------- |
1124 ;; Int Iterators Attributes. | 1595 ;; Int Iterators Attributes. |
1125 ;; ------------------------------------------------------------------- | 1596 ;; ------------------------------------------------------------------- |
1597 | |
1598 ;; The optab associated with an operation. Note that for ANDF, IORF | |
1599 ;; and XORF, the optab pattern is not actually defined; we just use this | |
1600 ;; name for consistency with the integer patterns. | |
1601 (define_int_attr optab [(UNSPEC_ANDF "and") | |
1602 (UNSPEC_IORF "ior") | |
1603 (UNSPEC_XORF "xor") | |
1604 (UNSPEC_ANDV "and") | |
1605 (UNSPEC_IORV "ior") | |
1606 (UNSPEC_XORV "xor") | |
1607 (UNSPEC_COND_ADD "add") | |
1608 (UNSPEC_COND_SUB "sub") | |
1609 (UNSPEC_COND_MUL "mul") | |
1610 (UNSPEC_COND_DIV "div") | |
1611 (UNSPEC_COND_MAX "smax") | |
1612 (UNSPEC_COND_MIN "smin") | |
1613 (UNSPEC_COND_FMLA "fma") | |
1614 (UNSPEC_COND_FMLS "fnma") | |
1615 (UNSPEC_COND_FNMLA "fnms") | |
1616 (UNSPEC_COND_FNMLS "fms")]) | |
1617 | |
1126 (define_int_attr maxmin_uns [(UNSPEC_UMAXV "umax") | 1618 (define_int_attr maxmin_uns [(UNSPEC_UMAXV "umax") |
1127 (UNSPEC_UMINV "umin") | 1619 (UNSPEC_UMINV "umin") |
1128 (UNSPEC_SMAXV "smax") | 1620 (UNSPEC_SMAXV "smax") |
1129 (UNSPEC_SMINV "smin") | 1621 (UNSPEC_SMINV "smin") |
1130 (UNSPEC_FMAX "smax_nan") | 1622 (UNSPEC_FMAX "smax_nan") |
1147 (UNSPEC_FMINNMV "fminnm") | 1639 (UNSPEC_FMINNMV "fminnm") |
1148 (UNSPEC_FMINV "fmin") | 1640 (UNSPEC_FMINV "fmin") |
1149 (UNSPEC_FMAXNM "fmaxnm") | 1641 (UNSPEC_FMAXNM "fmaxnm") |
1150 (UNSPEC_FMINNM "fminnm")]) | 1642 (UNSPEC_FMINNM "fminnm")]) |
1151 | 1643 |
1644 (define_int_attr bit_reduc_op [(UNSPEC_ANDV "andv") | |
1645 (UNSPEC_IORV "orv") | |
1646 (UNSPEC_XORV "eorv")]) | |
1647 | |
1648 ;; The SVE logical instruction that implements an unspec. | |
1649 (define_int_attr logicalf_op [(UNSPEC_ANDF "and") | |
1650 (UNSPEC_IORF "orr") | |
1651 (UNSPEC_XORF "eor")]) | |
1652 | |
1653 ;; "s" for signed operations and "u" for unsigned ones. | |
1654 (define_int_attr su [(UNSPEC_UNPACKSHI "s") | |
1655 (UNSPEC_UNPACKUHI "u") | |
1656 (UNSPEC_UNPACKSLO "s") | |
1657 (UNSPEC_UNPACKULO "u") | |
1658 (UNSPEC_SMUL_HIGHPART "s") | |
1659 (UNSPEC_UMUL_HIGHPART "u")]) | |
1660 | |
1152 (define_int_attr sur [(UNSPEC_SHADD "s") (UNSPEC_UHADD "u") | 1661 (define_int_attr sur [(UNSPEC_SHADD "s") (UNSPEC_UHADD "u") |
1153 (UNSPEC_SRHADD "sr") (UNSPEC_URHADD "ur") | 1662 (UNSPEC_SRHADD "sr") (UNSPEC_URHADD "ur") |
1154 (UNSPEC_SHSUB "s") (UNSPEC_UHSUB "u") | 1663 (UNSPEC_SHSUB "s") (UNSPEC_UHSUB "u") |
1155 (UNSPEC_SRHSUB "sr") (UNSPEC_URHSUB "ur") | 1664 (UNSPEC_SRHSUB "sr") (UNSPEC_URHSUB "ur") |
1156 (UNSPEC_ADDHN "") (UNSPEC_RADDHN "r") | 1665 (UNSPEC_ADDHN "") (UNSPEC_RADDHN "r") |
1666 (UNSPEC_SABAL "s") (UNSPEC_UABAL "u") | |
1667 (UNSPEC_SABDL2 "s") (UNSPEC_UABDL2 "u") | |
1668 (UNSPEC_SADALP "s") (UNSPEC_UADALP "u") | |
1157 (UNSPEC_SUBHN "") (UNSPEC_RSUBHN "r") | 1669 (UNSPEC_SUBHN "") (UNSPEC_RSUBHN "r") |
1158 (UNSPEC_ADDHN2 "") (UNSPEC_RADDHN2 "r") | 1670 (UNSPEC_ADDHN2 "") (UNSPEC_RADDHN2 "r") |
1159 (UNSPEC_SUBHN2 "") (UNSPEC_RSUBHN2 "r") | 1671 (UNSPEC_SUBHN2 "") (UNSPEC_RSUBHN2 "r") |
1160 (UNSPEC_SQXTN "s") (UNSPEC_UQXTN "u") | 1672 (UNSPEC_SQXTN "s") (UNSPEC_UQXTN "u") |
1161 (UNSPEC_USQADD "us") (UNSPEC_SUQADD "su") | 1673 (UNSPEC_USQADD "us") (UNSPEC_SUQADD "su") |
1187 (define_int_attr lr [(UNSPEC_SSLI "l") (UNSPEC_USLI "l") | 1699 (define_int_attr lr [(UNSPEC_SSLI "l") (UNSPEC_USLI "l") |
1188 (UNSPEC_SSRI "r") (UNSPEC_USRI "r")]) | 1700 (UNSPEC_SSRI "r") (UNSPEC_USRI "r")]) |
1189 | 1701 |
1190 (define_int_attr u [(UNSPEC_SQSHLU "u") (UNSPEC_SQSHL "") (UNSPEC_UQSHL "") | 1702 (define_int_attr u [(UNSPEC_SQSHLU "u") (UNSPEC_SQSHL "") (UNSPEC_UQSHL "") |
1191 (UNSPEC_SQSHRUN "u") (UNSPEC_SQRSHRUN "u") | 1703 (UNSPEC_SQSHRUN "u") (UNSPEC_SQRSHRUN "u") |
1192 (UNSPEC_SQSHRN "") (UNSPEC_UQSHRN "") | 1704 (UNSPEC_SQSHRN "") (UNSPEC_UQSHRN "") |
1193 (UNSPEC_SQRSHRN "") (UNSPEC_UQRSHRN "")]) | 1705 (UNSPEC_SQRSHRN "") (UNSPEC_UQRSHRN "") |
1706 (UNSPEC_SHADD "") (UNSPEC_UHADD "u") | |
1707 (UNSPEC_SRHADD "") (UNSPEC_URHADD "u")]) | |
1194 | 1708 |
1195 (define_int_attr addsub [(UNSPEC_SHADD "add") | 1709 (define_int_attr addsub [(UNSPEC_SHADD "add") |
1196 (UNSPEC_UHADD "add") | 1710 (UNSPEC_UHADD "add") |
1197 (UNSPEC_SRHADD "add") | 1711 (UNSPEC_SRHADD "add") |
1198 (UNSPEC_URHADD "add") | 1712 (UNSPEC_URHADD "add") |
1257 (define_int_attr rev_op [(UNSPEC_REV64 "64") (UNSPEC_REV32 "32") | 1771 (define_int_attr rev_op [(UNSPEC_REV64 "64") (UNSPEC_REV32 "32") |
1258 (UNSPEC_REV16 "16")]) | 1772 (UNSPEC_REV16 "16")]) |
1259 | 1773 |
1260 (define_int_attr perm_hilo [(UNSPEC_ZIP1 "1") (UNSPEC_ZIP2 "2") | 1774 (define_int_attr perm_hilo [(UNSPEC_ZIP1 "1") (UNSPEC_ZIP2 "2") |
1261 (UNSPEC_TRN1 "1") (UNSPEC_TRN2 "2") | 1775 (UNSPEC_TRN1 "1") (UNSPEC_TRN2 "2") |
1262 (UNSPEC_UZP1 "1") (UNSPEC_UZP2 "2")]) | 1776 (UNSPEC_UZP1 "1") (UNSPEC_UZP2 "2") |
1263 | 1777 (UNSPEC_UNPACKSHI "hi") (UNSPEC_UNPACKUHI "hi") |
1264 (define_int_attr frecp_suffix [(UNSPEC_FRECPE "e") (UNSPEC_FRECPX "x")]) | 1778 (UNSPEC_UNPACKSLO "lo") (UNSPEC_UNPACKULO "lo")]) |
1779 | |
1780 ;; Return true if the associated optab refers to the high-numbered lanes, | |
1781 ;; false if it refers to the low-numbered lanes. The convention is for | |
1782 ;; "hi" to refer to the low-numbered lanes (the first ones in memory) | |
1783 ;; for big-endian. | |
1784 (define_int_attr hi_lanes_optab [(UNSPEC_UNPACKSHI "!BYTES_BIG_ENDIAN") | |
1785 (UNSPEC_UNPACKUHI "!BYTES_BIG_ENDIAN") | |
1786 (UNSPEC_UNPACKSLO "BYTES_BIG_ENDIAN") | |
1787 (UNSPEC_UNPACKULO "BYTES_BIG_ENDIAN")]) | |
1265 | 1788 |
1266 (define_int_attr crc_variant [(UNSPEC_CRC32B "crc32b") (UNSPEC_CRC32H "crc32h") | 1789 (define_int_attr crc_variant [(UNSPEC_CRC32B "crc32b") (UNSPEC_CRC32H "crc32h") |
1267 (UNSPEC_CRC32W "crc32w") (UNSPEC_CRC32X "crc32x") | 1790 (UNSPEC_CRC32W "crc32w") (UNSPEC_CRC32X "crc32x") |
1268 (UNSPEC_CRC32CB "crc32cb") (UNSPEC_CRC32CH "crc32ch") | 1791 (UNSPEC_CRC32CB "crc32cb") (UNSPEC_CRC32CH "crc32ch") |
1269 (UNSPEC_CRC32CW "crc32cw") (UNSPEC_CRC32CX "crc32cx")]) | 1792 (UNSPEC_CRC32CW "crc32cw") (UNSPEC_CRC32CX "crc32cx")]) |
1280 (UNSPEC_SHA1M "m")]) | 1803 (UNSPEC_SHA1M "m")]) |
1281 | 1804 |
1282 (define_int_attr sha256_op [(UNSPEC_SHA256H "") (UNSPEC_SHA256H2 "2")]) | 1805 (define_int_attr sha256_op [(UNSPEC_SHA256H "") (UNSPEC_SHA256H2 "2")]) |
1283 | 1806 |
1284 (define_int_attr rdma_as [(UNSPEC_SQRDMLAH "a") (UNSPEC_SQRDMLSH "s")]) | 1807 (define_int_attr rdma_as [(UNSPEC_SQRDMLAH "a") (UNSPEC_SQRDMLSH "s")]) |
1808 | |
1809 (define_int_attr sha512_op [(UNSPEC_SHA512H "") (UNSPEC_SHA512H2 "2")]) | |
1810 | |
1811 (define_int_attr sm3tt_op [(UNSPEC_SM3TT1A "1a") (UNSPEC_SM3TT1B "1b") | |
1812 (UNSPEC_SM3TT2A "2a") (UNSPEC_SM3TT2B "2b")]) | |
1813 | |
1814 (define_int_attr sm3part_op [(UNSPEC_SM3PARTW1 "1") (UNSPEC_SM3PARTW2 "2")]) | |
1815 | |
1816 (define_int_attr f16mac1 [(UNSPEC_FMLAL "a") (UNSPEC_FMLSL "s") | |
1817 (UNSPEC_FMLAL2 "a") (UNSPEC_FMLSL2 "s")]) | |
1818 | |
1819 ;; The condition associated with an UNSPEC_COND_<xx>. | |
1820 (define_int_attr cmp_op [(UNSPEC_COND_LT "lt") | |
1821 (UNSPEC_COND_LE "le") | |
1822 (UNSPEC_COND_EQ "eq") | |
1823 (UNSPEC_COND_NE "ne") | |
1824 (UNSPEC_COND_GE "ge") | |
1825 (UNSPEC_COND_GT "gt")]) | |
1826 | |
1827 (define_int_attr sve_fp_op [(UNSPEC_COND_ADD "fadd") | |
1828 (UNSPEC_COND_SUB "fsub") | |
1829 (UNSPEC_COND_MUL "fmul") | |
1830 (UNSPEC_COND_DIV "fdiv") | |
1831 (UNSPEC_COND_MAX "fmaxnm") | |
1832 (UNSPEC_COND_MIN "fminnm")]) | |
1833 | |
1834 (define_int_attr sve_fp_op_rev [(UNSPEC_COND_ADD "fadd") | |
1835 (UNSPEC_COND_SUB "fsubr") | |
1836 (UNSPEC_COND_MUL "fmul") | |
1837 (UNSPEC_COND_DIV "fdivr") | |
1838 (UNSPEC_COND_MAX "fmaxnm") | |
1839 (UNSPEC_COND_MIN "fminnm")]) | |
1840 | |
1841 (define_int_attr sve_fmla_op [(UNSPEC_COND_FMLA "fmla") | |
1842 (UNSPEC_COND_FMLS "fmls") | |
1843 (UNSPEC_COND_FNMLA "fnmla") | |
1844 (UNSPEC_COND_FNMLS "fnmls")]) | |
1845 | |
1846 (define_int_attr sve_fmad_op [(UNSPEC_COND_FMLA "fmad") | |
1847 (UNSPEC_COND_FMLS "fmsb") | |
1848 (UNSPEC_COND_FNMLA "fnmad") | |
1849 (UNSPEC_COND_FNMLS "fnmsb")]) | |
1850 | |
1851 (define_int_attr commutative [(UNSPEC_COND_ADD "true") | |
1852 (UNSPEC_COND_SUB "false") | |
1853 (UNSPEC_COND_MUL "true") | |
1854 (UNSPEC_COND_DIV "false") | |
1855 (UNSPEC_COND_MIN "true") | |
1856 (UNSPEC_COND_MAX "true")]) |