xref: /llvm-project/llvm/test/CodeGen/AArch64/insertextract.ll (revision 61510b51c33464a6bc15e4cf5b1ee07e2e0ec1c9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2; RUN: llc -mtriple=aarch64 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3; RUN: llc -mtriple=aarch64 -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI
4
5define <2 x double> @insert_v2f64_0(<2 x double> %a, double %b, i32 %c) {
6; CHECK-LABEL: insert_v2f64_0:
7; CHECK:       // %bb.0: // %entry
8; CHECK-NEXT:    // kill: def $d1 killed $d1 def $q1
9; CHECK-NEXT:    mov v0.d[0], v1.d[0]
10; CHECK-NEXT:    ret
11entry:
12  %d = insertelement <2 x double> %a, double %b, i32 0
13  ret <2 x double> %d
14}
15
16define <2 x double> @insert_v2f64_1(<2 x double> %a, double %b, i32 %c) {
17; CHECK-LABEL: insert_v2f64_1:
18; CHECK:       // %bb.0: // %entry
19; CHECK-NEXT:    // kill: def $d1 killed $d1 def $q1
20; CHECK-NEXT:    mov v0.d[1], v1.d[0]
21; CHECK-NEXT:    ret
22entry:
23  %d = insertelement <2 x double> %a, double %b, i32 1
24  ret <2 x double> %d
25}
26
27define <2 x double> @insert_v2f64_c(<2 x double> %a, double %b, i32 %c) {
28; CHECK-SD-LABEL: insert_v2f64_c:
29; CHECK-SD:       // %bb.0: // %entry
30; CHECK-SD-NEXT:    sub sp, sp, #16
31; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
32; CHECK-SD-NEXT:    mov x8, sp
33; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
34; CHECK-SD-NEXT:    str q0, [sp]
35; CHECK-SD-NEXT:    bfi x8, x0, #3, #1
36; CHECK-SD-NEXT:    str d1, [x8]
37; CHECK-SD-NEXT:    ldr q0, [sp], #16
38; CHECK-SD-NEXT:    ret
39;
40; CHECK-GI-LABEL: insert_v2f64_c:
41; CHECK-GI:       // %bb.0: // %entry
42; CHECK-GI-NEXT:    sub sp, sp, #16
43; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
44; CHECK-GI-NEXT:    mov w9, w0
45; CHECK-GI-NEXT:    mov x8, sp
46; CHECK-GI-NEXT:    str q0, [sp]
47; CHECK-GI-NEXT:    and x9, x9, #0x1
48; CHECK-GI-NEXT:    str d1, [x8, x9, lsl #3]
49; CHECK-GI-NEXT:    ldr q0, [sp], #16
50; CHECK-GI-NEXT:    ret
51entry:
52  %d = insertelement <2 x double> %a, double %b, i32 %c
53  ret <2 x double> %d
54}
55
56define <3 x double> @insert_v3f64_0(<3 x double> %a, double %b, i32 %c) {
57; CHECK-SD-LABEL: insert_v3f64_0:
58; CHECK-SD:       // %bb.0: // %entry
59; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
60; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
61; CHECK-SD-NEXT:    // kill: def $d3 killed $d3 def $q3
62; CHECK-SD-NEXT:    mov v0.d[0], v3.d[0]
63; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
64; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
65; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
66; CHECK-SD-NEXT:    ret
67;
68; CHECK-GI-LABEL: insert_v3f64_0:
69; CHECK-GI:       // %bb.0: // %entry
70; CHECK-GI-NEXT:    fmov d0, d3
71; CHECK-GI-NEXT:    ret
72entry:
73  %d = insertelement <3 x double> %a, double %b, i32 0
74  ret <3 x double> %d
75}
76
77define <3 x double> @insert_v3f64_2(<3 x double> %a, double %b, i32 %c) {
78; CHECK-LABEL: insert_v3f64_2:
79; CHECK:       // %bb.0: // %entry
80; CHECK-NEXT:    fmov d2, d3
81; CHECK-NEXT:    ret
82entry:
83  %d = insertelement <3 x double> %a, double %b, i32 2
84  ret <3 x double> %d
85}
86
87define <3 x double> @insert_v3f64_c(<3 x double> %a, double %b, i32 %c) {
88; CHECK-SD-LABEL: insert_v3f64_c:
89; CHECK-SD:       // %bb.0: // %entry
90; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
91; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
92; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
93; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
94; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
95; CHECK-SD-NEXT:    stp q0, q2, [sp, #-32]!
96; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
97; CHECK-SD-NEXT:    mov x8, sp
98; CHECK-SD-NEXT:    and x9, x0, #0x3
99; CHECK-SD-NEXT:    str d3, [x8, x9, lsl #3]
100; CHECK-SD-NEXT:    ldr q0, [sp]
101; CHECK-SD-NEXT:    ldr d2, [sp, #16]
102; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
103; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
104; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
105; CHECK-SD-NEXT:    add sp, sp, #32
106; CHECK-SD-NEXT:    ret
107;
108; CHECK-GI-LABEL: insert_v3f64_c:
109; CHECK-GI:       // %bb.0: // %entry
110; CHECK-GI-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
111; CHECK-GI-NEXT:    sub x9, sp, #48
112; CHECK-GI-NEXT:    mov x29, sp
113; CHECK-GI-NEXT:    and sp, x9, #0xffffffffffffffe0
114; CHECK-GI-NEXT:    .cfi_def_cfa w29, 16
115; CHECK-GI-NEXT:    .cfi_offset w30, -8
116; CHECK-GI-NEXT:    .cfi_offset w29, -16
117; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
118; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
119; CHECK-GI-NEXT:    mov w8, w0
120; CHECK-GI-NEXT:    mov x9, sp
121; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 def $q2
122; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
123; CHECK-GI-NEXT:    and x8, x8, #0x3
124; CHECK-GI-NEXT:    stp q0, q2, [sp]
125; CHECK-GI-NEXT:    str d3, [x9, x8, lsl #3]
126; CHECK-GI-NEXT:    ldp q0, q2, [sp]
127; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 killed $q2
128; CHECK-GI-NEXT:    mov d1, v0.d[1]
129; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
130; CHECK-GI-NEXT:    mov sp, x29
131; CHECK-GI-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
132; CHECK-GI-NEXT:    ret
133entry:
134  %d = insertelement <3 x double> %a, double %b, i32 %c
135  ret <3 x double> %d
136}
137
138define <4 x double> @insert_v4f64_0(<4 x double> %a, double %b, i32 %c) {
139; CHECK-LABEL: insert_v4f64_0:
140; CHECK:       // %bb.0: // %entry
141; CHECK-NEXT:    // kill: def $d2 killed $d2 def $q2
142; CHECK-NEXT:    mov v0.d[0], v2.d[0]
143; CHECK-NEXT:    ret
144entry:
145  %d = insertelement <4 x double> %a, double %b, i32 0
146  ret <4 x double> %d
147}
148
149define <4 x double> @insert_v4f64_2(<4 x double> %a, double %b, i32 %c) {
150; CHECK-LABEL: insert_v4f64_2:
151; CHECK:       // %bb.0: // %entry
152; CHECK-NEXT:    // kill: def $d2 killed $d2 def $q2
153; CHECK-NEXT:    mov v1.d[0], v2.d[0]
154; CHECK-NEXT:    ret
155entry:
156  %d = insertelement <4 x double> %a, double %b, i32 2
157  ret <4 x double> %d
158}
159
160define <4 x double> @insert_v4f64_c(<4 x double> %a, double %b, i32 %c) {
161; CHECK-SD-LABEL: insert_v4f64_c:
162; CHECK-SD:       // %bb.0: // %entry
163; CHECK-SD-NEXT:    stp q0, q1, [sp, #-32]!
164; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
165; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
166; CHECK-SD-NEXT:    and x8, x0, #0x3
167; CHECK-SD-NEXT:    mov x9, sp
168; CHECK-SD-NEXT:    str d2, [x9, x8, lsl #3]
169; CHECK-SD-NEXT:    ldp q0, q1, [sp], #32
170; CHECK-SD-NEXT:    ret
171;
172; CHECK-GI-LABEL: insert_v4f64_c:
173; CHECK-GI:       // %bb.0: // %entry
174; CHECK-GI-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
175; CHECK-GI-NEXT:    sub x9, sp, #48
176; CHECK-GI-NEXT:    mov x29, sp
177; CHECK-GI-NEXT:    and sp, x9, #0xffffffffffffffe0
178; CHECK-GI-NEXT:    .cfi_def_cfa w29, 16
179; CHECK-GI-NEXT:    .cfi_offset w30, -8
180; CHECK-GI-NEXT:    .cfi_offset w29, -16
181; CHECK-GI-NEXT:    mov w8, w0
182; CHECK-GI-NEXT:    mov x9, sp
183; CHECK-GI-NEXT:    stp q0, q1, [sp]
184; CHECK-GI-NEXT:    and x8, x8, #0x3
185; CHECK-GI-NEXT:    str d2, [x9, x8, lsl #3]
186; CHECK-GI-NEXT:    ldp q0, q1, [sp]
187; CHECK-GI-NEXT:    mov sp, x29
188; CHECK-GI-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
189; CHECK-GI-NEXT:    ret
190entry:
191  %d = insertelement <4 x double> %a, double %b, i32 %c
192  ret <4 x double> %d
193}
194
195define <2 x float> @insert_v2f32_0(<2 x float> %a, float %b, i32 %c) {
196; CHECK-LABEL: insert_v2f32_0:
197; CHECK:       // %bb.0: // %entry
198; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
199; CHECK-NEXT:    // kill: def $s1 killed $s1 def $q1
200; CHECK-NEXT:    mov v0.s[0], v1.s[0]
201; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
202; CHECK-NEXT:    ret
203entry:
204  %d = insertelement <2 x float> %a, float %b, i32 0
205  ret <2 x float> %d
206}
207
208define <2 x float> @insert_v2f32_1(<2 x float> %a, float %b, i32 %c) {
209; CHECK-LABEL: insert_v2f32_1:
210; CHECK:       // %bb.0: // %entry
211; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
212; CHECK-NEXT:    // kill: def $s1 killed $s1 def $q1
213; CHECK-NEXT:    mov v0.s[1], v1.s[0]
214; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
215; CHECK-NEXT:    ret
216entry:
217  %d = insertelement <2 x float> %a, float %b, i32 1
218  ret <2 x float> %d
219}
220
221define <2 x float> @insert_v2f32_c(<2 x float> %a, float %b, i32 %c) {
222; CHECK-SD-LABEL: insert_v2f32_c:
223; CHECK-SD:       // %bb.0: // %entry
224; CHECK-SD-NEXT:    sub sp, sp, #16
225; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
226; CHECK-SD-NEXT:    add x8, sp, #8
227; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
228; CHECK-SD-NEXT:    str d0, [sp, #8]
229; CHECK-SD-NEXT:    bfi x8, x0, #2, #1
230; CHECK-SD-NEXT:    str s1, [x8]
231; CHECK-SD-NEXT:    ldr d0, [sp, #8]
232; CHECK-SD-NEXT:    add sp, sp, #16
233; CHECK-SD-NEXT:    ret
234;
235; CHECK-GI-LABEL: insert_v2f32_c:
236; CHECK-GI:       // %bb.0: // %entry
237; CHECK-GI-NEXT:    sub sp, sp, #16
238; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
239; CHECK-GI-NEXT:    mov w9, w0
240; CHECK-GI-NEXT:    add x8, sp, #8
241; CHECK-GI-NEXT:    str d0, [sp, #8]
242; CHECK-GI-NEXT:    and x9, x9, #0x1
243; CHECK-GI-NEXT:    str s1, [x8, x9, lsl #2]
244; CHECK-GI-NEXT:    ldr d0, [sp, #8]
245; CHECK-GI-NEXT:    add sp, sp, #16
246; CHECK-GI-NEXT:    ret
247entry:
248  %d = insertelement <2 x float> %a, float %b, i32 %c
249  ret <2 x float> %d
250}
251
252define <3 x float> @insert_v3f32_0(<3 x float> %a, float %b, i32 %c) {
253; CHECK-LABEL: insert_v3f32_0:
254; CHECK:       // %bb.0: // %entry
255; CHECK-NEXT:    // kill: def $s1 killed $s1 def $q1
256; CHECK-NEXT:    mov v1.s[1], v0.s[1]
257; CHECK-NEXT:    mov v1.s[2], v0.s[2]
258; CHECK-NEXT:    mov v0.16b, v1.16b
259; CHECK-NEXT:    ret
260entry:
261  %d = insertelement <3 x float> %a, float %b, i32 0
262  ret <3 x float> %d
263}
264
265define <3 x float> @insert_v3f32_2(<3 x float> %a, float %b, i32 %c) {
266; CHECK-SD-LABEL: insert_v3f32_2:
267; CHECK-SD:       // %bb.0: // %entry
268; CHECK-SD-NEXT:    // kill: def $s1 killed $s1 def $q1
269; CHECK-SD-NEXT:    mov v0.s[2], v1.s[0]
270; CHECK-SD-NEXT:    ret
271;
272; CHECK-GI-LABEL: insert_v3f32_2:
273; CHECK-GI:       // %bb.0: // %entry
274; CHECK-GI-NEXT:    mov v2.s[0], v0.s[0]
275; CHECK-GI-NEXT:    // kill: def $s1 killed $s1 def $q1
276; CHECK-GI-NEXT:    mov v2.s[1], v0.s[1]
277; CHECK-GI-NEXT:    mov v2.s[2], v1.s[0]
278; CHECK-GI-NEXT:    mov v0.16b, v2.16b
279; CHECK-GI-NEXT:    ret
280entry:
281  %d = insertelement <3 x float> %a, float %b, i32 2
282  ret <3 x float> %d
283}
284
285define <3 x float> @insert_v3f32_c(<3 x float> %a, float %b, i32 %c) {
286; CHECK-SD-LABEL: insert_v3f32_c:
287; CHECK-SD:       // %bb.0: // %entry
288; CHECK-SD-NEXT:    sub sp, sp, #16
289; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
290; CHECK-SD-NEXT:    mov x8, sp
291; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
292; CHECK-SD-NEXT:    str q0, [sp]
293; CHECK-SD-NEXT:    bfi x8, x0, #2, #2
294; CHECK-SD-NEXT:    str s1, [x8]
295; CHECK-SD-NEXT:    ldr q0, [sp], #16
296; CHECK-SD-NEXT:    ret
297;
298; CHECK-GI-LABEL: insert_v3f32_c:
299; CHECK-GI:       // %bb.0: // %entry
300; CHECK-GI-NEXT:    sub sp, sp, #16
301; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
302; CHECK-GI-NEXT:    mov w9, w0
303; CHECK-GI-NEXT:    mov x8, sp
304; CHECK-GI-NEXT:    str q0, [sp]
305; CHECK-GI-NEXT:    and x9, x9, #0x3
306; CHECK-GI-NEXT:    str s1, [x8, x9, lsl #2]
307; CHECK-GI-NEXT:    ldr q0, [sp], #16
308; CHECK-GI-NEXT:    ret
309entry:
310  %d = insertelement <3 x float> %a, float %b, i32 %c
311  ret <3 x float> %d
312}
313
314define <4 x float> @insert_v4f32_0(<4 x float> %a, float %b, i32 %c) {
315; CHECK-LABEL: insert_v4f32_0:
316; CHECK:       // %bb.0: // %entry
317; CHECK-NEXT:    // kill: def $s1 killed $s1 def $q1
318; CHECK-NEXT:    mov v0.s[0], v1.s[0]
319; CHECK-NEXT:    ret
320entry:
321  %d = insertelement <4 x float> %a, float %b, i32 0
322  ret <4 x float> %d
323}
324
325define <4 x float> @insert_v4f32_2(<4 x float> %a, float %b, i32 %c) {
326; CHECK-LABEL: insert_v4f32_2:
327; CHECK:       // %bb.0: // %entry
328; CHECK-NEXT:    // kill: def $s1 killed $s1 def $q1
329; CHECK-NEXT:    mov v0.s[2], v1.s[0]
330; CHECK-NEXT:    ret
331entry:
332  %d = insertelement <4 x float> %a, float %b, i32 2
333  ret <4 x float> %d
334}
335
336define <4 x float> @insert_v4f32_c(<4 x float> %a, float %b, i32 %c) {
337; CHECK-SD-LABEL: insert_v4f32_c:
338; CHECK-SD:       // %bb.0: // %entry
339; CHECK-SD-NEXT:    sub sp, sp, #16
340; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
341; CHECK-SD-NEXT:    mov x8, sp
342; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
343; CHECK-SD-NEXT:    str q0, [sp]
344; CHECK-SD-NEXT:    bfi x8, x0, #2, #2
345; CHECK-SD-NEXT:    str s1, [x8]
346; CHECK-SD-NEXT:    ldr q0, [sp], #16
347; CHECK-SD-NEXT:    ret
348;
349; CHECK-GI-LABEL: insert_v4f32_c:
350; CHECK-GI:       // %bb.0: // %entry
351; CHECK-GI-NEXT:    sub sp, sp, #16
352; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
353; CHECK-GI-NEXT:    mov w9, w0
354; CHECK-GI-NEXT:    mov x8, sp
355; CHECK-GI-NEXT:    str q0, [sp]
356; CHECK-GI-NEXT:    and x9, x9, #0x3
357; CHECK-GI-NEXT:    str s1, [x8, x9, lsl #2]
358; CHECK-GI-NEXT:    ldr q0, [sp], #16
359; CHECK-GI-NEXT:    ret
360entry:
361  %d = insertelement <4 x float> %a, float %b, i32 %c
362  ret <4 x float> %d
363}
364
365define <8 x float> @insert_v8f32_0(<8 x float> %a, float %b, i32 %c) {
366; CHECK-LABEL: insert_v8f32_0:
367; CHECK:       // %bb.0: // %entry
368; CHECK-NEXT:    // kill: def $s2 killed $s2 def $q2
369; CHECK-NEXT:    mov v0.s[0], v2.s[0]
370; CHECK-NEXT:    ret
371entry:
372  %d = insertelement <8 x float> %a, float %b, i32 0
373  ret <8 x float> %d
374}
375
376define <8 x float> @insert_v8f32_2(<8 x float> %a, float %b, i32 %c) {
377; CHECK-LABEL: insert_v8f32_2:
378; CHECK:       // %bb.0: // %entry
379; CHECK-NEXT:    // kill: def $s2 killed $s2 def $q2
380; CHECK-NEXT:    mov v0.s[2], v2.s[0]
381; CHECK-NEXT:    ret
382entry:
383  %d = insertelement <8 x float> %a, float %b, i32 2
384  ret <8 x float> %d
385}
386
387define <8 x float> @insert_v8f32_c(<8 x float> %a, float %b, i32 %c) {
388; CHECK-SD-LABEL: insert_v8f32_c:
389; CHECK-SD:       // %bb.0: // %entry
390; CHECK-SD-NEXT:    stp q0, q1, [sp, #-32]!
391; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
392; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
393; CHECK-SD-NEXT:    and x8, x0, #0x7
394; CHECK-SD-NEXT:    mov x9, sp
395; CHECK-SD-NEXT:    str s2, [x9, x8, lsl #2]
396; CHECK-SD-NEXT:    ldp q0, q1, [sp], #32
397; CHECK-SD-NEXT:    ret
398;
399; CHECK-GI-LABEL: insert_v8f32_c:
400; CHECK-GI:       // %bb.0: // %entry
401; CHECK-GI-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
402; CHECK-GI-NEXT:    sub x9, sp, #48
403; CHECK-GI-NEXT:    mov x29, sp
404; CHECK-GI-NEXT:    and sp, x9, #0xffffffffffffffe0
405; CHECK-GI-NEXT:    .cfi_def_cfa w29, 16
406; CHECK-GI-NEXT:    .cfi_offset w30, -8
407; CHECK-GI-NEXT:    .cfi_offset w29, -16
408; CHECK-GI-NEXT:    mov w8, w0
409; CHECK-GI-NEXT:    mov x9, sp
410; CHECK-GI-NEXT:    stp q0, q1, [sp]
411; CHECK-GI-NEXT:    and x8, x8, #0x7
412; CHECK-GI-NEXT:    str s2, [x9, x8, lsl #2]
413; CHECK-GI-NEXT:    ldp q0, q1, [sp]
414; CHECK-GI-NEXT:    mov sp, x29
415; CHECK-GI-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
416; CHECK-GI-NEXT:    ret
417entry:
418  %d = insertelement <8 x float> %a, float %b, i32 %c
419  ret <8 x float> %d
420}
421
422define <4 x half> @insert_v4f16_0(<4 x half> %a, half %b, i32 %c) {
423; CHECK-LABEL: insert_v4f16_0:
424; CHECK:       // %bb.0: // %entry
425; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
426; CHECK-NEXT:    // kill: def $h1 killed $h1 def $q1
427; CHECK-NEXT:    mov v0.h[0], v1.h[0]
428; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
429; CHECK-NEXT:    ret
430entry:
431  %d = insertelement <4 x half> %a, half %b, i32 0
432  ret <4 x half> %d
433}
434
435define <4 x half> @insert_v4f16_2(<4 x half> %a, half %b, i32 %c) {
436; CHECK-LABEL: insert_v4f16_2:
437; CHECK:       // %bb.0: // %entry
438; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
439; CHECK-NEXT:    // kill: def $h1 killed $h1 def $q1
440; CHECK-NEXT:    mov v0.h[2], v1.h[0]
441; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
442; CHECK-NEXT:    ret
443entry:
444  %d = insertelement <4 x half> %a, half %b, i32 2
445  ret <4 x half> %d
446}
447
448define <4 x half> @insert_v4f16_c(<4 x half> %a, half %b, i32 %c) {
449; CHECK-SD-LABEL: insert_v4f16_c:
450; CHECK-SD:       // %bb.0: // %entry
451; CHECK-SD-NEXT:    sub sp, sp, #16
452; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
453; CHECK-SD-NEXT:    add x8, sp, #8
454; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
455; CHECK-SD-NEXT:    str d0, [sp, #8]
456; CHECK-SD-NEXT:    bfi x8, x0, #1, #2
457; CHECK-SD-NEXT:    str h1, [x8]
458; CHECK-SD-NEXT:    ldr d0, [sp, #8]
459; CHECK-SD-NEXT:    add sp, sp, #16
460; CHECK-SD-NEXT:    ret
461;
462; CHECK-GI-LABEL: insert_v4f16_c:
463; CHECK-GI:       // %bb.0: // %entry
464; CHECK-GI-NEXT:    sub sp, sp, #16
465; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
466; CHECK-GI-NEXT:    mov w9, w0
467; CHECK-GI-NEXT:    add x8, sp, #8
468; CHECK-GI-NEXT:    str d0, [sp, #8]
469; CHECK-GI-NEXT:    and x9, x9, #0x3
470; CHECK-GI-NEXT:    str h1, [x8, x9, lsl #1]
471; CHECK-GI-NEXT:    ldr d0, [sp, #8]
472; CHECK-GI-NEXT:    add sp, sp, #16
473; CHECK-GI-NEXT:    ret
474entry:
475  %d = insertelement <4 x half> %a, half %b, i32 %c
476  ret <4 x half> %d
477}
478
479define <8 x half> @insert_v8f16_0(<8 x half> %a, half %b, i32 %c) {
480; CHECK-LABEL: insert_v8f16_0:
481; CHECK:       // %bb.0: // %entry
482; CHECK-NEXT:    // kill: def $h1 killed $h1 def $q1
483; CHECK-NEXT:    mov v0.h[0], v1.h[0]
484; CHECK-NEXT:    ret
485entry:
486  %d = insertelement <8 x half> %a, half %b, i32 0
487  ret <8 x half> %d
488}
489
490define <8 x half> @insert_v8f16_2(<8 x half> %a, half %b, i32 %c) {
491; CHECK-LABEL: insert_v8f16_2:
492; CHECK:       // %bb.0: // %entry
493; CHECK-NEXT:    // kill: def $h1 killed $h1 def $q1
494; CHECK-NEXT:    mov v0.h[2], v1.h[0]
495; CHECK-NEXT:    ret
496entry:
497  %d = insertelement <8 x half> %a, half %b, i32 2
498  ret <8 x half> %d
499}
500
501define <8 x half> @insert_v8f16_c(<8 x half> %a, half %b, i32 %c) {
502; CHECK-SD-LABEL: insert_v8f16_c:
503; CHECK-SD:       // %bb.0: // %entry
504; CHECK-SD-NEXT:    sub sp, sp, #16
505; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
506; CHECK-SD-NEXT:    mov x8, sp
507; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
508; CHECK-SD-NEXT:    str q0, [sp]
509; CHECK-SD-NEXT:    bfi x8, x0, #1, #3
510; CHECK-SD-NEXT:    str h1, [x8]
511; CHECK-SD-NEXT:    ldr q0, [sp], #16
512; CHECK-SD-NEXT:    ret
513;
514; CHECK-GI-LABEL: insert_v8f16_c:
515; CHECK-GI:       // %bb.0: // %entry
516; CHECK-GI-NEXT:    sub sp, sp, #16
517; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
518; CHECK-GI-NEXT:    mov w9, w0
519; CHECK-GI-NEXT:    mov x8, sp
520; CHECK-GI-NEXT:    str q0, [sp]
521; CHECK-GI-NEXT:    and x9, x9, #0x7
522; CHECK-GI-NEXT:    str h1, [x8, x9, lsl #1]
523; CHECK-GI-NEXT:    ldr q0, [sp], #16
524; CHECK-GI-NEXT:    ret
525entry:
526  %d = insertelement <8 x half> %a, half %b, i32 %c
527  ret <8 x half> %d
528}
529
530define <16 x half> @insert_v16f16_0(<16 x half> %a, half %b, i32 %c) {
531; CHECK-LABEL: insert_v16f16_0:
532; CHECK:       // %bb.0: // %entry
533; CHECK-NEXT:    // kill: def $h2 killed $h2 def $q2
534; CHECK-NEXT:    mov v0.h[0], v2.h[0]
535; CHECK-NEXT:    ret
536entry:
537  %d = insertelement <16 x half> %a, half %b, i32 0
538  ret <16 x half> %d
539}
540
541define <16 x half> @insert_v16f16_2(<16 x half> %a, half %b, i32 %c) {
542; CHECK-LABEL: insert_v16f16_2:
543; CHECK:       // %bb.0: // %entry
544; CHECK-NEXT:    // kill: def $h2 killed $h2 def $q2
545; CHECK-NEXT:    mov v0.h[2], v2.h[0]
546; CHECK-NEXT:    ret
547entry:
548  %d = insertelement <16 x half> %a, half %b, i32 2
549  ret <16 x half> %d
550}
551
552define <16 x half> @insert_v16f16_c(<16 x half> %a, half %b, i32 %c) {
553; CHECK-SD-LABEL: insert_v16f16_c:
554; CHECK-SD:       // %bb.0: // %entry
555; CHECK-SD-NEXT:    stp q0, q1, [sp, #-32]!
556; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
557; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
558; CHECK-SD-NEXT:    and x8, x0, #0xf
559; CHECK-SD-NEXT:    mov x9, sp
560; CHECK-SD-NEXT:    str h2, [x9, x8, lsl #1]
561; CHECK-SD-NEXT:    ldp q0, q1, [sp], #32
562; CHECK-SD-NEXT:    ret
563;
564; CHECK-GI-LABEL: insert_v16f16_c:
565; CHECK-GI:       // %bb.0: // %entry
566; CHECK-GI-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
567; CHECK-GI-NEXT:    sub x9, sp, #48
568; CHECK-GI-NEXT:    mov x29, sp
569; CHECK-GI-NEXT:    and sp, x9, #0xffffffffffffffe0
570; CHECK-GI-NEXT:    .cfi_def_cfa w29, 16
571; CHECK-GI-NEXT:    .cfi_offset w30, -8
572; CHECK-GI-NEXT:    .cfi_offset w29, -16
573; CHECK-GI-NEXT:    mov w8, w0
574; CHECK-GI-NEXT:    mov x9, sp
575; CHECK-GI-NEXT:    stp q0, q1, [sp]
576; CHECK-GI-NEXT:    and x8, x8, #0xf
577; CHECK-GI-NEXT:    str h2, [x9, x8, lsl #1]
578; CHECK-GI-NEXT:    ldp q0, q1, [sp]
579; CHECK-GI-NEXT:    mov sp, x29
580; CHECK-GI-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
581; CHECK-GI-NEXT:    ret
582entry:
583  %d = insertelement <16 x half> %a, half %b, i32 %c
584  ret <16 x half> %d
585}
586
587define <8 x i8> @insert_v8i8_0(<8 x i8> %a, i8 %b, i32 %c) {
588; CHECK-LABEL: insert_v8i8_0:
589; CHECK:       // %bb.0: // %entry
590; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
591; CHECK-NEXT:    mov v0.b[0], w0
592; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
593; CHECK-NEXT:    ret
594entry:
595  %d = insertelement <8 x i8> %a, i8 %b, i32 0
596  ret <8 x i8> %d
597}
598
599define <8 x i8> @insert_v8i8_2(<8 x i8> %a, i8 %b, i32 %c) {
600; CHECK-LABEL: insert_v8i8_2:
601; CHECK:       // %bb.0: // %entry
602; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
603; CHECK-NEXT:    mov v0.b[2], w0
604; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
605; CHECK-NEXT:    ret
606entry:
607  %d = insertelement <8 x i8> %a, i8 %b, i32 2
608  ret <8 x i8> %d
609}
610
611define <8 x i8> @insert_v8i8_c(<8 x i8> %a, i8 %b, i32 %c) {
612; CHECK-SD-LABEL: insert_v8i8_c:
613; CHECK-SD:       // %bb.0: // %entry
614; CHECK-SD-NEXT:    sub sp, sp, #16
615; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
616; CHECK-SD-NEXT:    add x8, sp, #8
617; CHECK-SD-NEXT:    // kill: def $w1 killed $w1 def $x1
618; CHECK-SD-NEXT:    str d0, [sp, #8]
619; CHECK-SD-NEXT:    bfxil x8, x1, #0, #3
620; CHECK-SD-NEXT:    strb w0, [x8]
621; CHECK-SD-NEXT:    ldr d0, [sp, #8]
622; CHECK-SD-NEXT:    add sp, sp, #16
623; CHECK-SD-NEXT:    ret
624;
625; CHECK-GI-LABEL: insert_v8i8_c:
626; CHECK-GI:       // %bb.0: // %entry
627; CHECK-GI-NEXT:    sub sp, sp, #16
628; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
629; CHECK-GI-NEXT:    mov w9, w1
630; CHECK-GI-NEXT:    mov w8, #1 // =0x1
631; CHECK-GI-NEXT:    str d0, [sp, #8]
632; CHECK-GI-NEXT:    and x9, x9, #0x7
633; CHECK-GI-NEXT:    mul x8, x9, x8
634; CHECK-GI-NEXT:    add x9, sp, #8
635; CHECK-GI-NEXT:    strb w0, [x9, x8]
636; CHECK-GI-NEXT:    ldr d0, [sp, #8]
637; CHECK-GI-NEXT:    add sp, sp, #16
638; CHECK-GI-NEXT:    ret
639entry:
640  %d = insertelement <8 x i8> %a, i8 %b, i32 %c
641  ret <8 x i8> %d
642}
643
644define <16 x i8> @insert_v16i8_0(<16 x i8> %a, i8 %b, i32 %c) {
645; CHECK-LABEL: insert_v16i8_0:
646; CHECK:       // %bb.0: // %entry
647; CHECK-NEXT:    mov v0.b[0], w0
648; CHECK-NEXT:    ret
649entry:
650  %d = insertelement <16 x i8> %a, i8 %b, i32 0
651  ret <16 x i8> %d
652}
653
654define <16 x i8> @insert_v16i8_2(<16 x i8> %a, i8 %b, i32 %c) {
655; CHECK-LABEL: insert_v16i8_2:
656; CHECK:       // %bb.0: // %entry
657; CHECK-NEXT:    mov v0.b[2], w0
658; CHECK-NEXT:    ret
659entry:
660  %d = insertelement <16 x i8> %a, i8 %b, i32 2
661  ret <16 x i8> %d
662}
663
664define <16 x i8> @insert_v16i8_c(<16 x i8> %a, i8 %b, i32 %c) {
665; CHECK-SD-LABEL: insert_v16i8_c:
666; CHECK-SD:       // %bb.0: // %entry
667; CHECK-SD-NEXT:    sub sp, sp, #16
668; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
669; CHECK-SD-NEXT:    mov x8, sp
670; CHECK-SD-NEXT:    // kill: def $w1 killed $w1 def $x1
671; CHECK-SD-NEXT:    str q0, [sp]
672; CHECK-SD-NEXT:    bfxil x8, x1, #0, #4
673; CHECK-SD-NEXT:    strb w0, [x8]
674; CHECK-SD-NEXT:    ldr q0, [sp], #16
675; CHECK-SD-NEXT:    ret
676;
677; CHECK-GI-LABEL: insert_v16i8_c:
678; CHECK-GI:       // %bb.0: // %entry
679; CHECK-GI-NEXT:    sub sp, sp, #16
680; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
681; CHECK-GI-NEXT:    mov w9, w1
682; CHECK-GI-NEXT:    mov w8, #1 // =0x1
683; CHECK-GI-NEXT:    str q0, [sp]
684; CHECK-GI-NEXT:    and x9, x9, #0xf
685; CHECK-GI-NEXT:    mul x8, x9, x8
686; CHECK-GI-NEXT:    mov x9, sp
687; CHECK-GI-NEXT:    strb w0, [x9, x8]
688; CHECK-GI-NEXT:    ldr q0, [sp], #16
689; CHECK-GI-NEXT:    ret
690entry:
691  %d = insertelement <16 x i8> %a, i8 %b, i32 %c
692  ret <16 x i8> %d
693}
694
695define <32 x i8> @insert_v32i8_0(<32 x i8> %a, i8 %b, i32 %c) {
696; CHECK-LABEL: insert_v32i8_0:
697; CHECK:       // %bb.0: // %entry
698; CHECK-NEXT:    mov v0.b[0], w0
699; CHECK-NEXT:    ret
700entry:
701  %d = insertelement <32 x i8> %a, i8 %b, i32 0
702  ret <32 x i8> %d
703}
704
705define <32 x i8> @insert_v32i8_2(<32 x i8> %a, i8 %b, i32 %c) {
706; CHECK-LABEL: insert_v32i8_2:
707; CHECK:       // %bb.0: // %entry
708; CHECK-NEXT:    mov v0.b[2], w0
709; CHECK-NEXT:    ret
710entry:
711  %d = insertelement <32 x i8> %a, i8 %b, i32 2
712  ret <32 x i8> %d
713}
714
715define <32 x i8> @insert_v32i8_c(<32 x i8> %a, i8 %b, i32 %c) {
716; CHECK-SD-LABEL: insert_v32i8_c:
717; CHECK-SD:       // %bb.0: // %entry
718; CHECK-SD-NEXT:    stp q0, q1, [sp, #-32]!
719; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
720; CHECK-SD-NEXT:    // kill: def $w1 killed $w1 def $x1
721; CHECK-SD-NEXT:    and x8, x1, #0x1f
722; CHECK-SD-NEXT:    mov x9, sp
723; CHECK-SD-NEXT:    strb w0, [x9, x8]
724; CHECK-SD-NEXT:    ldp q0, q1, [sp], #32
725; CHECK-SD-NEXT:    ret
726;
727; CHECK-GI-LABEL: insert_v32i8_c:
728; CHECK-GI:       // %bb.0: // %entry
729; CHECK-GI-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
730; CHECK-GI-NEXT:    sub x9, sp, #48
731; CHECK-GI-NEXT:    mov x29, sp
732; CHECK-GI-NEXT:    and sp, x9, #0xffffffffffffffe0
733; CHECK-GI-NEXT:    .cfi_def_cfa w29, 16
734; CHECK-GI-NEXT:    .cfi_offset w30, -8
735; CHECK-GI-NEXT:    .cfi_offset w29, -16
736; CHECK-GI-NEXT:    mov w8, w1
737; CHECK-GI-NEXT:    mov x10, sp
738; CHECK-GI-NEXT:    stp q0, q1, [sp]
739; CHECK-GI-NEXT:    and x8, x8, #0x1f
740; CHECK-GI-NEXT:    lsl x9, x8, #1
741; CHECK-GI-NEXT:    sub x8, x9, x8
742; CHECK-GI-NEXT:    strb w0, [x10, x8]
743; CHECK-GI-NEXT:    ldp q0, q1, [sp]
744; CHECK-GI-NEXT:    mov sp, x29
745; CHECK-GI-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
746; CHECK-GI-NEXT:    ret
747entry:
748  %d = insertelement <32 x i8> %a, i8 %b, i32 %c
749  ret <32 x i8> %d
750}
751
752define <4 x i16> @insert_v4i16_0(<4 x i16> %a, i16 %b, i32 %c) {
753; CHECK-LABEL: insert_v4i16_0:
754; CHECK:       // %bb.0: // %entry
755; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
756; CHECK-NEXT:    mov v0.h[0], w0
757; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
758; CHECK-NEXT:    ret
759entry:
760  %d = insertelement <4 x i16> %a, i16 %b, i32 0
761  ret <4 x i16> %d
762}
763
764define <4 x i16> @insert_v4i16_2(<4 x i16> %a, i16 %b, i32 %c) {
765; CHECK-LABEL: insert_v4i16_2:
766; CHECK:       // %bb.0: // %entry
767; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
768; CHECK-NEXT:    mov v0.h[2], w0
769; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
770; CHECK-NEXT:    ret
771entry:
772  %d = insertelement <4 x i16> %a, i16 %b, i32 2
773  ret <4 x i16> %d
774}
775
776define <4 x i16> @insert_v4i16_c(<4 x i16> %a, i16 %b, i32 %c) {
777; CHECK-SD-LABEL: insert_v4i16_c:
778; CHECK-SD:       // %bb.0: // %entry
779; CHECK-SD-NEXT:    sub sp, sp, #16
780; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
781; CHECK-SD-NEXT:    add x8, sp, #8
782; CHECK-SD-NEXT:    // kill: def $w1 killed $w1 def $x1
783; CHECK-SD-NEXT:    str d0, [sp, #8]
784; CHECK-SD-NEXT:    bfi x8, x1, #1, #2
785; CHECK-SD-NEXT:    strh w0, [x8]
786; CHECK-SD-NEXT:    ldr d0, [sp, #8]
787; CHECK-SD-NEXT:    add sp, sp, #16
788; CHECK-SD-NEXT:    ret
789;
790; CHECK-GI-LABEL: insert_v4i16_c:
791; CHECK-GI:       // %bb.0: // %entry
792; CHECK-GI-NEXT:    sub sp, sp, #16
793; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
794; CHECK-GI-NEXT:    mov w9, w1
795; CHECK-GI-NEXT:    add x8, sp, #8
796; CHECK-GI-NEXT:    str d0, [sp, #8]
797; CHECK-GI-NEXT:    and x9, x9, #0x3
798; CHECK-GI-NEXT:    strh w0, [x8, x9, lsl #1]
799; CHECK-GI-NEXT:    ldr d0, [sp, #8]
800; CHECK-GI-NEXT:    add sp, sp, #16
801; CHECK-GI-NEXT:    ret
802entry:
803  %d = insertelement <4 x i16> %a, i16 %b, i32 %c
804  ret <4 x i16> %d
805}
806
807define <8 x i16> @insert_v8i16_0(<8 x i16> %a, i16 %b, i32 %c) {
808; CHECK-LABEL: insert_v8i16_0:
809; CHECK:       // %bb.0: // %entry
810; CHECK-NEXT:    mov v0.h[0], w0
811; CHECK-NEXT:    ret
812entry:
813  %d = insertelement <8 x i16> %a, i16 %b, i32 0
814  ret <8 x i16> %d
815}
816
817define <8 x i16> @insert_v8i16_2(<8 x i16> %a, i16 %b, i32 %c) {
818; CHECK-LABEL: insert_v8i16_2:
819; CHECK:       // %bb.0: // %entry
820; CHECK-NEXT:    mov v0.h[2], w0
821; CHECK-NEXT:    ret
822entry:
823  %d = insertelement <8 x i16> %a, i16 %b, i32 2
824  ret <8 x i16> %d
825}
826
827define <8 x i16> @insert_v8i16_c(<8 x i16> %a, i16 %b, i32 %c) {
828; CHECK-SD-LABEL: insert_v8i16_c:
829; CHECK-SD:       // %bb.0: // %entry
830; CHECK-SD-NEXT:    sub sp, sp, #16
831; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
832; CHECK-SD-NEXT:    mov x8, sp
833; CHECK-SD-NEXT:    // kill: def $w1 killed $w1 def $x1
834; CHECK-SD-NEXT:    str q0, [sp]
835; CHECK-SD-NEXT:    bfi x8, x1, #1, #3
836; CHECK-SD-NEXT:    strh w0, [x8]
837; CHECK-SD-NEXT:    ldr q0, [sp], #16
838; CHECK-SD-NEXT:    ret
839;
840; CHECK-GI-LABEL: insert_v8i16_c:
841; CHECK-GI:       // %bb.0: // %entry
842; CHECK-GI-NEXT:    sub sp, sp, #16
843; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
844; CHECK-GI-NEXT:    mov w9, w1
845; CHECK-GI-NEXT:    mov x8, sp
846; CHECK-GI-NEXT:    str q0, [sp]
847; CHECK-GI-NEXT:    and x9, x9, #0x7
848; CHECK-GI-NEXT:    strh w0, [x8, x9, lsl #1]
849; CHECK-GI-NEXT:    ldr q0, [sp], #16
850; CHECK-GI-NEXT:    ret
851entry:
852  %d = insertelement <8 x i16> %a, i16 %b, i32 %c
853  ret <8 x i16> %d
854}
855
856define <16 x i16> @insert_v16i16_0(<16 x i16> %a, i16 %b, i32 %c) {
857; CHECK-LABEL: insert_v16i16_0:
858; CHECK:       // %bb.0: // %entry
859; CHECK-NEXT:    mov v0.h[0], w0
860; CHECK-NEXT:    ret
861entry:
862  %d = insertelement <16 x i16> %a, i16 %b, i32 0
863  ret <16 x i16> %d
864}
865
866define <16 x i16> @insert_v16i16_2(<16 x i16> %a, i16 %b, i32 %c) {
867; CHECK-LABEL: insert_v16i16_2:
868; CHECK:       // %bb.0: // %entry
869; CHECK-NEXT:    mov v0.h[2], w0
870; CHECK-NEXT:    ret
871entry:
872  %d = insertelement <16 x i16> %a, i16 %b, i32 2
873  ret <16 x i16> %d
874}
875
876define <16 x i16> @insert_v16i16_c(<16 x i16> %a, i16 %b, i32 %c) {
877; CHECK-SD-LABEL: insert_v16i16_c:
878; CHECK-SD:       // %bb.0: // %entry
879; CHECK-SD-NEXT:    stp q0, q1, [sp, #-32]!
880; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
881; CHECK-SD-NEXT:    // kill: def $w1 killed $w1 def $x1
882; CHECK-SD-NEXT:    and x8, x1, #0xf
883; CHECK-SD-NEXT:    mov x9, sp
884; CHECK-SD-NEXT:    strh w0, [x9, x8, lsl #1]
885; CHECK-SD-NEXT:    ldp q0, q1, [sp], #32
886; CHECK-SD-NEXT:    ret
887;
888; CHECK-GI-LABEL: insert_v16i16_c:
889; CHECK-GI:       // %bb.0: // %entry
890; CHECK-GI-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
891; CHECK-GI-NEXT:    sub x9, sp, #48
892; CHECK-GI-NEXT:    mov x29, sp
893; CHECK-GI-NEXT:    and sp, x9, #0xffffffffffffffe0
894; CHECK-GI-NEXT:    .cfi_def_cfa w29, 16
895; CHECK-GI-NEXT:    .cfi_offset w30, -8
896; CHECK-GI-NEXT:    .cfi_offset w29, -16
897; CHECK-GI-NEXT:    mov w8, w1
898; CHECK-GI-NEXT:    mov x9, sp
899; CHECK-GI-NEXT:    stp q0, q1, [sp]
900; CHECK-GI-NEXT:    and x8, x8, #0xf
901; CHECK-GI-NEXT:    strh w0, [x9, x8, lsl #1]
902; CHECK-GI-NEXT:    ldp q0, q1, [sp]
903; CHECK-GI-NEXT:    mov sp, x29
904; CHECK-GI-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
905; CHECK-GI-NEXT:    ret
906entry:
907  %d = insertelement <16 x i16> %a, i16 %b, i32 %c
908  ret <16 x i16> %d
909}
910
911define <2 x i32> @insert_v2i32_0(<2 x i32> %a, i32 %b, i32 %c) {
912; CHECK-LABEL: insert_v2i32_0:
913; CHECK:       // %bb.0: // %entry
914; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
915; CHECK-NEXT:    mov v0.s[0], w0
916; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
917; CHECK-NEXT:    ret
918entry:
919  %d = insertelement <2 x i32> %a, i32 %b, i32 0
920  ret <2 x i32> %d
921}
922
923define <2 x i32> @insert_v2i32_1(<2 x i32> %a, i32 %b, i32 %c) {
924; CHECK-LABEL: insert_v2i32_1:
925; CHECK:       // %bb.0: // %entry
926; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
927; CHECK-NEXT:    mov v0.s[1], w0
928; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
929; CHECK-NEXT:    ret
930entry:
931  %d = insertelement <2 x i32> %a, i32 %b, i32 1
932  ret <2 x i32> %d
933}
934
935define <2 x i32> @insert_v2i32_c(<2 x i32> %a, i32 %b, i32 %c) {
936; CHECK-SD-LABEL: insert_v2i32_c:
937; CHECK-SD:       // %bb.0: // %entry
938; CHECK-SD-NEXT:    sub sp, sp, #16
939; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
940; CHECK-SD-NEXT:    add x8, sp, #8
941; CHECK-SD-NEXT:    // kill: def $w1 killed $w1 def $x1
942; CHECK-SD-NEXT:    str d0, [sp, #8]
943; CHECK-SD-NEXT:    bfi x8, x1, #2, #1
944; CHECK-SD-NEXT:    str w0, [x8]
945; CHECK-SD-NEXT:    ldr d0, [sp, #8]
946; CHECK-SD-NEXT:    add sp, sp, #16
947; CHECK-SD-NEXT:    ret
948;
949; CHECK-GI-LABEL: insert_v2i32_c:
950; CHECK-GI:       // %bb.0: // %entry
951; CHECK-GI-NEXT:    sub sp, sp, #16
952; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
953; CHECK-GI-NEXT:    mov w9, w1
954; CHECK-GI-NEXT:    add x8, sp, #8
955; CHECK-GI-NEXT:    str d0, [sp, #8]
956; CHECK-GI-NEXT:    and x9, x9, #0x1
957; CHECK-GI-NEXT:    str w0, [x8, x9, lsl #2]
958; CHECK-GI-NEXT:    ldr d0, [sp, #8]
959; CHECK-GI-NEXT:    add sp, sp, #16
960; CHECK-GI-NEXT:    ret
961entry:
962  %d = insertelement <2 x i32> %a, i32 %b, i32 %c
963  ret <2 x i32> %d
964}
965
966define <3 x i32> @insert_v3i32_0(<3 x i32> %a, i32 %b, i32 %c) {
967; CHECK-SD-LABEL: insert_v3i32_0:
968; CHECK-SD:       // %bb.0: // %entry
969; CHECK-SD-NEXT:    fmov s1, w0
970; CHECK-SD-NEXT:    mov v1.s[1], v0.s[1]
971; CHECK-SD-NEXT:    mov v1.s[2], v0.s[2]
972; CHECK-SD-NEXT:    mov v0.16b, v1.16b
973; CHECK-SD-NEXT:    ret
974;
975; CHECK-GI-LABEL: insert_v3i32_0:
976; CHECK-GI:       // %bb.0: // %entry
977; CHECK-GI-NEXT:    mov v1.s[0], w0
978; CHECK-GI-NEXT:    mov v1.s[1], v0.s[1]
979; CHECK-GI-NEXT:    mov v1.s[2], v0.s[2]
980; CHECK-GI-NEXT:    mov v0.16b, v1.16b
981; CHECK-GI-NEXT:    ret
982entry:
983  %d = insertelement <3 x i32> %a, i32 %b, i32 0
984  ret <3 x i32> %d
985}
986
987define <3 x i32> @insert_v3i32_2(<3 x i32> %a, i32 %b, i32 %c) {
988; CHECK-SD-LABEL: insert_v3i32_2:
989; CHECK-SD:       // %bb.0: // %entry
990; CHECK-SD-NEXT:    mov v0.s[2], w0
991; CHECK-SD-NEXT:    ret
992;
993; CHECK-GI-LABEL: insert_v3i32_2:
994; CHECK-GI:       // %bb.0: // %entry
995; CHECK-GI-NEXT:    mov v1.s[0], v0.s[0]
996; CHECK-GI-NEXT:    mov v1.s[1], v0.s[1]
997; CHECK-GI-NEXT:    mov v1.s[2], w0
998; CHECK-GI-NEXT:    mov v0.16b, v1.16b
999; CHECK-GI-NEXT:    ret
1000entry:
1001  %d = insertelement <3 x i32> %a, i32 %b, i32 2
1002  ret <3 x i32> %d
1003}
1004
1005define <3 x i32> @insert_v3i32_c(<3 x i32> %a, i32 %b, i32 %c) {
1006; CHECK-SD-LABEL: insert_v3i32_c:
1007; CHECK-SD:       // %bb.0: // %entry
1008; CHECK-SD-NEXT:    sub sp, sp, #16
1009; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
1010; CHECK-SD-NEXT:    mov x8, sp
1011; CHECK-SD-NEXT:    // kill: def $w1 killed $w1 def $x1
1012; CHECK-SD-NEXT:    str q0, [sp]
1013; CHECK-SD-NEXT:    bfi x8, x1, #2, #2
1014; CHECK-SD-NEXT:    str w0, [x8]
1015; CHECK-SD-NEXT:    ldr q0, [sp], #16
1016; CHECK-SD-NEXT:    ret
1017;
1018; CHECK-GI-LABEL: insert_v3i32_c:
1019; CHECK-GI:       // %bb.0: // %entry
1020; CHECK-GI-NEXT:    sub sp, sp, #16
1021; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
1022; CHECK-GI-NEXT:    mov w9, w1
1023; CHECK-GI-NEXT:    mov x8, sp
1024; CHECK-GI-NEXT:    str q0, [sp]
1025; CHECK-GI-NEXT:    and x9, x9, #0x3
1026; CHECK-GI-NEXT:    str w0, [x8, x9, lsl #2]
1027; CHECK-GI-NEXT:    ldr q0, [sp], #16
1028; CHECK-GI-NEXT:    ret
1029entry:
1030  %d = insertelement <3 x i32> %a, i32 %b, i32 %c
1031  ret <3 x i32> %d
1032}
1033
1034define <4 x i32> @insert_v4i32_0(<4 x i32> %a, i32 %b, i32 %c) {
1035; CHECK-LABEL: insert_v4i32_0:
1036; CHECK:       // %bb.0: // %entry
1037; CHECK-NEXT:    mov v0.s[0], w0
1038; CHECK-NEXT:    ret
1039entry:
1040  %d = insertelement <4 x i32> %a, i32 %b, i32 0
1041  ret <4 x i32> %d
1042}
1043
1044define <4 x i32> @insert_v4i32_2(<4 x i32> %a, i32 %b, i32 %c) {
1045; CHECK-LABEL: insert_v4i32_2:
1046; CHECK:       // %bb.0: // %entry
1047; CHECK-NEXT:    mov v0.s[2], w0
1048; CHECK-NEXT:    ret
1049entry:
1050  %d = insertelement <4 x i32> %a, i32 %b, i32 2
1051  ret <4 x i32> %d
1052}
1053
1054define <4 x i32> @insert_v4i32_c(<4 x i32> %a, i32 %b, i32 %c) {
1055; CHECK-SD-LABEL: insert_v4i32_c:
1056; CHECK-SD:       // %bb.0: // %entry
1057; CHECK-SD-NEXT:    sub sp, sp, #16
1058; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
1059; CHECK-SD-NEXT:    mov x8, sp
1060; CHECK-SD-NEXT:    // kill: def $w1 killed $w1 def $x1
1061; CHECK-SD-NEXT:    str q0, [sp]
1062; CHECK-SD-NEXT:    bfi x8, x1, #2, #2
1063; CHECK-SD-NEXT:    str w0, [x8]
1064; CHECK-SD-NEXT:    ldr q0, [sp], #16
1065; CHECK-SD-NEXT:    ret
1066;
1067; CHECK-GI-LABEL: insert_v4i32_c:
1068; CHECK-GI:       // %bb.0: // %entry
1069; CHECK-GI-NEXT:    sub sp, sp, #16
1070; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
1071; CHECK-GI-NEXT:    mov w9, w1
1072; CHECK-GI-NEXT:    mov x8, sp
1073; CHECK-GI-NEXT:    str q0, [sp]
1074; CHECK-GI-NEXT:    and x9, x9, #0x3
1075; CHECK-GI-NEXT:    str w0, [x8, x9, lsl #2]
1076; CHECK-GI-NEXT:    ldr q0, [sp], #16
1077; CHECK-GI-NEXT:    ret
1078entry:
1079  %d = insertelement <4 x i32> %a, i32 %b, i32 %c
1080  ret <4 x i32> %d
1081}
1082
1083define <8 x i32> @insert_v8i32_0(<8 x i32> %a, i32 %b, i32 %c) {
1084; CHECK-LABEL: insert_v8i32_0:
1085; CHECK:       // %bb.0: // %entry
1086; CHECK-NEXT:    mov v0.s[0], w0
1087; CHECK-NEXT:    ret
1088entry:
1089  %d = insertelement <8 x i32> %a, i32 %b, i32 0
1090  ret <8 x i32> %d
1091}
1092
1093define <8 x i32> @insert_v8i32_2(<8 x i32> %a, i32 %b, i32 %c) {
1094; CHECK-LABEL: insert_v8i32_2:
1095; CHECK:       // %bb.0: // %entry
1096; CHECK-NEXT:    mov v0.s[2], w0
1097; CHECK-NEXT:    ret
1098entry:
1099  %d = insertelement <8 x i32> %a, i32 %b, i32 2
1100  ret <8 x i32> %d
1101}
1102
1103define <8 x i32> @insert_v8i32_c(<8 x i32> %a, i32 %b, i32 %c) {
1104; CHECK-SD-LABEL: insert_v8i32_c:
1105; CHECK-SD:       // %bb.0: // %entry
1106; CHECK-SD-NEXT:    stp q0, q1, [sp, #-32]!
1107; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
1108; CHECK-SD-NEXT:    // kill: def $w1 killed $w1 def $x1
1109; CHECK-SD-NEXT:    and x8, x1, #0x7
1110; CHECK-SD-NEXT:    mov x9, sp
1111; CHECK-SD-NEXT:    str w0, [x9, x8, lsl #2]
1112; CHECK-SD-NEXT:    ldp q0, q1, [sp], #32
1113; CHECK-SD-NEXT:    ret
1114;
1115; CHECK-GI-LABEL: insert_v8i32_c:
1116; CHECK-GI:       // %bb.0: // %entry
1117; CHECK-GI-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
1118; CHECK-GI-NEXT:    sub x9, sp, #48
1119; CHECK-GI-NEXT:    mov x29, sp
1120; CHECK-GI-NEXT:    and sp, x9, #0xffffffffffffffe0
1121; CHECK-GI-NEXT:    .cfi_def_cfa w29, 16
1122; CHECK-GI-NEXT:    .cfi_offset w30, -8
1123; CHECK-GI-NEXT:    .cfi_offset w29, -16
1124; CHECK-GI-NEXT:    mov w8, w1
1125; CHECK-GI-NEXT:    mov x9, sp
1126; CHECK-GI-NEXT:    stp q0, q1, [sp]
1127; CHECK-GI-NEXT:    and x8, x8, #0x7
1128; CHECK-GI-NEXT:    str w0, [x9, x8, lsl #2]
1129; CHECK-GI-NEXT:    ldp q0, q1, [sp]
1130; CHECK-GI-NEXT:    mov sp, x29
1131; CHECK-GI-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
1132; CHECK-GI-NEXT:    ret
1133entry:
1134  %d = insertelement <8 x i32> %a, i32 %b, i32 %c
1135  ret <8 x i32> %d
1136}
1137
1138define <2 x i64> @insert_v2i64_0(<2 x i64> %a, i64 %b, i32 %c) {
1139; CHECK-LABEL: insert_v2i64_0:
1140; CHECK:       // %bb.0: // %entry
1141; CHECK-NEXT:    mov v0.d[0], x0
1142; CHECK-NEXT:    ret
1143entry:
1144  %d = insertelement <2 x i64> %a, i64 %b, i32 0
1145  ret <2 x i64> %d
1146}
1147
1148define <2 x i64> @insert_v2i64_1(<2 x i64> %a, i64 %b, i32 %c) {
1149; CHECK-LABEL: insert_v2i64_1:
1150; CHECK:       // %bb.0: // %entry
1151; CHECK-NEXT:    mov v0.d[1], x0
1152; CHECK-NEXT:    ret
1153entry:
1154  %d = insertelement <2 x i64> %a, i64 %b, i32 1
1155  ret <2 x i64> %d
1156}
1157
1158define <2 x i64> @insert_v2i64_c(<2 x i64> %a, i64 %b, i32 %c) {
1159; CHECK-SD-LABEL: insert_v2i64_c:
1160; CHECK-SD:       // %bb.0: // %entry
1161; CHECK-SD-NEXT:    sub sp, sp, #16
1162; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
1163; CHECK-SD-NEXT:    mov x8, sp
1164; CHECK-SD-NEXT:    // kill: def $w1 killed $w1 def $x1
1165; CHECK-SD-NEXT:    str q0, [sp]
1166; CHECK-SD-NEXT:    bfi x8, x1, #3, #1
1167; CHECK-SD-NEXT:    str x0, [x8]
1168; CHECK-SD-NEXT:    ldr q0, [sp], #16
1169; CHECK-SD-NEXT:    ret
1170;
1171; CHECK-GI-LABEL: insert_v2i64_c:
1172; CHECK-GI:       // %bb.0: // %entry
1173; CHECK-GI-NEXT:    sub sp, sp, #16
1174; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
1175; CHECK-GI-NEXT:    mov w9, w1
1176; CHECK-GI-NEXT:    mov x8, sp
1177; CHECK-GI-NEXT:    str q0, [sp]
1178; CHECK-GI-NEXT:    and x9, x9, #0x1
1179; CHECK-GI-NEXT:    str x0, [x8, x9, lsl #3]
1180; CHECK-GI-NEXT:    ldr q0, [sp], #16
1181; CHECK-GI-NEXT:    ret
1182entry:
1183  %d = insertelement <2 x i64> %a, i64 %b, i32 %c
1184  ret <2 x i64> %d
1185}
1186
1187define <3 x i64> @insert_v3i64_0(<3 x i64> %a, i64 %b, i32 %c) {
1188; CHECK-SD-LABEL: insert_v3i64_0:
1189; CHECK-SD:       // %bb.0: // %entry
1190; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
1191; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
1192; CHECK-SD-NEXT:    mov v0.d[0], x0
1193; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
1194; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
1195; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
1196; CHECK-SD-NEXT:    ret
1197;
1198; CHECK-GI-LABEL: insert_v3i64_0:
1199; CHECK-GI:       // %bb.0: // %entry
1200; CHECK-GI-NEXT:    fmov d0, x0
1201; CHECK-GI-NEXT:    ret
1202entry:
1203  %d = insertelement <3 x i64> %a, i64 %b, i32 0
1204  ret <3 x i64> %d
1205}
1206
1207define <3 x i64> @insert_v3i64_2(<3 x i64> %a, i64 %b, i32 %c) {
1208; CHECK-LABEL: insert_v3i64_2:
1209; CHECK:       // %bb.0: // %entry
1210; CHECK-NEXT:    fmov d2, x0
1211; CHECK-NEXT:    ret
1212entry:
1213  %d = insertelement <3 x i64> %a, i64 %b, i32 2
1214  ret <3 x i64> %d
1215}
1216
1217define <3 x i64> @insert_v3i64_c(<3 x i64> %a, i64 %b, i32 %c) {
1218; CHECK-SD-LABEL: insert_v3i64_c:
1219; CHECK-SD:       // %bb.0: // %entry
1220; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
1221; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
1222; CHECK-SD-NEXT:    // kill: def $w1 killed $w1 def $x1
1223; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
1224; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
1225; CHECK-SD-NEXT:    stp q0, q2, [sp, #-32]!
1226; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
1227; CHECK-SD-NEXT:    mov x8, sp
1228; CHECK-SD-NEXT:    and x9, x1, #0x3
1229; CHECK-SD-NEXT:    str x0, [x8, x9, lsl #3]
1230; CHECK-SD-NEXT:    ldr q0, [sp]
1231; CHECK-SD-NEXT:    ldr d2, [sp, #16]
1232; CHECK-SD-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
1233; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 killed $q0
1234; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 killed $q1
1235; CHECK-SD-NEXT:    add sp, sp, #32
1236; CHECK-SD-NEXT:    ret
1237;
1238; CHECK-GI-LABEL: insert_v3i64_c:
1239; CHECK-GI:       // %bb.0: // %entry
1240; CHECK-GI-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
1241; CHECK-GI-NEXT:    sub x9, sp, #48
1242; CHECK-GI-NEXT:    mov x29, sp
1243; CHECK-GI-NEXT:    and sp, x9, #0xffffffffffffffe0
1244; CHECK-GI-NEXT:    .cfi_def_cfa w29, 16
1245; CHECK-GI-NEXT:    .cfi_offset w30, -8
1246; CHECK-GI-NEXT:    .cfi_offset w29, -16
1247; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
1248; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
1249; CHECK-GI-NEXT:    mov w8, w1
1250; CHECK-GI-NEXT:    mov x9, sp
1251; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 def $q2
1252; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
1253; CHECK-GI-NEXT:    and x8, x8, #0x3
1254; CHECK-GI-NEXT:    stp q0, q2, [sp]
1255; CHECK-GI-NEXT:    str x0, [x9, x8, lsl #3]
1256; CHECK-GI-NEXT:    ldp q0, q2, [sp]
1257; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 killed $q2
1258; CHECK-GI-NEXT:    mov d1, v0.d[1]
1259; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 killed $q0
1260; CHECK-GI-NEXT:    mov sp, x29
1261; CHECK-GI-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
1262; CHECK-GI-NEXT:    ret
1263entry:
1264  %d = insertelement <3 x i64> %a, i64 %b, i32 %c
1265  ret <3 x i64> %d
1266}
1267
1268define <4 x i64> @insert_v4i64_0(<4 x i64> %a, i64 %b, i32 %c) {
1269; CHECK-LABEL: insert_v4i64_0:
1270; CHECK:       // %bb.0: // %entry
1271; CHECK-NEXT:    mov v0.d[0], x0
1272; CHECK-NEXT:    ret
1273entry:
1274  %d = insertelement <4 x i64> %a, i64 %b, i32 0
1275  ret <4 x i64> %d
1276}
1277
1278define <4 x i64> @insert_v4i64_2(<4 x i64> %a, i64 %b, i32 %c) {
1279; CHECK-LABEL: insert_v4i64_2:
1280; CHECK:       // %bb.0: // %entry
1281; CHECK-NEXT:    mov v1.d[0], x0
1282; CHECK-NEXT:    ret
1283entry:
1284  %d = insertelement <4 x i64> %a, i64 %b, i32 2
1285  ret <4 x i64> %d
1286}
1287
1288define <4 x i64> @insert_v4i64_c(<4 x i64> %a, i64 %b, i32 %c) {
1289; CHECK-SD-LABEL: insert_v4i64_c:
1290; CHECK-SD:       // %bb.0: // %entry
1291; CHECK-SD-NEXT:    stp q0, q1, [sp, #-32]!
1292; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
1293; CHECK-SD-NEXT:    // kill: def $w1 killed $w1 def $x1
1294; CHECK-SD-NEXT:    and x8, x1, #0x3
1295; CHECK-SD-NEXT:    mov x9, sp
1296; CHECK-SD-NEXT:    str x0, [x9, x8, lsl #3]
1297; CHECK-SD-NEXT:    ldp q0, q1, [sp], #32
1298; CHECK-SD-NEXT:    ret
1299;
1300; CHECK-GI-LABEL: insert_v4i64_c:
1301; CHECK-GI:       // %bb.0: // %entry
1302; CHECK-GI-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
1303; CHECK-GI-NEXT:    sub x9, sp, #48
1304; CHECK-GI-NEXT:    mov x29, sp
1305; CHECK-GI-NEXT:    and sp, x9, #0xffffffffffffffe0
1306; CHECK-GI-NEXT:    .cfi_def_cfa w29, 16
1307; CHECK-GI-NEXT:    .cfi_offset w30, -8
1308; CHECK-GI-NEXT:    .cfi_offset w29, -16
1309; CHECK-GI-NEXT:    mov w8, w1
1310; CHECK-GI-NEXT:    mov x9, sp
1311; CHECK-GI-NEXT:    stp q0, q1, [sp]
1312; CHECK-GI-NEXT:    and x8, x8, #0x3
1313; CHECK-GI-NEXT:    str x0, [x9, x8, lsl #3]
1314; CHECK-GI-NEXT:    ldp q0, q1, [sp]
1315; CHECK-GI-NEXT:    mov sp, x29
1316; CHECK-GI-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
1317; CHECK-GI-NEXT:    ret
1318entry:
1319  %d = insertelement <4 x i64> %a, i64 %b, i32 %c
1320  ret <4 x i64> %d
1321}
1322
1323define double @extract_v2f64_0(<2 x double> %a, i32 %c) {
1324; CHECK-LABEL: extract_v2f64_0:
1325; CHECK:       // %bb.0: // %entry
1326; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
1327; CHECK-NEXT:    ret
1328entry:
1329  %d = extractelement <2 x double> %a, i32 0
1330  ret double %d
1331}
1332
1333define double @extract_v2f64_1(<2 x double> %a, i32 %c) {
1334; CHECK-LABEL: extract_v2f64_1:
1335; CHECK:       // %bb.0: // %entry
1336; CHECK-NEXT:    mov d0, v0.d[1]
1337; CHECK-NEXT:    ret
1338entry:
1339  %d = extractelement <2 x double> %a, i32 1
1340  ret double %d
1341}
1342
1343define double @extract_v2f64_c(<2 x double> %a, i32 %c) {
1344; CHECK-SD-LABEL: extract_v2f64_c:
1345; CHECK-SD:       // %bb.0: // %entry
1346; CHECK-SD-NEXT:    sub sp, sp, #16
1347; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
1348; CHECK-SD-NEXT:    mov x8, sp
1349; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
1350; CHECK-SD-NEXT:    str q0, [sp]
1351; CHECK-SD-NEXT:    bfi x8, x0, #3, #1
1352; CHECK-SD-NEXT:    ldr d0, [x8]
1353; CHECK-SD-NEXT:    add sp, sp, #16
1354; CHECK-SD-NEXT:    ret
1355;
1356; CHECK-GI-LABEL: extract_v2f64_c:
1357; CHECK-GI:       // %bb.0: // %entry
1358; CHECK-GI-NEXT:    sub sp, sp, #16
1359; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
1360; CHECK-GI-NEXT:    mov w9, w0
1361; CHECK-GI-NEXT:    mov x8, sp
1362; CHECK-GI-NEXT:    str q0, [sp]
1363; CHECK-GI-NEXT:    and x9, x9, #0x1
1364; CHECK-GI-NEXT:    ldr d0, [x8, x9, lsl #3]
1365; CHECK-GI-NEXT:    add sp, sp, #16
1366; CHECK-GI-NEXT:    ret
1367entry:
1368  %d = extractelement <2 x double> %a, i32 %c
1369  ret double %d
1370}
1371
1372define double @extract_v3f64_0(<3 x double> %a, i32 %c) {
1373; CHECK-LABEL: extract_v3f64_0:
1374; CHECK:       // %bb.0: // %entry
1375; CHECK-NEXT:    ret
1376entry:
1377  %d = extractelement <3 x double> %a, i32 0
1378  ret double %d
1379}
1380
1381define double @extract_v3f64_2(<3 x double> %a, i32 %c) {
1382; CHECK-LABEL: extract_v3f64_2:
1383; CHECK:       // %bb.0: // %entry
1384; CHECK-NEXT:    fmov d0, d2
1385; CHECK-NEXT:    ret
1386entry:
1387  %d = extractelement <3 x double> %a, i32 2
1388  ret double %d
1389}
1390
1391define double @extract_v3f64_c(<3 x double> %a, i32 %c) {
1392; CHECK-SD-LABEL: extract_v3f64_c:
1393; CHECK-SD:       // %bb.0: // %entry
1394; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
1395; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
1396; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
1397; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
1398; CHECK-SD-NEXT:    and x8, x0, #0x3
1399; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
1400; CHECK-SD-NEXT:    stp q0, q2, [sp, #-32]!
1401; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
1402; CHECK-SD-NEXT:    mov x9, sp
1403; CHECK-SD-NEXT:    ldr d0, [x9, x8, lsl #3]
1404; CHECK-SD-NEXT:    add sp, sp, #32
1405; CHECK-SD-NEXT:    ret
1406;
1407; CHECK-GI-LABEL: extract_v3f64_c:
1408; CHECK-GI:       // %bb.0: // %entry
1409; CHECK-GI-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
1410; CHECK-GI-NEXT:    sub x9, sp, #48
1411; CHECK-GI-NEXT:    mov x29, sp
1412; CHECK-GI-NEXT:    and sp, x9, #0xffffffffffffffe0
1413; CHECK-GI-NEXT:    .cfi_def_cfa w29, 16
1414; CHECK-GI-NEXT:    .cfi_offset w30, -8
1415; CHECK-GI-NEXT:    .cfi_offset w29, -16
1416; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
1417; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
1418; CHECK-GI-NEXT:    mov w8, w0
1419; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 def $q2
1420; CHECK-GI-NEXT:    mov x9, sp
1421; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
1422; CHECK-GI-NEXT:    and x8, x8, #0x3
1423; CHECK-GI-NEXT:    stp q0, q2, [sp]
1424; CHECK-GI-NEXT:    ldr d0, [x9, x8, lsl #3]
1425; CHECK-GI-NEXT:    mov sp, x29
1426; CHECK-GI-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
1427; CHECK-GI-NEXT:    ret
1428entry:
1429  %d = extractelement <3 x double> %a, i32 %c
1430  ret double %d
1431}
1432
1433define double @extract_v4f64_0(<4 x double> %a, i32 %c) {
1434; CHECK-LABEL: extract_v4f64_0:
1435; CHECK:       // %bb.0: // %entry
1436; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
1437; CHECK-NEXT:    ret
1438entry:
1439  %d = extractelement <4 x double> %a, i32 0
1440  ret double %d
1441}
1442
1443define double @extract_v4f64_2(<4 x double> %a, i32 %c) {
1444; CHECK-LABEL: extract_v4f64_2:
1445; CHECK:       // %bb.0: // %entry
1446; CHECK-NEXT:    mov v0.16b, v1.16b
1447; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
1448; CHECK-NEXT:    ret
1449entry:
1450  %d = extractelement <4 x double> %a, i32 2
1451  ret double %d
1452}
1453
1454define double @extract_v4f64_c(<4 x double> %a, i32 %c) {
1455; CHECK-SD-LABEL: extract_v4f64_c:
1456; CHECK-SD:       // %bb.0: // %entry
1457; CHECK-SD-NEXT:    stp q0, q1, [sp, #-32]!
1458; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
1459; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
1460; CHECK-SD-NEXT:    and x8, x0, #0x3
1461; CHECK-SD-NEXT:    mov x9, sp
1462; CHECK-SD-NEXT:    ldr d0, [x9, x8, lsl #3]
1463; CHECK-SD-NEXT:    add sp, sp, #32
1464; CHECK-SD-NEXT:    ret
1465;
1466; CHECK-GI-LABEL: extract_v4f64_c:
1467; CHECK-GI:       // %bb.0: // %entry
1468; CHECK-GI-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
1469; CHECK-GI-NEXT:    sub x9, sp, #48
1470; CHECK-GI-NEXT:    mov x29, sp
1471; CHECK-GI-NEXT:    and sp, x9, #0xffffffffffffffe0
1472; CHECK-GI-NEXT:    .cfi_def_cfa w29, 16
1473; CHECK-GI-NEXT:    .cfi_offset w30, -8
1474; CHECK-GI-NEXT:    .cfi_offset w29, -16
1475; CHECK-GI-NEXT:    mov w8, w0
1476; CHECK-GI-NEXT:    stp q0, q1, [sp]
1477; CHECK-GI-NEXT:    mov x9, sp
1478; CHECK-GI-NEXT:    and x8, x8, #0x3
1479; CHECK-GI-NEXT:    ldr d0, [x9, x8, lsl #3]
1480; CHECK-GI-NEXT:    mov sp, x29
1481; CHECK-GI-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
1482; CHECK-GI-NEXT:    ret
1483entry:
1484  %d = extractelement <4 x double> %a, i32 %c
1485  ret double %d
1486}
1487
1488define float @extract_v2f32_0(<2 x float> %a, i32 %c) {
1489; CHECK-SD-LABEL: extract_v2f32_0:
1490; CHECK-SD:       // %bb.0: // %entry
1491; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
1492; CHECK-SD-NEXT:    // kill: def $s0 killed $s0 killed $q0
1493; CHECK-SD-NEXT:    ret
1494;
1495; CHECK-GI-LABEL: extract_v2f32_0:
1496; CHECK-GI:       // %bb.0: // %entry
1497; CHECK-GI-NEXT:    // kill: def $s0 killed $s0 killed $d0
1498; CHECK-GI-NEXT:    ret
1499entry:
1500  %d = extractelement <2 x float> %a, i32 0
1501  ret float %d
1502}
1503
1504define float @extract_v2f32_1(<2 x float> %a, i32 %c) {
1505; CHECK-LABEL: extract_v2f32_1:
1506; CHECK:       // %bb.0: // %entry
1507; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
1508; CHECK-NEXT:    mov s0, v0.s[1]
1509; CHECK-NEXT:    ret
1510entry:
1511  %d = extractelement <2 x float> %a, i32 1
1512  ret float %d
1513}
1514
1515define float @extract_v2f32_c(<2 x float> %a, i32 %c) {
1516; CHECK-SD-LABEL: extract_v2f32_c:
1517; CHECK-SD:       // %bb.0: // %entry
1518; CHECK-SD-NEXT:    sub sp, sp, #16
1519; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
1520; CHECK-SD-NEXT:    add x8, sp, #8
1521; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
1522; CHECK-SD-NEXT:    str d0, [sp, #8]
1523; CHECK-SD-NEXT:    bfi x8, x0, #2, #1
1524; CHECK-SD-NEXT:    ldr s0, [x8]
1525; CHECK-SD-NEXT:    add sp, sp, #16
1526; CHECK-SD-NEXT:    ret
1527;
1528; CHECK-GI-LABEL: extract_v2f32_c:
1529; CHECK-GI:       // %bb.0: // %entry
1530; CHECK-GI-NEXT:    sub sp, sp, #16
1531; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
1532; CHECK-GI-NEXT:    mov w9, w0
1533; CHECK-GI-NEXT:    add x8, sp, #8
1534; CHECK-GI-NEXT:    str d0, [sp, #8]
1535; CHECK-GI-NEXT:    and x9, x9, #0x1
1536; CHECK-GI-NEXT:    ldr s0, [x8, x9, lsl #2]
1537; CHECK-GI-NEXT:    add sp, sp, #16
1538; CHECK-GI-NEXT:    ret
1539entry:
1540  %d = extractelement <2 x float> %a, i32 %c
1541  ret float %d
1542}
1543
1544define float @extract_v3f32_0(<3 x float> %a, i32 %c) {
1545; CHECK-LABEL: extract_v3f32_0:
1546; CHECK:       // %bb.0: // %entry
1547; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $q0
1548; CHECK-NEXT:    ret
1549entry:
1550  %d = extractelement <3 x float> %a, i32 0
1551  ret float %d
1552}
1553
1554define float @extract_v3f32_2(<3 x float> %a, i32 %c) {
1555; CHECK-LABEL: extract_v3f32_2:
1556; CHECK:       // %bb.0: // %entry
1557; CHECK-NEXT:    mov s0, v0.s[2]
1558; CHECK-NEXT:    ret
1559entry:
1560  %d = extractelement <3 x float> %a, i32 2
1561  ret float %d
1562}
1563
1564define float @extract_v3f32_c(<3 x float> %a, i32 %c) {
1565; CHECK-SD-LABEL: extract_v3f32_c:
1566; CHECK-SD:       // %bb.0: // %entry
1567; CHECK-SD-NEXT:    sub sp, sp, #16
1568; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
1569; CHECK-SD-NEXT:    mov x8, sp
1570; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
1571; CHECK-SD-NEXT:    str q0, [sp]
1572; CHECK-SD-NEXT:    bfi x8, x0, #2, #2
1573; CHECK-SD-NEXT:    ldr s0, [x8]
1574; CHECK-SD-NEXT:    add sp, sp, #16
1575; CHECK-SD-NEXT:    ret
1576;
1577; CHECK-GI-LABEL: extract_v3f32_c:
1578; CHECK-GI:       // %bb.0: // %entry
1579; CHECK-GI-NEXT:    sub sp, sp, #16
1580; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
1581; CHECK-GI-NEXT:    mov w9, w0
1582; CHECK-GI-NEXT:    mov x8, sp
1583; CHECK-GI-NEXT:    str q0, [sp]
1584; CHECK-GI-NEXT:    and x9, x9, #0x3
1585; CHECK-GI-NEXT:    ldr s0, [x8, x9, lsl #2]
1586; CHECK-GI-NEXT:    add sp, sp, #16
1587; CHECK-GI-NEXT:    ret
1588entry:
1589  %d = extractelement <3 x float> %a, i32 %c
1590  ret float %d
1591}
1592
1593define float @extract_v4f32_0(<4 x float> %a, i32 %c) {
1594; CHECK-LABEL: extract_v4f32_0:
1595; CHECK:       // %bb.0: // %entry
1596; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $q0
1597; CHECK-NEXT:    ret
1598entry:
1599  %d = extractelement <4 x float> %a, i32 0
1600  ret float %d
1601}
1602
1603define float @extract_v4f32_2(<4 x float> %a, i32 %c) {
1604; CHECK-LABEL: extract_v4f32_2:
1605; CHECK:       // %bb.0: // %entry
1606; CHECK-NEXT:    mov s0, v0.s[2]
1607; CHECK-NEXT:    ret
1608entry:
1609  %d = extractelement <4 x float> %a, i32 2
1610  ret float %d
1611}
1612
1613define float @extract_v4f32_c(<4 x float> %a, i32 %c) {
1614; CHECK-SD-LABEL: extract_v4f32_c:
1615; CHECK-SD:       // %bb.0: // %entry
1616; CHECK-SD-NEXT:    sub sp, sp, #16
1617; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
1618; CHECK-SD-NEXT:    mov x8, sp
1619; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
1620; CHECK-SD-NEXT:    str q0, [sp]
1621; CHECK-SD-NEXT:    bfi x8, x0, #2, #2
1622; CHECK-SD-NEXT:    ldr s0, [x8]
1623; CHECK-SD-NEXT:    add sp, sp, #16
1624; CHECK-SD-NEXT:    ret
1625;
1626; CHECK-GI-LABEL: extract_v4f32_c:
1627; CHECK-GI:       // %bb.0: // %entry
1628; CHECK-GI-NEXT:    sub sp, sp, #16
1629; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
1630; CHECK-GI-NEXT:    mov w9, w0
1631; CHECK-GI-NEXT:    mov x8, sp
1632; CHECK-GI-NEXT:    str q0, [sp]
1633; CHECK-GI-NEXT:    and x9, x9, #0x3
1634; CHECK-GI-NEXT:    ldr s0, [x8, x9, lsl #2]
1635; CHECK-GI-NEXT:    add sp, sp, #16
1636; CHECK-GI-NEXT:    ret
1637entry:
1638  %d = extractelement <4 x float> %a, i32 %c
1639  ret float %d
1640}
1641
1642define float @extract_v8f32_0(<8 x float> %a, i32 %c) {
1643; CHECK-LABEL: extract_v8f32_0:
1644; CHECK:       // %bb.0: // %entry
1645; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $q0
1646; CHECK-NEXT:    ret
1647entry:
1648  %d = extractelement <8 x float> %a, i32 0
1649  ret float %d
1650}
1651
1652define float @extract_v8f32_2(<8 x float> %a, i32 %c) {
1653; CHECK-LABEL: extract_v8f32_2:
1654; CHECK:       // %bb.0: // %entry
1655; CHECK-NEXT:    mov s0, v0.s[2]
1656; CHECK-NEXT:    ret
1657entry:
1658  %d = extractelement <8 x float> %a, i32 2
1659  ret float %d
1660}
1661
1662define float @extract_v8f32_c(<8 x float> %a, i32 %c) {
1663; CHECK-SD-LABEL: extract_v8f32_c:
1664; CHECK-SD:       // %bb.0: // %entry
1665; CHECK-SD-NEXT:    stp q0, q1, [sp, #-32]!
1666; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
1667; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
1668; CHECK-SD-NEXT:    and x8, x0, #0x7
1669; CHECK-SD-NEXT:    mov x9, sp
1670; CHECK-SD-NEXT:    ldr s0, [x9, x8, lsl #2]
1671; CHECK-SD-NEXT:    add sp, sp, #32
1672; CHECK-SD-NEXT:    ret
1673;
1674; CHECK-GI-LABEL: extract_v8f32_c:
1675; CHECK-GI:       // %bb.0: // %entry
1676; CHECK-GI-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
1677; CHECK-GI-NEXT:    sub x9, sp, #48
1678; CHECK-GI-NEXT:    mov x29, sp
1679; CHECK-GI-NEXT:    and sp, x9, #0xffffffffffffffe0
1680; CHECK-GI-NEXT:    .cfi_def_cfa w29, 16
1681; CHECK-GI-NEXT:    .cfi_offset w30, -8
1682; CHECK-GI-NEXT:    .cfi_offset w29, -16
1683; CHECK-GI-NEXT:    mov w8, w0
1684; CHECK-GI-NEXT:    stp q0, q1, [sp]
1685; CHECK-GI-NEXT:    mov x9, sp
1686; CHECK-GI-NEXT:    and x8, x8, #0x7
1687; CHECK-GI-NEXT:    ldr s0, [x9, x8, lsl #2]
1688; CHECK-GI-NEXT:    mov sp, x29
1689; CHECK-GI-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
1690; CHECK-GI-NEXT:    ret
1691entry:
1692  %d = extractelement <8 x float> %a, i32 %c
1693  ret float %d
1694}
1695
1696define half @extract_v4f16_0(<4 x half> %a, i32 %c) {
1697; CHECK-SD-LABEL: extract_v4f16_0:
1698; CHECK-SD:       // %bb.0: // %entry
1699; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
1700; CHECK-SD-NEXT:    // kill: def $h0 killed $h0 killed $q0
1701; CHECK-SD-NEXT:    ret
1702;
1703; CHECK-GI-LABEL: extract_v4f16_0:
1704; CHECK-GI:       // %bb.0: // %entry
1705; CHECK-GI-NEXT:    // kill: def $h0 killed $h0 killed $d0
1706; CHECK-GI-NEXT:    ret
1707entry:
1708  %d = extractelement <4 x half> %a, i32 0
1709  ret half %d
1710}
1711
1712define half @extract_v4f16_2(<4 x half> %a, i32 %c) {
1713; CHECK-LABEL: extract_v4f16_2:
1714; CHECK:       // %bb.0: // %entry
1715; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
1716; CHECK-NEXT:    mov h0, v0.h[2]
1717; CHECK-NEXT:    ret
1718entry:
1719  %d = extractelement <4 x half> %a, i32 2
1720  ret half %d
1721}
1722
1723define half @extract_v4f16_c(<4 x half> %a, i32 %c) {
1724; CHECK-SD-LABEL: extract_v4f16_c:
1725; CHECK-SD:       // %bb.0: // %entry
1726; CHECK-SD-NEXT:    sub sp, sp, #16
1727; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
1728; CHECK-SD-NEXT:    add x8, sp, #8
1729; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
1730; CHECK-SD-NEXT:    str d0, [sp, #8]
1731; CHECK-SD-NEXT:    bfi x8, x0, #1, #2
1732; CHECK-SD-NEXT:    ldr h0, [x8]
1733; CHECK-SD-NEXT:    add sp, sp, #16
1734; CHECK-SD-NEXT:    ret
1735;
1736; CHECK-GI-LABEL: extract_v4f16_c:
1737; CHECK-GI:       // %bb.0: // %entry
1738; CHECK-GI-NEXT:    sub sp, sp, #16
1739; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
1740; CHECK-GI-NEXT:    mov w9, w0
1741; CHECK-GI-NEXT:    add x8, sp, #8
1742; CHECK-GI-NEXT:    str d0, [sp, #8]
1743; CHECK-GI-NEXT:    and x9, x9, #0x3
1744; CHECK-GI-NEXT:    ldr h0, [x8, x9, lsl #1]
1745; CHECK-GI-NEXT:    add sp, sp, #16
1746; CHECK-GI-NEXT:    ret
1747entry:
1748  %d = extractelement <4 x half> %a, i32 %c
1749  ret half %d
1750}
1751
1752define half @extract_v8f16_0(<8 x half> %a, i32 %c) {
1753; CHECK-LABEL: extract_v8f16_0:
1754; CHECK:       // %bb.0: // %entry
1755; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $q0
1756; CHECK-NEXT:    ret
1757entry:
1758  %d = extractelement <8 x half> %a, i32 0
1759  ret half %d
1760}
1761
1762define half @extract_v8f16_2(<8 x half> %a, i32 %c) {
1763; CHECK-LABEL: extract_v8f16_2:
1764; CHECK:       // %bb.0: // %entry
1765; CHECK-NEXT:    mov h0, v0.h[2]
1766; CHECK-NEXT:    ret
1767entry:
1768  %d = extractelement <8 x half> %a, i32 2
1769  ret half %d
1770}
1771
1772define half @extract_v8f16_c(<8 x half> %a, i32 %c) {
1773; CHECK-SD-LABEL: extract_v8f16_c:
1774; CHECK-SD:       // %bb.0: // %entry
1775; CHECK-SD-NEXT:    sub sp, sp, #16
1776; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
1777; CHECK-SD-NEXT:    mov x8, sp
1778; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
1779; CHECK-SD-NEXT:    str q0, [sp]
1780; CHECK-SD-NEXT:    bfi x8, x0, #1, #3
1781; CHECK-SD-NEXT:    ldr h0, [x8]
1782; CHECK-SD-NEXT:    add sp, sp, #16
1783; CHECK-SD-NEXT:    ret
1784;
1785; CHECK-GI-LABEL: extract_v8f16_c:
1786; CHECK-GI:       // %bb.0: // %entry
1787; CHECK-GI-NEXT:    sub sp, sp, #16
1788; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
1789; CHECK-GI-NEXT:    mov w9, w0
1790; CHECK-GI-NEXT:    mov x8, sp
1791; CHECK-GI-NEXT:    str q0, [sp]
1792; CHECK-GI-NEXT:    and x9, x9, #0x7
1793; CHECK-GI-NEXT:    ldr h0, [x8, x9, lsl #1]
1794; CHECK-GI-NEXT:    add sp, sp, #16
1795; CHECK-GI-NEXT:    ret
1796entry:
1797  %d = extractelement <8 x half> %a, i32 %c
1798  ret half %d
1799}
1800
1801define half @extract_v16f16_0(<16 x half> %a, i32 %c) {
1802; CHECK-LABEL: extract_v16f16_0:
1803; CHECK:       // %bb.0: // %entry
1804; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $q0
1805; CHECK-NEXT:    ret
1806entry:
1807  %d = extractelement <16 x half> %a, i32 0
1808  ret half %d
1809}
1810
1811define half @extract_v16f16_2(<16 x half> %a, i32 %c) {
1812; CHECK-LABEL: extract_v16f16_2:
1813; CHECK:       // %bb.0: // %entry
1814; CHECK-NEXT:    mov h0, v0.h[2]
1815; CHECK-NEXT:    ret
1816entry:
1817  %d = extractelement <16 x half> %a, i32 2
1818  ret half %d
1819}
1820
1821define half @extract_v16f16_c(<16 x half> %a, i32 %c) {
1822; CHECK-SD-LABEL: extract_v16f16_c:
1823; CHECK-SD:       // %bb.0: // %entry
1824; CHECK-SD-NEXT:    stp q0, q1, [sp, #-32]!
1825; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
1826; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
1827; CHECK-SD-NEXT:    and x8, x0, #0xf
1828; CHECK-SD-NEXT:    mov x9, sp
1829; CHECK-SD-NEXT:    ldr h0, [x9, x8, lsl #1]
1830; CHECK-SD-NEXT:    add sp, sp, #32
1831; CHECK-SD-NEXT:    ret
1832;
1833; CHECK-GI-LABEL: extract_v16f16_c:
1834; CHECK-GI:       // %bb.0: // %entry
1835; CHECK-GI-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
1836; CHECK-GI-NEXT:    sub x9, sp, #48
1837; CHECK-GI-NEXT:    mov x29, sp
1838; CHECK-GI-NEXT:    and sp, x9, #0xffffffffffffffe0
1839; CHECK-GI-NEXT:    .cfi_def_cfa w29, 16
1840; CHECK-GI-NEXT:    .cfi_offset w30, -8
1841; CHECK-GI-NEXT:    .cfi_offset w29, -16
1842; CHECK-GI-NEXT:    mov w8, w0
1843; CHECK-GI-NEXT:    stp q0, q1, [sp]
1844; CHECK-GI-NEXT:    mov x9, sp
1845; CHECK-GI-NEXT:    and x8, x8, #0xf
1846; CHECK-GI-NEXT:    ldr h0, [x9, x8, lsl #1]
1847; CHECK-GI-NEXT:    mov sp, x29
1848; CHECK-GI-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
1849; CHECK-GI-NEXT:    ret
1850entry:
1851  %d = extractelement <16 x half> %a, i32 %c
1852  ret half %d
1853}
1854
1855define i8 @extract_v8i8_0(<8 x i8> %a, i32 %c) {
1856; CHECK-LABEL: extract_v8i8_0:
1857; CHECK:       // %bb.0: // %entry
1858; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
1859; CHECK-NEXT:    umov w0, v0.b[0]
1860; CHECK-NEXT:    ret
1861entry:
1862  %d = extractelement <8 x i8> %a, i32 0
1863  ret i8 %d
1864}
1865
1866define i8 @extract_v8i8_2(<8 x i8> %a, i32 %c) {
1867; CHECK-LABEL: extract_v8i8_2:
1868; CHECK:       // %bb.0: // %entry
1869; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
1870; CHECK-NEXT:    umov w0, v0.b[2]
1871; CHECK-NEXT:    ret
1872entry:
1873  %d = extractelement <8 x i8> %a, i32 2
1874  ret i8 %d
1875}
1876
1877define i8 @extract_v8i8_c(<8 x i8> %a, i32 %c) {
1878; CHECK-SD-LABEL: extract_v8i8_c:
1879; CHECK-SD:       // %bb.0: // %entry
1880; CHECK-SD-NEXT:    sub sp, sp, #16
1881; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
1882; CHECK-SD-NEXT:    add x8, sp, #8
1883; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
1884; CHECK-SD-NEXT:    str d0, [sp, #8]
1885; CHECK-SD-NEXT:    bfxil x8, x0, #0, #3
1886; CHECK-SD-NEXT:    ldrb w0, [x8]
1887; CHECK-SD-NEXT:    add sp, sp, #16
1888; CHECK-SD-NEXT:    ret
1889;
1890; CHECK-GI-LABEL: extract_v8i8_c:
1891; CHECK-GI:       // %bb.0: // %entry
1892; CHECK-GI-NEXT:    sub sp, sp, #16
1893; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
1894; CHECK-GI-NEXT:    mov w9, w0
1895; CHECK-GI-NEXT:    add x8, sp, #8
1896; CHECK-GI-NEXT:    str d0, [sp, #8]
1897; CHECK-GI-NEXT:    and x9, x9, #0x7
1898; CHECK-GI-NEXT:    lsl x10, x9, #1
1899; CHECK-GI-NEXT:    sub x9, x10, x9
1900; CHECK-GI-NEXT:    ldrb w0, [x8, x9]
1901; CHECK-GI-NEXT:    add sp, sp, #16
1902; CHECK-GI-NEXT:    ret
1903entry:
1904  %d = extractelement <8 x i8> %a, i32 %c
1905  ret i8 %d
1906}
1907
1908define i8 @extract_v16i8_0(<16 x i8> %a, i32 %c) {
1909; CHECK-LABEL: extract_v16i8_0:
1910; CHECK:       // %bb.0: // %entry
1911; CHECK-NEXT:    umov w0, v0.b[0]
1912; CHECK-NEXT:    ret
1913entry:
1914  %d = extractelement <16 x i8> %a, i32 0
1915  ret i8 %d
1916}
1917
1918define i8 @extract_v16i8_2(<16 x i8> %a, i32 %c) {
1919; CHECK-LABEL: extract_v16i8_2:
1920; CHECK:       // %bb.0: // %entry
1921; CHECK-NEXT:    umov w0, v0.b[2]
1922; CHECK-NEXT:    ret
1923entry:
1924  %d = extractelement <16 x i8> %a, i32 2
1925  ret i8 %d
1926}
1927
1928define i8 @extract_v16i8_c(<16 x i8> %a, i32 %c) {
1929; CHECK-SD-LABEL: extract_v16i8_c:
1930; CHECK-SD:       // %bb.0: // %entry
1931; CHECK-SD-NEXT:    sub sp, sp, #16
1932; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
1933; CHECK-SD-NEXT:    mov x8, sp
1934; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
1935; CHECK-SD-NEXT:    str q0, [sp]
1936; CHECK-SD-NEXT:    bfxil x8, x0, #0, #4
1937; CHECK-SD-NEXT:    ldrb w0, [x8]
1938; CHECK-SD-NEXT:    add sp, sp, #16
1939; CHECK-SD-NEXT:    ret
1940;
1941; CHECK-GI-LABEL: extract_v16i8_c:
1942; CHECK-GI:       // %bb.0: // %entry
1943; CHECK-GI-NEXT:    sub sp, sp, #16
1944; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
1945; CHECK-GI-NEXT:    mov w9, w0
1946; CHECK-GI-NEXT:    mov x8, sp
1947; CHECK-GI-NEXT:    str q0, [sp]
1948; CHECK-GI-NEXT:    and x9, x9, #0xf
1949; CHECK-GI-NEXT:    lsl x10, x9, #1
1950; CHECK-GI-NEXT:    sub x9, x10, x9
1951; CHECK-GI-NEXT:    ldrb w0, [x8, x9]
1952; CHECK-GI-NEXT:    add sp, sp, #16
1953; CHECK-GI-NEXT:    ret
1954entry:
1955  %d = extractelement <16 x i8> %a, i32 %c
1956  ret i8 %d
1957}
1958
1959define i8 @extract_v32i8_0(<32 x i8> %a, i32 %c) {
1960; CHECK-LABEL: extract_v32i8_0:
1961; CHECK:       // %bb.0: // %entry
1962; CHECK-NEXT:    umov w0, v0.b[0]
1963; CHECK-NEXT:    ret
1964entry:
1965  %d = extractelement <32 x i8> %a, i32 0
1966  ret i8 %d
1967}
1968
1969define i8 @extract_v32i8_2(<32 x i8> %a, i32 %c) {
1970; CHECK-LABEL: extract_v32i8_2:
1971; CHECK:       // %bb.0: // %entry
1972; CHECK-NEXT:    umov w0, v0.b[2]
1973; CHECK-NEXT:    ret
1974entry:
1975  %d = extractelement <32 x i8> %a, i32 2
1976  ret i8 %d
1977}
1978
1979define i8 @extract_v32i8_c(<32 x i8> %a, i32 %c) {
1980; CHECK-SD-LABEL: extract_v32i8_c:
1981; CHECK-SD:       // %bb.0: // %entry
1982; CHECK-SD-NEXT:    stp q0, q1, [sp, #-32]!
1983; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
1984; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
1985; CHECK-SD-NEXT:    and x8, x0, #0x1f
1986; CHECK-SD-NEXT:    mov x9, sp
1987; CHECK-SD-NEXT:    ldrb w0, [x9, x8]
1988; CHECK-SD-NEXT:    add sp, sp, #32
1989; CHECK-SD-NEXT:    ret
1990;
1991; CHECK-GI-LABEL: extract_v32i8_c:
1992; CHECK-GI:       // %bb.0: // %entry
1993; CHECK-GI-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
1994; CHECK-GI-NEXT:    sub x9, sp, #48
1995; CHECK-GI-NEXT:    mov x29, sp
1996; CHECK-GI-NEXT:    and sp, x9, #0xffffffffffffffe0
1997; CHECK-GI-NEXT:    .cfi_def_cfa w29, 16
1998; CHECK-GI-NEXT:    .cfi_offset w30, -8
1999; CHECK-GI-NEXT:    .cfi_offset w29, -16
2000; CHECK-GI-NEXT:    mov w8, w0
2001; CHECK-GI-NEXT:    stp q0, q1, [sp]
2002; CHECK-GI-NEXT:    mov x10, sp
2003; CHECK-GI-NEXT:    and x8, x8, #0x1f
2004; CHECK-GI-NEXT:    lsl x9, x8, #1
2005; CHECK-GI-NEXT:    sub x8, x9, x8
2006; CHECK-GI-NEXT:    ldrb w0, [x10, x8]
2007; CHECK-GI-NEXT:    mov sp, x29
2008; CHECK-GI-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
2009; CHECK-GI-NEXT:    ret
2010entry:
2011  %d = extractelement <32 x i8> %a, i32 %c
2012  ret i8 %d
2013}
2014
2015define i16 @extract_v4i16_0(<4 x i16> %a, i32 %c) {
2016; CHECK-LABEL: extract_v4i16_0:
2017; CHECK:       // %bb.0: // %entry
2018; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
2019; CHECK-NEXT:    umov w0, v0.h[0]
2020; CHECK-NEXT:    ret
2021entry:
2022  %d = extractelement <4 x i16> %a, i32 0
2023  ret i16 %d
2024}
2025
2026define i16 @extract_v4i16_2(<4 x i16> %a, i32 %c) {
2027; CHECK-LABEL: extract_v4i16_2:
2028; CHECK:       // %bb.0: // %entry
2029; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
2030; CHECK-NEXT:    umov w0, v0.h[2]
2031; CHECK-NEXT:    ret
2032entry:
2033  %d = extractelement <4 x i16> %a, i32 2
2034  ret i16 %d
2035}
2036
2037define i16 @extract_v4i16_c(<4 x i16> %a, i32 %c) {
2038; CHECK-SD-LABEL: extract_v4i16_c:
2039; CHECK-SD:       // %bb.0: // %entry
2040; CHECK-SD-NEXT:    sub sp, sp, #16
2041; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
2042; CHECK-SD-NEXT:    add x8, sp, #8
2043; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
2044; CHECK-SD-NEXT:    str d0, [sp, #8]
2045; CHECK-SD-NEXT:    bfi x8, x0, #1, #2
2046; CHECK-SD-NEXT:    ldrh w0, [x8]
2047; CHECK-SD-NEXT:    add sp, sp, #16
2048; CHECK-SD-NEXT:    ret
2049;
2050; CHECK-GI-LABEL: extract_v4i16_c:
2051; CHECK-GI:       // %bb.0: // %entry
2052; CHECK-GI-NEXT:    sub sp, sp, #16
2053; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
2054; CHECK-GI-NEXT:    mov w9, w0
2055; CHECK-GI-NEXT:    add x8, sp, #8
2056; CHECK-GI-NEXT:    str d0, [sp, #8]
2057; CHECK-GI-NEXT:    and x9, x9, #0x3
2058; CHECK-GI-NEXT:    ldrh w0, [x8, x9, lsl #1]
2059; CHECK-GI-NEXT:    add sp, sp, #16
2060; CHECK-GI-NEXT:    ret
2061entry:
2062  %d = extractelement <4 x i16> %a, i32 %c
2063  ret i16 %d
2064}
2065
2066define i16 @extract_v8i16_0(<8 x i16> %a, i32 %c) {
2067; CHECK-LABEL: extract_v8i16_0:
2068; CHECK:       // %bb.0: // %entry
2069; CHECK-NEXT:    umov w0, v0.h[0]
2070; CHECK-NEXT:    ret
2071entry:
2072  %d = extractelement <8 x i16> %a, i32 0
2073  ret i16 %d
2074}
2075
2076define i16 @extract_v8i16_2(<8 x i16> %a, i32 %c) {
2077; CHECK-LABEL: extract_v8i16_2:
2078; CHECK:       // %bb.0: // %entry
2079; CHECK-NEXT:    umov w0, v0.h[2]
2080; CHECK-NEXT:    ret
2081entry:
2082  %d = extractelement <8 x i16> %a, i32 2
2083  ret i16 %d
2084}
2085
2086define i16 @extract_v8i16_c(<8 x i16> %a, i32 %c) {
2087; CHECK-SD-LABEL: extract_v8i16_c:
2088; CHECK-SD:       // %bb.0: // %entry
2089; CHECK-SD-NEXT:    sub sp, sp, #16
2090; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
2091; CHECK-SD-NEXT:    mov x8, sp
2092; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
2093; CHECK-SD-NEXT:    str q0, [sp]
2094; CHECK-SD-NEXT:    bfi x8, x0, #1, #3
2095; CHECK-SD-NEXT:    ldrh w0, [x8]
2096; CHECK-SD-NEXT:    add sp, sp, #16
2097; CHECK-SD-NEXT:    ret
2098;
2099; CHECK-GI-LABEL: extract_v8i16_c:
2100; CHECK-GI:       // %bb.0: // %entry
2101; CHECK-GI-NEXT:    sub sp, sp, #16
2102; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
2103; CHECK-GI-NEXT:    mov w9, w0
2104; CHECK-GI-NEXT:    mov x8, sp
2105; CHECK-GI-NEXT:    str q0, [sp]
2106; CHECK-GI-NEXT:    and x9, x9, #0x7
2107; CHECK-GI-NEXT:    ldrh w0, [x8, x9, lsl #1]
2108; CHECK-GI-NEXT:    add sp, sp, #16
2109; CHECK-GI-NEXT:    ret
2110entry:
2111  %d = extractelement <8 x i16> %a, i32 %c
2112  ret i16 %d
2113}
2114
2115define i16 @extract_v16i16_0(<16 x i16> %a, i32 %c) {
2116; CHECK-LABEL: extract_v16i16_0:
2117; CHECK:       // %bb.0: // %entry
2118; CHECK-NEXT:    umov w0, v0.h[0]
2119; CHECK-NEXT:    ret
2120entry:
2121  %d = extractelement <16 x i16> %a, i32 0
2122  ret i16 %d
2123}
2124
2125define i16 @extract_v16i16_2(<16 x i16> %a, i32 %c) {
2126; CHECK-LABEL: extract_v16i16_2:
2127; CHECK:       // %bb.0: // %entry
2128; CHECK-NEXT:    umov w0, v0.h[2]
2129; CHECK-NEXT:    ret
2130entry:
2131  %d = extractelement <16 x i16> %a, i32 2
2132  ret i16 %d
2133}
2134
2135define i16 @extract_v16i16_c(<16 x i16> %a, i32 %c) {
2136; CHECK-SD-LABEL: extract_v16i16_c:
2137; CHECK-SD:       // %bb.0: // %entry
2138; CHECK-SD-NEXT:    stp q0, q1, [sp, #-32]!
2139; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
2140; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
2141; CHECK-SD-NEXT:    and x8, x0, #0xf
2142; CHECK-SD-NEXT:    mov x9, sp
2143; CHECK-SD-NEXT:    ldrh w0, [x9, x8, lsl #1]
2144; CHECK-SD-NEXT:    add sp, sp, #32
2145; CHECK-SD-NEXT:    ret
2146;
2147; CHECK-GI-LABEL: extract_v16i16_c:
2148; CHECK-GI:       // %bb.0: // %entry
2149; CHECK-GI-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
2150; CHECK-GI-NEXT:    sub x9, sp, #48
2151; CHECK-GI-NEXT:    mov x29, sp
2152; CHECK-GI-NEXT:    and sp, x9, #0xffffffffffffffe0
2153; CHECK-GI-NEXT:    .cfi_def_cfa w29, 16
2154; CHECK-GI-NEXT:    .cfi_offset w30, -8
2155; CHECK-GI-NEXT:    .cfi_offset w29, -16
2156; CHECK-GI-NEXT:    mov w8, w0
2157; CHECK-GI-NEXT:    stp q0, q1, [sp]
2158; CHECK-GI-NEXT:    mov x9, sp
2159; CHECK-GI-NEXT:    and x8, x8, #0xf
2160; CHECK-GI-NEXT:    ldrh w0, [x9, x8, lsl #1]
2161; CHECK-GI-NEXT:    mov sp, x29
2162; CHECK-GI-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
2163; CHECK-GI-NEXT:    ret
2164entry:
2165  %d = extractelement <16 x i16> %a, i32 %c
2166  ret i16 %d
2167}
2168
2169define i32 @extract_v2i32_0(<2 x i32> %a, i32 %c) {
2170; CHECK-SD-LABEL: extract_v2i32_0:
2171; CHECK-SD:       // %bb.0: // %entry
2172; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
2173; CHECK-SD-NEXT:    fmov w0, s0
2174; CHECK-SD-NEXT:    ret
2175;
2176; CHECK-GI-LABEL: extract_v2i32_0:
2177; CHECK-GI:       // %bb.0: // %entry
2178; CHECK-GI-NEXT:    fmov w0, s0
2179; CHECK-GI-NEXT:    ret
2180entry:
2181  %d = extractelement <2 x i32> %a, i32 0
2182  ret i32 %d
2183}
2184
2185define i32 @extract_v2i32_1(<2 x i32> %a, i32 %c) {
2186; CHECK-SD-LABEL: extract_v2i32_1:
2187; CHECK-SD:       // %bb.0: // %entry
2188; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
2189; CHECK-SD-NEXT:    mov w0, v0.s[1]
2190; CHECK-SD-NEXT:    ret
2191;
2192; CHECK-GI-LABEL: extract_v2i32_1:
2193; CHECK-GI:       // %bb.0: // %entry
2194; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
2195; CHECK-GI-NEXT:    mov s0, v0.s[1]
2196; CHECK-GI-NEXT:    fmov w0, s0
2197; CHECK-GI-NEXT:    ret
2198entry:
2199  %d = extractelement <2 x i32> %a, i32 1
2200  ret i32 %d
2201}
2202
2203define i32 @extract_v2i32_c(<2 x i32> %a, i32 %c) {
2204; CHECK-SD-LABEL: extract_v2i32_c:
2205; CHECK-SD:       // %bb.0: // %entry
2206; CHECK-SD-NEXT:    sub sp, sp, #16
2207; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
2208; CHECK-SD-NEXT:    add x8, sp, #8
2209; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
2210; CHECK-SD-NEXT:    str d0, [sp, #8]
2211; CHECK-SD-NEXT:    bfi x8, x0, #2, #1
2212; CHECK-SD-NEXT:    ldr w0, [x8]
2213; CHECK-SD-NEXT:    add sp, sp, #16
2214; CHECK-SD-NEXT:    ret
2215;
2216; CHECK-GI-LABEL: extract_v2i32_c:
2217; CHECK-GI:       // %bb.0: // %entry
2218; CHECK-GI-NEXT:    sub sp, sp, #16
2219; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
2220; CHECK-GI-NEXT:    mov w9, w0
2221; CHECK-GI-NEXT:    add x8, sp, #8
2222; CHECK-GI-NEXT:    str d0, [sp, #8]
2223; CHECK-GI-NEXT:    and x9, x9, #0x1
2224; CHECK-GI-NEXT:    ldr w0, [x8, x9, lsl #2]
2225; CHECK-GI-NEXT:    add sp, sp, #16
2226; CHECK-GI-NEXT:    ret
2227entry:
2228  %d = extractelement <2 x i32> %a, i32 %c
2229  ret i32 %d
2230}
2231
2232define i32 @extract_v3i32_0(<3 x i32> %a, i32 %c) {
2233; CHECK-LABEL: extract_v3i32_0:
2234; CHECK:       // %bb.0: // %entry
2235; CHECK-NEXT:    fmov w0, s0
2236; CHECK-NEXT:    ret
2237entry:
2238  %d = extractelement <3 x i32> %a, i32 0
2239  ret i32 %d
2240}
2241
2242define i32 @extract_v3i32_2(<3 x i32> %a, i32 %c) {
2243; CHECK-SD-LABEL: extract_v3i32_2:
2244; CHECK-SD:       // %bb.0: // %entry
2245; CHECK-SD-NEXT:    mov w0, v0.s[2]
2246; CHECK-SD-NEXT:    ret
2247;
2248; CHECK-GI-LABEL: extract_v3i32_2:
2249; CHECK-GI:       // %bb.0: // %entry
2250; CHECK-GI-NEXT:    mov s0, v0.s[2]
2251; CHECK-GI-NEXT:    fmov w0, s0
2252; CHECK-GI-NEXT:    ret
2253entry:
2254  %d = extractelement <3 x i32> %a, i32 2
2255  ret i32 %d
2256}
2257
2258define i32 @extract_v3i32_c(<3 x i32> %a, i32 %c) {
2259; CHECK-SD-LABEL: extract_v3i32_c:
2260; CHECK-SD:       // %bb.0: // %entry
2261; CHECK-SD-NEXT:    sub sp, sp, #16
2262; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
2263; CHECK-SD-NEXT:    mov x8, sp
2264; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
2265; CHECK-SD-NEXT:    str q0, [sp]
2266; CHECK-SD-NEXT:    bfi x8, x0, #2, #2
2267; CHECK-SD-NEXT:    ldr w0, [x8]
2268; CHECK-SD-NEXT:    add sp, sp, #16
2269; CHECK-SD-NEXT:    ret
2270;
2271; CHECK-GI-LABEL: extract_v3i32_c:
2272; CHECK-GI:       // %bb.0: // %entry
2273; CHECK-GI-NEXT:    sub sp, sp, #16
2274; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
2275; CHECK-GI-NEXT:    mov w9, w0
2276; CHECK-GI-NEXT:    mov x8, sp
2277; CHECK-GI-NEXT:    str q0, [sp]
2278; CHECK-GI-NEXT:    and x9, x9, #0x3
2279; CHECK-GI-NEXT:    ldr w0, [x8, x9, lsl #2]
2280; CHECK-GI-NEXT:    add sp, sp, #16
2281; CHECK-GI-NEXT:    ret
2282entry:
2283  %d = extractelement <3 x i32> %a, i32 %c
2284  ret i32 %d
2285}
2286
2287define i32 @extract_v4i32_0(<4 x i32> %a, i32 %c) {
2288; CHECK-LABEL: extract_v4i32_0:
2289; CHECK:       // %bb.0: // %entry
2290; CHECK-NEXT:    fmov w0, s0
2291; CHECK-NEXT:    ret
2292entry:
2293  %d = extractelement <4 x i32> %a, i32 0
2294  ret i32 %d
2295}
2296
2297define i32 @extract_v4i32_2(<4 x i32> %a, i32 %c) {
2298; CHECK-SD-LABEL: extract_v4i32_2:
2299; CHECK-SD:       // %bb.0: // %entry
2300; CHECK-SD-NEXT:    mov w0, v0.s[2]
2301; CHECK-SD-NEXT:    ret
2302;
2303; CHECK-GI-LABEL: extract_v4i32_2:
2304; CHECK-GI:       // %bb.0: // %entry
2305; CHECK-GI-NEXT:    mov s0, v0.s[2]
2306; CHECK-GI-NEXT:    fmov w0, s0
2307; CHECK-GI-NEXT:    ret
2308entry:
2309  %d = extractelement <4 x i32> %a, i32 2
2310  ret i32 %d
2311}
2312
2313define i32 @extract_v4i32_c(<4 x i32> %a, i32 %c) {
2314; CHECK-SD-LABEL: extract_v4i32_c:
2315; CHECK-SD:       // %bb.0: // %entry
2316; CHECK-SD-NEXT:    sub sp, sp, #16
2317; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
2318; CHECK-SD-NEXT:    mov x8, sp
2319; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
2320; CHECK-SD-NEXT:    str q0, [sp]
2321; CHECK-SD-NEXT:    bfi x8, x0, #2, #2
2322; CHECK-SD-NEXT:    ldr w0, [x8]
2323; CHECK-SD-NEXT:    add sp, sp, #16
2324; CHECK-SD-NEXT:    ret
2325;
2326; CHECK-GI-LABEL: extract_v4i32_c:
2327; CHECK-GI:       // %bb.0: // %entry
2328; CHECK-GI-NEXT:    sub sp, sp, #16
2329; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
2330; CHECK-GI-NEXT:    mov w9, w0
2331; CHECK-GI-NEXT:    mov x8, sp
2332; CHECK-GI-NEXT:    str q0, [sp]
2333; CHECK-GI-NEXT:    and x9, x9, #0x3
2334; CHECK-GI-NEXT:    ldr w0, [x8, x9, lsl #2]
2335; CHECK-GI-NEXT:    add sp, sp, #16
2336; CHECK-GI-NEXT:    ret
2337entry:
2338  %d = extractelement <4 x i32> %a, i32 %c
2339  ret i32 %d
2340}
2341
2342define i32 @extract_v8i32_0(<8 x i32> %a, i32 %c) {
2343; CHECK-LABEL: extract_v8i32_0:
2344; CHECK:       // %bb.0: // %entry
2345; CHECK-NEXT:    fmov w0, s0
2346; CHECK-NEXT:    ret
2347entry:
2348  %d = extractelement <8 x i32> %a, i32 0
2349  ret i32 %d
2350}
2351
2352define i32 @extract_v8i32_2(<8 x i32> %a, i32 %c) {
2353; CHECK-SD-LABEL: extract_v8i32_2:
2354; CHECK-SD:       // %bb.0: // %entry
2355; CHECK-SD-NEXT:    mov w0, v0.s[2]
2356; CHECK-SD-NEXT:    ret
2357;
2358; CHECK-GI-LABEL: extract_v8i32_2:
2359; CHECK-GI:       // %bb.0: // %entry
2360; CHECK-GI-NEXT:    mov s0, v0.s[2]
2361; CHECK-GI-NEXT:    fmov w0, s0
2362; CHECK-GI-NEXT:    ret
2363entry:
2364  %d = extractelement <8 x i32> %a, i32 2
2365  ret i32 %d
2366}
2367
2368define i32 @extract_v8i32_c(<8 x i32> %a, i32 %c) {
2369; CHECK-SD-LABEL: extract_v8i32_c:
2370; CHECK-SD:       // %bb.0: // %entry
2371; CHECK-SD-NEXT:    stp q0, q1, [sp, #-32]!
2372; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
2373; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
2374; CHECK-SD-NEXT:    and x8, x0, #0x7
2375; CHECK-SD-NEXT:    mov x9, sp
2376; CHECK-SD-NEXT:    ldr w0, [x9, x8, lsl #2]
2377; CHECK-SD-NEXT:    add sp, sp, #32
2378; CHECK-SD-NEXT:    ret
2379;
2380; CHECK-GI-LABEL: extract_v8i32_c:
2381; CHECK-GI:       // %bb.0: // %entry
2382; CHECK-GI-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
2383; CHECK-GI-NEXT:    sub x9, sp, #48
2384; CHECK-GI-NEXT:    mov x29, sp
2385; CHECK-GI-NEXT:    and sp, x9, #0xffffffffffffffe0
2386; CHECK-GI-NEXT:    .cfi_def_cfa w29, 16
2387; CHECK-GI-NEXT:    .cfi_offset w30, -8
2388; CHECK-GI-NEXT:    .cfi_offset w29, -16
2389; CHECK-GI-NEXT:    mov w8, w0
2390; CHECK-GI-NEXT:    stp q0, q1, [sp]
2391; CHECK-GI-NEXT:    mov x9, sp
2392; CHECK-GI-NEXT:    and x8, x8, #0x7
2393; CHECK-GI-NEXT:    ldr w0, [x9, x8, lsl #2]
2394; CHECK-GI-NEXT:    mov sp, x29
2395; CHECK-GI-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
2396; CHECK-GI-NEXT:    ret
2397entry:
2398  %d = extractelement <8 x i32> %a, i32 %c
2399  ret i32 %d
2400}
2401
2402define i64 @extract_v2i64_0(<2 x i64> %a, i32 %c) {
2403; CHECK-LABEL: extract_v2i64_0:
2404; CHECK:       // %bb.0: // %entry
2405; CHECK-NEXT:    fmov x0, d0
2406; CHECK-NEXT:    ret
2407entry:
2408  %d = extractelement <2 x i64> %a, i32 0
2409  ret i64 %d
2410}
2411
2412define i64 @extract_v2i64_1(<2 x i64> %a, i32 %c) {
2413; CHECK-SD-LABEL: extract_v2i64_1:
2414; CHECK-SD:       // %bb.0: // %entry
2415; CHECK-SD-NEXT:    mov x0, v0.d[1]
2416; CHECK-SD-NEXT:    ret
2417;
2418; CHECK-GI-LABEL: extract_v2i64_1:
2419; CHECK-GI:       // %bb.0: // %entry
2420; CHECK-GI-NEXT:    mov d0, v0.d[1]
2421; CHECK-GI-NEXT:    fmov x0, d0
2422; CHECK-GI-NEXT:    ret
2423entry:
2424  %d = extractelement <2 x i64> %a, i32 1
2425  ret i64 %d
2426}
2427
2428define i64 @extract_v2i64_c(<2 x i64> %a, i32 %c) {
2429; CHECK-SD-LABEL: extract_v2i64_c:
2430; CHECK-SD:       // %bb.0: // %entry
2431; CHECK-SD-NEXT:    sub sp, sp, #16
2432; CHECK-SD-NEXT:    .cfi_def_cfa_offset 16
2433; CHECK-SD-NEXT:    mov x8, sp
2434; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
2435; CHECK-SD-NEXT:    str q0, [sp]
2436; CHECK-SD-NEXT:    bfi x8, x0, #3, #1
2437; CHECK-SD-NEXT:    ldr x0, [x8]
2438; CHECK-SD-NEXT:    add sp, sp, #16
2439; CHECK-SD-NEXT:    ret
2440;
2441; CHECK-GI-LABEL: extract_v2i64_c:
2442; CHECK-GI:       // %bb.0: // %entry
2443; CHECK-GI-NEXT:    sub sp, sp, #16
2444; CHECK-GI-NEXT:    .cfi_def_cfa_offset 16
2445; CHECK-GI-NEXT:    mov w9, w0
2446; CHECK-GI-NEXT:    mov x8, sp
2447; CHECK-GI-NEXT:    str q0, [sp]
2448; CHECK-GI-NEXT:    and x9, x9, #0x1
2449; CHECK-GI-NEXT:    ldr x0, [x8, x9, lsl #3]
2450; CHECK-GI-NEXT:    add sp, sp, #16
2451; CHECK-GI-NEXT:    ret
2452entry:
2453  %d = extractelement <2 x i64> %a, i32 %c
2454  ret i64 %d
2455}
2456
2457define i64 @extract_v3i64_0(<3 x i64> %a, i32 %c) {
2458; CHECK-SD-LABEL: extract_v3i64_0:
2459; CHECK-SD:       // %bb.0: // %entry
2460; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
2461; CHECK-SD-NEXT:    fmov x0, d0
2462; CHECK-SD-NEXT:    ret
2463;
2464; CHECK-GI-LABEL: extract_v3i64_0:
2465; CHECK-GI:       // %bb.0: // %entry
2466; CHECK-GI-NEXT:    fmov x0, d0
2467; CHECK-GI-NEXT:    ret
2468entry:
2469  %d = extractelement <3 x i64> %a, i32 0
2470  ret i64 %d
2471}
2472
2473define i64 @extract_v3i64_2(<3 x i64> %a, i32 %c) {
2474; CHECK-SD-LABEL: extract_v3i64_2:
2475; CHECK-SD:       // %bb.0: // %entry
2476; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
2477; CHECK-SD-NEXT:    fmov x0, d2
2478; CHECK-SD-NEXT:    ret
2479;
2480; CHECK-GI-LABEL: extract_v3i64_2:
2481; CHECK-GI:       // %bb.0: // %entry
2482; CHECK-GI-NEXT:    fmov x0, d2
2483; CHECK-GI-NEXT:    ret
2484entry:
2485  %d = extractelement <3 x i64> %a, i32 2
2486  ret i64 %d
2487}
2488
2489define i64 @extract_v3i64_c(<3 x i64> %a, i32 %c) {
2490; CHECK-SD-LABEL: extract_v3i64_c:
2491; CHECK-SD:       // %bb.0: // %entry
2492; CHECK-SD-NEXT:    // kill: def $d0 killed $d0 def $q0
2493; CHECK-SD-NEXT:    // kill: def $d1 killed $d1 def $q1
2494; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
2495; CHECK-SD-NEXT:    // kill: def $d2 killed $d2 def $q2
2496; CHECK-SD-NEXT:    and x8, x0, #0x3
2497; CHECK-SD-NEXT:    mov v0.d[1], v1.d[0]
2498; CHECK-SD-NEXT:    stp q0, q2, [sp, #-32]!
2499; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
2500; CHECK-SD-NEXT:    mov x9, sp
2501; CHECK-SD-NEXT:    ldr x0, [x9, x8, lsl #3]
2502; CHECK-SD-NEXT:    add sp, sp, #32
2503; CHECK-SD-NEXT:    ret
2504;
2505; CHECK-GI-LABEL: extract_v3i64_c:
2506; CHECK-GI:       // %bb.0: // %entry
2507; CHECK-GI-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
2508; CHECK-GI-NEXT:    sub x9, sp, #48
2509; CHECK-GI-NEXT:    mov x29, sp
2510; CHECK-GI-NEXT:    and sp, x9, #0xffffffffffffffe0
2511; CHECK-GI-NEXT:    .cfi_def_cfa w29, 16
2512; CHECK-GI-NEXT:    .cfi_offset w30, -8
2513; CHECK-GI-NEXT:    .cfi_offset w29, -16
2514; CHECK-GI-NEXT:    // kill: def $d0 killed $d0 def $q0
2515; CHECK-GI-NEXT:    // kill: def $d1 killed $d1 def $q1
2516; CHECK-GI-NEXT:    mov w8, w0
2517; CHECK-GI-NEXT:    // kill: def $d2 killed $d2 def $q2
2518; CHECK-GI-NEXT:    mov x9, sp
2519; CHECK-GI-NEXT:    mov v0.d[1], v1.d[0]
2520; CHECK-GI-NEXT:    and x8, x8, #0x3
2521; CHECK-GI-NEXT:    stp q0, q2, [sp]
2522; CHECK-GI-NEXT:    ldr x0, [x9, x8, lsl #3]
2523; CHECK-GI-NEXT:    mov sp, x29
2524; CHECK-GI-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
2525; CHECK-GI-NEXT:    ret
2526entry:
2527  %d = extractelement <3 x i64> %a, i32 %c
2528  ret i64 %d
2529}
2530
2531define i64 @extract_v4i64_0(<4 x i64> %a, i32 %c) {
2532; CHECK-LABEL: extract_v4i64_0:
2533; CHECK:       // %bb.0: // %entry
2534; CHECK-NEXT:    fmov x0, d0
2535; CHECK-NEXT:    ret
2536entry:
2537  %d = extractelement <4 x i64> %a, i32 0
2538  ret i64 %d
2539}
2540
2541define i64 @extract_v4i64_2(<4 x i64> %a, i32 %c) {
2542; CHECK-LABEL: extract_v4i64_2:
2543; CHECK:       // %bb.0: // %entry
2544; CHECK-NEXT:    fmov x0, d1
2545; CHECK-NEXT:    ret
2546entry:
2547  %d = extractelement <4 x i64> %a, i32 2
2548  ret i64 %d
2549}
2550
2551define i64 @extract_v4i64_c(<4 x i64> %a, i32 %c) {
2552; CHECK-SD-LABEL: extract_v4i64_c:
2553; CHECK-SD:       // %bb.0: // %entry
2554; CHECK-SD-NEXT:    stp q0, q1, [sp, #-32]!
2555; CHECK-SD-NEXT:    .cfi_def_cfa_offset 32
2556; CHECK-SD-NEXT:    // kill: def $w0 killed $w0 def $x0
2557; CHECK-SD-NEXT:    and x8, x0, #0x3
2558; CHECK-SD-NEXT:    mov x9, sp
2559; CHECK-SD-NEXT:    ldr x0, [x9, x8, lsl #3]
2560; CHECK-SD-NEXT:    add sp, sp, #32
2561; CHECK-SD-NEXT:    ret
2562;
2563; CHECK-GI-LABEL: extract_v4i64_c:
2564; CHECK-GI:       // %bb.0: // %entry
2565; CHECK-GI-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
2566; CHECK-GI-NEXT:    sub x9, sp, #48
2567; CHECK-GI-NEXT:    mov x29, sp
2568; CHECK-GI-NEXT:    and sp, x9, #0xffffffffffffffe0
2569; CHECK-GI-NEXT:    .cfi_def_cfa w29, 16
2570; CHECK-GI-NEXT:    .cfi_offset w30, -8
2571; CHECK-GI-NEXT:    .cfi_offset w29, -16
2572; CHECK-GI-NEXT:    mov w8, w0
2573; CHECK-GI-NEXT:    stp q0, q1, [sp]
2574; CHECK-GI-NEXT:    mov x9, sp
2575; CHECK-GI-NEXT:    and x8, x8, #0x3
2576; CHECK-GI-NEXT:    ldr x0, [x9, x8, lsl #3]
2577; CHECK-GI-NEXT:    mov sp, x29
2578; CHECK-GI-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload
2579; CHECK-GI-NEXT:    ret
2580entry:
2581  %d = extractelement <4 x i64> %a, i32 %c
2582  ret i64 %d
2583}
2584