[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-streaming-mode-fixed-length-extract-subvector.ll
blob35dd827bbabc55305e32686c71164f62743212fe
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"
8 ; i1
10 define <4 x i1> @extract_subvector_v8i1(<8 x i1> %op) {
11 ; CHECK-LABEL: extract_subvector_v8i1:
12 ; CHECK:       // %bb.0:
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
22 ; CHECK-NEXT:    ret
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)
40   ret <4 x i1> %ret
43 ; i8
45 define <4 x i8> @extract_subvector_v8i8(<8 x i8> %op) {
46 ; CHECK-LABEL: extract_subvector_v8i8:
47 ; CHECK:       // %bb.0:
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
57 ; CHECK-NEXT:    ret
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)
75   ret <4 x i8> %ret
78 define <8 x i8> @extract_subvector_v16i8(<16 x i8> %op) {
79 ; CHECK-LABEL: extract_subvector_v16i8:
80 ; CHECK:       // %bb.0:
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
84 ; CHECK-NEXT:    ret
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)
94   ret <8 x i8> %ret
97 define void @extract_subvector_v32i8(ptr %a, ptr %b) {
98 ; CHECK-LABEL: extract_subvector_v32i8:
99 ; CHECK:       // %bb.0:
100 ; CHECK-NEXT:    ldr q0, [x0, #16]
101 ; CHECK-NEXT:    str q0, [x1]
102 ; CHECK-NEXT:    ret
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
112   ret void
115 ; i16
117 define <2 x i16> @extract_subvector_v4i16(<4 x i16> %op) {
118 ; CHECK-LABEL: extract_subvector_v4i16:
119 ; CHECK:       // %bb.0:
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
124 ; CHECK-NEXT:    ret
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)
135   ret <2 x i16> %ret
138 define <4 x i16> @extract_subvector_v8i16(<8 x i16> %op) {
139 ; CHECK-LABEL: extract_subvector_v8i16:
140 ; CHECK:       // %bb.0:
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
144 ; CHECK-NEXT:    ret
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)
154   ret <4 x i16> %ret
157 define void @extract_subvector_v16i16(ptr %a, ptr %b) {
158 ; CHECK-LABEL: extract_subvector_v16i16:
159 ; CHECK:       // %bb.0:
160 ; CHECK-NEXT:    ldr q0, [x0, #16]
161 ; CHECK-NEXT:    str q0, [x1]
162 ; CHECK-NEXT:    ret
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
172   ret void
175 ; i32
177 define <1 x i32> @extract_subvector_v2i32(<2 x i32> %op) {
178 ; CHECK-LABEL: extract_subvector_v2i32:
179 ; CHECK:       // %bb.0:
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
183 ; CHECK-NEXT:    ret
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)
195   ret <1 x i32> %ret
198 define <2 x i32> @extract_subvector_v4i32(<4 x i32> %op) {
199 ; CHECK-LABEL: extract_subvector_v4i32:
200 ; CHECK:       // %bb.0:
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
204 ; CHECK-NEXT:    ret
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)
214   ret <2 x i32> %ret
217 define void @extract_subvector_v8i32(ptr %a, ptr %b) {
218 ; CHECK-LABEL: extract_subvector_v8i32:
219 ; CHECK:       // %bb.0:
220 ; CHECK-NEXT:    ldr q0, [x0, #16]
221 ; CHECK-NEXT:    str q0, [x1]
222 ; CHECK-NEXT:    ret
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
232   ret void
235 ; i64
237 define <1 x i64> @extract_subvector_v2i64(<2 x i64> %op) {
238 ; CHECK-LABEL: extract_subvector_v2i64:
239 ; CHECK:       // %bb.0:
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
243 ; CHECK-NEXT:    ret
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)
253   ret <1 x i64> %ret
256 define void @extract_subvector_v4i64(ptr %a, ptr %b) {
257 ; CHECK-LABEL: extract_subvector_v4i64:
258 ; CHECK:       // %bb.0:
259 ; CHECK-NEXT:    ldr q0, [x0, #16]
260 ; CHECK-NEXT:    str q0, [x1]
261 ; CHECK-NEXT:    ret
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
271   ret void
274 ; f16
276 define <2 x half> @extract_subvector_v4f16(<4 x half> %op) {
277 ; CHECK-LABEL: extract_subvector_v4f16:
278 ; CHECK:       // %bb.0:
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
282 ; CHECK-NEXT:    ret
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)
294   ret <2 x half> %ret
297 define <4 x half> @extract_subvector_v8f16(<8 x half> %op) {
298 ; CHECK-LABEL: extract_subvector_v8f16:
299 ; CHECK:       // %bb.0:
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
303 ; CHECK-NEXT:    ret
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)
313   ret <4 x half> %ret
316 define void @extract_subvector_v16f16(ptr %a, ptr %b) {
317 ; CHECK-LABEL: extract_subvector_v16f16:
318 ; CHECK:       // %bb.0:
319 ; CHECK-NEXT:    ldr q0, [x0, #16]
320 ; CHECK-NEXT:    str q0, [x1]
321 ; CHECK-NEXT:    ret
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
331   ret void
334 ; f32
336 define <1 x float> @extract_subvector_v2f32(<2 x float> %op) {
337 ; CHECK-LABEL: extract_subvector_v2f32:
338 ; CHECK:       // %bb.0:
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
342 ; CHECK-NEXT:    ret
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)
354   ret <1 x float> %ret
357 define <2 x float> @extract_subvector_v4f32(<4 x float> %op) {
358 ; CHECK-LABEL: extract_subvector_v4f32:
359 ; CHECK:       // %bb.0:
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
363 ; CHECK-NEXT:    ret
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)
373   ret <2 x float> %ret
376 define void @extract_subvector_v8f32(ptr %a, ptr %b) {
377 ; CHECK-LABEL: extract_subvector_v8f32:
378 ; CHECK:       // %bb.0:
379 ; CHECK-NEXT:    ldr q0, [x0, #16]
380 ; CHECK-NEXT:    str q0, [x1]
381 ; CHECK-NEXT:    ret
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
391   ret void
394 ; f64
396 define <1 x double> @extract_subvector_v2f64(<2 x double> %op) {
397 ; CHECK-LABEL: extract_subvector_v2f64:
398 ; CHECK:       // %bb.0:
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
402 ; CHECK-NEXT:    ret
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:
417 ; CHECK:       // %bb.0:
418 ; CHECK-NEXT:    ldr q0, [x0, #16]
419 ; CHECK-NEXT:    str q0, [x1]
420 ; CHECK-NEXT:    ret
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
430   ret void
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)