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 -mattr=+sme -force-streaming < %s | FileCheck %s
4 ; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE
6 target triple = "aarch64-unknown-linux-gnu"
10 define <4 x i1> @extract_subvector_v8i1(<8 x i1> %op) {
11 ; CHECK-LABEL: extract_subvector_v8i1:
13 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
14 ; CHECK-NEXT: mov z1.b, z0.b[7]
15 ; CHECK-NEXT: mov z2.b, z0.b[6]
16 ; CHECK-NEXT: mov z3.b, z0.b[5]
17 ; CHECK-NEXT: mov z0.b, z0.b[4]
18 ; CHECK-NEXT: zip1 z1.h, z2.h, z1.h
19 ; CHECK-NEXT: zip1 z0.h, z0.h, z3.h
20 ; CHECK-NEXT: zip1 z0.s, z0.s, z1.s
21 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
24 ; NONEON-NOSVE-LABEL: extract_subvector_v8i1:
25 ; NONEON-NOSVE: // %bb.0:
26 ; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!
27 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16
28 ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7]
29 ; NONEON-NOSVE-NEXT: strh w8, [sp, #14]
30 ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6]
31 ; NONEON-NOSVE-NEXT: strh w8, [sp, #12]
32 ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5]
33 ; NONEON-NOSVE-NEXT: strh w8, [sp, #10]
34 ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4]
35 ; NONEON-NOSVE-NEXT: strh w8, [sp, #8]
36 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]
37 ; NONEON-NOSVE-NEXT: add sp, sp, #16
38 ; NONEON-NOSVE-NEXT: ret
39 %ret = call <4 x i1> @llvm.vector.extract.v4i1.v8i1(<8 x i1> %op, i64 4)
45 define <4 x i8> @extract_subvector_v8i8(<8 x i8> %op) {
46 ; CHECK-LABEL: extract_subvector_v8i8:
48 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
49 ; CHECK-NEXT: mov z1.b, z0.b[7]
50 ; CHECK-NEXT: mov z2.b, z0.b[6]
51 ; CHECK-NEXT: mov z3.b, z0.b[5]
52 ; CHECK-NEXT: mov z0.b, z0.b[4]
53 ; CHECK-NEXT: zip1 z1.h, z2.h, z1.h
54 ; CHECK-NEXT: zip1 z0.h, z0.h, z3.h
55 ; CHECK-NEXT: zip1 z0.s, z0.s, z1.s
56 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
59 ; NONEON-NOSVE-LABEL: extract_subvector_v8i8:
60 ; NONEON-NOSVE: // %bb.0:
61 ; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!
62 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16
63 ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #7]
64 ; NONEON-NOSVE-NEXT: strh w8, [sp, #14]
65 ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #6]
66 ; NONEON-NOSVE-NEXT: strh w8, [sp, #12]
67 ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #5]
68 ; NONEON-NOSVE-NEXT: strh w8, [sp, #10]
69 ; NONEON-NOSVE-NEXT: ldrb w8, [sp, #4]
70 ; NONEON-NOSVE-NEXT: strh w8, [sp, #8]
71 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]
72 ; NONEON-NOSVE-NEXT: add sp, sp, #16
73 ; NONEON-NOSVE-NEXT: ret
74 %ret = call <4 x i8> @llvm.vector.extract.v4i8.v8i8(<8 x i8> %op, i64 4)
78 define <8 x i8> @extract_subvector_v16i8(<16 x i8> %op) {
79 ; CHECK-LABEL: extract_subvector_v16i8:
81 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
82 ; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8
83 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
86 ; NONEON-NOSVE-LABEL: extract_subvector_v16i8:
87 ; NONEON-NOSVE: // %bb.0:
88 ; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!
89 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16
90 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]
91 ; NONEON-NOSVE-NEXT: add sp, sp, #16
92 ; NONEON-NOSVE-NEXT: ret
93 %ret = call <8 x i8> @llvm.vector.extract.v8i8.v16i8(<16 x i8> %op, i64 8)
97 define void @extract_subvector_v32i8(ptr %a, ptr %b) {
98 ; CHECK-LABEL: extract_subvector_v32i8:
100 ; CHECK-NEXT: ldr q0, [x0, #16]
101 ; CHECK-NEXT: str q0, [x1]
104 ; NONEON-NOSVE-LABEL: extract_subvector_v32i8:
105 ; NONEON-NOSVE: // %bb.0:
106 ; NONEON-NOSVE-NEXT: ldr q0, [x0, #16]
107 ; NONEON-NOSVE-NEXT: str q0, [x1]
108 ; NONEON-NOSVE-NEXT: ret
109 %op = load <32 x i8>, ptr %a
110 %ret = call <16 x i8> @llvm.vector.extract.v16i8.v32i8(<32 x i8> %op, i64 16)
111 store <16 x i8> %ret, ptr %b
117 define <2 x i16> @extract_subvector_v4i16(<4 x i16> %op) {
118 ; CHECK-LABEL: extract_subvector_v4i16:
120 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
121 ; CHECK-NEXT: uunpklo z0.s, z0.h
122 ; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8
123 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
126 ; NONEON-NOSVE-LABEL: extract_subvector_v4i16:
127 ; NONEON-NOSVE: // %bb.0:
128 ; NONEON-NOSVE-NEXT: ushll v0.4s, v0.4h, #0
129 ; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!
130 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16
131 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]
132 ; NONEON-NOSVE-NEXT: add sp, sp, #16
133 ; NONEON-NOSVE-NEXT: ret
134 %ret = call <2 x i16> @llvm.vector.extract.v2i16.v4i16(<4 x i16> %op, i64 2)
138 define <4 x i16> @extract_subvector_v8i16(<8 x i16> %op) {
139 ; CHECK-LABEL: extract_subvector_v8i16:
141 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
142 ; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8
143 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
146 ; NONEON-NOSVE-LABEL: extract_subvector_v8i16:
147 ; NONEON-NOSVE: // %bb.0:
148 ; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!
149 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16
150 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]
151 ; NONEON-NOSVE-NEXT: add sp, sp, #16
152 ; NONEON-NOSVE-NEXT: ret
153 %ret = call <4 x i16> @llvm.vector.extract.v4i16.v8i16(<8 x i16> %op, i64 4)
157 define void @extract_subvector_v16i16(ptr %a, ptr %b) {
158 ; CHECK-LABEL: extract_subvector_v16i16:
160 ; CHECK-NEXT: ldr q0, [x0, #16]
161 ; CHECK-NEXT: str q0, [x1]
164 ; NONEON-NOSVE-LABEL: extract_subvector_v16i16:
165 ; NONEON-NOSVE: // %bb.0:
166 ; NONEON-NOSVE-NEXT: ldr q0, [x0, #16]
167 ; NONEON-NOSVE-NEXT: str q0, [x1]
168 ; NONEON-NOSVE-NEXT: ret
169 %op = load <16 x i16>, ptr %a
170 %ret = call <8 x i16> @llvm.vector.extract.v8i16.v16i16(<16 x i16> %op, i64 8)
171 store <8 x i16> %ret, ptr %b
177 define <1 x i32> @extract_subvector_v2i32(<2 x i32> %op) {
178 ; CHECK-LABEL: extract_subvector_v2i32:
180 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
181 ; CHECK-NEXT: mov z0.s, z0.s[1]
182 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
185 ; NONEON-NOSVE-LABEL: extract_subvector_v2i32:
186 ; NONEON-NOSVE: // %bb.0:
187 ; NONEON-NOSVE-NEXT: sub sp, sp, #16
188 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16
189 ; NONEON-NOSVE-NEXT: str d0, [sp, #8]
190 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #12]
191 ; NONEON-NOSVE-NEXT: str w8, [sp]
192 ; NONEON-NOSVE-NEXT: ldr d0, [sp], #16
193 ; NONEON-NOSVE-NEXT: ret
194 %ret = call <1 x i32> @llvm.vector.extract.v1i32.v2i32(<2 x i32> %op, i64 1)
198 define <2 x i32> @extract_subvector_v4i32(<4 x i32> %op) {
199 ; CHECK-LABEL: extract_subvector_v4i32:
201 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
202 ; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8
203 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
206 ; NONEON-NOSVE-LABEL: extract_subvector_v4i32:
207 ; NONEON-NOSVE: // %bb.0:
208 ; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!
209 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16
210 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]
211 ; NONEON-NOSVE-NEXT: add sp, sp, #16
212 ; NONEON-NOSVE-NEXT: ret
213 %ret = call <2 x i32> @llvm.vector.extract.v2i32.v4i32(<4 x i32> %op, i64 2)
217 define void @extract_subvector_v8i32(ptr %a, ptr %b) {
218 ; CHECK-LABEL: extract_subvector_v8i32:
220 ; CHECK-NEXT: ldr q0, [x0, #16]
221 ; CHECK-NEXT: str q0, [x1]
224 ; NONEON-NOSVE-LABEL: extract_subvector_v8i32:
225 ; NONEON-NOSVE: // %bb.0:
226 ; NONEON-NOSVE-NEXT: ldr q0, [x0, #16]
227 ; NONEON-NOSVE-NEXT: str q0, [x1]
228 ; NONEON-NOSVE-NEXT: ret
229 %op = load <8 x i32>, ptr %a
230 %ret = call <4 x i32> @llvm.vector.extract.v4i32.v8i32(<8 x i32> %op, i64 4)
231 store <4 x i32> %ret, ptr %b
237 define <1 x i64> @extract_subvector_v2i64(<2 x i64> %op) {
238 ; CHECK-LABEL: extract_subvector_v2i64:
240 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
241 ; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8
242 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
245 ; NONEON-NOSVE-LABEL: extract_subvector_v2i64:
246 ; NONEON-NOSVE: // %bb.0:
247 ; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!
248 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16
249 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]
250 ; NONEON-NOSVE-NEXT: add sp, sp, #16
251 ; NONEON-NOSVE-NEXT: ret
252 %ret = call <1 x i64> @llvm.vector.extract.v1i64.v2i64(<2 x i64> %op, i64 1)
256 define void @extract_subvector_v4i64(ptr %a, ptr %b) {
257 ; CHECK-LABEL: extract_subvector_v4i64:
259 ; CHECK-NEXT: ldr q0, [x0, #16]
260 ; CHECK-NEXT: str q0, [x1]
263 ; NONEON-NOSVE-LABEL: extract_subvector_v4i64:
264 ; NONEON-NOSVE: // %bb.0:
265 ; NONEON-NOSVE-NEXT: ldr q0, [x0, #16]
266 ; NONEON-NOSVE-NEXT: str q0, [x1]
267 ; NONEON-NOSVE-NEXT: ret
268 %op = load <4 x i64>, ptr %a
269 %ret = call <2 x i64> @llvm.vector.extract.v2i64.v4i64(<4 x i64> %op, i64 2)
270 store <2 x i64> %ret, ptr %b
276 define <2 x half> @extract_subvector_v4f16(<4 x half> %op) {
277 ; CHECK-LABEL: extract_subvector_v4f16:
279 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
280 ; CHECK-NEXT: mov z0.s, z0.s[1]
281 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
284 ; NONEON-NOSVE-LABEL: extract_subvector_v4f16:
285 ; NONEON-NOSVE: // %bb.0:
286 ; NONEON-NOSVE-NEXT: str d0, [sp, #-16]!
287 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16
288 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #4]
289 ; NONEON-NOSVE-NEXT: str w8, [sp, #8]
290 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]
291 ; NONEON-NOSVE-NEXT: add sp, sp, #16
292 ; NONEON-NOSVE-NEXT: ret
293 %ret = call <2 x half> @llvm.vector.extract.v2f16.v4f16(<4 x half> %op, i64 2)
297 define <4 x half> @extract_subvector_v8f16(<8 x half> %op) {
298 ; CHECK-LABEL: extract_subvector_v8f16:
300 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
301 ; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8
302 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
305 ; NONEON-NOSVE-LABEL: extract_subvector_v8f16:
306 ; NONEON-NOSVE: // %bb.0:
307 ; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!
308 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16
309 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]
310 ; NONEON-NOSVE-NEXT: add sp, sp, #16
311 ; NONEON-NOSVE-NEXT: ret
312 %ret = call <4 x half> @llvm.vector.extract.v4f16.v8f16(<8 x half> %op, i64 4)
316 define void @extract_subvector_v16f16(ptr %a, ptr %b) {
317 ; CHECK-LABEL: extract_subvector_v16f16:
319 ; CHECK-NEXT: ldr q0, [x0, #16]
320 ; CHECK-NEXT: str q0, [x1]
323 ; NONEON-NOSVE-LABEL: extract_subvector_v16f16:
324 ; NONEON-NOSVE: // %bb.0:
325 ; NONEON-NOSVE-NEXT: ldr q0, [x0, #16]
326 ; NONEON-NOSVE-NEXT: str q0, [x1]
327 ; NONEON-NOSVE-NEXT: ret
328 %op = load <16 x half>, ptr %a
329 %ret = call <8 x half> @llvm.vector.extract.v8f16.v16f16(<16 x half> %op, i64 8)
330 store <8 x half> %ret, ptr %b
336 define <1 x float> @extract_subvector_v2f32(<2 x float> %op) {
337 ; CHECK-LABEL: extract_subvector_v2f32:
339 ; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0
340 ; CHECK-NEXT: mov z0.s, z0.s[1]
341 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
344 ; NONEON-NOSVE-LABEL: extract_subvector_v2f32:
345 ; NONEON-NOSVE: // %bb.0:
346 ; NONEON-NOSVE-NEXT: sub sp, sp, #16
347 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16
348 ; NONEON-NOSVE-NEXT: str d0, [sp, #8]
349 ; NONEON-NOSVE-NEXT: ldr w8, [sp, #12]
350 ; NONEON-NOSVE-NEXT: str w8, [sp]
351 ; NONEON-NOSVE-NEXT: ldr d0, [sp], #16
352 ; NONEON-NOSVE-NEXT: ret
353 %ret = call <1 x float> @llvm.vector.extract.v1f32.v2f32(<2 x float> %op, i64 1)
357 define <2 x float> @extract_subvector_v4f32(<4 x float> %op) {
358 ; CHECK-LABEL: extract_subvector_v4f32:
360 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
361 ; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8
362 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
365 ; NONEON-NOSVE-LABEL: extract_subvector_v4f32:
366 ; NONEON-NOSVE: // %bb.0:
367 ; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!
368 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16
369 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]
370 ; NONEON-NOSVE-NEXT: add sp, sp, #16
371 ; NONEON-NOSVE-NEXT: ret
372 %ret = call <2 x float> @llvm.vector.extract.v2f32.v4f32(<4 x float> %op, i64 2)
376 define void @extract_subvector_v8f32(ptr %a, ptr %b) {
377 ; CHECK-LABEL: extract_subvector_v8f32:
379 ; CHECK-NEXT: ldr q0, [x0, #16]
380 ; CHECK-NEXT: str q0, [x1]
383 ; NONEON-NOSVE-LABEL: extract_subvector_v8f32:
384 ; NONEON-NOSVE: // %bb.0:
385 ; NONEON-NOSVE-NEXT: ldr q0, [x0, #16]
386 ; NONEON-NOSVE-NEXT: str q0, [x1]
387 ; NONEON-NOSVE-NEXT: ret
388 %op = load <8 x float>, ptr %a
389 %ret = call <4 x float> @llvm.vector.extract.v4f32.v8f32(<8 x float> %op, i64 4)
390 store <4 x float> %ret, ptr %b
396 define <1 x double> @extract_subvector_v2f64(<2 x double> %op) {
397 ; CHECK-LABEL: extract_subvector_v2f64:
399 ; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0
400 ; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8
401 ; CHECK-NEXT: // kill: def $d0 killed $d0 killed $z0
404 ; NONEON-NOSVE-LABEL: extract_subvector_v2f64:
405 ; NONEON-NOSVE: // %bb.0:
406 ; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!
407 ; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16
408 ; NONEON-NOSVE-NEXT: ldr d0, [sp, #8]
409 ; NONEON-NOSVE-NEXT: add sp, sp, #16
410 ; NONEON-NOSVE-NEXT: ret
411 %ret = call <1 x double> @llvm.vector.extract.v1f64.v2f64(<2 x double> %op, i64 1)
412 ret <1 x double> %ret
415 define void @extract_subvector_v4f64(ptr %a, ptr %b) {
416 ; CHECK-LABEL: extract_subvector_v4f64:
418 ; CHECK-NEXT: ldr q0, [x0, #16]
419 ; CHECK-NEXT: str q0, [x1]
422 ; NONEON-NOSVE-LABEL: extract_subvector_v4f64:
423 ; NONEON-NOSVE: // %bb.0:
424 ; NONEON-NOSVE-NEXT: ldr q0, [x0, #16]
425 ; NONEON-NOSVE-NEXT: str q0, [x1]
426 ; NONEON-NOSVE-NEXT: ret
427 %op = load <4 x double>, ptr %a
428 %ret = call <2 x double> @llvm.vector.extract.v2f64.v4f64(<4 x double> %op, i64 2)
429 store <2 x double> %ret, ptr %b
433 declare <4 x i1> @llvm.vector.extract.v4i1.v8i1(<8 x i1>, i64)
435 declare <4 x i8> @llvm.vector.extract.v4i8.v8i8(<8 x i8>, i64)
436 declare <8 x i8> @llvm.vector.extract.v8i8.v16i8(<16 x i8>, i64)
437 declare <16 x i8> @llvm.vector.extract.v16i8.v32i8(<32 x i8>, i64)
438 declare <32 x i8> @llvm.vector.extract.v32i8.v64i8(<64 x i8>, i64)
440 declare <2 x i16> @llvm.vector.extract.v2i16.v4i16(<4 x i16>, i64)
441 declare <4 x i16> @llvm.vector.extract.v4i16.v8i16(<8 x i16>, i64)
442 declare <8 x i16> @llvm.vector.extract.v8i16.v16i16(<16 x i16>, i64)
443 declare <16 x i16> @llvm.vector.extract.v16i16.v32i16(<32 x i16>, i64)
445 declare <1 x i32> @llvm.vector.extract.v1i32.v2i32(<2 x i32>, i64)
446 declare <2 x i32> @llvm.vector.extract.v2i32.v4i32(<4 x i32>, i64)
447 declare <4 x i32> @llvm.vector.extract.v4i32.v8i32(<8 x i32>, i64)
448 declare <8 x i32> @llvm.vector.extract.v8i32.v16i32(<16 x i32>, i64)
450 declare <1 x i64> @llvm.vector.extract.v1i64.v2i64(<2 x i64>, i64)
451 declare <2 x i64> @llvm.vector.extract.v2i64.v4i64(<4 x i64>, i64)
452 declare <4 x i64> @llvm.vector.extract.v4i64.v8i64(<8 x i64>, i64)
454 declare <2 x half> @llvm.vector.extract.v2f16.v4f16(<4 x half>, i64)
455 declare <4 x half> @llvm.vector.extract.v4f16.v8f16(<8 x half>, i64)
456 declare <8 x half> @llvm.vector.extract.v8f16.v16f16(<16 x half>, i64)
457 declare <16 x half> @llvm.vector.extract.v16f16.v32f16(<32 x half>, i64)
459 declare <1 x float> @llvm.vector.extract.v1f32.v2f32(<2 x float>, i64)
460 declare <2 x float> @llvm.vector.extract.v2f32.v4f32(<4 x float>, i64)
461 declare <4 x float> @llvm.vector.extract.v4f32.v8f32(<8 x float>, i64)
462 declare <8 x float> @llvm.vector.extract.v8f32.v16f32(<16 x float>, i64)
464 declare <1 x double> @llvm.vector.extract.v1f64.v2f64(<2 x double>, i64)
465 declare <2 x double> @llvm.vector.extract.v2f64.v4f64(<4 x double>, i64)
466 declare <4 x double> @llvm.vector.extract.v4f64.v8f64(<8 x double>, i64)