[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-extract-element.ll
blob1586d02aacc355355e8429566b4d8f1d20b1d5df
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s | FileCheck %s
4 target triple = "aarch64-unknown-linux-gnu"
6 define i8 @test_lane0_16xi8(<vscale x 16 x i8> %a) #0 {
7 ; CHECK-LABEL: test_lane0_16xi8:
8 ; CHECK:       // %bb.0:
9 ; CHECK-NEXT:    fmov w0, s0
10 ; CHECK-NEXT:    ret
11   %b = extractelement <vscale x 16 x i8> %a, i32 0
12   ret i8 %b
15 define i8 @test_lane15_16xi8(<vscale x 16 x i8> %a) #0 {
16 ; CHECK-LABEL: test_lane15_16xi8:
17 ; CHECK:       // %bb.0:
18 ; CHECK-NEXT:    umov w0, v0.b[15]
19 ; CHECK-NEXT:    ret
20   %b = extractelement <vscale x 16 x i8> %a, i32 15
21   ret i8 %b
24 define i8 @test_lane16_16xi8(<vscale x 16 x i8> %a) #0 {
25 ; CHECK-LABEL: test_lane16_16xi8:
26 ; CHECK:       // %bb.0:
27 ; CHECK-NEXT:    mov z0.b, z0.b[16]
28 ; CHECK-NEXT:    fmov w0, s0
29 ; CHECK-NEXT:    ret
30   %b = extractelement <vscale x 16 x i8> %a, i32 16
31   ret i8 %b
34 define i16 @test_lane0_8xi16(<vscale x 8 x i16> %a) #0 {
35 ; CHECK-LABEL: test_lane0_8xi16:
36 ; CHECK:       // %bb.0:
37 ; CHECK-NEXT:    fmov w0, s0
38 ; CHECK-NEXT:    ret
39   %b = extractelement <vscale x 8 x i16> %a, i32 0
40   ret i16 %b
43 define i16 @test_lane7_8xi16(<vscale x 8 x i16> %a) #0 {
44 ; CHECK-LABEL: test_lane7_8xi16:
45 ; CHECK:       // %bb.0:
46 ; CHECK-NEXT:    umov w0, v0.h[7]
47 ; CHECK-NEXT:    ret
48   %b = extractelement <vscale x 8 x i16> %a, i32 7
49   ret i16 %b
52 define i16 @test_lane8_8xi16(<vscale x 8 x i16> %a) #0 {
53 ; CHECK-LABEL: test_lane8_8xi16:
54 ; CHECK:       // %bb.0:
55 ; CHECK-NEXT:    mov z0.h, z0.h[8]
56 ; CHECK-NEXT:    fmov w0, s0
57 ; CHECK-NEXT:    ret
58   %b = extractelement <vscale x 8 x i16> %a, i32 8
59   ret i16 %b
62 define i32 @test_lane0_4xi32(<vscale x 4 x i32> %a) #0 {
63 ; CHECK-LABEL: test_lane0_4xi32:
64 ; CHECK:       // %bb.0:
65 ; CHECK-NEXT:    fmov w0, s0
66 ; CHECK-NEXT:    ret
67   %b = extractelement <vscale x 4 x i32> %a, i32 0
68   ret i32 %b
71 define i32 @test_lane3_4xi32(<vscale x 4 x i32> %a) #0 {
72 ; CHECK-LABEL: test_lane3_4xi32:
73 ; CHECK:       // %bb.0:
74 ; CHECK-NEXT:    mov w0, v0.s[3]
75 ; CHECK-NEXT:    ret
76   %b = extractelement <vscale x 4 x i32> %a, i32 3
77   ret i32 %b
80 define i32 @test_lane4_4xi32(<vscale x 4 x i32> %a) #0 {
81 ; CHECK-LABEL: test_lane4_4xi32:
82 ; CHECK:       // %bb.0:
83 ; CHECK-NEXT:    mov z0.s, z0.s[4]
84 ; CHECK-NEXT:    fmov w0, s0
85 ; CHECK-NEXT:    ret
86   %b = extractelement <vscale x 4 x i32> %a, i32 4
87   ret i32 %b
90 define i64 @test_lane0_2xi64(<vscale x 2 x i64> %a) #0 {
91 ; CHECK-LABEL: test_lane0_2xi64:
92 ; CHECK:       // %bb.0:
93 ; CHECK-NEXT:    fmov x0, d0
94 ; CHECK-NEXT:    ret
95   %b = extractelement <vscale x 2 x i64> %a, i32 0
96   ret i64 %b
99 define i64 @test_lane1_2xi64(<vscale x 2 x i64> %a) #0 {
100 ; CHECK-LABEL: test_lane1_2xi64:
101 ; CHECK:       // %bb.0:
102 ; CHECK-NEXT:    mov x0, v0.d[1]
103 ; CHECK-NEXT:    ret
104   %b = extractelement <vscale x 2 x i64> %a, i32 1
105   ret i64 %b
108 define i64 @test_lane2_2xi64(<vscale x 2 x i64> %a) #0 {
109 ; CHECK-LABEL: test_lane2_2xi64:
110 ; CHECK:       // %bb.0:
111 ; CHECK-NEXT:    mov z0.d, z0.d[2]
112 ; CHECK-NEXT:    fmov x0, d0
113 ; CHECK-NEXT:    ret
114   %b = extractelement <vscale x 2 x i64> %a, i32 2
115   ret i64 %b
118 define half @test_lane0_8xf16(<vscale x 8 x half> %a) #0 {
119 ; CHECK-LABEL: test_lane0_8xf16:
120 ; CHECK:       // %bb.0:
121 ; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
122 ; CHECK-NEXT:    ret
123   %b = extractelement <vscale x 8 x half> %a, i32 0
124   ret half %b
127 define half @test_lane7_8xf16(<vscale x 8 x half> %a) #0 {
128 ; CHECK-LABEL: test_lane7_8xf16:
129 ; CHECK:       // %bb.0:
130 ; CHECK-NEXT:    mov z0.h, z0.h[7]
131 ; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
132 ; CHECK-NEXT:    ret
133   %b = extractelement <vscale x 8 x half> %a, i32 7
134   ret half %b
137 define half @test_lane8_8xf16(<vscale x 8 x half> %a) #0 {
138 ; CHECK-LABEL: test_lane8_8xf16:
139 ; CHECK:       // %bb.0:
140 ; CHECK-NEXT:    mov z0.h, z0.h[8]
141 ; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
142 ; CHECK-NEXT:    ret
143   %b = extractelement <vscale x 8 x half> %a, i32 8
144   ret half %b
147 define half @test_lane0_4xf16(<vscale x 4 x half> %a) #0 {
148 ; CHECK-LABEL: test_lane0_4xf16:
149 ; CHECK:       // %bb.0:
150 ; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
151 ; CHECK-NEXT:    ret
152   %b = extractelement <vscale x 4 x half> %a, i32 0
153   ret half %b
156 define half @test_lane3_4xf16(<vscale x 4 x half> %a) #0 {
157 ; CHECK-LABEL: test_lane3_4xf16:
158 ; CHECK:       // %bb.0:
159 ; CHECK-NEXT:    mov z0.s, z0.s[3]
160 ; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
161 ; CHECK-NEXT:    ret
162   %b = extractelement <vscale x 4 x half> %a, i32 3
163   ret half %b
166 define half @test_lane4_4xf16(<vscale x 4 x half> %a) #0 {
167 ; CHECK-LABEL: test_lane4_4xf16:
168 ; CHECK:       // %bb.0:
169 ; CHECK-NEXT:    mov z0.s, z0.s[4]
170 ; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
171 ; CHECK-NEXT:    ret
172   %b = extractelement <vscale x 4 x half> %a, i32 4
173   ret half %b
176 define half @test_lane0_2xf16(<vscale x 2 x half> %a) #0 {
177 ; CHECK-LABEL: test_lane0_2xf16:
178 ; CHECK:       // %bb.0:
179 ; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
180 ; CHECK-NEXT:    ret
181   %b = extractelement <vscale x 2 x half> %a, i32 0
182   ret half %b
185 define half @test_lane1_2xf16(<vscale x 2 x half> %a) #0 {
186 ; CHECK-LABEL: test_lane1_2xf16:
187 ; CHECK:       // %bb.0:
188 ; CHECK-NEXT:    mov z0.d, z0.d[1]
189 ; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
190 ; CHECK-NEXT:    ret
191   %b = extractelement <vscale x 2 x half> %a, i32 1
192   ret half %b
195 define half @test_lane2_2xf16(<vscale x 2 x half> %a) #0 {
196 ; CHECK-LABEL: test_lane2_2xf16:
197 ; CHECK:       // %bb.0:
198 ; CHECK-NEXT:    mov z0.d, z0.d[2]
199 ; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
200 ; CHECK-NEXT:    ret
201   %b = extractelement <vscale x 2 x half> %a, i32 2
202   ret half %b
205 define float @test_lane0_4xf32(<vscale x 4 x float> %a) #0 {
206 ; CHECK-LABEL: test_lane0_4xf32:
207 ; CHECK:       // %bb.0:
208 ; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
209 ; CHECK-NEXT:    ret
210   %b = extractelement <vscale x 4 x float> %a, i32 0
211   ret float %b
214 define float @test_lane3_4xf32(<vscale x 4 x float> %a) #0 {
215 ; CHECK-LABEL: test_lane3_4xf32:
216 ; CHECK:       // %bb.0:
217 ; CHECK-NEXT:    mov z0.s, z0.s[3]
218 ; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
219 ; CHECK-NEXT:    ret
220   %b = extractelement <vscale x 4 x float> %a, i32 3
221   ret float %b
224 define float @test_lane4_4xf32(<vscale x 4 x float> %a) #0 {
225 ; CHECK-LABEL: test_lane4_4xf32:
226 ; CHECK:       // %bb.0:
227 ; CHECK-NEXT:    mov z0.s, z0.s[4]
228 ; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
229 ; CHECK-NEXT:    ret
230   %b = extractelement <vscale x 4 x float> %a, i32 4
231   ret float %b
234 define float @test_lane0_2xf32(<vscale x 2 x float> %a) #0 {
235 ; CHECK-LABEL: test_lane0_2xf32:
236 ; CHECK:       // %bb.0:
237 ; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
238 ; CHECK-NEXT:    ret
239   %b = extractelement <vscale x 2 x float> %a, i32 0
240   ret float %b
243 define float @test_lane1_2xf32(<vscale x 2 x float> %a) #0 {
244 ; CHECK-LABEL: test_lane1_2xf32:
245 ; CHECK:       // %bb.0:
246 ; CHECK-NEXT:    mov z0.d, z0.d[1]
247 ; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
248 ; CHECK-NEXT:    ret
249   %b = extractelement <vscale x 2 x float> %a, i32 1
250   ret float %b
253 define float @test_lane2_2xf32(<vscale x 2 x float> %a) #0 {
254 ; CHECK-LABEL: test_lane2_2xf32:
255 ; CHECK:       // %bb.0:
256 ; CHECK-NEXT:    mov z0.d, z0.d[2]
257 ; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
258 ; CHECK-NEXT:    ret
259   %b = extractelement <vscale x 2 x float> %a, i32 2
260   ret float %b
263 define double @test_lane0_2xf64(<vscale x 2 x double> %a) #0 {
264 ; CHECK-LABEL: test_lane0_2xf64:
265 ; CHECK:       // %bb.0:
266 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
267 ; CHECK-NEXT:    ret
268   %b = extractelement <vscale x 2 x double> %a, i32 0
269   ret double %b
272 define double @test_lane1_2xf64(<vscale x 2 x double> %a) #0 {
273 ; CHECK-LABEL: test_lane1_2xf64:
274 ; CHECK:       // %bb.0:
275 ; CHECK-NEXT:    mov z0.d, z0.d[1]
276 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
277 ; CHECK-NEXT:    ret
278   %b = extractelement <vscale x 2 x double> %a, i32 1
279   ret double %b
282 define double @test_lane2_2xf64(<vscale x 2 x double> %a) #0 {
283 ; CHECK-LABEL: test_lane2_2xf64:
284 ; CHECK:       // %bb.0:
285 ; CHECK-NEXT:    mov z0.d, z0.d[2]
286 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
287 ; CHECK-NEXT:    ret
288   %b = extractelement <vscale x 2 x double> %a, i32 2
289   ret double %b
292 define i8 @test_lanex_16xi8(<vscale x 16 x i8> %a, i32 %x) #0 {
293 ; CHECK-LABEL: test_lanex_16xi8:
294 ; CHECK:       // %bb.0:
295 ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0
296 ; CHECK-NEXT:    sxtw x8, w0
297 ; CHECK-NEXT:    whilels p0.b, xzr, x8
298 ; CHECK-NEXT:    lastb w0, p0, z0.b
299 ; CHECK-NEXT:    ret
300   %b = extractelement <vscale x 16 x i8> %a, i32 %x
301   ret i8 %b
304 define i16 @test_lanex_8xi16(<vscale x 8 x i16> %a, i32 %x) #0 {
305 ; CHECK-LABEL: test_lanex_8xi16:
306 ; CHECK:       // %bb.0:
307 ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0
308 ; CHECK-NEXT:    sxtw x8, w0
309 ; CHECK-NEXT:    whilels p0.h, xzr, x8
310 ; CHECK-NEXT:    lastb w0, p0, z0.h
311 ; CHECK-NEXT:    ret
312   %b = extractelement <vscale x 8 x i16> %a, i32 %x
313   ret i16 %b
316 define i32 @test_lanex_4xi32(<vscale x 4 x i32> %a, i32 %x) #0 {
317 ; CHECK-LABEL: test_lanex_4xi32:
318 ; CHECK:       // %bb.0:
319 ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0
320 ; CHECK-NEXT:    sxtw x8, w0
321 ; CHECK-NEXT:    whilels p0.s, xzr, x8
322 ; CHECK-NEXT:    lastb w0, p0, z0.s
323 ; CHECK-NEXT:    ret
324   %b = extractelement <vscale x 4 x i32> %a, i32 %x
325   ret i32 %b
328 define i64 @test_lanex_2xi64(<vscale x 2 x i64> %a, i32 %x) #0 {
329 ; CHECK-LABEL: test_lanex_2xi64:
330 ; CHECK:       // %bb.0:
331 ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0
332 ; CHECK-NEXT:    sxtw x8, w0
333 ; CHECK-NEXT:    whilels p0.d, xzr, x8
334 ; CHECK-NEXT:    lastb x0, p0, z0.d
335 ; CHECK-NEXT:    ret
336   %b = extractelement <vscale x 2 x i64> %a, i32 %x
337   ret i64 %b
340 define half @test_lanex_8xf16(<vscale x 8 x half> %a, i32 %x) #0 {
341 ; CHECK-LABEL: test_lanex_8xf16:
342 ; CHECK:       // %bb.0:
343 ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0
344 ; CHECK-NEXT:    sxtw x8, w0
345 ; CHECK-NEXT:    whilels p0.h, xzr, x8
346 ; CHECK-NEXT:    lastb h0, p0, z0.h
347 ; CHECK-NEXT:    ret
348   %b = extractelement <vscale x 8 x half> %a, i32 %x
349   ret half %b
352 define half @test_lanex_4xf16(<vscale x 4 x half> %a, i32 %x) #0 {
353 ; CHECK-LABEL: test_lanex_4xf16:
354 ; CHECK:       // %bb.0:
355 ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0
356 ; CHECK-NEXT:    sxtw x8, w0
357 ; CHECK-NEXT:    whilels p0.s, xzr, x8
358 ; CHECK-NEXT:    lastb h0, p0, z0.h
359 ; CHECK-NEXT:    ret
360   %b = extractelement <vscale x 4 x half> %a, i32 %x
361   ret half %b
364 define half @test_lanex_2xf16(<vscale x 2 x half> %a, i32 %x) #0 {
365 ; CHECK-LABEL: test_lanex_2xf16:
366 ; CHECK:       // %bb.0:
367 ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0
368 ; CHECK-NEXT:    sxtw x8, w0
369 ; CHECK-NEXT:    whilels p0.d, xzr, x8
370 ; CHECK-NEXT:    lastb h0, p0, z0.h
371 ; CHECK-NEXT:    ret
372   %b = extractelement <vscale x 2 x half> %a, i32 %x
373   ret half %b
376 define float @test_lanex_4xf32(<vscale x 4 x float> %a, i32 %x) #0 {
377 ; CHECK-LABEL: test_lanex_4xf32:
378 ; CHECK:       // %bb.0:
379 ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0
380 ; CHECK-NEXT:    sxtw x8, w0
381 ; CHECK-NEXT:    whilels p0.s, xzr, x8
382 ; CHECK-NEXT:    lastb s0, p0, z0.s
383 ; CHECK-NEXT:    ret
384   %b = extractelement <vscale x 4 x float> %a, i32 %x
385   ret float %b
388 define float @test_lanex_2xf32(<vscale x 2 x float> %a, i32 %x) #0 {
389 ; CHECK-LABEL: test_lanex_2xf32:
390 ; CHECK:       // %bb.0:
391 ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0
392 ; CHECK-NEXT:    sxtw x8, w0
393 ; CHECK-NEXT:    whilels p0.d, xzr, x8
394 ; CHECK-NEXT:    lastb s0, p0, z0.s
395 ; CHECK-NEXT:    ret
396   %b = extractelement <vscale x 2 x float> %a, i32 %x
397   ret float %b
400 define double @test_lanex_2xf64(<vscale x 2 x double> %a, i32 %x) #0 {
401 ; CHECK-LABEL: test_lanex_2xf64:
402 ; CHECK:       // %bb.0:
403 ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0
404 ; CHECK-NEXT:    sxtw x8, w0
405 ; CHECK-NEXT:    whilels p0.d, xzr, x8
406 ; CHECK-NEXT:    lastb d0, p0, z0.d
407 ; CHECK-NEXT:    ret
408   %b = extractelement <vscale x 2 x double> %a, i32 %x
409   ret double %b
412 ; Deliberately choose an index that is undefined
413 define i32 @test_undef_lane_4xi32(<vscale x 4 x i32> %a) #0 {
414 ; CHECK-LABEL: test_undef_lane_4xi32:
415 ; CHECK:       // %bb.0:
416 ; CHECK-NEXT:    fmov w0, s0
417 ; CHECK-NEXT:    ret
418   %b = extractelement <vscale x 4 x i32> %a, i32 undef
419   ret i32 %b
422 define i8 @extract_of_insert_undef_16xi8(i8 %a) #0 {
423 ; CHECK-LABEL: extract_of_insert_undef_16xi8:
424 ; CHECK:       // %bb.0:
425 ; CHECK-NEXT:    ret
426   %b = insertelement <vscale x 16 x i8> undef, i8 %a, i32 0
427   %c = extractelement <vscale x 16 x i8> %b, i32 0
428   ret i8 %c
431 define i8 @extract0_of_insert0_16xi8(<vscale x 16 x i8> %a, i8 %b) #0 {
432 ; CHECK-LABEL: extract0_of_insert0_16xi8:
433 ; CHECK:       // %bb.0:
434 ; CHECK-NEXT:    ret
435   %c = insertelement <vscale x 16 x i8> %a, i8 %b, i32 0
436   %d = extractelement <vscale x 16 x i8> %c, i32 0
437   ret i8 %d
440 define i8 @extract64_of_insert64_16xi8(<vscale x 16 x i8> %a, i8 %b) #0 {
441 ; CHECK-LABEL: extract64_of_insert64_16xi8:
442 ; CHECK:       // %bb.0:
443 ; CHECK-NEXT:    ret
444   %c = insertelement <vscale x 16 x i8> %a, i8 %b, i32 64
445   %d = extractelement <vscale x 16 x i8> %c, i32 64
446   ret i8 %d
449 define i8 @extract_of_insert_diff_lanes_16xi8(<vscale x 16 x i8> %a, i8 %b) #0 {
450 ; CHECK-LABEL: extract_of_insert_diff_lanes_16xi8:
451 ; CHECK:       // %bb.0:
452 ; CHECK-NEXT:    umov w0, v0.b[3]
453 ; CHECK-NEXT:    ret
454   %c = insertelement <vscale x 16 x i8> %a, i8 %b, i32 0
455   %d = extractelement <vscale x 16 x i8> %c, i32 3
456   ret i8 %d
459 define i8 @test_lane0_zero_16xi8(<vscale x 16 x i8> %a) #0 {
460 ; CHECK-LABEL: test_lane0_zero_16xi8:
461 ; CHECK:       // %bb.0:
462 ; CHECK-NEXT:    mov w0, wzr
463 ; CHECK-NEXT:    ret
464   %b = extractelement <vscale x 16 x i8> zeroinitializer, i32 0
465   ret i8 %b
468 ; The DAG combiner should fold the extract of a splat to give element zero
469 ; of the splat, i.e. %x. If the index is beyond the end of the scalable
470 ; vector the result is undefined anyway.
471 define i64 @test_lanex_splat_2xi64(i64 %x, i32 %y) #0 {
472 ; CHECK-LABEL: test_lanex_splat_2xi64:
473 ; CHECK:       // %bb.0:
474 ; CHECK-NEXT:    ret
475   %a = insertelement <vscale x 2 x i64> undef, i64 %x, i32 0
476   %b = shufflevector <vscale x 2 x i64> %a, <vscale x 2 x i64> undef, <vscale x 2 x i32> zeroinitializer
477   %c = extractelement <vscale x 2 x i64> %b, i32 %y
478   ret i64 %c
481 define i1 @test_lane0_16xi1(<vscale x 16 x i1> %a) #0 {
482 ; CHECK-LABEL: test_lane0_16xi1:
483 ; CHECK:       // %bb.0:
484 ; CHECK-NEXT:    mov z0.b, p0/z, #1 // =0x1
485 ; CHECK-NEXT:    fmov w8, s0
486 ; CHECK-NEXT:    and w0, w8, #0x1
487 ; CHECK-NEXT:    ret
488   %b = extractelement <vscale x 16 x i1> %a, i32 0
489   ret i1 %b
492 define i1 @test_lane9_8xi1(<vscale x 8 x i1> %a) #0 {
493 ; CHECK-LABEL: test_lane9_8xi1:
494 ; CHECK:       // %bb.0:
495 ; CHECK-NEXT:    mov z0.h, p0/z, #1 // =0x1
496 ; CHECK-NEXT:    mov z0.h, z0.h[9]
497 ; CHECK-NEXT:    fmov w8, s0
498 ; CHECK-NEXT:    and w0, w8, #0x1
499 ; CHECK-NEXT:    ret
500   %b = extractelement <vscale x 8 x i1> %a, i32 9
501   ret i1 %b
504 define i1 @test_lanex_4xi1(<vscale x 4 x i1> %a, i32 %x) #0 {
505 ; CHECK-LABEL: test_lanex_4xi1:
506 ; CHECK:       // %bb.0:
507 ; CHECK-NEXT:    // kill: def $w0 killed $w0 def $x0
508 ; CHECK-NEXT:    sxtw x8, w0
509 ; CHECK-NEXT:    whilels p1.s, xzr, x8
510 ; CHECK-NEXT:    mov z0.s, p0/z, #1 // =0x1
511 ; CHECK-NEXT:    lastb w8, p1, z0.s
512 ; CHECK-NEXT:    and w0, w8, #0x1
513 ; CHECK-NEXT:    ret
514   %b = extractelement <vscale x 4 x i1> %a, i32 %x
515   ret i1 %b
518 define i1 @test_lane4_2xi1(<vscale x 2 x i1> %a) #0 {
519 ; CHECK-LABEL: test_lane4_2xi1:
520 ; CHECK:       // %bb.0:
521 ; CHECK-NEXT:    mov z0.d, p0/z, #1 // =0x1
522 ; CHECK-NEXT:    mov z0.d, z0.d[4]
523 ; CHECK-NEXT:    fmov x8, d0
524 ; CHECK-NEXT:    and w0, w8, #0x1
525 ; CHECK-NEXT:    ret
526   %b = extractelement <vscale x 2 x i1> %a, i32 4
527   ret i1 %b
530 attributes #0 = { "target-features"="+sve" }