1; RUN: llc -mtriple aarch64 -mattr=+sve -asm-verbose=1 < %s 2>%t | FileCheck %s
2; RUN: FileCheck --check-prefix=WARN --allow-empty %s <%t
3
4; If this check fails please read test/CodeGen/AArch64/README for instructions on how to resolve it.
5; WARN-NOT: warning
6
7;
8; SVCREATE2 (i8)
9;
10
11define <vscale x 16 x i8> @test_svcreate2_s8_vec0(i1 %p, <vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1) local_unnamed_addr #0 {
12; CHECK-LABEL: test_svcreate2_s8_vec0:
13; CHECK: // %L2
14; CHECK-NEXT: ret
15  %tuple = tail call <vscale x 32 x i8> @llvm.aarch64.sve.tuple.create2.nxv32i8.nxv16i8(<vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1)
16  br i1 %p, label %L1, label %L2
17L1:
18  ret <vscale x 16 x i8> undef
19L2:
20  %extract = tail call <vscale x 16 x i8> @llvm.aarch64.sve.tuple.get.nxv16i8.nxv32i8(<vscale x 32 x i8> %tuple, i32 0)
21  ret <vscale x 16 x i8> %extract
22}
23
24define <vscale x 16 x i8> @test_svcreate2_s8_vec1(i1 %p, <vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1) local_unnamed_addr #0 {
25; CHECK-LABEL: test_svcreate2_s8_vec1:
26; CHECK: // %L2
27; CHECK-NEXT: mov z0.d, z1.d
28; CHECK-NEXT: ret
29  %tuple = tail call <vscale x 32 x i8> @llvm.aarch64.sve.tuple.create2.nxv32i8.nxv16i8(<vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1)
30  br i1 %p, label %L1, label %L2
31L1:
32  ret <vscale x 16 x i8> undef
33L2:
34  %extract = tail call <vscale x 16 x i8> @llvm.aarch64.sve.tuple.get.nxv16i8.nxv32i8(<vscale x 32 x i8> %tuple, i32 1)
35  ret <vscale x 16 x i8> %extract
36}
37
38;
39; SVCREATE2 (i16)
40;
41
42define <vscale x 8 x i16> @test_svcreate2_s16_vec0(i1 %p, <vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1) local_unnamed_addr #0 {
43; CHECK-LABEL: test_svcreate2_s16_vec0:
44; CHECK: // %L2
45; CHECK-NEXT: ret
46  %tuple = tail call <vscale x 16 x i16> @llvm.aarch64.sve.tuple.create2.nxv16i16.nxv8i16(<vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1)
47  br i1 %p, label %L1, label %L2
48L1:
49  ret <vscale x 8 x i16> undef
50L2:
51  %extract = tail call <vscale x 8 x i16> @llvm.aarch64.sve.tuple.get.nxv8i16.nxv16i16(<vscale x 16 x i16> %tuple, i32 0)
52  ret <vscale x 8 x i16> %extract
53}
54
55define <vscale x 8 x i16> @test_svcreate2_s16_vec1(i1 %p, <vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1) local_unnamed_addr #0 {
56; CHECK-LABEL: test_svcreate2_s16_vec1:
57; CHECK: // %L2
58; CHECK-NEXT: mov z0.d, z1.d
59; CHECK-NEXT: ret
60  %tuple = tail call <vscale x 16 x i16> @llvm.aarch64.sve.tuple.create2.nxv16i16.nxv8i16(<vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1)
61  br i1 %p, label %L1, label %L2
62L1:
63  ret <vscale x 8 x i16> undef
64L2:
65  %extract = tail call <vscale x 8 x i16> @llvm.aarch64.sve.tuple.get.nxv8i16.nxv16i16(<vscale x 16 x i16> %tuple, i32 1)
66  ret <vscale x 8 x i16> %extract
67}
68
69;
70; SVCREATE2 (half)
71;
72
73define <vscale x 8 x half> @test_svcreate2_f16_vec0(i1 %p, <vscale x 8 x half> %z0, <vscale x 8 x half> %z1) local_unnamed_addr #0 {
74; CHECK-LABEL: test_svcreate2_f16_vec0:
75; CHECK: // %L2
76; CHECK-NEXT: ret
77  %tuple = tail call <vscale x 16 x half> @llvm.aarch64.sve.tuple.create2.nxv16f16.nxv8f16(<vscale x 8 x half> %z0, <vscale x 8 x half> %z1)
78  br i1 %p, label %L1, label %L2
79L1:
80  ret <vscale x 8 x half> undef
81L2:
82  %extract = tail call <vscale x 8 x half> @llvm.aarch64.sve.tuple.get.nxv8f16.nxv16f16(<vscale x 16 x half> %tuple, i32 0)
83  ret <vscale x 8 x half> %extract
84}
85
86define <vscale x 8 x half> @test_svcreate2_f16_vec1(i1 %p, <vscale x 8 x half> %z0, <vscale x 8 x half> %z1) local_unnamed_addr #0 {
87; CHECK-LABEL: test_svcreate2_f16_vec1:
88; CHECK: // %L2
89; CHECK-NEXT: mov z0.d, z1.d
90; CHECK-NEXT: ret
91  %tuple = tail call <vscale x 16 x half> @llvm.aarch64.sve.tuple.create2.nxv16f16.nxv8f16(<vscale x 8 x half> %z0, <vscale x 8 x half> %z1)
92  br i1 %p, label %L1, label %L2
93L1:
94  ret <vscale x 8 x half> undef
95L2:
96  %extract = tail call <vscale x 8 x half> @llvm.aarch64.sve.tuple.get.nxv8f16.nxv16f16(<vscale x 16 x half> %tuple, i32 1)
97  ret <vscale x 8 x half> %extract
98}
99
100;
101; SVCREATE2 (bfloat)
102;
103
104define <vscale x 8 x bfloat> @test_svcreate2_bf16_vec0(i1 %p, <vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1) local_unnamed_addr #1 {
105; CHECK-LABEL: test_svcreate2_bf16_vec0:
106; CHECK: // %L2
107; CHECK-NEXT: ret
108  %tuple = tail call <vscale x 16 x bfloat> @llvm.aarch64.sve.tuple.create2.nxv16bf16.nxv8bf16(<vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1)
109  br i1 %p, label %L1, label %L2
110L1:
111  ret <vscale x 8 x bfloat> undef
112L2:
113  %extract = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.tuple.get.nxv8bf16.nxv16bf16(<vscale x 16 x bfloat> %tuple, i32 0)
114  ret <vscale x 8 x bfloat> %extract
115}
116
117define <vscale x 8 x bfloat> @test_svcreate2_bf16_vec1(i1 %p, <vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1) local_unnamed_addr #1 {
118; CHECK-LABEL: test_svcreate2_bf16_vec1:
119; CHECK: // %L2
120; CHECK-NEXT: mov z0.d, z1.d
121; CHECK-NEXT: ret
122  %tuple = tail call <vscale x 16 x bfloat> @llvm.aarch64.sve.tuple.create2.nxv16bf16.nxv8bf16(<vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1)
123  br i1 %p, label %L1, label %L2
124L1:
125  ret <vscale x 8 x bfloat> undef
126L2:
127  %extract = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.tuple.get.nxv8bf16.nxv16bf16(<vscale x 16 x bfloat> %tuple, i32 1)
128  ret <vscale x 8 x bfloat> %extract
129}
130
131;
132; SVCREATE2 (i32)
133;
134
135define <vscale x 4 x i32> @test_svcreate2_s32_vec0(i1 %p, <vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1) local_unnamed_addr #0 {
136; CHECK-LABEL: test_svcreate2_s32_vec0:
137; CHECK: // %L2
138; CHECK-NEXT: ret
139  %tuple = tail call <vscale x 8 x i32> @llvm.aarch64.sve.tuple.create2.nxv8i32.nxv4i32(<vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1)
140  br i1 %p, label %L1, label %L2
141L1:
142  ret <vscale x 4 x i32> undef
143L2:
144  %extract = tail call <vscale x 4 x i32> @llvm.aarch64.sve.tuple.get.nxv4i32.nxv8i32(<vscale x 8 x i32> %tuple, i32 0)
145  ret <vscale x 4 x i32> %extract
146}
147
148define <vscale x 4 x i32> @test_svcreate2_s32_vec1(i1 %p, <vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1) local_unnamed_addr #0 {
149; CHECK-LABEL: test_svcreate2_s32_vec1:
150; CHECK: // %L2
151; CHECK-NEXT: mov z0.d, z1.d
152; CHECK-NEXT: ret
153  %tuple = tail call <vscale x 8 x i32> @llvm.aarch64.sve.tuple.create2.nxv8i32.nxv4i32(<vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1)
154  br i1 %p, label %L1, label %L2
155L1:
156  ret <vscale x 4 x i32> undef
157L2:
158  %extract = tail call <vscale x 4 x i32> @llvm.aarch64.sve.tuple.get.nxv4i32.nxv8i32(<vscale x 8 x i32> %tuple, i32 1)
159  ret <vscale x 4 x i32> %extract
160}
161
162;
163; SVCREATE2 (float)
164;
165
166define <vscale x 4 x float> @test_svcreate2_f32_vec0(i1 %p, <vscale x 4 x float> %z0, <vscale x 4 x float> %z1) local_unnamed_addr #0 {
167; CHECK-LABEL: test_svcreate2_f32_vec0:
168; CHECK: // %L2
169; CHECK-NEXT: ret
170  %tuple = tail call <vscale x 8 x float> @llvm.aarch64.sve.tuple.create2.nxv8f32.nxv4f32(<vscale x 4 x float> %z0, <vscale x 4 x float> %z1)
171  br i1 %p, label %L1, label %L2
172L1:
173  ret <vscale x 4 x float> undef
174L2:
175  %extract = tail call <vscale x 4 x float> @llvm.aarch64.sve.tuple.get.nxv4f32.nxv8f32(<vscale x 8 x float> %tuple, i32 0)
176  ret <vscale x 4 x float> %extract
177}
178
179define <vscale x 4 x float> @test_svcreate2_f32_vec1(i1 %p, <vscale x 4 x float> %z0, <vscale x 4 x float> %z1) local_unnamed_addr #0 {
180; CHECK-LABEL: test_svcreate2_f32_vec1:
181; CHECK: // %L2
182; CHECK-NEXT: mov z0.d, z1.d
183; CHECK-NEXT: ret
184  %tuple = tail call <vscale x 8 x float> @llvm.aarch64.sve.tuple.create2.nxv8f32.nxv4f32(<vscale x 4 x float> %z0, <vscale x 4 x float> %z1)
185  br i1 %p, label %L1, label %L2
186L1:
187  ret <vscale x 4 x float> undef
188L2:
189  %extract = tail call <vscale x 4 x float> @llvm.aarch64.sve.tuple.get.nxv4f32.nxv8f32(<vscale x 8 x float> %tuple, i32 1)
190  ret <vscale x 4 x float> %extract
191}
192
193;
194; SVCREATE2 (i64)
195;
196
197define <vscale x 2 x i64> @test_svcreate2_s64_vec0(i1 %p, <vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1) local_unnamed_addr #0 {
198; CHECK-LABEL: test_svcreate2_s64_vec0:
199; CHECK: // %L2
200; CHECK-NEXT: ret
201  %tuple = tail call <vscale x 4 x i64> @llvm.aarch64.sve.tuple.create2.nxv4i64.nxv2i64(<vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1)
202  br i1 %p, label %L1, label %L2
203L1:
204  ret <vscale x 2 x i64> undef
205L2:
206  %extract = tail call <vscale x 2 x i64> @llvm.aarch64.sve.tuple.get.nxv2i64.nxv4i64(<vscale x 4 x i64> %tuple, i32 0)
207  ret <vscale x 2 x i64> %extract
208}
209
210define <vscale x 2 x i64> @test_svcreate2_s64_vec1(i1 %p, <vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1) local_unnamed_addr #0 {
211; CHECK-LABEL: test_svcreate2_s64_vec1:
212; CHECK: // %L2
213; CHECK-NEXT: mov z0.d, z1.d
214; CHECK-NEXT: ret
215  %tuple = tail call <vscale x 4 x i64> @llvm.aarch64.sve.tuple.create2.nxv4i64.nxv2i64(<vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1)
216  br i1 %p, label %L1, label %L2
217L1:
218  ret <vscale x 2 x i64> undef
219L2:
220  %extract = tail call <vscale x 2 x i64> @llvm.aarch64.sve.tuple.get.nxv2i64.nxv4i64(<vscale x 4 x i64> %tuple, i32 1)
221  ret <vscale x 2 x i64> %extract
222}
223
224;
225; SVCREATE2 (double)
226;
227
228define <vscale x 2 x double> @test_svcreate2_f64_vec0(i1 %p, <vscale x 2 x double> %z0, <vscale x 2 x double> %z1) local_unnamed_addr #0 {
229; CHECK-LABEL: test_svcreate2_f64_vec0:
230; CHECK: // %L2
231; CHECK-NEXT: ret
232  %tuple = tail call <vscale x 4 x double> @llvm.aarch64.sve.tuple.create2.nxv4f64.nxv2f64(<vscale x 2 x double> %z0, <vscale x 2 x double> %z1)
233  br i1 %p, label %L1, label %L2
234L1:
235  ret <vscale x 2 x double> undef
236L2:
237  %extract = tail call <vscale x 2 x double> @llvm.aarch64.sve.tuple.get.nxv2f64.nxv4f64(<vscale x 4 x double> %tuple, i32 0)
238  ret <vscale x 2 x double> %extract
239}
240
241define <vscale x 2 x double> @test_svcreate2_f64_vec1(i1 %p, <vscale x 2 x double> %z0, <vscale x 2 x double> %z1) local_unnamed_addr #0 {
242; CHECK-LABEL: test_svcreate2_f64_vec1:
243; CHECK: // %L2
244; CHECK-NEXT: mov z0.d, z1.d
245; CHECK-NEXT: ret
246  %tuple = tail call <vscale x 4 x double> @llvm.aarch64.sve.tuple.create2.nxv4f64.nxv2f64(<vscale x 2 x double> %z0, <vscale x 2 x double> %z1)
247  br i1 %p, label %L1, label %L2
248L1:
249  ret <vscale x 2 x double> undef
250L2:
251  %extract = tail call <vscale x 2 x double> @llvm.aarch64.sve.tuple.get.nxv2f64.nxv4f64(<vscale x 4 x double> %tuple, i32 1)
252  ret <vscale x 2 x double> %extract
253}
254
255;
256; SVCREATE3 (i8)
257;
258
259define <vscale x 16 x i8> @test_svcreate3_s8_vec0(i1 %p, <vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1, <vscale x 16 x i8> %z2) local_unnamed_addr #0 {
260; CHECK-LABEL: test_svcreate3_s8_vec0:
261; CHECK: // %L2
262; CHECK-NEXT: ret
263  %tuple = tail call <vscale x 48 x i8> @llvm.aarch64.sve.tuple.create3.nxv48i8.nxv16i8(<vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1, <vscale x 16 x i8> %z2)
264  br i1 %p, label %L1, label %L2
265L1:
266  ret <vscale x 16 x i8> undef
267L2:
268  %extract = tail call <vscale x 16 x i8> @llvm.aarch64.sve.tuple.get.nxv16i8.nxv48i8(<vscale x 48 x i8> %tuple, i32 0)
269  ret <vscale x 16 x i8> %extract
270}
271
272define <vscale x 16 x i8> @test_svcreate3_s8_vec2(i1 %p, <vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1, <vscale x 16 x i8> %z2) local_unnamed_addr #0 {
273; CHECK-LABEL: test_svcreate3_s8_vec2:
274; CHECK: // %L2
275; CHECK-NEXT: mov z0.d, z2.d
276; CHECK-NEXT: ret
277  %tuple = tail call <vscale x 48 x i8> @llvm.aarch64.sve.tuple.create3.nxv48i8.nxv16i8(<vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1, <vscale x 16 x i8> %z2)
278  br i1 %p, label %L1, label %L2
279L1:
280  ret <vscale x 16 x i8> undef
281L2:
282  %extract = tail call <vscale x 16 x i8> @llvm.aarch64.sve.tuple.get.nxv16i8.nxv48i8(<vscale x 48 x i8> %tuple, i32 2)
283  ret <vscale x 16 x i8> %extract
284}
285
286;
287; SVCREATE3 (i16)
288;
289
290define <vscale x 8 x i16> @test_svcreate3_s16_vec0(i1 %p, <vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1, <vscale x 8 x i16> %z2) local_unnamed_addr #0 {
291; CHECK-LABEL: test_svcreate3_s16_vec0:
292; CHECK: // %L2
293; CHECK-NEXT: ret
294  %tuple = tail call <vscale x 24 x i16> @llvm.aarch64.sve.tuple.create3.nxv24i16.nxv8i16(<vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1, <vscale x 8 x i16> %z2)
295  br i1 %p, label %L1, label %L2
296L1:
297  ret <vscale x 8 x i16> undef
298L2:
299  %extract = tail call <vscale x 8 x i16> @llvm.aarch64.sve.tuple.get.nxv8i16.nxv24i16(<vscale x 24 x i16> %tuple, i32 0)
300  ret <vscale x 8 x i16> %extract
301}
302
303define <vscale x 8 x i16> @test_svcreate3_s16_vec2(i1 %p, <vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1, <vscale x 8 x i16> %z2) local_unnamed_addr #0 {
304; CHECK-LABEL: test_svcreate3_s16_vec2:
305; CHECK: // %L2
306; CHECK-NEXT: mov z0.d, z2.d
307; CHECK-NEXT: ret
308  %tuple = tail call <vscale x 24 x i16> @llvm.aarch64.sve.tuple.create3.nxv24i16.nxv8i16(<vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1, <vscale x 8 x i16> %z2)
309  br i1 %p, label %L1, label %L2
310L1:
311  ret <vscale x 8 x i16> undef
312L2:
313  %extract = tail call <vscale x 8 x i16> @llvm.aarch64.sve.tuple.get.nxv8i16.nxv24i16(<vscale x 24 x i16> %tuple, i32 2)
314  ret <vscale x 8 x i16> %extract
315}
316
317;
318; SVCREATE3 (half)
319;
320
321define <vscale x 8 x half> @test_svcreate3_f16_vec0(i1 %p, <vscale x 8 x half> %z0, <vscale x 8 x half> %z1, <vscale x 8 x half> %z2) local_unnamed_addr #0 {
322; CHECK-LABEL: test_svcreate3_f16_vec0:
323; CHECK: // %L2
324; CHECK-NEXT: ret
325  %tuple = tail call <vscale x 24 x half> @llvm.aarch64.sve.tuple.create3.nxv24f16.nxv8f16(<vscale x 8 x half> %z0, <vscale x 8 x half> %z1, <vscale x 8 x half> %z2)
326  br i1 %p, label %L1, label %L2
327L1:
328  ret <vscale x 8 x half> undef
329L2:
330  %extract = tail call <vscale x 8 x half> @llvm.aarch64.sve.tuple.get.nxv8f16.nxv24f16(<vscale x 24 x half> %tuple, i32 0)
331  ret <vscale x 8 x half> %extract
332}
333
334define <vscale x 8 x half> @test_svcreate3_f16_vec2(i1 %p, <vscale x 8 x half> %z0, <vscale x 8 x half> %z1, <vscale x 8 x half> %z2) local_unnamed_addr #0 {
335; CHECK-LABEL: test_svcreate3_f16_vec2:
336; CHECK: // %L2
337; CHECK-NEXT: mov z0.d, z2.d
338; CHECK-NEXT: ret
339  %tuple = tail call <vscale x 24 x half> @llvm.aarch64.sve.tuple.create3.nxv24f16.nxv8f16(<vscale x 8 x half> %z0, <vscale x 8 x half> %z1, <vscale x 8 x half> %z2)
340  br i1 %p, label %L1, label %L2
341L1:
342  ret <vscale x 8 x half> undef
343L2:
344  %extract = tail call <vscale x 8 x half> @llvm.aarch64.sve.tuple.get.nxv8f16.nxv24f16(<vscale x 24 x half> %tuple, i32 2)
345  ret <vscale x 8 x half> %extract
346}
347
348;
349; SVCREATE3 (bfloat)
350;
351
352define <vscale x 8 x bfloat> @test_svcreate3_bf16_vec0(i1 %p, <vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1, <vscale x 8 x bfloat> %z2) local_unnamed_addr #1 {
353; CHECK-LABEL: test_svcreate3_bf16_vec0:
354; CHECK: // %L2
355; CHECK-NEXT: ret
356  %tuple = tail call <vscale x 24 x bfloat> @llvm.aarch64.sve.tuple.create3.nxv24bf16.nxv8bf16(<vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1, <vscale x 8 x bfloat> %z2)
357  br i1 %p, label %L1, label %L2
358L1:
359  ret <vscale x 8 x bfloat> undef
360L2:
361  %extract = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.tuple.get.nxv8bf16.nxv24bf16(<vscale x 24 x bfloat> %tuple, i32 0)
362  ret <vscale x 8 x bfloat> %extract
363}
364
365define <vscale x 8 x bfloat> @test_svcreate3_bf16_vec2(i1 %p, <vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1, <vscale x 8 x bfloat> %z2) local_unnamed_addr #1 {
366; CHECK-LABEL: test_svcreate3_bf16_vec2:
367; CHECK: // %L2
368; CHECK-NEXT: mov z0.d, z2.d
369; CHECK-NEXT: ret
370  %tuple = tail call <vscale x 24 x bfloat> @llvm.aarch64.sve.tuple.create3.nxv24bf16.nxv8bf16(<vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1, <vscale x 8 x bfloat> %z2)
371  br i1 %p, label %L1, label %L2
372L1:
373  ret <vscale x 8 x bfloat> undef
374L2:
375  %extract = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.tuple.get.nxv8bf16.nxv24bf16(<vscale x 24 x bfloat> %tuple, i32 2)
376  ret <vscale x 8 x bfloat> %extract
377}
378
379;
380; SVCREATE3 (i32)
381;
382
383define <vscale x 4 x i32> @test_svcreate3_s32_vec0(i1 %p, <vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1, <vscale x 4 x i32> %z2) local_unnamed_addr #0 {
384; CHECK-LABEL: test_svcreate3_s32_vec0:
385; CHECK: // %L2
386; CHECK-NEXT: ret
387  %tuple = tail call <vscale x 12 x i32> @llvm.aarch64.sve.tuple.create3.nxv12i32.nxv4i32(<vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1, <vscale x 4 x i32> %z2)
388  br i1 %p, label %L1, label %L2
389L1:
390  ret <vscale x 4 x i32> undef
391L2:
392  %extract = tail call <vscale x 4 x i32> @llvm.aarch64.sve.tuple.get.nxv4i32.nxv12i32(<vscale x 12 x i32> %tuple, i32 0)
393  ret <vscale x 4 x i32> %extract
394}
395
396define <vscale x 4 x i32> @test_svcreate3_s32_vec2(i1 %p, <vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1, <vscale x 4 x i32> %z2) local_unnamed_addr #0 {
397; CHECK-LABEL: test_svcreate3_s32_vec2:
398; CHECK: // %L2
399; CHECK-NEXT: mov z0.d, z2.d
400; CHECK-NEXT: ret
401  %tuple = tail call <vscale x 12 x i32> @llvm.aarch64.sve.tuple.create3.nxv12i32.nxv4i32(<vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1, <vscale x 4 x i32> %z2)
402  br i1 %p, label %L1, label %L2
403L1:
404  ret <vscale x 4 x i32> undef
405L2:
406  %extract = tail call <vscale x 4 x i32> @llvm.aarch64.sve.tuple.get.nxv4i32.nxv12i32(<vscale x 12 x i32> %tuple, i32 2)
407  ret <vscale x 4 x i32> %extract
408}
409
410;
411; SVCREATE3 (float)
412;
413
414define <vscale x 4 x float> @test_svcreate3_f32_vec0(i1 %p, <vscale x 4 x float> %z0, <vscale x 4 x float> %z1, <vscale x 4 x float> %z2) local_unnamed_addr #0 {
415; CHECK-LABEL: test_svcreate3_f32_vec0:
416; CHECK: // %L2
417; CHECK-NEXT: ret
418  %tuple = tail call <vscale x 12 x float> @llvm.aarch64.sve.tuple.create3.nxv12f32.nxv4f32(<vscale x 4 x float> %z0, <vscale x 4 x float> %z1, <vscale x 4 x float> %z2)
419  br i1 %p, label %L1, label %L2
420L1:
421  ret <vscale x 4 x float> undef
422L2:
423  %extract = tail call <vscale x 4 x float> @llvm.aarch64.sve.tuple.get.nxv4f32.nxv12f32(<vscale x 12 x float> %tuple, i32 0)
424  ret <vscale x 4 x float> %extract
425}
426
427define <vscale x 4 x float> @test_svcreate3_f32_vec2(i1 %p, <vscale x 4 x float> %z0, <vscale x 4 x float> %z1, <vscale x 4 x float> %z2) local_unnamed_addr #0 {
428; CHECK-LABEL: test_svcreate3_f32_vec2:
429; CHECK: // %L2
430; CHECK-NEXT: mov z0.d, z2.d
431; CHECK-NEXT: ret
432  %tuple = tail call <vscale x 12 x float> @llvm.aarch64.sve.tuple.create3.nxv12f32.nxv4f32(<vscale x 4 x float> %z0, <vscale x 4 x float> %z1, <vscale x 4 x float> %z2)
433  br i1 %p, label %L1, label %L2
434L1:
435  ret <vscale x 4 x float> undef
436L2:
437  %extract = tail call <vscale x 4 x float> @llvm.aarch64.sve.tuple.get.nxv4f32.nxv12f32(<vscale x 12 x float> %tuple, i32 2)
438  ret <vscale x 4 x float> %extract
439}
440
441;
442; SVCREATE3 (i64)
443;
444
445define <vscale x 2 x i64> @test_svcreate3_s64_vec0(i1 %p, <vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1, <vscale x 2 x i64> %z2) local_unnamed_addr #0 {
446; CHECK-LABEL: test_svcreate3_s64_vec0:
447; CHECK: // %L2
448; CHECK-NEXT: ret
449  %tuple = tail call <vscale x 6 x i64> @llvm.aarch64.sve.tuple.create3.nxv6i64.nxv2i64(<vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1, <vscale x 2 x i64> %z2)
450  br i1 %p, label %L1, label %L2
451L1:
452  ret <vscale x 2 x i64> undef
453L2:
454  %extract = tail call <vscale x 2 x i64> @llvm.aarch64.sve.tuple.get.nxv2i64.nxv6i64(<vscale x 6 x i64> %tuple, i32 0)
455  ret <vscale x 2 x i64> %extract
456}
457
458define <vscale x 2 x i64> @test_svcreate3_s64_vec2(i1 %p, <vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1, <vscale x 2 x i64> %z2) local_unnamed_addr #0 {
459; CHECK-LABEL: test_svcreate3_s64_vec2:
460; CHECK: // %L2
461; CHECK-NEXT: mov z0.d, z2.d
462; CHECK-NEXT: ret
463  %tuple = tail call <vscale x 6 x i64> @llvm.aarch64.sve.tuple.create3.nxv6i64.nxv2i64(<vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1, <vscale x 2 x i64> %z2)
464  br i1 %p, label %L1, label %L2
465L1:
466  ret <vscale x 2 x i64> undef
467L2:
468  %extract = tail call <vscale x 2 x i64> @llvm.aarch64.sve.tuple.get.nxv2i64.nxv6i64(<vscale x 6 x i64> %tuple, i32 2)
469  ret <vscale x 2 x i64> %extract
470}
471
472;
473; SVCREATE3 (double)
474;
475
476define <vscale x 2 x double> @test_svcreate3_f64_vec0(i1 %p, <vscale x 2 x double> %z0, <vscale x 2 x double> %z1, <vscale x 2 x double> %z2) local_unnamed_addr #0 {
477; CHECK-LABEL: test_svcreate3_f64_vec0:
478; CHECK: // %L2
479; CHECK-NEXT: ret
480  %tuple = tail call <vscale x 6 x double> @llvm.aarch64.sve.tuple.create3.nxv6f64.nxv2f64(<vscale x 2 x double> %z0, <vscale x 2 x double> %z1, <vscale x 2 x double> %z2)
481  br i1 %p, label %L1, label %L2
482L1:
483  ret <vscale x 2 x double> undef
484L2:
485  %extract = tail call <vscale x 2 x double> @llvm.aarch64.sve.tuple.get.nxv2f64.nxv6f64(<vscale x 6 x double> %tuple, i32 0)
486  ret <vscale x 2 x double> %extract
487}
488
489define <vscale x 2 x double> @test_svcreate3_f64_vec2(i1 %p, <vscale x 2 x double> %z0, <vscale x 2 x double> %z1, <vscale x 2 x double> %z2) local_unnamed_addr #0 {
490; CHECK-LABEL: test_svcreate3_f64_vec2:
491; CHECK: // %L2
492; CHECK-NEXT: mov z0.d, z2.d
493; CHECK-NEXT: ret
494  %tuple = tail call <vscale x 6 x double> @llvm.aarch64.sve.tuple.create3.nxv6f64.nxv2f64(<vscale x 2 x double> %z0, <vscale x 2 x double> %z1, <vscale x 2 x double> %z2)
495  br i1 %p, label %L1, label %L2
496L1:
497  ret <vscale x 2 x double> undef
498L2:
499  %extract = tail call <vscale x 2 x double> @llvm.aarch64.sve.tuple.get.nxv2f64.nxv6f64(<vscale x 6 x double> %tuple, i32 2)
500  ret <vscale x 2 x double> %extract
501}
502
503;
504; SVCREATE4 (i8)
505;
506
507define <vscale x 16 x i8> @test_svcreate4_s8_vec0(i1 %p, <vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1, <vscale x 16 x i8> %z2, <vscale x 16 x i8> %z3) local_unnamed_addr #0 {
508; CHECK-LABEL: test_svcreate4_s8_vec0:
509; CHECK: // %L2
510; CHECK-NEXT: ret
511  %tuple = tail call <vscale x 64 x i8> @llvm.aarch64.sve.tuple.create4.nxv64i8.nxv16i8(<vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1, <vscale x 16 x i8> %z2, <vscale x 16 x i8> %z3)
512  br i1 %p, label %L1, label %L2
513L1:
514  ret <vscale x 16 x i8> undef
515L2:
516  %extract = tail call <vscale x 16 x i8> @llvm.aarch64.sve.tuple.get.nxv16i8.nxv64i8(<vscale x 64 x i8> %tuple, i32 0)
517  ret <vscale x 16 x i8> %extract
518}
519
520define <vscale x 16 x i8> @test_svcreate4_s8_vec3(i1 %p, <vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1, <vscale x 16 x i8> %z2, <vscale x 16 x i8> %z3) local_unnamed_addr #0 {
521; CHECK-LABEL: test_svcreate4_s8_vec3:
522; CHECK: // %L2
523; CHECK-NEXT: mov z0.d, z3.d
524; CHECK-NEXT: ret
525  %tuple = tail call <vscale x 64 x i8> @llvm.aarch64.sve.tuple.create4.nxv64i8.nxv16i8(<vscale x 16 x i8> %z0, <vscale x 16 x i8> %z1, <vscale x 16 x i8> %z2, <vscale x 16 x i8> %z3)
526  br i1 %p, label %L1, label %L2
527L1:
528  ret <vscale x 16 x i8> undef
529L2:
530  %extract = tail call <vscale x 16 x i8> @llvm.aarch64.sve.tuple.get.nxv16i8.nxv64i8(<vscale x 64 x i8> %tuple, i32 3)
531  ret <vscale x 16 x i8> %extract
532}
533
534;
535; SVCREATE4 (i16)
536;
537
538define <vscale x 8 x i16> @test_svcreate4_s16_vec0(i1 %p, <vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1, <vscale x 8 x i16> %z2, <vscale x 8 x i16> %z3) local_unnamed_addr #0 {
539; CHECK-LABEL: test_svcreate4_s16_vec0:
540; CHECK: // %L2
541; CHECK-NEXT: ret
542  %tuple = tail call <vscale x 32 x i16> @llvm.aarch64.sve.tuple.create4.nxv32i16.nxv8i16(<vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1, <vscale x 8 x i16> %z2, <vscale x 8 x i16> %z3)
543  br i1 %p, label %L1, label %L2
544L1:
545  ret <vscale x 8 x i16> undef
546L2:
547  %extract = tail call <vscale x 8 x i16> @llvm.aarch64.sve.tuple.get.nxv8i16.nxv32i16(<vscale x 32 x i16> %tuple, i32 0)
548  ret <vscale x 8 x i16> %extract
549}
550
551define <vscale x 8 x i16> @test_svcreate4_s16_vec3(i1 %p, <vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1, <vscale x 8 x i16> %z2, <vscale x 8 x i16> %z3) local_unnamed_addr #0 {
552; CHECK-LABEL: test_svcreate4_s16_vec3:
553; CHECK: // %L2
554; CHECK-NEXT: mov z0.d, z3.d
555; CHECK-NEXT: ret
556  %tuple = tail call <vscale x 32 x i16> @llvm.aarch64.sve.tuple.create4.nxv32i16.nxv8i16(<vscale x 8 x i16> %z0, <vscale x 8 x i16> %z1, <vscale x 8 x i16> %z2, <vscale x 8 x i16> %z3)
557  br i1 %p, label %L1, label %L2
558L1:
559  ret <vscale x 8 x i16> undef
560L2:
561  %extract = tail call <vscale x 8 x i16> @llvm.aarch64.sve.tuple.get.nxv8i16.nxv32i16(<vscale x 32 x i16> %tuple, i32 3)
562  ret <vscale x 8 x i16> %extract
563}
564
565;
566; SVCREATE4 (half)
567;
568
569define <vscale x 8 x half> @test_svcreate4_f16_vec0(i1 %p, <vscale x 8 x half> %z0, <vscale x 8 x half> %z1, <vscale x 8 x half> %z2, <vscale x 8 x half> %z3) local_unnamed_addr #0 {
570; CHECK-LABEL: test_svcreate4_f16_vec0:
571; CHECK: // %L2
572; CHECK-NEXT: ret
573  %tuple = tail call <vscale x 32 x half> @llvm.aarch64.sve.tuple.create4.nxv32f16.nxv8f16(<vscale x 8 x half> %z0, <vscale x 8 x half> %z1, <vscale x 8 x half> %z2, <vscale x 8 x half> %z3)
574  br i1 %p, label %L1, label %L2
575L1:
576  ret <vscale x 8 x half> undef
577L2:
578  %extract = tail call <vscale x 8 x half> @llvm.aarch64.sve.tuple.get.nxv8f16.nxv32f16(<vscale x 32 x half> %tuple, i32 0)
579  ret <vscale x 8 x half> %extract
580}
581
582define <vscale x 8 x half> @test_svcreate4_f16_vec3(i1 %p, <vscale x 8 x half> %z0, <vscale x 8 x half> %z1, <vscale x 8 x half> %z2, <vscale x 8 x half> %z3) local_unnamed_addr #0 {
583; CHECK-LABEL: test_svcreate4_f16_vec3:
584; CHECK: // %L2
585; CHECK-NEXT: mov z0.d, z3.d
586; CHECK-NEXT: ret
587  %tuple = tail call <vscale x 32 x half> @llvm.aarch64.sve.tuple.create4.nxv32f16.nxv8f16(<vscale x 8 x half> %z0, <vscale x 8 x half> %z1, <vscale x 8 x half> %z2, <vscale x 8 x half> %z3)
588  br i1 %p, label %L1, label %L2
589L1:
590  ret <vscale x 8 x half> undef
591L2:
592  %extract = tail call <vscale x 8 x half> @llvm.aarch64.sve.tuple.get.nxv8f16.nxv32f16(<vscale x 32 x half> %tuple, i32 3)
593  ret <vscale x 8 x half> %extract
594}
595
596;
597; SVCREATE4 (bfloat)
598;
599
600define <vscale x 8 x bfloat> @test_svcreate4_bf16_vec0(i1 %p, <vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1, <vscale x 8 x bfloat> %z2, <vscale x 8 x bfloat> %z3) local_unnamed_addr #1 {
601; CHECK-LABEL: test_svcreate4_bf16_vec0:
602; CHECK: // %L2
603; CHECK-NEXT: ret
604  %tuple = tail call <vscale x 32 x bfloat> @llvm.aarch64.sve.tuple.create4.nxv32bf16.nxv8bf16(<vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1, <vscale x 8 x bfloat> %z2, <vscale x 8 x bfloat> %z3)
605  br i1 %p, label %L1, label %L2
606L1:
607  ret <vscale x 8 x bfloat> undef
608L2:
609  %extract = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.tuple.get.nxv8bf16.nxv32bf16(<vscale x 32 x bfloat> %tuple, i32 0)
610  ret <vscale x 8 x bfloat> %extract
611}
612
613define <vscale x 8 x bfloat> @test_svcreate4_bf16_vec3(i1 %p, <vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1, <vscale x 8 x bfloat> %z2, <vscale x 8 x bfloat> %z3) local_unnamed_addr #1 {
614; CHECK-LABEL: test_svcreate4_bf16_vec3:
615; CHECK: // %L2
616; CHECK-NEXT: mov z0.d, z3.d
617; CHECK-NEXT: ret
618  %tuple = tail call <vscale x 32 x bfloat> @llvm.aarch64.sve.tuple.create4.nxv32bf16.nxv8bf16(<vscale x 8 x bfloat> %z0, <vscale x 8 x bfloat> %z1, <vscale x 8 x bfloat> %z2, <vscale x 8 x bfloat> %z3)
619  br i1 %p, label %L1, label %L2
620L1:
621  ret <vscale x 8 x bfloat> undef
622L2:
623  %extract = tail call <vscale x 8 x bfloat> @llvm.aarch64.sve.tuple.get.nxv8bf16.nxv32bf16(<vscale x 32 x bfloat> %tuple, i32 3)
624  ret <vscale x 8 x bfloat> %extract
625}
626
627;
628; SVCREATE4 (i32)
629;
630
631define <vscale x 4 x i32> @test_svcreate4_s32_vec0(i1 %p, <vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1, <vscale x 4 x i32> %z2, <vscale x 4 x i32> %z3) local_unnamed_addr #0 {
632; CHECK-LABEL: test_svcreate4_s32_vec0:
633; CHECK: // %L2
634; CHECK-NEXT: ret
635  %tuple = tail call <vscale x 16 x i32> @llvm.aarch64.sve.tuple.create4.nxv16i32.nxv4i32(<vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1, <vscale x 4 x i32> %z2, <vscale x 4 x i32> %z3)
636  br i1 %p, label %L1, label %L2
637L1:
638  ret <vscale x 4 x i32> undef
639L2:
640  %extract = tail call <vscale x 4 x i32> @llvm.aarch64.sve.tuple.get.nxv4i32.nxv16i32(<vscale x 16 x i32> %tuple, i32 0)
641  ret <vscale x 4 x i32> %extract
642}
643
644define <vscale x 4 x i32> @test_svcreate4_s32_vec3(i1 %p, <vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1, <vscale x 4 x i32> %z2, <vscale x 4 x i32> %z3) local_unnamed_addr #0 {
645; CHECK-LABEL: test_svcreate4_s32_vec3:
646; CHECK: // %L2
647; CHECK-NEXT: mov z0.d, z3.d
648; CHECK-NEXT: ret
649  %tuple = tail call <vscale x 16 x i32> @llvm.aarch64.sve.tuple.create4.nxv16i32.nxv4i32(<vscale x 4 x i32> %z0, <vscale x 4 x i32> %z1, <vscale x 4 x i32> %z2, <vscale x 4 x i32> %z3)
650  br i1 %p, label %L1, label %L2
651L1:
652  ret <vscale x 4 x i32> undef
653L2:
654  %extract = tail call <vscale x 4 x i32> @llvm.aarch64.sve.tuple.get.nxv4i32.nxv16i32(<vscale x 16 x i32> %tuple, i32 3)
655  ret <vscale x 4 x i32> %extract
656}
657
658;
659; SVCREATE4 (float)
660;
661
662define <vscale x 4 x float> @test_svcreate4_f32_vec0(i1 %p, <vscale x 4 x float> %z0, <vscale x 4 x float> %z1, <vscale x 4 x float> %z2, <vscale x 4 x float> %z3) local_unnamed_addr #0 {
663; CHECK-LABEL: test_svcreate4_f32_vec0:
664; CHECK: // %L2
665; CHECK-NEXT: ret
666  %tuple = tail call <vscale x 16 x float> @llvm.aarch64.sve.tuple.create4.nxv16f32.nxv4f32(<vscale x 4 x float> %z0, <vscale x 4 x float> %z1, <vscale x 4 x float> %z2, <vscale x 4 x float> %z3)
667  br i1 %p, label %L1, label %L2
668L1:
669  ret <vscale x 4 x float> undef
670L2:
671  %extract = tail call <vscale x 4 x float> @llvm.aarch64.sve.tuple.get.nxv4f32.nxv16f32(<vscale x 16 x float> %tuple, i32 0)
672  ret <vscale x 4 x float> %extract
673}
674
675define <vscale x 4 x float> @test_svcreate4_f32_vec3(i1 %p, <vscale x 4 x float> %z0, <vscale x 4 x float> %z1, <vscale x 4 x float> %z2, <vscale x 4 x float> %z3) local_unnamed_addr #0 {
676; CHECK-LABEL: test_svcreate4_f32_vec3:
677; CHECK: // %L2
678; CHECK-NEXT: mov z0.d, z3.d
679; CHECK-NEXT: ret
680  %tuple = tail call <vscale x 16 x float> @llvm.aarch64.sve.tuple.create4.nxv16f32.nxv4f32(<vscale x 4 x float> %z0, <vscale x 4 x float> %z1, <vscale x 4 x float> %z2, <vscale x 4 x float> %z3)
681  br i1 %p, label %L1, label %L2
682L1:
683  ret <vscale x 4 x float> undef
684L2:
685  %extract = tail call <vscale x 4 x float> @llvm.aarch64.sve.tuple.get.nxv4f32.nxv16f32(<vscale x 16 x float> %tuple, i32 3)
686  ret <vscale x 4 x float> %extract
687}
688
689;
690; SVCREATE4 (i64)
691;
692
693define <vscale x 2 x i64> @test_svcreate4_s64_vec0(i1 %p, <vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1, <vscale x 2 x i64> %z2, <vscale x 2 x i64> %z3) local_unnamed_addr #0 {
694; CHECK-LABEL: test_svcreate4_s64_vec0:
695; CHECK: // %L2
696; CHECK-NEXT: ret
697  %tuple = tail call <vscale x 8 x i64> @llvm.aarch64.sve.tuple.create4.nxv8i64.nxv2i64(<vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1, <vscale x 2 x i64> %z2, <vscale x 2 x i64> %z3)
698  br i1 %p, label %L1, label %L2
699L1:
700  ret <vscale x 2 x i64> undef
701L2:
702  %extract = tail call <vscale x 2 x i64> @llvm.aarch64.sve.tuple.get.nxv2i64.nxv8i64(<vscale x 8 x i64> %tuple, i32 0)
703  ret <vscale x 2 x i64> %extract
704}
705
706define <vscale x 2 x i64> @test_svcreate4_s64_vec3(i1 %p, <vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1, <vscale x 2 x i64> %z2, <vscale x 2 x i64> %z3) local_unnamed_addr #0 {
707; CHECK-LABEL: test_svcreate4_s64_vec3:
708; CHECK: // %L2
709; CHECK-NEXT: mov z0.d, z3.d
710; CHECK-NEXT: ret
711  %tuple = tail call <vscale x 8 x i64> @llvm.aarch64.sve.tuple.create4.nxv8i64.nxv2i64(<vscale x 2 x i64> %z0, <vscale x 2 x i64> %z1, <vscale x 2 x i64> %z2, <vscale x 2 x i64> %z3)
712  br i1 %p, label %L1, label %L2
713L1:
714  ret <vscale x 2 x i64> undef
715L2:
716  %extract = tail call <vscale x 2 x i64> @llvm.aarch64.sve.tuple.get.nxv2i64.nxv8i64(<vscale x 8 x i64> %tuple, i32 3)
717  ret <vscale x 2 x i64> %extract
718}
719
720;
721; SVCREATE4 (double)
722;
723
724define <vscale x 2 x double> @test_svcreate4_f64_vec0(i1 %p, <vscale x 2 x double> %z0, <vscale x 2 x double> %z1, <vscale x 2 x double> %z2, <vscale x 2 x double> %z3) local_unnamed_addr #0 {
725; CHECK-LABEL: test_svcreate4_f64_vec0:
726; CHECK: // %L2
727; CHECK-NEXT: ret
728  %tuple = tail call <vscale x 8 x double> @llvm.aarch64.sve.tuple.create4.nxv8f64.nxv2f64(<vscale x 2 x double> %z0, <vscale x 2 x double> %z1, <vscale x 2 x double> %z2, <vscale x 2 x double> %z3)
729  br i1 %p, label %L1, label %L2
730L1:
731  ret <vscale x 2 x double> undef
732L2:
733  %extract = tail call <vscale x 2 x double> @llvm.aarch64.sve.tuple.get.nxv2f64.nxv8f64(<vscale x 8 x double> %tuple, i32 0)
734  ret <vscale x 2 x double> %extract
735}
736
737define <vscale x 2 x double> @test_svcreate4_f64_vec3(i1 %p, <vscale x 2 x double> %z0, <vscale x 2 x double> %z1, <vscale x 2 x double> %z2, <vscale x 2 x double> %z3) local_unnamed_addr #0 {
738; CHECK-LABEL: test_svcreate4_f64_vec3:
739; CHECK: // %L2
740; CHECK-NEXT: mov z0.d, z3.d
741; CHECK-NEXT: ret
742  %tuple = tail call <vscale x 8 x double> @llvm.aarch64.sve.tuple.create4.nxv8f64.nxv2f64(<vscale x 2 x double> %z0, <vscale x 2 x double> %z1, <vscale x 2 x double> %z2, <vscale x 2 x double> %z3)
743  br i1 %p, label %L1, label %L2
744L1:
745  ret <vscale x 2 x double> undef
746L2:
747  %extract = tail call <vscale x 2 x double> @llvm.aarch64.sve.tuple.get.nxv2f64.nxv8f64(<vscale x 8 x double> %tuple, i32 3)
748  ret <vscale x 2 x double> %extract
749}
750
751attributes #0 = { nounwind "target-features"="+sve" }
752; +bf16 is required for the bfloat version.
753attributes #1 = { nounwind "target-features"="+sve,+bf16" }
754
755declare <vscale x 4 x double>  @llvm.aarch64.sve.tuple.create2.nxv4f64.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>)
756declare <vscale x 8 x float>  @llvm.aarch64.sve.tuple.create2.nxv8f32.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>)
757declare <vscale x 16 x half>  @llvm.aarch64.sve.tuple.create2.nxv16f16.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>)
758declare <vscale x 16 x bfloat>  @llvm.aarch64.sve.tuple.create2.nxv16bf16.nxv8bf16(<vscale x 8 x bfloat>, <vscale x 8 x bfloat>)
759declare <vscale x 4 x i64>  @llvm.aarch64.sve.tuple.create2.nxv4i64.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>)
760declare <vscale x 8 x i32>  @llvm.aarch64.sve.tuple.create2.nxv8i32.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>)
761declare <vscale x 16 x i16> @llvm.aarch64.sve.tuple.create2.nxv16i16.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>)
762declare <vscale x 32 x i8>  @llvm.aarch64.sve.tuple.create2.nxv32i8.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>)
763
764declare <vscale x 6 x double>  @llvm.aarch64.sve.tuple.create3.nxv6f64.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double>)
765declare <vscale x 12 x float> @llvm.aarch64.sve.tuple.create3.nxv12f32.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float>)
766declare <vscale x 24 x half> @llvm.aarch64.sve.tuple.create3.nxv24f16.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>, <vscale x 8 x half>)
767declare <vscale x 24 x bfloat> @llvm.aarch64.sve.tuple.create3.nxv24bf16.nxv8bf16(<vscale x 8 x bfloat>, <vscale x 8 x bfloat>, <vscale x 8 x bfloat>)
768declare <vscale x 6 x i64>  @llvm.aarch64.sve.tuple.create3.nxv6i64.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>)
769declare <vscale x 12 x i32> @llvm.aarch64.sve.tuple.create3.nxv12i32.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>)
770declare <vscale x 24 x i16> @llvm.aarch64.sve.tuple.create3.nxv24i16.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)
771declare <vscale x 48 x i8>  @llvm.aarch64.sve.tuple.create3.nxv48i8.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)
772
773declare <vscale x 8 x double>  @llvm.aarch64.sve.tuple.create4.nxv8f64.nxv2f64 (<vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double>, <vscale x 2 x double>)
774declare <vscale x 16 x float>  @llvm.aarch64.sve.tuple.create4.nxv16f32.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float>, <vscale x 4 x float>)
775declare <vscale x 32 x half>  @llvm.aarch64.sve.tuple.create4.nxv32f16.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>, <vscale x 8 x half>, <vscale x 8 x half>)
776declare <vscale x 32 x bfloat>  @llvm.aarch64.sve.tuple.create4.nxv32bf16.nxv8bf16(<vscale x 8 x bfloat>, <vscale x 8 x bfloat>, <vscale x 8 x bfloat>, <vscale x 8 x bfloat>)
777declare <vscale x  8 x i64> @llvm.aarch64.sve.tuple.create4.nxv8i64.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i64>)
778declare <vscale x 16 x i32> @llvm.aarch64.sve.tuple.create4.nxv16i32.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i32>)
779declare <vscale x 32 x i16> @llvm.aarch64.sve.tuple.create4.nxv32i16.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i16>)
780declare <vscale x 64 x i8>  @llvm.aarch64.sve.tuple.create4.nxv64i8.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i8>)
781
782declare <vscale x 16 x i8> @llvm.aarch64.sve.tuple.get.nxv16i8.nxv32i8(<vscale x 32 x i8>, i32 immarg)
783declare <vscale x 16 x i8> @llvm.aarch64.sve.tuple.get.nxv16i8.nxv48i8(<vscale x 48 x i8>, i32 immarg)
784declare <vscale x 16 x i8> @llvm.aarch64.sve.tuple.get.nxv16i8.nxv64i8(<vscale x 64 x i8>, i32 immarg)
785
786declare <vscale x 8 x i16> @llvm.aarch64.sve.tuple.get.nxv8i16.nxv16i16(<vscale x 16 x i16>, i32 immarg)
787declare <vscale x 8 x i16> @llvm.aarch64.sve.tuple.get.nxv8i16.nxv24i16(<vscale x 24 x i16>, i32 immarg)
788declare <vscale x 8 x i16> @llvm.aarch64.sve.tuple.get.nxv8i16.nxv32i16(<vscale x 32 x i16>, i32 immarg)
789
790declare <vscale x 4 x i32> @llvm.aarch64.sve.tuple.get.nxv4i32.nxv8i32(<vscale x 8 x i32>, i32 immarg)
791declare <vscale x 4 x i32> @llvm.aarch64.sve.tuple.get.nxv4i32.nxv12i32(<vscale x 12 x i32>, i32 immarg)
792declare <vscale x 4 x i32> @llvm.aarch64.sve.tuple.get.nxv4i32.nxv16i32(<vscale x 16 x i32>, i32 immarg)
793
794declare <vscale x 2 x i64> @llvm.aarch64.sve.tuple.get.nxv2i64.nxv4i64(<vscale x 4 x i64>, i32 immarg)
795declare <vscale x 2 x i64> @llvm.aarch64.sve.tuple.get.nxv2i64.nxv6i64(<vscale x 6 x i64>, i32 immarg)
796declare <vscale x 2 x i64> @llvm.aarch64.sve.tuple.get.nxv2i64.nxv8i64(<vscale x 8 x i64>, i32 immarg)
797
798declare <vscale x 8 x bfloat> @llvm.aarch64.sve.tuple.get.nxv8bf16.nxv16bf16(<vscale x 16 x bfloat>, i32 immarg)
799declare <vscale x 8 x bfloat> @llvm.aarch64.sve.tuple.get.nxv8bf16.nxv24bf16(<vscale x 24 x bfloat>, i32 immarg)
800declare <vscale x 8 x bfloat> @llvm.aarch64.sve.tuple.get.nxv8bf16.nxv32bf16(<vscale x 32 x bfloat>, i32 immarg)
801
802declare <vscale x 8 x half> @llvm.aarch64.sve.tuple.get.nxv8f16.nxv16f16(<vscale x 16 x half>, i32 immarg)
803declare <vscale x 8 x half> @llvm.aarch64.sve.tuple.get.nxv8f16.nxv24f16(<vscale x 24 x half>, i32 immarg)
804declare <vscale x 8 x half> @llvm.aarch64.sve.tuple.get.nxv8f16.nxv32f16(<vscale x 32 x half>, i32 immarg)
805
806declare <vscale x 4 x float> @llvm.aarch64.sve.tuple.get.nxv4f32.nxv8f32(<vscale x 8 x float>, i32 immarg)
807declare <vscale x 4 x float> @llvm.aarch64.sve.tuple.get.nxv4f32.nxv12f32(<vscale x 12 x float>, i32 immarg)
808declare <vscale x 4 x float> @llvm.aarch64.sve.tuple.get.nxv4f32.nxv16f32(<vscale x 16 x float>, i32 immarg)
809
810declare <vscale x 2 x double> @llvm.aarch64.sve.tuple.get.nxv2f64.nxv4f64(<vscale x 4 x double>, i32 immarg)
811declare <vscale x 2 x double> @llvm.aarch64.sve.tuple.get.nxv2f64.nxv6f64(<vscale x 6 x double>, i32 immarg)
812declare <vscale x 2 x double> @llvm.aarch64.sve.tuple.get.nxv2f64.nxv8f64(<vscale x 8 x double>, i32 immarg)
813