1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mattr=+sve2 -force-streaming-compatible -aarch64-sve-vector-bits-min=128 -aarch64-sve-vector-bits-max=128 < %s | FileCheck %s -check-prefixes=CHECK,SVE2_128
3 ; RUN: llc -mattr=+sve2 -force-streaming-compatible -aarch64-sve-vector-bits-min=128 < %s | FileCheck %s -check-prefixes=CHECK,SVE2_128_NOMAX
4 ; RUN: llc -mattr=+sve2 -force-streaming-compatible < %s | FileCheck %s -check-prefixes=CHECK,SVE2_NOMIN_NOMAX
5 ; RUN: llc -mattr=+sve2 -force-streaming-compatible -aarch64-sve-vector-bits-min=256 < %s | FileCheck %s -check-prefixes=CHECK,SVE2_MIN_256_NOMAX
7 target triple = "aarch64-unknown-linux-gnu"
10 ; SVE2_128-NEXT: .byte 0 // 0x0
11 ; SVE2_128-NEXT: .byte 7 // 0x7
12 ; SVE2_128-NEXT: .byte 2 // 0x2
13 ; SVE2_128-NEXT: .byte 3 // 0x3
14 ; SVE2_128-NEXT: .byte 4 // 0x4
15 ; SVE2_128-NEXT: .byte 5 // 0x5
16 ; SVE2_128-NEXT: .byte 6 // 0x6
17 ; SVE2_128-NEXT: .byte 7 // 0x7
18 ; SVE2_128-NEXT: .byte 255 // 0xff
19 ; SVE2_128-NEXT: .byte 255 // 0xff
20 define <8 x i8> @shuffle_index_indices_from_op1(ptr %a, ptr %b) {
21 ; SVE2_128-LABEL: shuffle_index_indices_from_op1:
23 ; SVE2_128-NEXT: adrp x8, .LCPI0_0
24 ; SVE2_128-NEXT: ldr d0, [x0]
25 ; SVE2_128-NEXT: ldr q1, [x8, :lo12:.LCPI0_0]
26 ; SVE2_128-NEXT: tbl z0.b, { z0.b }, z1.b
27 ; SVE2_128-NEXT: // kill: def $d0 killed $d0 killed $z0
30 ; SVE2_128_NOMAX-LABEL: shuffle_index_indices_from_op1:
31 ; SVE2_128_NOMAX: // %bb.0:
32 ; SVE2_128_NOMAX-NEXT: adrp x8, .LCPI0_0
33 ; SVE2_128_NOMAX-NEXT: ldr d0, [x0]
34 ; SVE2_128_NOMAX-NEXT: ldr q1, [x8, :lo12:.LCPI0_0]
35 ; SVE2_128_NOMAX-NEXT: tbl z0.b, { z0.b }, z1.b
36 ; SVE2_128_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0
37 ; SVE2_128_NOMAX-NEXT: ret
39 ; SVE2_NOMIN_NOMAX-LABEL: shuffle_index_indices_from_op1:
40 ; SVE2_NOMIN_NOMAX: // %bb.0:
41 ; SVE2_NOMIN_NOMAX-NEXT: adrp x8, .LCPI0_0
42 ; SVE2_NOMIN_NOMAX-NEXT: ldr d0, [x0]
43 ; SVE2_NOMIN_NOMAX-NEXT: ldr q1, [x8, :lo12:.LCPI0_0]
44 ; SVE2_NOMIN_NOMAX-NEXT: tbl z0.b, { z0.b }, z1.b
45 ; SVE2_NOMIN_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0
46 ; SVE2_NOMIN_NOMAX-NEXT: ret
48 ; SVE2_MIN_256_NOMAX-LABEL: shuffle_index_indices_from_op1:
49 ; SVE2_MIN_256_NOMAX: // %bb.0:
50 ; SVE2_MIN_256_NOMAX-NEXT: ptrue p0.b, vl32
51 ; SVE2_MIN_256_NOMAX-NEXT: adrp x8, .LCPI0_0
52 ; SVE2_MIN_256_NOMAX-NEXT: add x8, x8, :lo12:.LCPI0_0
53 ; SVE2_MIN_256_NOMAX-NEXT: ldr d1, [x0]
54 ; SVE2_MIN_256_NOMAX-NEXT: ld1b { z0.b }, p0/z, [x8]
55 ; SVE2_MIN_256_NOMAX-NEXT: tbl z0.b, { z1.b }, z0.b
56 ; SVE2_MIN_256_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0
57 ; SVE2_MIN_256_NOMAX-NEXT: ret
58 %op1 = load <8 x i8>, ptr %a
59 %op2 = load <8 x i8>, ptr %b
60 %1 = shufflevector <8 x i8> %op1, <8 x i8> %op2, <8 x i32> <i32 0, i32 7, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
65 ; SVE2_128-NEXT: .byte 0 // 0x0
66 ; SVE2_128-NEXT: .byte 1 // 0x1
67 ; SVE2_128-NEXT: .byte 1 // 0x1
68 ; SVE2_128-NEXT: .byte 3 // 0x3
69 ; SVE2_128-NEXT: .byte 4 // 0x4
70 ; SVE2_128-NEXT: .byte 7 // 0x7
71 ; SVE2_128-NEXT: .byte 6 // 0x6
72 ; SVE2_128-NEXT: .byte 7 // 0x7
73 ; SVE2_128-NEXT: .byte 255 // 0xff
74 ; SVE2_128-NEXT: .byte 255 // 0xff
75 define <8 x i8> @shuffle_index_indices_from_op2(ptr %a, ptr %b) {
76 ; SVE2_128-LABEL: shuffle_index_indices_from_op2:
78 ; SVE2_128-NEXT: adrp x8, .LCPI1_0
79 ; SVE2_128-NEXT: ldr d0, [x1]
80 ; SVE2_128-NEXT: ldr q1, [x8, :lo12:.LCPI1_0]
81 ; SVE2_128-NEXT: tbl z0.b, { z0.b }, z1.b
82 ; SVE2_128-NEXT: // kill: def $d0 killed $d0 killed $z0
85 ; SVE2_128_NOMAX-LABEL: shuffle_index_indices_from_op2:
86 ; SVE2_128_NOMAX: // %bb.0:
87 ; SVE2_128_NOMAX-NEXT: adrp x8, .LCPI1_0
88 ; SVE2_128_NOMAX-NEXT: ldr d0, [x1]
89 ; SVE2_128_NOMAX-NEXT: ldr q1, [x8, :lo12:.LCPI1_0]
90 ; SVE2_128_NOMAX-NEXT: tbl z0.b, { z0.b }, z1.b
91 ; SVE2_128_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0
92 ; SVE2_128_NOMAX-NEXT: ret
94 ; SVE2_NOMIN_NOMAX-LABEL: shuffle_index_indices_from_op2:
95 ; SVE2_NOMIN_NOMAX: // %bb.0:
96 ; SVE2_NOMIN_NOMAX-NEXT: adrp x8, .LCPI1_0
97 ; SVE2_NOMIN_NOMAX-NEXT: ldr d0, [x1]
98 ; SVE2_NOMIN_NOMAX-NEXT: ldr q1, [x8, :lo12:.LCPI1_0]
99 ; SVE2_NOMIN_NOMAX-NEXT: tbl z0.b, { z0.b }, z1.b
100 ; SVE2_NOMIN_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0
101 ; SVE2_NOMIN_NOMAX-NEXT: ret
103 ; SVE2_MIN_256_NOMAX-LABEL: shuffle_index_indices_from_op2:
104 ; SVE2_MIN_256_NOMAX: // %bb.0:
105 ; SVE2_MIN_256_NOMAX-NEXT: ptrue p0.b, vl32
106 ; SVE2_MIN_256_NOMAX-NEXT: adrp x8, .LCPI1_0
107 ; SVE2_MIN_256_NOMAX-NEXT: add x8, x8, :lo12:.LCPI1_0
108 ; SVE2_MIN_256_NOMAX-NEXT: ldr d1, [x1]
109 ; SVE2_MIN_256_NOMAX-NEXT: ld1b { z0.b }, p0/z, [x8]
110 ; SVE2_MIN_256_NOMAX-NEXT: tbl z0.b, { z1.b }, z0.b
111 ; SVE2_MIN_256_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0
112 ; SVE2_MIN_256_NOMAX-NEXT: ret
113 %op1 = load <8 x i8>, ptr %a
114 %op2 = load <8 x i8>, ptr %b
115 %1 = shufflevector <8 x i8> %op1, <8 x i8> %op2, <8 x i32> <i32 8, i32 9, i32 9, i32 11, i32 12, i32 15, i32 14, i32 15>
119 ; SVE2_128: .LCPI2_0:
120 ; SVE2_128-NEXT: .byte 1 // 0x1
121 ; SVE2_128-NEXT: .byte 17 // 0x11
122 ; SVE2_128-NEXT: .byte 18 // 0x12
123 ; SVE2_128-NEXT: .byte 19 // 0x13
124 ; SVE2_128-NEXT: .byte 20 // 0x14
125 ; SVE2_128-NEXT: .byte 20 // 0x14
126 ; SVE2_128-NEXT: .byte 22 // 0x16
127 ; SVE2_128-NEXT: .byte 23 // 0x17
128 ; SVE2_128-NEXT: .byte 255 // 0xff
129 ; SVE2_128-NEXT: .byte 255 // 0xff
130 define <8 x i8> @shuffle_index_indices_from_both_ops(ptr %a, ptr %b) {
131 ; SVE2_128-LABEL: shuffle_index_indices_from_both_ops:
132 ; SVE2_128: // %bb.0:
133 ; SVE2_128-NEXT: adrp x8, .LCPI2_0
134 ; SVE2_128-NEXT: ldr d0, [x0]
135 ; SVE2_128-NEXT: ldr d1, [x1]
136 ; SVE2_128-NEXT: ldr q2, [x8, :lo12:.LCPI2_0]
137 ; SVE2_128-NEXT: tbl z0.b, { z0.b, z1.b }, z2.b
138 ; SVE2_128-NEXT: // kill: def $d0 killed $d0 killed $z0
141 ; SVE2_128_NOMAX-LABEL: shuffle_index_indices_from_both_ops:
142 ; SVE2_128_NOMAX: // %bb.0:
143 ; SVE2_128_NOMAX-NEXT: sub sp, sp, #16
144 ; SVE2_128_NOMAX-NEXT: .cfi_def_cfa_offset 16
145 ; SVE2_128_NOMAX-NEXT: ldr d0, [x1]
146 ; SVE2_128_NOMAX-NEXT: mov z1.b, z0.b[7]
147 ; SVE2_128_NOMAX-NEXT: mov z2.b, z0.b[6]
148 ; SVE2_128_NOMAX-NEXT: mov z3.b, z0.b[4]
149 ; SVE2_128_NOMAX-NEXT: fmov w8, s1
150 ; SVE2_128_NOMAX-NEXT: ldr d1, [x0]
151 ; SVE2_128_NOMAX-NEXT: fmov w9, s2
152 ; SVE2_128_NOMAX-NEXT: mov z2.b, z0.b[3]
153 ; SVE2_128_NOMAX-NEXT: mov z1.b, z1.b[1]
154 ; SVE2_128_NOMAX-NEXT: strb w8, [sp, #15]
155 ; SVE2_128_NOMAX-NEXT: fmov w8, s3
156 ; SVE2_128_NOMAX-NEXT: mov z3.b, z0.b[2]
157 ; SVE2_128_NOMAX-NEXT: strb w9, [sp, #14]
158 ; SVE2_128_NOMAX-NEXT: mov z0.b, z0.b[1]
159 ; SVE2_128_NOMAX-NEXT: fmov w9, s2
160 ; SVE2_128_NOMAX-NEXT: strb w8, [sp, #13]
161 ; SVE2_128_NOMAX-NEXT: strb w8, [sp, #12]
162 ; SVE2_128_NOMAX-NEXT: fmov w8, s3
163 ; SVE2_128_NOMAX-NEXT: strb w9, [sp, #11]
164 ; SVE2_128_NOMAX-NEXT: fmov w9, s0
165 ; SVE2_128_NOMAX-NEXT: strb w8, [sp, #10]
166 ; SVE2_128_NOMAX-NEXT: fmov w8, s1
167 ; SVE2_128_NOMAX-NEXT: strb w9, [sp, #9]
168 ; SVE2_128_NOMAX-NEXT: strb w8, [sp, #8]
169 ; SVE2_128_NOMAX-NEXT: ldr d0, [sp, #8]
170 ; SVE2_128_NOMAX-NEXT: add sp, sp, #16
171 ; SVE2_128_NOMAX-NEXT: ret
173 ; SVE2_NOMIN_NOMAX-LABEL: shuffle_index_indices_from_both_ops:
174 ; SVE2_NOMIN_NOMAX: // %bb.0:
175 ; SVE2_NOMIN_NOMAX-NEXT: sub sp, sp, #16
176 ; SVE2_NOMIN_NOMAX-NEXT: .cfi_def_cfa_offset 16
177 ; SVE2_NOMIN_NOMAX-NEXT: ldr d0, [x1]
178 ; SVE2_NOMIN_NOMAX-NEXT: mov z1.b, z0.b[7]
179 ; SVE2_NOMIN_NOMAX-NEXT: mov z2.b, z0.b[6]
180 ; SVE2_NOMIN_NOMAX-NEXT: mov z3.b, z0.b[4]
181 ; SVE2_NOMIN_NOMAX-NEXT: fmov w8, s1
182 ; SVE2_NOMIN_NOMAX-NEXT: ldr d1, [x0]
183 ; SVE2_NOMIN_NOMAX-NEXT: fmov w9, s2
184 ; SVE2_NOMIN_NOMAX-NEXT: mov z2.b, z0.b[3]
185 ; SVE2_NOMIN_NOMAX-NEXT: mov z1.b, z1.b[1]
186 ; SVE2_NOMIN_NOMAX-NEXT: strb w8, [sp, #15]
187 ; SVE2_NOMIN_NOMAX-NEXT: fmov w8, s3
188 ; SVE2_NOMIN_NOMAX-NEXT: mov z3.b, z0.b[2]
189 ; SVE2_NOMIN_NOMAX-NEXT: strb w9, [sp, #14]
190 ; SVE2_NOMIN_NOMAX-NEXT: mov z0.b, z0.b[1]
191 ; SVE2_NOMIN_NOMAX-NEXT: fmov w9, s2
192 ; SVE2_NOMIN_NOMAX-NEXT: strb w8, [sp, #13]
193 ; SVE2_NOMIN_NOMAX-NEXT: strb w8, [sp, #12]
194 ; SVE2_NOMIN_NOMAX-NEXT: fmov w8, s3
195 ; SVE2_NOMIN_NOMAX-NEXT: strb w9, [sp, #11]
196 ; SVE2_NOMIN_NOMAX-NEXT: fmov w9, s0
197 ; SVE2_NOMIN_NOMAX-NEXT: strb w8, [sp, #10]
198 ; SVE2_NOMIN_NOMAX-NEXT: fmov w8, s1
199 ; SVE2_NOMIN_NOMAX-NEXT: strb w9, [sp, #9]
200 ; SVE2_NOMIN_NOMAX-NEXT: strb w8, [sp, #8]
201 ; SVE2_NOMIN_NOMAX-NEXT: ldr d0, [sp, #8]
202 ; SVE2_NOMIN_NOMAX-NEXT: add sp, sp, #16
203 ; SVE2_NOMIN_NOMAX-NEXT: ret
205 ; SVE2_MIN_256_NOMAX-LABEL: shuffle_index_indices_from_both_ops:
206 ; SVE2_MIN_256_NOMAX: // %bb.0:
207 ; SVE2_MIN_256_NOMAX-NEXT: sub sp, sp, #16
208 ; SVE2_MIN_256_NOMAX-NEXT: .cfi_def_cfa_offset 16
209 ; SVE2_MIN_256_NOMAX-NEXT: ldr d0, [x1]
210 ; SVE2_MIN_256_NOMAX-NEXT: mov z1.b, z0.b[7]
211 ; SVE2_MIN_256_NOMAX-NEXT: mov z2.b, z0.b[6]
212 ; SVE2_MIN_256_NOMAX-NEXT: mov z3.b, z0.b[4]
213 ; SVE2_MIN_256_NOMAX-NEXT: fmov w8, s1
214 ; SVE2_MIN_256_NOMAX-NEXT: ldr d1, [x0]
215 ; SVE2_MIN_256_NOMAX-NEXT: fmov w9, s2
216 ; SVE2_MIN_256_NOMAX-NEXT: mov z2.b, z0.b[3]
217 ; SVE2_MIN_256_NOMAX-NEXT: mov z1.b, z1.b[1]
218 ; SVE2_MIN_256_NOMAX-NEXT: strb w8, [sp, #15]
219 ; SVE2_MIN_256_NOMAX-NEXT: fmov w8, s3
220 ; SVE2_MIN_256_NOMAX-NEXT: mov z3.b, z0.b[2]
221 ; SVE2_MIN_256_NOMAX-NEXT: strb w9, [sp, #14]
222 ; SVE2_MIN_256_NOMAX-NEXT: mov z0.b, z0.b[1]
223 ; SVE2_MIN_256_NOMAX-NEXT: fmov w9, s2
224 ; SVE2_MIN_256_NOMAX-NEXT: strb w8, [sp, #13]
225 ; SVE2_MIN_256_NOMAX-NEXT: strb w8, [sp, #12]
226 ; SVE2_MIN_256_NOMAX-NEXT: fmov w8, s3
227 ; SVE2_MIN_256_NOMAX-NEXT: strb w9, [sp, #11]
228 ; SVE2_MIN_256_NOMAX-NEXT: fmov w9, s0
229 ; SVE2_MIN_256_NOMAX-NEXT: strb w8, [sp, #10]
230 ; SVE2_MIN_256_NOMAX-NEXT: fmov w8, s1
231 ; SVE2_MIN_256_NOMAX-NEXT: strb w9, [sp, #9]
232 ; SVE2_MIN_256_NOMAX-NEXT: strb w8, [sp, #8]
233 ; SVE2_MIN_256_NOMAX-NEXT: ldr d0, [sp, #8]
234 ; SVE2_MIN_256_NOMAX-NEXT: add sp, sp, #16
235 ; SVE2_MIN_256_NOMAX-NEXT: ret
236 %op1 = load <8 x i8>, ptr %a
237 %op2 = load <8 x i8>, ptr %b
238 %1 = shufflevector <8 x i8> %op1, <8 x i8> %op2, <8 x i32> <i32 1, i32 9, i32 10, i32 11, i32 12, i32 12, i32 14, i32 15>
242 ; SVE2_128: .LCPI3_0:
243 ; SVE2_128-NEXT: .byte 1 // 0x1
244 ; SVE2_128-NEXT: .byte 17 // 0x11
245 ; SVE2_128-NEXT: .byte 18 // 0x12
246 ; SVE2_128-NEXT: .byte 19 // 0x13
247 ; SVE2_128-NEXT: .byte 20 // 0x14
248 ; SVE2_128-NEXT: .byte 20 // 0x14
249 ; SVE2_128-NEXT: .byte 22 // 0x16
250 ; SVE2_128-NEXT: .byte 0 // 0x0
251 ; SVE2_128-NEXT: .byte 255 // 0xff
252 ; SVE2_128-NEXT: .byte 255 // 0xff
253 define <8 x i8> @shuffle_index_poison_value(ptr %a, ptr %b) {
254 ; SVE2_128-LABEL: shuffle_index_poison_value:
255 ; SVE2_128: // %bb.0:
256 ; SVE2_128-NEXT: adrp x8, .LCPI3_0
257 ; SVE2_128-NEXT: ldr d0, [x0]
258 ; SVE2_128-NEXT: ldr d1, [x1]
259 ; SVE2_128-NEXT: ldr q2, [x8, :lo12:.LCPI3_0]
260 ; SVE2_128-NEXT: tbl z0.b, { z0.b, z1.b }, z2.b
261 ; SVE2_128-NEXT: // kill: def $d0 killed $d0 killed $z0
264 ; SVE2_128_NOMAX-LABEL: shuffle_index_poison_value:
265 ; SVE2_128_NOMAX: // %bb.0:
266 ; SVE2_128_NOMAX-NEXT: sub sp, sp, #16
267 ; SVE2_128_NOMAX-NEXT: .cfi_def_cfa_offset 16
268 ; SVE2_128_NOMAX-NEXT: ldr d0, [x1]
269 ; SVE2_128_NOMAX-NEXT: ldr d3, [x0]
270 ; SVE2_128_NOMAX-NEXT: mov z1.b, z0.b[6]
271 ; SVE2_128_NOMAX-NEXT: mov z2.b, z0.b[4]
272 ; SVE2_128_NOMAX-NEXT: fmov w8, s1
273 ; SVE2_128_NOMAX-NEXT: mov z1.b, z0.b[3]
274 ; SVE2_128_NOMAX-NEXT: fmov w9, s2
275 ; SVE2_128_NOMAX-NEXT: mov z2.b, z0.b[2]
276 ; SVE2_128_NOMAX-NEXT: mov z0.b, z0.b[1]
277 ; SVE2_128_NOMAX-NEXT: strb w8, [sp, #14]
278 ; SVE2_128_NOMAX-NEXT: fmov w8, s1
279 ; SVE2_128_NOMAX-NEXT: mov z1.b, z3.b[1]
280 ; SVE2_128_NOMAX-NEXT: strb w9, [sp, #13]
281 ; SVE2_128_NOMAX-NEXT: strb w9, [sp, #12]
282 ; SVE2_128_NOMAX-NEXT: fmov w9, s2
283 ; SVE2_128_NOMAX-NEXT: strb w8, [sp, #11]
284 ; SVE2_128_NOMAX-NEXT: fmov w8, s0
285 ; SVE2_128_NOMAX-NEXT: strb w9, [sp, #10]
286 ; SVE2_128_NOMAX-NEXT: fmov w9, s1
287 ; SVE2_128_NOMAX-NEXT: strb w8, [sp, #9]
288 ; SVE2_128_NOMAX-NEXT: strb w9, [sp, #8]
289 ; SVE2_128_NOMAX-NEXT: ldr d0, [sp, #8]
290 ; SVE2_128_NOMAX-NEXT: add sp, sp, #16
291 ; SVE2_128_NOMAX-NEXT: ret
293 ; SVE2_NOMIN_NOMAX-LABEL: shuffle_index_poison_value:
294 ; SVE2_NOMIN_NOMAX: // %bb.0:
295 ; SVE2_NOMIN_NOMAX-NEXT: sub sp, sp, #16
296 ; SVE2_NOMIN_NOMAX-NEXT: .cfi_def_cfa_offset 16
297 ; SVE2_NOMIN_NOMAX-NEXT: ldr d0, [x1]
298 ; SVE2_NOMIN_NOMAX-NEXT: ldr d3, [x0]
299 ; SVE2_NOMIN_NOMAX-NEXT: mov z1.b, z0.b[6]
300 ; SVE2_NOMIN_NOMAX-NEXT: mov z2.b, z0.b[4]
301 ; SVE2_NOMIN_NOMAX-NEXT: fmov w8, s1
302 ; SVE2_NOMIN_NOMAX-NEXT: mov z1.b, z0.b[3]
303 ; SVE2_NOMIN_NOMAX-NEXT: fmov w9, s2
304 ; SVE2_NOMIN_NOMAX-NEXT: mov z2.b, z0.b[2]
305 ; SVE2_NOMIN_NOMAX-NEXT: mov z0.b, z0.b[1]
306 ; SVE2_NOMIN_NOMAX-NEXT: strb w8, [sp, #14]
307 ; SVE2_NOMIN_NOMAX-NEXT: fmov w8, s1
308 ; SVE2_NOMIN_NOMAX-NEXT: mov z1.b, z3.b[1]
309 ; SVE2_NOMIN_NOMAX-NEXT: strb w9, [sp, #13]
310 ; SVE2_NOMIN_NOMAX-NEXT: strb w9, [sp, #12]
311 ; SVE2_NOMIN_NOMAX-NEXT: fmov w9, s2
312 ; SVE2_NOMIN_NOMAX-NEXT: strb w8, [sp, #11]
313 ; SVE2_NOMIN_NOMAX-NEXT: fmov w8, s0
314 ; SVE2_NOMIN_NOMAX-NEXT: strb w9, [sp, #10]
315 ; SVE2_NOMIN_NOMAX-NEXT: fmov w9, s1
316 ; SVE2_NOMIN_NOMAX-NEXT: strb w8, [sp, #9]
317 ; SVE2_NOMIN_NOMAX-NEXT: strb w9, [sp, #8]
318 ; SVE2_NOMIN_NOMAX-NEXT: ldr d0, [sp, #8]
319 ; SVE2_NOMIN_NOMAX-NEXT: add sp, sp, #16
320 ; SVE2_NOMIN_NOMAX-NEXT: ret
322 ; SVE2_MIN_256_NOMAX-LABEL: shuffle_index_poison_value:
323 ; SVE2_MIN_256_NOMAX: // %bb.0:
324 ; SVE2_MIN_256_NOMAX-NEXT: sub sp, sp, #16
325 ; SVE2_MIN_256_NOMAX-NEXT: .cfi_def_cfa_offset 16
326 ; SVE2_MIN_256_NOMAX-NEXT: ldr d0, [x1]
327 ; SVE2_MIN_256_NOMAX-NEXT: ldr d3, [x0]
328 ; SVE2_MIN_256_NOMAX-NEXT: mov z1.b, z0.b[6]
329 ; SVE2_MIN_256_NOMAX-NEXT: mov z2.b, z0.b[4]
330 ; SVE2_MIN_256_NOMAX-NEXT: fmov w8, s1
331 ; SVE2_MIN_256_NOMAX-NEXT: mov z1.b, z0.b[3]
332 ; SVE2_MIN_256_NOMAX-NEXT: fmov w9, s2
333 ; SVE2_MIN_256_NOMAX-NEXT: mov z2.b, z0.b[2]
334 ; SVE2_MIN_256_NOMAX-NEXT: mov z0.b, z0.b[1]
335 ; SVE2_MIN_256_NOMAX-NEXT: strb w8, [sp, #14]
336 ; SVE2_MIN_256_NOMAX-NEXT: fmov w8, s1
337 ; SVE2_MIN_256_NOMAX-NEXT: mov z1.b, z3.b[1]
338 ; SVE2_MIN_256_NOMAX-NEXT: strb w9, [sp, #13]
339 ; SVE2_MIN_256_NOMAX-NEXT: strb w9, [sp, #12]
340 ; SVE2_MIN_256_NOMAX-NEXT: fmov w9, s2
341 ; SVE2_MIN_256_NOMAX-NEXT: strb w8, [sp, #11]
342 ; SVE2_MIN_256_NOMAX-NEXT: fmov w8, s0
343 ; SVE2_MIN_256_NOMAX-NEXT: strb w9, [sp, #10]
344 ; SVE2_MIN_256_NOMAX-NEXT: fmov w9, s1
345 ; SVE2_MIN_256_NOMAX-NEXT: strb w8, [sp, #9]
346 ; SVE2_MIN_256_NOMAX-NEXT: strb w9, [sp, #8]
347 ; SVE2_MIN_256_NOMAX-NEXT: ldr d0, [sp, #8]
348 ; SVE2_MIN_256_NOMAX-NEXT: add sp, sp, #16
349 ; SVE2_MIN_256_NOMAX-NEXT: ret
350 %op1 = load <8 x i8>, ptr %a
351 %op2 = load <8 x i8>, ptr %b
352 %1 = shufflevector <8 x i8> %op1, <8 x i8> %op2, <8 x i32> <i32 1, i32 9, i32 10, i32 11, i32 12, i32 12, i32 14, i32 poison>
356 define <8 x i8> @shuffle_op1_poison(ptr %a, ptr %b) {
357 ; SVE2_128-LABEL: shuffle_op1_poison:
358 ; SVE2_128: // %bb.0:
359 ; SVE2_128-NEXT: adrp x8, .LCPI4_0
360 ; SVE2_128-NEXT: ldr d0, [x1]
361 ; SVE2_128-NEXT: ldr q1, [x8, :lo12:.LCPI4_0]
362 ; SVE2_128-NEXT: tbl z0.b, { z0.b }, z1.b
363 ; SVE2_128-NEXT: // kill: def $d0 killed $d0 killed $z0
366 ; SVE2_128_NOMAX-LABEL: shuffle_op1_poison:
367 ; SVE2_128_NOMAX: // %bb.0:
368 ; SVE2_128_NOMAX-NEXT: adrp x8, .LCPI4_0
369 ; SVE2_128_NOMAX-NEXT: ldr d0, [x1]
370 ; SVE2_128_NOMAX-NEXT: ldr q1, [x8, :lo12:.LCPI4_0]
371 ; SVE2_128_NOMAX-NEXT: tbl z0.b, { z0.b }, z1.b
372 ; SVE2_128_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0
373 ; SVE2_128_NOMAX-NEXT: ret
375 ; SVE2_NOMIN_NOMAX-LABEL: shuffle_op1_poison:
376 ; SVE2_NOMIN_NOMAX: // %bb.0:
377 ; SVE2_NOMIN_NOMAX-NEXT: adrp x8, .LCPI4_0
378 ; SVE2_NOMIN_NOMAX-NEXT: ldr d0, [x1]
379 ; SVE2_NOMIN_NOMAX-NEXT: ldr q1, [x8, :lo12:.LCPI4_0]
380 ; SVE2_NOMIN_NOMAX-NEXT: tbl z0.b, { z0.b }, z1.b
381 ; SVE2_NOMIN_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0
382 ; SVE2_NOMIN_NOMAX-NEXT: ret
384 ; SVE2_MIN_256_NOMAX-LABEL: shuffle_op1_poison:
385 ; SVE2_MIN_256_NOMAX: // %bb.0:
386 ; SVE2_MIN_256_NOMAX-NEXT: ptrue p0.b, vl32
387 ; SVE2_MIN_256_NOMAX-NEXT: adrp x8, .LCPI4_0
388 ; SVE2_MIN_256_NOMAX-NEXT: add x8, x8, :lo12:.LCPI4_0
389 ; SVE2_MIN_256_NOMAX-NEXT: ldr d1, [x1]
390 ; SVE2_MIN_256_NOMAX-NEXT: ld1b { z0.b }, p0/z, [x8]
391 ; SVE2_MIN_256_NOMAX-NEXT: tbl z0.b, { z1.b }, z0.b
392 ; SVE2_MIN_256_NOMAX-NEXT: // kill: def $d0 killed $d0 killed $z0
393 ; SVE2_MIN_256_NOMAX-NEXT: ret
394 %op2 = load <8 x i8>, ptr %b
395 %1 = shufflevector <8 x i8> poison, <8 x i8> %op2, <8 x i32> <i32 1, i32 9, i32 10, i32 11, i32 12, i32 12, i32 14, i32 15>
399 ; In this function, we could not represent indexes for the second operand
400 ; because for i8 type, the maximum constant in the mask is 256.
401 define <8 x i8> @negative_test_shuffle_index_size_op_both_maxhw(ptr %a, ptr %b) "target-features"="+sve2" vscale_range(16,16) {
402 ; CHECK-LABEL: negative_test_shuffle_index_size_op_both_maxhw:
404 ; CHECK-NEXT: sub sp, sp, #16
405 ; CHECK-NEXT: .cfi_def_cfa_offset 16
406 ; CHECK-NEXT: ldr d0, [x1]
407 ; CHECK-NEXT: mov z1.b, z0.b[7]
408 ; CHECK-NEXT: mov z2.b, z0.b[6]
409 ; CHECK-NEXT: mov z3.b, z0.b[4]
410 ; CHECK-NEXT: fmov w8, s1
411 ; CHECK-NEXT: ldr d1, [x0]
412 ; CHECK-NEXT: fmov w9, s2
413 ; CHECK-NEXT: mov z2.b, z0.b[3]
414 ; CHECK-NEXT: mov z1.b, z1.b[1]
415 ; CHECK-NEXT: strb w8, [sp, #15]
416 ; CHECK-NEXT: fmov w8, s3
417 ; CHECK-NEXT: mov z3.b, z0.b[2]
418 ; CHECK-NEXT: strb w9, [sp, #14]
419 ; CHECK-NEXT: mov z0.b, z0.b[1]
420 ; CHECK-NEXT: fmov w9, s2
421 ; CHECK-NEXT: strb w8, [sp, #13]
422 ; CHECK-NEXT: strb w8, [sp, #12]
423 ; CHECK-NEXT: fmov w8, s3
424 ; CHECK-NEXT: strb w9, [sp, #11]
425 ; CHECK-NEXT: fmov w9, s0
426 ; CHECK-NEXT: strb w8, [sp, #10]
427 ; CHECK-NEXT: fmov w8, s1
428 ; CHECK-NEXT: strb w9, [sp, #9]
429 ; CHECK-NEXT: strb w8, [sp, #8]
430 ; CHECK-NEXT: ldr d0, [sp, #8]
431 ; CHECK-NEXT: add sp, sp, #16
433 %op1 = load <8 x i8>, ptr %a
434 %op2 = load <8 x i8>, ptr %b
435 %1 = shufflevector <8 x i8> %op1, <8 x i8> %op2, <8 x i32> <i32 1, i32 9, i32 10, i32 11, i32 12, i32 12, i32 14, i32 15>
440 ; CHECK-NEXT: .byte 0 // 0x0
441 ; CHECK-NEXT: .byte 7 // 0x7
442 ; CHECK-NEXT: .byte 2 // 0x2
443 ; CHECK-NEXT: .byte 3 // 0x3
444 ; CHECK-NEXT: .byte 4 // 0x4
445 ; CHECK-NEXT: .byte 5 // 0x5
446 ; CHECK-NEXT: .byte 6 // 0x6
447 ; CHECK-NEXT: .byte 7 // 0x7
448 ; CHECK-NEXT: .byte 255 // 0xff
449 ; CHECK-NEXT: .byte 255 // 0xff
450 define <8 x i8> @shuffle_index_size_op1_maxhw(ptr %a, ptr %b) "target-features"="+sve2" vscale_range(16,16) {
451 ; CHECK-LABEL: shuffle_index_size_op1_maxhw:
453 ; CHECK-NEXT: ptrue p0.b
454 ; CHECK-NEXT: adrp x8, .LCPI6_0
455 ; CHECK-NEXT: add x8, x8, :lo12:.LCPI6_0
456 ; CHECK-NEXT: ldr d1, [x0]
457 ; CHECK-NEXT: ld1b { z0.b }, p0/z, [x8]
458 ; CHECK-NEXT: tbl z0.b, { z1.b }, z0.b
459 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
461 %op1 = load <8 x i8>, ptr %a
462 %op2 = load <8 x i8>, ptr %b
463 %1 = shufflevector <8 x i8> %op1, <8 x i8> %op2, <8 x i32> <i32 0, i32 7, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
467 ; SVE2_128: .LCPI7_0:
468 ; SVE2_128-NEXT: .hword 1 // 0x1
469 ; SVE2_128-NEXT: .hword 9 // 0x9
470 ; SVE2_128-NEXT: .hword 10 // 0xa
471 ; SVE2_128-NEXT: .hword 11 // 0xb
472 ; SVE2_128-NEXT: .hword 12 // 0xc
473 ; SVE2_128-NEXT: .hword 12 // 0xc
474 ; SVE2_128-NEXT: .hword 14 // 0xe
475 ; SVE2_128-NEXT: .hword 15 // 0xf
477 ; SVE2_128_NOMAX: .LCPI7_0:
478 ; SVE2_128_NOMAX-NEXT: .hword 0 // 0x0
479 ; SVE2_128_NOMAX-NEXT: .hword 1 // 0x1
480 ; SVE2_128_NOMAX-NEXT: .hword 1 // 0x1
481 ; SVE2_128_NOMAX-NEXT: .hword 1 // 0x1
482 ; SVE2_128_NOMAX-NEXT: .hword 1 // 0x1
483 ; SVE2_128_NOMAX-NEXT: .hword 1 // 0x1
484 ; SVE2_128_NOMAX-NEXT: .hword 1 // 0x1
485 ; SVE2_128_NOMAX-NEXT: .hword 1 // 0x1
486 ; SVE2_128_NOMAX-NEXT:.LCPI7_1:
487 ; SVE2_128_NOMAX-NEXT: .hword 1 // 0x1
488 ; SVE2_128_NOMAX-NEXT: .hword 1 // 0x1
489 ; SVE2_128_NOMAX-NEXT: .hword 2 // 0x2
490 ; SVE2_128_NOMAX-NEXT: .hword 3 // 0x3
491 ; SVE2_128_NOMAX-NEXT: .hword 4 // 0x4
492 ; SVE2_128_NOMAX-NEXT: .hword 4 // 0x4
493 ; SVE2_128_NOMAX-NEXT: .hword 6 // 0x6
494 ; SVE2_128_NOMAX-NEXT: .hword 7 // 0x7
496 ; SVE2_NOMIN_NOMAX: .LCPI7_0:
497 ; SVE2_NOMIN_NOMAX-NEXT: .hword 0 // 0x0
498 ; SVE2_NOMIN_NOMAX-NEXT: .hword 1 // 0x1
499 ; SVE2_NOMIN_NOMAX-NEXT: .hword 1 // 0x1
500 ; SVE2_NOMIN_NOMAX-NEXT: .hword 1 // 0x1
501 ; SVE2_NOMIN_NOMAX-NEXT: .hword 1 // 0x1
502 ; SVE2_NOMIN_NOMAX-NEXT: .hword 1 // 0x1
503 ; SVE2_NOMIN_NOMAX-NEXT: .hword 1 // 0x1
504 ; SVE2_NOMIN_NOMAX-NEXT: .hword 1 // 0x1
505 ; SVE2_NOMIN_NOMAX-NEXT:.LCPI7_1:
506 ; SVE2_NOMIN_NOMAX-NEXT: .hword 1 // 0x1
507 ; SVE2_NOMIN_NOMAX-NEXT: .hword 1 // 0x1
508 ; SVE2_NOMIN_NOMAX-NEXT: .hword 2 // 0x2
509 ; SVE2_NOMIN_NOMAX-NEXT: .hword 3 // 0x3
510 ; SVE2_NOMIN_NOMAX-NEXT: .hword 4 // 0x4
511 ; SVE2_NOMIN_NOMAX-NEXT: .hword 4 // 0x4
512 ; SVE2_NOMIN_NOMAX-NEXT: .hword 6 // 0x6
513 ; SVE2_NOMIN_NOMAX-NEXT: .hword 7 // 0x7
515 ; SVE2_MIN_256_NOMAX: .LCPI7_0:
516 ; SVE2_MIN_256_NOMAX-NEXT: .hword 0 // 0x0
517 ; SVE2_MIN_256_NOMAX-NEXT: .hword 1 // 0x1
518 ; SVE2_MIN_256_NOMAX-NEXT: .hword 1 // 0x1
519 ; SVE2_MIN_256_NOMAX-NEXT: .hword 1 // 0x1
520 ; SVE2_MIN_256_NOMAX-NEXT: .hword 1 // 0x1
521 ; SVE2_MIN_256_NOMAX-NEXT: .hword 1 // 0x1
522 ; SVE2_MIN_256_NOMAX-NEXT: .hword 1 // 0x1
523 ; SVE2_MIN_256_NOMAX-NEXT: .hword 1 // 0x1
524 ; SVE2_MIN_256_NOMAX-NEXT: .hword 0 // 0x0
525 ; SVE2_MIN_256_NOMAX-NEXT: .hword 0 // 0x0
526 ; SVE2_MIN_256_NOMAX-NEXT: .hword 0 // 0x0
527 ; SVE2_MIN_256_NOMAX-NEXT: .hword 0 // 0x0
528 ; SVE2_MIN_256_NOMAX-NEXT: .hword 0 // 0x0
529 ; SVE2_MIN_256_NOMAX-NEXT: .hword 0 // 0x0
530 ; SVE2_MIN_256_NOMAX-NEXT: .hword 0 // 0x0
531 ; SVE2_MIN_256_NOMAX-NEXT: .hword 0 // 0x0
532 ; SVE2_MIN_256_NOMAX-NEXT:.LCPI7_1:
533 ; SVE2_MIN_256_NOMAX-NEXT: .hword 1 // 0x1
534 ; SVE2_MIN_256_NOMAX-NEXT: .hword 1 // 0x1
535 ; SVE2_MIN_256_NOMAX-NEXT: .hword 2 // 0x2
536 ; SVE2_MIN_256_NOMAX-NEXT: .hword 3 // 0x3
537 ; SVE2_MIN_256_NOMAX-NEXT: .hword 4 // 0x4
538 ; SVE2_MIN_256_NOMAX-NEXT: .hword 4 // 0x4
539 ; SVE2_MIN_256_NOMAX-NEXT: .hword 6 // 0x6
540 ; SVE2_MIN_256_NOMAX-NEXT: .hword 7 // 0x7
541 ; SVE2_MIN_256_NOMAX-NEXT: .hword 65535 // 0xffff
542 ; SVE2_MIN_256_NOMAX-NEXT: .hword 65535 // 0xffff
543 ; SVE2_MIN_256_NOMAX-NEXT: .hword 65535 // 0xffff
544 ; SVE2_MIN_256_NOMAX-NEXT: .hword 65535 // 0xffff
545 ; SVE2_MIN_256_NOMAX-NEXT: .hword 65535 // 0xffff
546 ; SVE2_MIN_256_NOMAX-NEXT: .hword 65535 // 0xffff
547 ; SVE2_MIN_256_NOMAX-NEXT: .hword 65535 // 0xffff
548 ; SVE2_MIN_256_NOMAX-NEXT: .hword 65535 // 0xffff
549 define <8 x i16> @shuffle_index_indices_from_both_ops_i16(ptr %a, ptr %b) {
550 ; SVE2_128-LABEL: shuffle_index_indices_from_both_ops_i16:
551 ; SVE2_128: // %bb.0:
552 ; SVE2_128-NEXT: adrp x8, .LCPI7_0
553 ; SVE2_128-NEXT: ldr q0, [x0]
554 ; SVE2_128-NEXT: ldr q1, [x1]
555 ; SVE2_128-NEXT: ldr q2, [x8, :lo12:.LCPI7_0]
556 ; SVE2_128-NEXT: tbl z0.h, { z0.h, z1.h }, z2.h
557 ; SVE2_128-NEXT: // kill: def $q0 killed $q0 killed $z0
560 ; SVE2_128_NOMAX-LABEL: shuffle_index_indices_from_both_ops_i16:
561 ; SVE2_128_NOMAX: // %bb.0:
562 ; SVE2_128_NOMAX-NEXT: cnth x8
563 ; SVE2_128_NOMAX-NEXT: adrp x9, .LCPI7_0
564 ; SVE2_128_NOMAX-NEXT: adrp x10, .LCPI7_1
565 ; SVE2_128_NOMAX-NEXT: mov z0.h, w8
566 ; SVE2_128_NOMAX-NEXT: ldr q1, [x9, :lo12:.LCPI7_0]
567 ; SVE2_128_NOMAX-NEXT: ldr q2, [x10, :lo12:.LCPI7_1]
568 ; SVE2_128_NOMAX-NEXT: ptrue p0.h, vl8
569 ; SVE2_128_NOMAX-NEXT: mad z0.h, p0/m, z1.h, z2.h
570 ; SVE2_128_NOMAX-NEXT: ldr q1, [x0]
571 ; SVE2_128_NOMAX-NEXT: ldr q2, [x1]
572 ; SVE2_128_NOMAX-NEXT: tbl z0.h, { z1.h, z2.h }, z0.h
573 ; SVE2_128_NOMAX-NEXT: // kill: def $q0 killed $q0 killed $z0
574 ; SVE2_128_NOMAX-NEXT: ret
576 ; SVE2_NOMIN_NOMAX-LABEL: shuffle_index_indices_from_both_ops_i16:
577 ; SVE2_NOMIN_NOMAX: // %bb.0:
578 ; SVE2_NOMIN_NOMAX-NEXT: cnth x8
579 ; SVE2_NOMIN_NOMAX-NEXT: adrp x9, .LCPI7_0
580 ; SVE2_NOMIN_NOMAX-NEXT: adrp x10, .LCPI7_1
581 ; SVE2_NOMIN_NOMAX-NEXT: mov z0.h, w8
582 ; SVE2_NOMIN_NOMAX-NEXT: ldr q1, [x9, :lo12:.LCPI7_0]
583 ; SVE2_NOMIN_NOMAX-NEXT: ldr q2, [x10, :lo12:.LCPI7_1]
584 ; SVE2_NOMIN_NOMAX-NEXT: ptrue p0.h, vl8
585 ; SVE2_NOMIN_NOMAX-NEXT: mad z0.h, p0/m, z1.h, z2.h
586 ; SVE2_NOMIN_NOMAX-NEXT: ldr q1, [x0]
587 ; SVE2_NOMIN_NOMAX-NEXT: ldr q2, [x1]
588 ; SVE2_NOMIN_NOMAX-NEXT: tbl z0.h, { z1.h, z2.h }, z0.h
589 ; SVE2_NOMIN_NOMAX-NEXT: // kill: def $q0 killed $q0 killed $z0
590 ; SVE2_NOMIN_NOMAX-NEXT: ret
592 ; SVE2_MIN_256_NOMAX-LABEL: shuffle_index_indices_from_both_ops_i16:
593 ; SVE2_MIN_256_NOMAX: // %bb.0:
594 ; SVE2_MIN_256_NOMAX-NEXT: ptrue p0.h, vl16
595 ; SVE2_MIN_256_NOMAX-NEXT: adrp x8, .LCPI7_0
596 ; SVE2_MIN_256_NOMAX-NEXT: add x8, x8, :lo12:.LCPI7_0
597 ; SVE2_MIN_256_NOMAX-NEXT: adrp x9, .LCPI7_1
598 ; SVE2_MIN_256_NOMAX-NEXT: add x9, x9, :lo12:.LCPI7_1
599 ; SVE2_MIN_256_NOMAX-NEXT: cnth x10
600 ; SVE2_MIN_256_NOMAX-NEXT: ld1h { z0.h }, p0/z, [x8]
601 ; SVE2_MIN_256_NOMAX-NEXT: ld1h { z1.h }, p0/z, [x9]
602 ; SVE2_MIN_256_NOMAX-NEXT: mov z2.h, w10
603 ; SVE2_MIN_256_NOMAX-NEXT: mad z0.h, p0/m, z2.h, z1.h
604 ; SVE2_MIN_256_NOMAX-NEXT: ldr q1, [x0]
605 ; SVE2_MIN_256_NOMAX-NEXT: ldr q2, [x1]
606 ; SVE2_MIN_256_NOMAX-NEXT: tbl z0.h, { z1.h, z2.h }, z0.h
607 ; SVE2_MIN_256_NOMAX-NEXT: // kill: def $q0 killed $q0 killed $z0
608 ; SVE2_MIN_256_NOMAX-NEXT: ret
609 %op1 = load <8 x i16>, ptr %a
610 %op2 = load <8 x i16>, ptr %b
611 %1 = shufflevector <8 x i16> %op1, <8 x i16> %op2, <8 x i32> <i32 1, i32 9, i32 10, i32 11, i32 12, i32 12, i32 14, i32 15>