xref: /llvm-project/llvm/test/CodeGen/AArch64/sve-streaming-mode-fixed-length-insert-vector-elt.ll (revision 61510b51c33464a6bc15e4cf5b1ee07e2e0ec1c9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mattr=+sve -force-streaming-compatible  < %s | FileCheck %s
3; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE
4
5target triple = "aarch64-unknown-linux-gnu"
6
7;
8; insertelement
9;
10
11; i8
12define <4 x i8> @insertelement_v4i8(<4 x i8> %op1) {
13; CHECK-LABEL: insertelement_v4i8:
14; CHECK:       // %bb.0:
15; CHECK-NEXT:    mov w8, #3 // =0x3
16; CHECK-NEXT:    index z1.h, #0, #1
17; CHECK-NEXT:    ptrue p0.h
18; CHECK-NEXT:    mov z2.h, w8
19; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
20; CHECK-NEXT:    mov w8, #5 // =0x5
21; CHECK-NEXT:    cmpeq p0.h, p0/z, z1.h, z2.h
22; CHECK-NEXT:    mov z0.h, p0/m, w8
23; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
24; CHECK-NEXT:    ret
25;
26; NONEON-NOSVE-LABEL: insertelement_v4i8:
27; NONEON-NOSVE:       // %bb.0:
28; NONEON-NOSVE-NEXT:    sub sp, sp, #32
29; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
30; NONEON-NOSVE-NEXT:    mov w8, #5 // =0x5
31; NONEON-NOSVE-NEXT:    str d0, [sp]
32; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
33; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
34; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
35; NONEON-NOSVE-NEXT:    strh w8, [sp, #20]
36; NONEON-NOSVE-NEXT:    ldr w8, [sp]
37; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
38; NONEON-NOSVE-NEXT:    str w8, [sp, #16]
39; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
40; NONEON-NOSVE-NEXT:    strh w8, [sp, #22]
41; NONEON-NOSVE-NEXT:    ldr d0, [sp, #16]
42; NONEON-NOSVE-NEXT:    add sp, sp, #32
43; NONEON-NOSVE-NEXT:    ret
44    %r = insertelement <4 x i8> %op1, i8 5, i64 3
45    ret <4 x i8> %r
46}
47
48define <8 x i8> @insertelement_v8i8(<8 x i8> %op1) {
49; CHECK-LABEL: insertelement_v8i8:
50; CHECK:       // %bb.0:
51; CHECK-NEXT:    mov w8, #7 // =0x7
52; CHECK-NEXT:    index z1.b, #0, #1
53; CHECK-NEXT:    ptrue p0.b
54; CHECK-NEXT:    mov z2.b, w8
55; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
56; CHECK-NEXT:    mov w8, #5 // =0x5
57; CHECK-NEXT:    cmpeq p0.b, p0/z, z1.b, z2.b
58; CHECK-NEXT:    mov z0.b, p0/m, w8
59; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
60; CHECK-NEXT:    ret
61;
62; NONEON-NOSVE-LABEL: insertelement_v8i8:
63; NONEON-NOSVE:       // %bb.0:
64; NONEON-NOSVE-NEXT:    sub sp, sp, #32
65; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
66; NONEON-NOSVE-NEXT:    mov w8, #5 // =0x5
67; NONEON-NOSVE-NEXT:    str d0, [sp]
68; NONEON-NOSVE-NEXT:    strb w8, [sp, #24]
69; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #6]
70; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
71; NONEON-NOSVE-NEXT:    strb w8, [sp, #22]
72; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
73; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
74; NONEON-NOSVE-NEXT:    strh w8, [sp, #20]
75; NONEON-NOSVE-NEXT:    ldr w8, [sp]
76; NONEON-NOSVE-NEXT:    str w8, [sp, #16]
77; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #8]
78; NONEON-NOSVE-NEXT:    strb w8, [sp, #23]
79; NONEON-NOSVE-NEXT:    ldr d0, [sp, #16]
80; NONEON-NOSVE-NEXT:    add sp, sp, #32
81; NONEON-NOSVE-NEXT:    ret
82    %r = insertelement <8 x i8> %op1, i8 5, i64 7
83    ret <8 x i8> %r
84}
85
86define <16 x i8> @insertelement_v16i8(<16 x i8> %op1) {
87; CHECK-LABEL: insertelement_v16i8:
88; CHECK:       // %bb.0:
89; CHECK-NEXT:    mov w8, #15 // =0xf
90; CHECK-NEXT:    index z1.b, #0, #1
91; CHECK-NEXT:    ptrue p0.b
92; CHECK-NEXT:    mov z2.b, w8
93; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
94; CHECK-NEXT:    mov w8, #5 // =0x5
95; CHECK-NEXT:    cmpeq p0.b, p0/z, z1.b, z2.b
96; CHECK-NEXT:    mov z0.b, p0/m, w8
97; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
98; CHECK-NEXT:    ret
99;
100; NONEON-NOSVE-LABEL: insertelement_v16i8:
101; NONEON-NOSVE:       // %bb.0:
102; NONEON-NOSVE-NEXT:    sub sp, sp, #64
103; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
104; NONEON-NOSVE-NEXT:    mov w8, #5 // =0x5
105; NONEON-NOSVE-NEXT:    str q0, [sp]
106; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
107; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]
108; NONEON-NOSVE-NEXT:    ldr q0, [sp, #48]
109; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
110; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
111; NONEON-NOSVE-NEXT:    str q0, [sp, #16]
112; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
113; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
114; NONEON-NOSVE-NEXT:    str w8, [sp, #40]
115; NONEON-NOSVE-NEXT:    ldr x8, [sp]
116; NONEON-NOSVE-NEXT:    str x8, [sp, #32]
117; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
118; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
119; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
120; NONEON-NOSVE-NEXT:    add sp, sp, #64
121; NONEON-NOSVE-NEXT:    ret
122    %r = insertelement <16 x i8> %op1, i8 5, i64 15
123    ret <16 x i8> %r
124}
125
126define <32 x i8> @insertelement_v32i8(<32 x i8> %op1) {
127; CHECK-LABEL: insertelement_v32i8:
128; CHECK:       // %bb.0:
129; CHECK-NEXT:    mov w8, #15 // =0xf
130; CHECK-NEXT:    index z2.b, #0, #1
131; CHECK-NEXT:    ptrue p0.b
132; CHECK-NEXT:    mov z3.b, w8
133; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
134; CHECK-NEXT:    mov w8, #5 // =0x5
135; CHECK-NEXT:    cmpeq p0.b, p0/z, z2.b, z3.b
136; CHECK-NEXT:    mov z1.b, p0/m, w8
137; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $z1
138; CHECK-NEXT:    ret
139;
140; NONEON-NOSVE-LABEL: insertelement_v32i8:
141; NONEON-NOSVE:       // %bb.0:
142; NONEON-NOSVE-NEXT:    sub sp, sp, #64
143; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
144; NONEON-NOSVE-NEXT:    mov w8, #5 // =0x5
145; NONEON-NOSVE-NEXT:    str q1, [sp]
146; NONEON-NOSVE-NEXT:    strb w8, [sp, #48]
147; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #14]
148; NONEON-NOSVE-NEXT:    ldr q1, [sp, #48]
149; NONEON-NOSVE-NEXT:    strb w8, [sp, #46]
150; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
151; NONEON-NOSVE-NEXT:    str q1, [sp, #16]
152; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
153; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
154; NONEON-NOSVE-NEXT:    str w8, [sp, #40]
155; NONEON-NOSVE-NEXT:    ldr x8, [sp]
156; NONEON-NOSVE-NEXT:    str x8, [sp, #32]
157; NONEON-NOSVE-NEXT:    ldrb w8, [sp, #16]
158; NONEON-NOSVE-NEXT:    strb w8, [sp, #47]
159; NONEON-NOSVE-NEXT:    ldr q1, [sp, #32]
160; NONEON-NOSVE-NEXT:    add sp, sp, #64
161; NONEON-NOSVE-NEXT:    ret
162    %r = insertelement <32 x i8> %op1, i8 5, i64 31
163    ret <32 x i8> %r
164}
165
166; i16
167define <2 x i16> @insertelement_v2i16(<2 x i16> %op1) {
168; CHECK-LABEL: insertelement_v2i16:
169; CHECK:       // %bb.0:
170; CHECK-NEXT:    mov w8, #1 // =0x1
171; CHECK-NEXT:    index z1.s, #0, #1
172; CHECK-NEXT:    ptrue p0.s
173; CHECK-NEXT:    mov z2.s, w8
174; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
175; CHECK-NEXT:    mov w8, #5 // =0x5
176; CHECK-NEXT:    cmpeq p0.s, p0/z, z1.s, z2.s
177; CHECK-NEXT:    mov z0.s, p0/m, w8
178; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
179; CHECK-NEXT:    ret
180;
181; NONEON-NOSVE-LABEL: insertelement_v2i16:
182; NONEON-NOSVE:       // %bb.0:
183; NONEON-NOSVE-NEXT:    sub sp, sp, #32
184; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
185; NONEON-NOSVE-NEXT:    mov w8, #5 // =0x5
186; NONEON-NOSVE-NEXT:    str d0, [sp]
187; NONEON-NOSVE-NEXT:    str w8, [sp, #24]
188; NONEON-NOSVE-NEXT:    ldr w9, [sp]
189; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
190; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
191; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
192; NONEON-NOSVE-NEXT:    stp w9, w8, [sp, #16]
193; NONEON-NOSVE-NEXT:    ldr d0, [sp, #16]
194; NONEON-NOSVE-NEXT:    add sp, sp, #32
195; NONEON-NOSVE-NEXT:    ret
196    %r = insertelement <2 x i16> %op1, i16 5, i64 1
197    ret <2 x i16> %r
198}
199
200define <4 x i16> @insertelement_v4i16(<4 x i16> %op1) {
201; CHECK-LABEL: insertelement_v4i16:
202; CHECK:       // %bb.0:
203; CHECK-NEXT:    mov w8, #3 // =0x3
204; CHECK-NEXT:    index z1.h, #0, #1
205; CHECK-NEXT:    ptrue p0.h
206; CHECK-NEXT:    mov z2.h, w8
207; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
208; CHECK-NEXT:    mov w8, #5 // =0x5
209; CHECK-NEXT:    cmpeq p0.h, p0/z, z1.h, z2.h
210; CHECK-NEXT:    mov z0.h, p0/m, w8
211; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
212; CHECK-NEXT:    ret
213;
214; NONEON-NOSVE-LABEL: insertelement_v4i16:
215; NONEON-NOSVE:       // %bb.0:
216; NONEON-NOSVE-NEXT:    sub sp, sp, #32
217; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
218; NONEON-NOSVE-NEXT:    mov w8, #5 // =0x5
219; NONEON-NOSVE-NEXT:    str d0, [sp]
220; NONEON-NOSVE-NEXT:    strh w8, [sp, #24]
221; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #4]
222; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
223; NONEON-NOSVE-NEXT:    strh w8, [sp, #20]
224; NONEON-NOSVE-NEXT:    ldr w8, [sp]
225; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
226; NONEON-NOSVE-NEXT:    str w8, [sp, #16]
227; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #8]
228; NONEON-NOSVE-NEXT:    strh w8, [sp, #22]
229; NONEON-NOSVE-NEXT:    ldr d0, [sp, #16]
230; NONEON-NOSVE-NEXT:    add sp, sp, #32
231; NONEON-NOSVE-NEXT:    ret
232    %r = insertelement <4 x i16> %op1, i16 5, i64 3
233    ret <4 x i16> %r
234}
235
236define <8 x i16> @insertelement_v8i16(<8 x i16> %op1) {
237; CHECK-LABEL: insertelement_v8i16:
238; CHECK:       // %bb.0:
239; CHECK-NEXT:    mov w8, #7 // =0x7
240; CHECK-NEXT:    index z1.h, #0, #1
241; CHECK-NEXT:    ptrue p0.h
242; CHECK-NEXT:    mov z2.h, w8
243; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
244; CHECK-NEXT:    mov w8, #5 // =0x5
245; CHECK-NEXT:    cmpeq p0.h, p0/z, z1.h, z2.h
246; CHECK-NEXT:    mov z0.h, p0/m, w8
247; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
248; CHECK-NEXT:    ret
249;
250; NONEON-NOSVE-LABEL: insertelement_v8i16:
251; NONEON-NOSVE:       // %bb.0:
252; NONEON-NOSVE-NEXT:    sub sp, sp, #64
253; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
254; NONEON-NOSVE-NEXT:    mov w8, #5 // =0x5
255; NONEON-NOSVE-NEXT:    str q0, [sp]
256; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
257; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
258; NONEON-NOSVE-NEXT:    ldr q0, [sp, #48]
259; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
260; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
261; NONEON-NOSVE-NEXT:    str q0, [sp, #16]
262; NONEON-NOSVE-NEXT:    str w8, [sp, #40]
263; NONEON-NOSVE-NEXT:    ldr x8, [sp]
264; NONEON-NOSVE-NEXT:    str x8, [sp, #32]
265; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
266; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
267; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
268; NONEON-NOSVE-NEXT:    add sp, sp, #64
269; NONEON-NOSVE-NEXT:    ret
270    %r = insertelement <8 x i16> %op1, i16 5, i64 7
271    ret <8 x i16> %r
272}
273
274define <16 x i16> @insertelement_v16i16(<16 x i16> %op1) {
275; CHECK-LABEL: insertelement_v16i16:
276; CHECK:       // %bb.0:
277; CHECK-NEXT:    mov w8, #7 // =0x7
278; CHECK-NEXT:    index z2.h, #0, #1
279; CHECK-NEXT:    ptrue p0.h
280; CHECK-NEXT:    mov z3.h, w8
281; CHECK-NEXT:    // kill: def $q1 killed $q1 def $z1
282; CHECK-NEXT:    mov w8, #5 // =0x5
283; CHECK-NEXT:    cmpeq p0.h, p0/z, z2.h, z3.h
284; CHECK-NEXT:    mov z1.h, p0/m, w8
285; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $z1
286; CHECK-NEXT:    ret
287;
288; NONEON-NOSVE-LABEL: insertelement_v16i16:
289; NONEON-NOSVE:       // %bb.0:
290; NONEON-NOSVE-NEXT:    sub sp, sp, #64
291; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
292; NONEON-NOSVE-NEXT:    mov w8, #5 // =0x5
293; NONEON-NOSVE-NEXT:    str q1, [sp]
294; NONEON-NOSVE-NEXT:    strh w8, [sp, #48]
295; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #12]
296; NONEON-NOSVE-NEXT:    ldr q1, [sp, #48]
297; NONEON-NOSVE-NEXT:    strh w8, [sp, #44]
298; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
299; NONEON-NOSVE-NEXT:    str q1, [sp, #16]
300; NONEON-NOSVE-NEXT:    str w8, [sp, #40]
301; NONEON-NOSVE-NEXT:    ldr x8, [sp]
302; NONEON-NOSVE-NEXT:    str x8, [sp, #32]
303; NONEON-NOSVE-NEXT:    ldrh w8, [sp, #16]
304; NONEON-NOSVE-NEXT:    strh w8, [sp, #46]
305; NONEON-NOSVE-NEXT:    ldr q1, [sp, #32]
306; NONEON-NOSVE-NEXT:    add sp, sp, #64
307; NONEON-NOSVE-NEXT:    ret
308    %r = insertelement <16 x i16> %op1, i16 5, i64 15
309    ret <16 x i16> %r
310}
311
312;i32
313define <2 x i32> @insertelement_v2i32(<2 x i32> %op1) {
314; CHECK-LABEL: insertelement_v2i32:
315; CHECK:       // %bb.0:
316; CHECK-NEXT:    mov w8, #1 // =0x1
317; CHECK-NEXT:    index z1.s, #0, #1
318; CHECK-NEXT:    ptrue p0.s
319; CHECK-NEXT:    mov z2.s, w8
320; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
321; CHECK-NEXT:    mov w8, #5 // =0x5
322; CHECK-NEXT:    cmpeq p0.s, p0/z, z1.s, z2.s
323; CHECK-NEXT:    mov z0.s, p0/m, w8
324; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
325; CHECK-NEXT:    ret
326;
327; NONEON-NOSVE-LABEL: insertelement_v2i32:
328; NONEON-NOSVE:       // %bb.0:
329; NONEON-NOSVE-NEXT:    sub sp, sp, #32
330; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
331; NONEON-NOSVE-NEXT:    mov w8, #5 // =0x5
332; NONEON-NOSVE-NEXT:    str d0, [sp]
333; NONEON-NOSVE-NEXT:    str w8, [sp, #24]
334; NONEON-NOSVE-NEXT:    ldr w9, [sp]
335; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
336; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
337; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
338; NONEON-NOSVE-NEXT:    stp w9, w8, [sp, #16]
339; NONEON-NOSVE-NEXT:    ldr d0, [sp, #16]
340; NONEON-NOSVE-NEXT:    add sp, sp, #32
341; NONEON-NOSVE-NEXT:    ret
342    %r = insertelement <2 x i32> %op1, i32 5, i64 1
343    ret <2 x i32> %r
344}
345
346define <4 x i32> @insertelement_v4i32(<4 x i32> %op1) {
347; CHECK-LABEL: insertelement_v4i32:
348; CHECK:       // %bb.0:
349; CHECK-NEXT:    mov w8, #3 // =0x3
350; CHECK-NEXT:    index z1.s, #0, #1
351; CHECK-NEXT:    ptrue p0.s
352; CHECK-NEXT:    mov z2.s, w8
353; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
354; CHECK-NEXT:    mov w8, #5 // =0x5
355; CHECK-NEXT:    cmpeq p0.s, p0/z, z1.s, z2.s
356; CHECK-NEXT:    mov z0.s, p0/m, w8
357; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
358; CHECK-NEXT:    ret
359;
360; NONEON-NOSVE-LABEL: insertelement_v4i32:
361; NONEON-NOSVE:       // %bb.0:
362; NONEON-NOSVE-NEXT:    sub sp, sp, #64
363; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
364; NONEON-NOSVE-NEXT:    mov w8, #5 // =0x5
365; NONEON-NOSVE-NEXT:    str q0, [sp]
366; NONEON-NOSVE-NEXT:    str w8, [sp, #48]
367; NONEON-NOSVE-NEXT:    ldr x8, [sp]
368; NONEON-NOSVE-NEXT:    ldr w9, [sp, #8]
369; NONEON-NOSVE-NEXT:    ldr q0, [sp, #48]
370; NONEON-NOSVE-NEXT:    str x8, [sp, #32]
371; NONEON-NOSVE-NEXT:    str q0, [sp, #16]
372; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
373; NONEON-NOSVE-NEXT:    stp w9, w8, [sp, #40]
374; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
375; NONEON-NOSVE-NEXT:    add sp, sp, #64
376; NONEON-NOSVE-NEXT:    ret
377    %r = insertelement <4 x i32> %op1, i32 5, i64 3
378    ret <4 x i32> %r
379}
380
381define <8 x i32> @insertelement_v8i32(ptr %a) {
382; CHECK-LABEL: insertelement_v8i32:
383; CHECK:       // %bb.0:
384; CHECK-NEXT:    mov w8, #3 // =0x3
385; CHECK-NEXT:    index z0.s, #0, #1
386; CHECK-NEXT:    ptrue p0.s
387; CHECK-NEXT:    mov z1.s, w8
388; CHECK-NEXT:    mov w8, #5 // =0x5
389; CHECK-NEXT:    cmpeq p0.s, p0/z, z0.s, z1.s
390; CHECK-NEXT:    ldp q0, q1, [x0]
391; CHECK-NEXT:    mov z1.s, p0/m, w8
392; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $z1
393; CHECK-NEXT:    ret
394;
395; NONEON-NOSVE-LABEL: insertelement_v8i32:
396; NONEON-NOSVE:       // %bb.0:
397; NONEON-NOSVE-NEXT:    sub sp, sp, #64
398; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
399; NONEON-NOSVE-NEXT:    mov w8, #5 // =0x5
400; NONEON-NOSVE-NEXT:    ldp q0, q2, [x0]
401; NONEON-NOSVE-NEXT:    str w8, [sp, #48]
402; NONEON-NOSVE-NEXT:    ldr q1, [sp, #48]
403; NONEON-NOSVE-NEXT:    stp q2, q1, [sp]
404; NONEON-NOSVE-NEXT:    ldr x8, [sp]
405; NONEON-NOSVE-NEXT:    ldr w9, [sp, #8]
406; NONEON-NOSVE-NEXT:    str x8, [sp, #32]
407; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
408; NONEON-NOSVE-NEXT:    stp w9, w8, [sp, #40]
409; NONEON-NOSVE-NEXT:    ldr q1, [sp, #32]
410; NONEON-NOSVE-NEXT:    add sp, sp, #64
411; NONEON-NOSVE-NEXT:    ret
412    %op1 = load <8 x i32>, ptr %a
413    %r = insertelement <8 x i32> %op1, i32 5, i64 7
414    ret <8 x i32> %r
415}
416
417;i64
418define <1 x i64> @insertelement_v1i64(<1 x i64> %op1) {
419; CHECK-LABEL: insertelement_v1i64:
420; CHECK:       // %bb.0:
421; CHECK-NEXT:    mov z0.d, #5 // =0x5
422; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
423; CHECK-NEXT:    ret
424;
425; NONEON-NOSVE-LABEL: insertelement_v1i64:
426; NONEON-NOSVE:       // %bb.0:
427; NONEON-NOSVE-NEXT:    sub sp, sp, #16
428; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
429; NONEON-NOSVE-NEXT:    mov w8, #5 // =0x5
430; NONEON-NOSVE-NEXT:    str x8, [sp, #8]
431; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
432; NONEON-NOSVE-NEXT:    add sp, sp, #16
433; NONEON-NOSVE-NEXT:    ret
434    %r = insertelement <1 x i64> %op1, i64 5, i64 0
435    ret <1 x i64> %r
436}
437
438define <2 x i64> @insertelement_v2i64(<2 x i64> %op1) {
439; CHECK-LABEL: insertelement_v2i64:
440; CHECK:       // %bb.0:
441; CHECK-NEXT:    mov w8, #1 // =0x1
442; CHECK-NEXT:    index z1.d, #0, #1
443; CHECK-NEXT:    ptrue p0.d
444; CHECK-NEXT:    mov z2.d, x8
445; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
446; CHECK-NEXT:    mov w8, #5 // =0x5
447; CHECK-NEXT:    cmpeq p0.d, p0/z, z1.d, z2.d
448; CHECK-NEXT:    mov z0.d, p0/m, x8
449; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
450; CHECK-NEXT:    ret
451;
452; NONEON-NOSVE-LABEL: insertelement_v2i64:
453; NONEON-NOSVE:       // %bb.0:
454; NONEON-NOSVE-NEXT:    sub sp, sp, #64
455; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
456; NONEON-NOSVE-NEXT:    mov w8, #5 // =0x5
457; NONEON-NOSVE-NEXT:    str q0, [sp]
458; NONEON-NOSVE-NEXT:    str x8, [sp, #48]
459; NONEON-NOSVE-NEXT:    ldr x9, [sp]
460; NONEON-NOSVE-NEXT:    ldr q0, [sp, #48]
461; NONEON-NOSVE-NEXT:    str q0, [sp, #16]
462; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
463; NONEON-NOSVE-NEXT:    stp x9, x8, [sp, #32]
464; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
465; NONEON-NOSVE-NEXT:    add sp, sp, #64
466; NONEON-NOSVE-NEXT:    ret
467    %r = insertelement <2 x i64> %op1, i64 5, i64 1
468    ret <2 x i64> %r
469}
470
471define <4 x i64> @insertelement_v4i64(ptr %a) {
472; CHECK-LABEL: insertelement_v4i64:
473; CHECK:       // %bb.0:
474; CHECK-NEXT:    mov w8, #1 // =0x1
475; CHECK-NEXT:    index z0.d, #0, #1
476; CHECK-NEXT:    ptrue p0.d
477; CHECK-NEXT:    mov z1.d, x8
478; CHECK-NEXT:    mov w8, #5 // =0x5
479; CHECK-NEXT:    cmpeq p0.d, p0/z, z0.d, z1.d
480; CHECK-NEXT:    ldp q0, q1, [x0]
481; CHECK-NEXT:    mov z1.d, p0/m, x8
482; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $z1
483; CHECK-NEXT:    ret
484;
485; NONEON-NOSVE-LABEL: insertelement_v4i64:
486; NONEON-NOSVE:       // %bb.0:
487; NONEON-NOSVE-NEXT:    sub sp, sp, #64
488; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
489; NONEON-NOSVE-NEXT:    mov w8, #5 // =0x5
490; NONEON-NOSVE-NEXT:    ldp q0, q2, [x0]
491; NONEON-NOSVE-NEXT:    str x8, [sp, #48]
492; NONEON-NOSVE-NEXT:    ldr q1, [sp, #48]
493; NONEON-NOSVE-NEXT:    stp q2, q1, [sp]
494; NONEON-NOSVE-NEXT:    ldr x9, [sp]
495; NONEON-NOSVE-NEXT:    ldr x8, [sp, #16]
496; NONEON-NOSVE-NEXT:    stp x9, x8, [sp, #32]
497; NONEON-NOSVE-NEXT:    ldr q1, [sp, #32]
498; NONEON-NOSVE-NEXT:    add sp, sp, #64
499; NONEON-NOSVE-NEXT:    ret
500    %op1 = load <4 x i64>, ptr %a
501    %r = insertelement <4 x i64> %op1, i64 5, i64 3
502    ret <4 x i64> %r
503}
504
505;f16
506define <2 x half> @insertelement_v2f16(<2 x half> %op1) {
507; CHECK-LABEL: insertelement_v2f16:
508; CHECK:       // %bb.0:
509; CHECK-NEXT:    fmov h1, #5.00000000
510; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
511; CHECK-NEXT:    zip1 z0.h, z0.h, z1.h
512; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
513; CHECK-NEXT:    ret
514;
515; NONEON-NOSVE-LABEL: insertelement_v2f16:
516; NONEON-NOSVE:       // %bb.0:
517; NONEON-NOSVE-NEXT:    str d0, [sp, #-16]!
518; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
519; NONEON-NOSVE-NEXT:    adrp x8, .LCPI14_0
520; NONEON-NOSVE-NEXT:    ldr h1, [sp]
521; NONEON-NOSVE-NEXT:    ldr h0, [x8, :lo12:.LCPI14_0]
522; NONEON-NOSVE-NEXT:    str h1, [sp, #8]
523; NONEON-NOSVE-NEXT:    str h0, [sp, #10]
524; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
525; NONEON-NOSVE-NEXT:    add sp, sp, #16
526; NONEON-NOSVE-NEXT:    ret
527    %r = insertelement <2 x half> %op1, half 5.0, i64 1
528    ret <2 x half> %r
529}
530
531define <4 x half> @insertelement_v4f16(<4 x half> %op1) {
532; CHECK-LABEL: insertelement_v4f16:
533; CHECK:       // %bb.0:
534; CHECK-NEXT:    mov w8, #3 // =0x3
535; CHECK-NEXT:    index z1.h, #0, #1
536; CHECK-NEXT:    ptrue p0.h
537; CHECK-NEXT:    mov z2.h, w8
538; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
539; CHECK-NEXT:    cmpeq p0.h, p0/z, z1.h, z2.h
540; CHECK-NEXT:    fmov h1, #5.00000000
541; CHECK-NEXT:    mov z0.h, p0/m, h1
542; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
543; CHECK-NEXT:    ret
544;
545; NONEON-NOSVE-LABEL: insertelement_v4f16:
546; NONEON-NOSVE:       // %bb.0:
547; NONEON-NOSVE-NEXT:    sub sp, sp, #32
548; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
549; NONEON-NOSVE-NEXT:    adrp x8, .LCPI15_0
550; NONEON-NOSVE-NEXT:    str d0, [sp]
551; NONEON-NOSVE-NEXT:    ldr h1, [x8, :lo12:.LCPI15_0]
552; NONEON-NOSVE-NEXT:    ldr w8, [sp]
553; NONEON-NOSVE-NEXT:    str h1, [sp, #24]
554; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
555; NONEON-NOSVE-NEXT:    str w8, [sp, #16]
556; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
557; NONEON-NOSVE-NEXT:    ldr h0, [sp, #4]
558; NONEON-NOSVE-NEXT:    str h0, [sp, #20]
559; NONEON-NOSVE-NEXT:    ldr h0, [sp, #8]
560; NONEON-NOSVE-NEXT:    str h0, [sp, #22]
561; NONEON-NOSVE-NEXT:    ldr d0, [sp, #16]
562; NONEON-NOSVE-NEXT:    add sp, sp, #32
563; NONEON-NOSVE-NEXT:    ret
564    %r = insertelement <4 x half> %op1, half 5.0, i64 3
565    ret <4 x half> %r
566}
567
568define <8 x half> @insertelement_v8f16(<8 x half> %op1) {
569; CHECK-LABEL: insertelement_v8f16:
570; CHECK:       // %bb.0:
571; CHECK-NEXT:    mov w8, #7 // =0x7
572; CHECK-NEXT:    index z1.h, #0, #1
573; CHECK-NEXT:    ptrue p0.h
574; CHECK-NEXT:    mov z2.h, w8
575; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
576; CHECK-NEXT:    cmpeq p0.h, p0/z, z1.h, z2.h
577; CHECK-NEXT:    fmov h1, #5.00000000
578; CHECK-NEXT:    mov z0.h, p0/m, h1
579; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
580; CHECK-NEXT:    ret
581;
582; NONEON-NOSVE-LABEL: insertelement_v8f16:
583; NONEON-NOSVE:       // %bb.0:
584; NONEON-NOSVE-NEXT:    sub sp, sp, #64
585; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
586; NONEON-NOSVE-NEXT:    adrp x8, .LCPI16_0
587; NONEON-NOSVE-NEXT:    str q0, [sp]
588; NONEON-NOSVE-NEXT:    ldr h1, [x8, :lo12:.LCPI16_0]
589; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
590; NONEON-NOSVE-NEXT:    str h1, [sp, #48]
591; NONEON-NOSVE-NEXT:    ldr q0, [sp, #48]
592; NONEON-NOSVE-NEXT:    str w8, [sp, #40]
593; NONEON-NOSVE-NEXT:    ldr x8, [sp]
594; NONEON-NOSVE-NEXT:    str q0, [sp, #16]
595; NONEON-NOSVE-NEXT:    ldr h0, [sp, #12]
596; NONEON-NOSVE-NEXT:    str x8, [sp, #32]
597; NONEON-NOSVE-NEXT:    str h0, [sp, #44]
598; NONEON-NOSVE-NEXT:    ldr h0, [sp, #16]
599; NONEON-NOSVE-NEXT:    str h0, [sp, #46]
600; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
601; NONEON-NOSVE-NEXT:    add sp, sp, #64
602; NONEON-NOSVE-NEXT:    ret
603    %r = insertelement <8 x half> %op1, half 5.0, i64 7
604    ret <8 x half> %r
605}
606
607define <16 x half> @insertelement_v16f16(ptr %a) {
608; CHECK-LABEL: insertelement_v16f16:
609; CHECK:       // %bb.0:
610; CHECK-NEXT:    mov w8, #7 // =0x7
611; CHECK-NEXT:    index z0.h, #0, #1
612; CHECK-NEXT:    ptrue p0.h
613; CHECK-NEXT:    mov z1.h, w8
614; CHECK-NEXT:    fmov h2, #5.00000000
615; CHECK-NEXT:    cmpeq p0.h, p0/z, z0.h, z1.h
616; CHECK-NEXT:    ldp q0, q1, [x0]
617; CHECK-NEXT:    mov z1.h, p0/m, h2
618; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $z1
619; CHECK-NEXT:    ret
620;
621; NONEON-NOSVE-LABEL: insertelement_v16f16:
622; NONEON-NOSVE:       // %bb.0:
623; NONEON-NOSVE-NEXT:    sub sp, sp, #64
624; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
625; NONEON-NOSVE-NEXT:    adrp x8, .LCPI17_0
626; NONEON-NOSVE-NEXT:    ldp q0, q2, [x0]
627; NONEON-NOSVE-NEXT:    ldr h1, [x8, :lo12:.LCPI17_0]
628; NONEON-NOSVE-NEXT:    str h1, [sp, #48]
629; NONEON-NOSVE-NEXT:    ldr q1, [sp, #48]
630; NONEON-NOSVE-NEXT:    stp q2, q1, [sp]
631; NONEON-NOSVE-NEXT:    ldr h1, [sp, #12]
632; NONEON-NOSVE-NEXT:    ldr w8, [sp, #8]
633; NONEON-NOSVE-NEXT:    str h1, [sp, #44]
634; NONEON-NOSVE-NEXT:    ldr h1, [sp, #16]
635; NONEON-NOSVE-NEXT:    str w8, [sp, #40]
636; NONEON-NOSVE-NEXT:    ldr x8, [sp]
637; NONEON-NOSVE-NEXT:    str h1, [sp, #46]
638; NONEON-NOSVE-NEXT:    str x8, [sp, #32]
639; NONEON-NOSVE-NEXT:    ldr q1, [sp, #32]
640; NONEON-NOSVE-NEXT:    add sp, sp, #64
641; NONEON-NOSVE-NEXT:    ret
642    %op1 = load <16 x half>, ptr %a
643    %r = insertelement <16 x half> %op1, half 5.0, i64 15
644    ret <16 x half> %r
645}
646
647;f32
648define <2 x float> @insertelement_v2f32(<2 x float> %op1) {
649; CHECK-LABEL: insertelement_v2f32:
650; CHECK:       // %bb.0:
651; CHECK-NEXT:    mov w8, #1 // =0x1
652; CHECK-NEXT:    index z1.s, #0, #1
653; CHECK-NEXT:    ptrue p0.s
654; CHECK-NEXT:    mov z2.s, w8
655; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
656; CHECK-NEXT:    cmpeq p0.s, p0/z, z1.s, z2.s
657; CHECK-NEXT:    fmov s1, #5.00000000
658; CHECK-NEXT:    mov z0.s, p0/m, s1
659; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
660; CHECK-NEXT:    ret
661;
662; NONEON-NOSVE-LABEL: insertelement_v2f32:
663; NONEON-NOSVE:       // %bb.0:
664; NONEON-NOSVE-NEXT:    sub sp, sp, #32
665; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
666; NONEON-NOSVE-NEXT:    mov w8, #1084227584 // =0x40a00000
667; NONEON-NOSVE-NEXT:    str d0, [sp]
668; NONEON-NOSVE-NEXT:    str w8, [sp, #24]
669; NONEON-NOSVE-NEXT:    ldr s1, [sp]
670; NONEON-NOSVE-NEXT:    ldr d0, [sp, #24]
671; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
672; NONEON-NOSVE-NEXT:    ldr s0, [sp, #8]
673; NONEON-NOSVE-NEXT:    stp s1, s0, [sp, #16]
674; NONEON-NOSVE-NEXT:    ldr d0, [sp, #16]
675; NONEON-NOSVE-NEXT:    add sp, sp, #32
676; NONEON-NOSVE-NEXT:    ret
677    %r = insertelement <2 x float> %op1, float 5.0, i64 1
678    ret <2 x float> %r
679}
680
681define <4 x float> @insertelement_v4f32(<4 x float> %op1) {
682; CHECK-LABEL: insertelement_v4f32:
683; CHECK:       // %bb.0:
684; CHECK-NEXT:    mov w8, #3 // =0x3
685; CHECK-NEXT:    index z1.s, #0, #1
686; CHECK-NEXT:    ptrue p0.s
687; CHECK-NEXT:    mov z2.s, w8
688; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
689; CHECK-NEXT:    cmpeq p0.s, p0/z, z1.s, z2.s
690; CHECK-NEXT:    fmov s1, #5.00000000
691; CHECK-NEXT:    mov z0.s, p0/m, s1
692; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
693; CHECK-NEXT:    ret
694;
695; NONEON-NOSVE-LABEL: insertelement_v4f32:
696; NONEON-NOSVE:       // %bb.0:
697; NONEON-NOSVE-NEXT:    sub sp, sp, #64
698; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
699; NONEON-NOSVE-NEXT:    mov w8, #1084227584 // =0x40a00000
700; NONEON-NOSVE-NEXT:    str q0, [sp]
701; NONEON-NOSVE-NEXT:    str w8, [sp, #48]
702; NONEON-NOSVE-NEXT:    ldr s1, [sp, #8]
703; NONEON-NOSVE-NEXT:    ldr x8, [sp]
704; NONEON-NOSVE-NEXT:    ldr q0, [sp, #48]
705; NONEON-NOSVE-NEXT:    str x8, [sp, #32]
706; NONEON-NOSVE-NEXT:    str q0, [sp, #16]
707; NONEON-NOSVE-NEXT:    ldr s0, [sp, #16]
708; NONEON-NOSVE-NEXT:    stp s1, s0, [sp, #40]
709; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
710; NONEON-NOSVE-NEXT:    add sp, sp, #64
711; NONEON-NOSVE-NEXT:    ret
712    %r = insertelement <4 x float> %op1, float 5.0, i64 3
713    ret <4 x float> %r
714}
715
716define <8 x float> @insertelement_v8f32(ptr %a) {
717; CHECK-LABEL: insertelement_v8f32:
718; CHECK:       // %bb.0:
719; CHECK-NEXT:    mov w8, #3 // =0x3
720; CHECK-NEXT:    index z0.s, #0, #1
721; CHECK-NEXT:    ptrue p0.s
722; CHECK-NEXT:    mov z1.s, w8
723; CHECK-NEXT:    fmov s2, #5.00000000
724; CHECK-NEXT:    cmpeq p0.s, p0/z, z0.s, z1.s
725; CHECK-NEXT:    ldp q0, q1, [x0]
726; CHECK-NEXT:    mov z1.s, p0/m, s2
727; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $z1
728; CHECK-NEXT:    ret
729;
730; NONEON-NOSVE-LABEL: insertelement_v8f32:
731; NONEON-NOSVE:       // %bb.0:
732; NONEON-NOSVE-NEXT:    sub sp, sp, #64
733; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
734; NONEON-NOSVE-NEXT:    mov w8, #1084227584 // =0x40a00000
735; NONEON-NOSVE-NEXT:    ldr q1, [x0, #16]
736; NONEON-NOSVE-NEXT:    str w8, [sp, #48]
737; NONEON-NOSVE-NEXT:    ldr q0, [sp, #48]
738; NONEON-NOSVE-NEXT:    stp q1, q0, [sp]
739; NONEON-NOSVE-NEXT:    ldr s1, [sp, #8]
740; NONEON-NOSVE-NEXT:    ldr x8, [sp]
741; NONEON-NOSVE-NEXT:    ldr s0, [sp, #16]
742; NONEON-NOSVE-NEXT:    str x8, [sp, #32]
743; NONEON-NOSVE-NEXT:    stp s1, s0, [sp, #40]
744; NONEON-NOSVE-NEXT:    ldr q0, [x0]
745; NONEON-NOSVE-NEXT:    ldr q1, [sp, #32]
746; NONEON-NOSVE-NEXT:    add sp, sp, #64
747; NONEON-NOSVE-NEXT:    ret
748    %op1 = load <8 x float>, ptr %a
749    %r = insertelement <8 x float> %op1, float 5.0, i64 7
750    ret <8 x float> %r
751}
752
753;f64
754define <1 x double> @insertelement_v1f64(<1 x double> %op1) {
755; CHECK-LABEL: insertelement_v1f64:
756; CHECK:       // %bb.0:
757; CHECK-NEXT:    fmov d0, #5.00000000
758; CHECK-NEXT:    ret
759;
760; NONEON-NOSVE-LABEL: insertelement_v1f64:
761; NONEON-NOSVE:       // %bb.0:
762; NONEON-NOSVE-NEXT:    sub sp, sp, #16
763; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
764; NONEON-NOSVE-NEXT:    mov x8, #4617315517961601024 // =0x4014000000000000
765; NONEON-NOSVE-NEXT:    str x8, [sp, #8]
766; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
767; NONEON-NOSVE-NEXT:    add sp, sp, #16
768; NONEON-NOSVE-NEXT:    ret
769    %r = insertelement <1 x double> %op1, double 5.0, i64 0
770    ret <1 x double> %r
771}
772
773define <2 x double> @insertelement_v2f64(<2 x double> %op1) {
774; CHECK-LABEL: insertelement_v2f64:
775; CHECK:       // %bb.0:
776; CHECK-NEXT:    mov w8, #1 // =0x1
777; CHECK-NEXT:    index z1.d, #0, #1
778; CHECK-NEXT:    ptrue p0.d
779; CHECK-NEXT:    mov z2.d, x8
780; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
781; CHECK-NEXT:    cmpeq p0.d, p0/z, z1.d, z2.d
782; CHECK-NEXT:    fmov d1, #5.00000000
783; CHECK-NEXT:    mov z0.d, p0/m, d1
784; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
785; CHECK-NEXT:    ret
786;
787; NONEON-NOSVE-LABEL: insertelement_v2f64:
788; NONEON-NOSVE:       // %bb.0:
789; NONEON-NOSVE-NEXT:    sub sp, sp, #64
790; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
791; NONEON-NOSVE-NEXT:    mov x8, #4617315517961601024 // =0x4014000000000000
792; NONEON-NOSVE-NEXT:    str q0, [sp]
793; NONEON-NOSVE-NEXT:    str x8, [sp, #48]
794; NONEON-NOSVE-NEXT:    ldr d1, [sp]
795; NONEON-NOSVE-NEXT:    ldr q0, [sp, #48]
796; NONEON-NOSVE-NEXT:    str q0, [sp, #16]
797; NONEON-NOSVE-NEXT:    ldr d0, [sp, #16]
798; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #32]
799; NONEON-NOSVE-NEXT:    ldr q0, [sp, #32]
800; NONEON-NOSVE-NEXT:    add sp, sp, #64
801; NONEON-NOSVE-NEXT:    ret
802    %r = insertelement <2 x double> %op1, double 5.0, i64 1
803    ret <2 x double> %r
804}
805
806define <4 x double> @insertelement_v4f64(ptr %a) {
807; CHECK-LABEL: insertelement_v4f64:
808; CHECK:       // %bb.0:
809; CHECK-NEXT:    mov w8, #1 // =0x1
810; CHECK-NEXT:    index z0.d, #0, #1
811; CHECK-NEXT:    ptrue p0.d
812; CHECK-NEXT:    mov z1.d, x8
813; CHECK-NEXT:    fmov d2, #5.00000000
814; CHECK-NEXT:    cmpeq p0.d, p0/z, z0.d, z1.d
815; CHECK-NEXT:    ldp q0, q1, [x0]
816; CHECK-NEXT:    mov z1.d, p0/m, d2
817; CHECK-NEXT:    // kill: def $q1 killed $q1 killed $z1
818; CHECK-NEXT:    ret
819;
820; NONEON-NOSVE-LABEL: insertelement_v4f64:
821; NONEON-NOSVE:       // %bb.0:
822; NONEON-NOSVE-NEXT:    sub sp, sp, #64
823; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 64
824; NONEON-NOSVE-NEXT:    mov x8, #4617315517961601024 // =0x4014000000000000
825; NONEON-NOSVE-NEXT:    ldr q1, [x0, #16]
826; NONEON-NOSVE-NEXT:    str x8, [sp, #48]
827; NONEON-NOSVE-NEXT:    ldr q0, [sp, #48]
828; NONEON-NOSVE-NEXT:    stp q1, q0, [sp]
829; NONEON-NOSVE-NEXT:    ldr d1, [sp]
830; NONEON-NOSVE-NEXT:    ldr d0, [sp, #16]
831; NONEON-NOSVE-NEXT:    stp d1, d0, [sp, #32]
832; NONEON-NOSVE-NEXT:    ldr q0, [x0]
833; NONEON-NOSVE-NEXT:    ldr q1, [sp, #32]
834; NONEON-NOSVE-NEXT:    add sp, sp, #64
835; NONEON-NOSVE-NEXT:    ret
836    %op1 = load <4 x double>, ptr %a
837    %r = insertelement <4 x double> %op1, double 5.0, i64 3
838    ret <4 x double> %r
839}
840