[Xtensa] Implement Windowed Register Option. (#124656)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / neon-insert-sve-elt.ll
blob0f4eec4fdfda1b5d4bd5076fe5880c1606b75739
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2 ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve,+neon < %s | FileCheck %s
4 ; Inserting an element from the bottom 128-bits of an SVE type into a NEON vector should use INS (element) to
5 ; avoid pointless FMOV trips.
7 ; --------- extraction from nxv16i8
9 define <8 x i8> @test_lane0_nxv16i8(<8 x i8> %a, <vscale x 16 x i8> %b) {
10 ; CHECK-LABEL: test_lane0_nxv16i8:
11 ; CHECK:       // %bb.0:
12 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
13 ; CHECK-NEXT:    mov v0.b[0], v1.b[0]
14 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
15 ; CHECK-NEXT:    ret
16     %c = extractelement <vscale x 16 x i8> %b, i32 0
17     %d = insertelement <8 x i8> %a, i8 %c, i32 0
18     ret <8 x i8> %d
21 define <8 x i8> @test_lane15_nxv16i8(<8 x i8> %a, <vscale x 16 x i8> %b) {
22 ; CHECK-LABEL: test_lane15_nxv16i8:
23 ; CHECK:       // %bb.0:
24 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
25 ; CHECK-NEXT:    mov v0.b[7], v1.b[15]
26 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
27 ; CHECK-NEXT:    ret
28     %c = extractelement <vscale x 16 x i8> %b, i32 15
29     %d = insertelement <8 x i8> %a, i8 %c, i32 7
30     ret <8 x i8> %d
33 define <16 x i8> @test_q_lane0_nxv16i8(<16 x i8> %a, <vscale x 16 x i8> %b) {
34 ; CHECK-LABEL: test_q_lane0_nxv16i8:
35 ; CHECK:       // %bb.0:
36 ; CHECK-NEXT:    mov v0.b[0], v1.b[0]
37 ; CHECK-NEXT:    ret
38     %c = extractelement <vscale x 16 x i8> %b, i32 0
39     %d = insertelement <16 x i8> %a, i8 %c, i32 0
40     ret <16 x i8> %d
43 define <16 x i8> @test_q_lane15_nxv16i8(<16 x i8> %a, <vscale x 16 x i8> %b) {
44 ; CHECK-LABEL: test_q_lane15_nxv16i8:
45 ; CHECK:       // %bb.0:
46 ; CHECK-NEXT:    mov v0.b[15], v1.b[15]
47 ; CHECK-NEXT:    ret
48     %c = extractelement <vscale x 16 x i8> %b, i32 15
49     %d = insertelement <16 x i8> %a, i8 %c, i32 15
50     ret <16 x i8> %d
53 ; (negative test) Extracted element is not within Vn
54 define <16 x i8> @test_q_lane16_nxv16i8(<16 x i8> %a, <vscale x 16 x i8> %b) {
55 ; CHECK-LABEL: test_q_lane16_nxv16i8:
56 ; CHECK:       // %bb.0:
57 ; CHECK-NEXT:    mov z1.b, z1.b[16]
58 ; CHECK-NEXT:    fmov w8, s1
59 ; CHECK-NEXT:    mov v0.b[15], w8
60 ; CHECK-NEXT:    ret
61     %c = extractelement <vscale x 16 x i8> %b, i32 16
62     %d = insertelement <16 x i8> %a, i8 %c, i32 15
63     ret <16 x i8> %d
66 ; --------- extraction from nxv8f16
68 define <4 x half> @test_lane0_nxv8f16(<4 x half> %a, <vscale x 8 x half> %b) {
69 ; CHECK-LABEL: test_lane0_nxv8f16:
70 ; CHECK:       // %bb.0:
71 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
72 ; CHECK-NEXT:    mov v0.h[0], v1.h[0]
73 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
74 ; CHECK-NEXT:    ret
75     %c = extractelement <vscale x 8 x half> %b, i32 0
76     %d = insertelement <4 x half> %a, half %c, i32 0
77     ret <4 x half> %d
80 define <4 x half> @test_lane7_nxv8f16(<4 x half> %a, <vscale x 8 x half> %b) {
81 ; CHECK-LABEL: test_lane7_nxv8f16:
82 ; CHECK:       // %bb.0:
83 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
84 ; CHECK-NEXT:    mov v0.h[3], v1.h[7]
85 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
86 ; CHECK-NEXT:    ret
87     %c = extractelement <vscale x 8 x half> %b, i32 7
88     %d = insertelement <4 x half> %a, half %c, i32 3
89     ret <4 x half> %d
92 define <8 x half> @test_q_lane0_nxv8f16(<8 x half> %a, <vscale x 8 x half> %b) {
93 ; CHECK-LABEL: test_q_lane0_nxv8f16:
94 ; CHECK:       // %bb.0:
95 ; CHECK-NEXT:    mov v0.h[0], v1.h[0]
96 ; CHECK-NEXT:    ret
97     %c = extractelement <vscale x 8 x half> %b, i32 0
98     %d = insertelement <8 x half> %a, half %c, i32 0
99     ret <8 x half> %d
102 define <8 x half> @test_q_lane7_nxv8f16(<8 x half> %a, <vscale x 8 x half> %b) {
103 ; CHECK-LABEL: test_q_lane7_nxv8f16:
104 ; CHECK:       // %bb.0:
105 ; CHECK-NEXT:    mov v0.h[7], v1.h[7]
106 ; CHECK-NEXT:    ret
107     %c = extractelement <vscale x 8 x half> %b, i32 7
108     %d = insertelement <8 x half> %a, half %c, i32 7
109     ret <8 x half> %d
112 ; (negative test) Extracted element is not within Vn
113 define <8 x half> @test_q_lane8_nxv8f16(<8 x half> %a, <vscale x 8 x half> %b) {
114 ; CHECK-LABEL: test_q_lane8_nxv8f16:
115 ; CHECK:       // %bb.0:
116 ; CHECK-NEXT:    mov z1.h, z1.h[8]
117 ; CHECK-NEXT:    mov v0.h[7], v1.h[0]
118 ; CHECK-NEXT:    ret
119     %c = extractelement <vscale x 8 x half> %b, i32 8
120     %d = insertelement <8 x half> %a, half %c, i32 7
121     ret <8 x half> %d
124 ; --------- extraction from nxv8bf16
126 define <4 x bfloat> @test_lane0_nxv8bf16(<4 x bfloat> %a, <vscale x 8 x bfloat> %b) {
127 ; CHECK-LABEL: test_lane0_nxv8bf16:
128 ; CHECK:       // %bb.0:
129 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
130 ; CHECK-NEXT:    mov v0.h[0], v1.h[0]
131 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
132 ; CHECK-NEXT:    ret
133     %c = extractelement <vscale x 8 x bfloat> %b, i32 0
134     %d = insertelement <4 x bfloat> %a, bfloat %c, i32 0
135     ret <4 x bfloat> %d
138 define <4 x bfloat> @test_lane7_nxv8bf16(<4 x bfloat> %a, <vscale x 8 x bfloat> %b) {
139 ; CHECK-LABEL: test_lane7_nxv8bf16:
140 ; CHECK:       // %bb.0:
141 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
142 ; CHECK-NEXT:    mov v0.h[3], v1.h[7]
143 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
144 ; CHECK-NEXT:    ret
145     %c = extractelement <vscale x 8 x bfloat> %b, i32 7
146     %d = insertelement <4 x bfloat> %a, bfloat %c, i32 3
147     ret <4 x bfloat> %d
150 define <8 x bfloat> @test_q_lane0_nxv8bf16(<8 x bfloat> %a, <vscale x 8 x bfloat> %b) {
151 ; CHECK-LABEL: test_q_lane0_nxv8bf16:
152 ; CHECK:       // %bb.0:
153 ; CHECK-NEXT:    mov v0.h[0], v1.h[0]
154 ; CHECK-NEXT:    ret
155     %c = extractelement <vscale x 8 x bfloat> %b, i32 0
156     %d = insertelement <8 x bfloat> %a, bfloat %c, i32 0
157     ret <8 x bfloat> %d
160 define <8 x bfloat> @test_q_lane7_nxv8bf16(<8 x bfloat> %a, <vscale x 8 x bfloat> %b) {
161 ; CHECK-LABEL: test_q_lane7_nxv8bf16:
162 ; CHECK:       // %bb.0:
163 ; CHECK-NEXT:    mov v0.h[7], v1.h[7]
164 ; CHECK-NEXT:    ret
165     %c = extractelement <vscale x 8 x bfloat> %b, i32 7
166     %d = insertelement <8 x bfloat> %a, bfloat %c, i32 7
167     ret <8 x bfloat> %d
170 ; (negative test) Extracted element is not within Vn
171 define <8 x bfloat> @test_q_lane8_nxv8bf16(<8 x bfloat> %a, <vscale x 8 x bfloat> %b) {
172 ; CHECK-LABEL: test_q_lane8_nxv8bf16:
173 ; CHECK:       // %bb.0:
174 ; CHECK-NEXT:    mov z1.h, z1.h[8]
175 ; CHECK-NEXT:    mov v0.h[7], v1.h[0]
176 ; CHECK-NEXT:    ret
177     %c = extractelement <vscale x 8 x bfloat> %b, i32 8
178     %d = insertelement <8 x bfloat> %a, bfloat %c, i32 7
179     ret <8 x bfloat> %d
182 ; --------- extraction from nxv8i16
184 define <4 x i16> @test_lane0_nxv8i16(<4 x i16> %a, <vscale x 8 x i16> %b) {
185 ; CHECK-LABEL: test_lane0_nxv8i16:
186 ; CHECK:       // %bb.0:
187 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
188 ; CHECK-NEXT:    mov v0.h[0], v1.h[0]
189 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
190 ; CHECK-NEXT:    ret
191     %c = extractelement <vscale x 8 x i16> %b, i32 0
192     %d = insertelement <4 x i16> %a, i16 %c, i32 0
193     ret <4 x i16> %d
196 define <4 x i16> @test_lane7_nxv8i16(<4 x i16> %a, <vscale x 8 x i16> %b) {
197 ; CHECK-LABEL: test_lane7_nxv8i16:
198 ; CHECK:       // %bb.0:
199 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
200 ; CHECK-NEXT:    mov v0.h[3], v1.h[7]
201 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
202 ; CHECK-NEXT:    ret
203     %c = extractelement <vscale x 8 x i16> %b, i32 7
204     %d = insertelement <4 x i16> %a, i16 %c, i32 3
205     ret <4 x i16> %d
208 define <8 x i16> @test_q_lane0_nxv8i16(<8 x i16> %a, <vscale x 8 x i16> %b) {
209 ; CHECK-LABEL: test_q_lane0_nxv8i16:
210 ; CHECK:       // %bb.0:
211 ; CHECK-NEXT:    mov v0.h[0], v1.h[0]
212 ; CHECK-NEXT:    ret
213     %c = extractelement <vscale x 8 x i16> %b, i32 0
214     %d = insertelement <8 x i16> %a, i16 %c, i32 0
215     ret <8 x i16> %d
218 define <8 x i16> @test_q_lane7_nxv8i16(<8 x i16> %a, <vscale x 8 x i16> %b) {
219 ; CHECK-LABEL: test_q_lane7_nxv8i16:
220 ; CHECK:       // %bb.0:
221 ; CHECK-NEXT:    mov v0.h[7], v1.h[7]
222 ; CHECK-NEXT:    ret
223     %c = extractelement <vscale x 8 x i16> %b, i32 7
224     %d = insertelement <8 x i16> %a, i16 %c, i32 7
225     ret <8 x i16> %d
228 ; (negative test) Extracted element is not within Vn
229 define <8 x i16> @test_q_lane8_nxv8i16(<8 x i16> %a, <vscale x 8 x i16> %b) {
230 ; CHECK-LABEL: test_q_lane8_nxv8i16:
231 ; CHECK:       // %bb.0:
232 ; CHECK-NEXT:    mov z1.h, z1.h[8]
233 ; CHECK-NEXT:    fmov w8, s1
234 ; CHECK-NEXT:    mov v0.h[7], w8
235 ; CHECK-NEXT:    ret
236     %c = extractelement <vscale x 8 x i16> %b, i32 8
237     %d = insertelement <8 x i16> %a, i16 %c, i32 7
238     ret <8 x i16> %d
241 ; --------- extraction from nxv4f32
243 define <2 x float> @test_lane0_nxv4f32(<2 x float> %a, <vscale x 4 x float> %b) {
244 ; CHECK-LABEL: test_lane0_nxv4f32:
245 ; CHECK:       // %bb.0:
246 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
247 ; CHECK-NEXT:    mov v0.s[0], v1.s[0]
248 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
249 ; CHECK-NEXT:    ret
250     %c = extractelement <vscale x 4 x float> %b, i32 0
251     %d = insertelement <2 x float> %a, float %c, i32 0
252     ret <2 x float> %d
255 define <2 x float> @test_lane3_nxv4f32(<2 x float> %a, <vscale x 4 x float> %b) {
256 ; CHECK-LABEL: test_lane3_nxv4f32:
257 ; CHECK:       // %bb.0:
258 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
259 ; CHECK-NEXT:    mov v0.s[1], v1.s[3]
260 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
261 ; CHECK-NEXT:    ret
262     %c = extractelement <vscale x 4 x float> %b, i32 3
263     %d = insertelement <2 x float> %a, float %c, i32 1
264     ret <2 x float> %d
267 define <4 x float> @test_q_lane0_nxv4f32(<4 x float> %a, <vscale x 4 x float> %b) {
268 ; CHECK-LABEL: test_q_lane0_nxv4f32:
269 ; CHECK:       // %bb.0:
270 ; CHECK-NEXT:    mov v0.s[0], v1.s[0]
271 ; CHECK-NEXT:    ret
272     %c = extractelement <vscale x 4 x float> %b, i32 0
273     %d = insertelement <4 x float> %a, float %c, i32 0
274     ret <4 x float> %d
277 define <4 x float> @test_q_lane3_nxv4f32(<4 x float> %a, <vscale x 4 x float> %b) {
278 ; CHECK-LABEL: test_q_lane3_nxv4f32:
279 ; CHECK:       // %bb.0:
280 ; CHECK-NEXT:    mov v0.s[3], v1.s[3]
281 ; CHECK-NEXT:    ret
282     %c = extractelement <vscale x 4 x float> %b, i32 3
283     %d = insertelement <4 x float> %a, float %c, i32 3
284     ret <4 x float> %d
287 ; (negative test) Extracted element is not within Vn
288 define <4 x float> @test_q_lane4_nxv4f32(<4 x float> %a, <vscale x 4 x float> %b) {
289 ; CHECK-LABEL: test_q_lane4_nxv4f32:
290 ; CHECK:       // %bb.0:
291 ; CHECK-NEXT:    mov z1.s, z1.s[4]
292 ; CHECK-NEXT:    mov v0.s[3], v1.s[0]
293 ; CHECK-NEXT:    ret
294     %c = extractelement <vscale x 4 x float> %b, i32 4
295     %d = insertelement <4 x float> %a, float %c, i32 3
296     ret <4 x float> %d
299 ; --------- extraction from nxv4i32
301 define <2 x i32> @test_lane0_nxv4i32(<2 x i32> %a, <vscale x 4 x i32> %b) {
302 ; CHECK-LABEL: test_lane0_nxv4i32:
303 ; CHECK:       // %bb.0:
304 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
305 ; CHECK-NEXT:    mov v0.s[0], v1.s[0]
306 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
307 ; CHECK-NEXT:    ret
308     %c = extractelement <vscale x 4 x i32> %b, i32 0
309     %d = insertelement <2 x i32> %a, i32 %c, i32 0
310     ret <2 x i32> %d
313 define <2 x i32> @test_lane3_nxv4i32(<2 x i32> %a, <vscale x 4 x i32> %b) {
314 ; CHECK-LABEL: test_lane3_nxv4i32:
315 ; CHECK:       // %bb.0:
316 ; CHECK-NEXT:    // kill: def $d0 killed $d0 def $q0
317 ; CHECK-NEXT:    mov v0.s[1], v1.s[3]
318 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
319 ; CHECK-NEXT:    ret
320     %c = extractelement <vscale x 4 x i32> %b, i32 3
321     %d = insertelement <2 x i32> %a, i32 %c, i32 1
322     ret <2 x i32> %d
325 define <4 x i32> @test_q_lane0_nxv4i32(<4 x i32> %a, <vscale x 4 x i32> %b) {
326 ; CHECK-LABEL: test_q_lane0_nxv4i32:
327 ; CHECK:       // %bb.0:
328 ; CHECK-NEXT:    mov v0.s[0], v1.s[0]
329 ; CHECK-NEXT:    ret
330     %c = extractelement <vscale x 4 x i32> %b, i32 0
331     %d = insertelement <4 x i32> %a, i32 %c, i32 0
332     ret <4 x i32> %d
335 define <4 x i32> @test_q_lane3_nxv4i32(<4 x i32> %a, <vscale x 4 x i32> %b) {
336 ; CHECK-LABEL: test_q_lane3_nxv4i32:
337 ; CHECK:       // %bb.0:
338 ; CHECK-NEXT:    mov v0.s[3], v1.s[3]
339 ; CHECK-NEXT:    ret
340     %c = extractelement <vscale x 4 x i32> %b, i32 3
341     %d = insertelement <4 x i32> %a, i32 %c, i32 3
342     ret <4 x i32> %d
345 ; (negative test) Extracted element is not within Vn
346 define <4 x i32> @test_q_lane4_nxv4i32(<4 x i32> %a, <vscale x 4 x i32> %b) {
347 ; CHECK-LABEL: test_q_lane4_nxv4i32:
348 ; CHECK:       // %bb.0:
349 ; CHECK-NEXT:    mov z1.s, z1.s[4]
350 ; CHECK-NEXT:    fmov w8, s1
351 ; CHECK-NEXT:    mov v0.s[3], w8
352 ; CHECK-NEXT:    ret
353     %c = extractelement <vscale x 4 x i32> %b, i32 4
354     %d = insertelement <4 x i32> %a, i32 %c, i32 3
355     ret <4 x i32> %d
358 ; --------- extraction from nxv2f64
360 define <1 x double> @test_lane0_nxv2f64(<1 x double> %a, <vscale x 2 x double> %b) {
361 ; CHECK-LABEL: test_lane0_nxv2f64:
362 ; CHECK:       // %bb.0:
363 ; CHECK-NEXT:    mov v0.d[0], v1.d[0]
364 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
365 ; CHECK-NEXT:    ret
366     %c = extractelement <vscale x 2 x double> %b, i32 0
367     %d = insertelement <1 x double> %a, double %c, i32 0
368     ret <1 x double> %d
371 define <1 x double> @test_lane1_nxv2f64(<1 x double> %a, <vscale x 2 x double> %b) {
372 ; CHECK-LABEL: test_lane1_nxv2f64:
373 ; CHECK:       // %bb.0:
374 ; CHECK-NEXT:    mov v0.d[0], v1.d[1]
375 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
376 ; CHECK-NEXT:    ret
377     %c = extractelement <vscale x 2 x double> %b, i32 1
378     %d = insertelement <1 x double> %a, double %c, i32 0
379     ret <1 x double> %d
382 define <2 x double> @test_q_lane0_nxv2f64(<2 x double> %a, <vscale x 2 x double> %b) {
383 ; CHECK-LABEL: test_q_lane0_nxv2f64:
384 ; CHECK:       // %bb.0:
385 ; CHECK-NEXT:    mov v0.d[0], v1.d[0]
386 ; CHECK-NEXT:    ret
387     %c = extractelement <vscale x 2 x double> %b, i32 0
388     %d = insertelement <2 x double> %a, double %c, i32 0
389     ret <2 x double> %d
392 define <2 x double> @test_q_lane1_nxv2f64(<2 x double> %a, <vscale x 2 x double> %b) {
393 ; CHECK-LABEL: test_q_lane1_nxv2f64:
394 ; CHECK:       // %bb.0:
395 ; CHECK-NEXT:    mov v0.d[1], v1.d[1]
396 ; CHECK-NEXT:    ret
397     %c = extractelement <vscale x 2 x double> %b, i32 1
398     %d = insertelement <2 x double> %a, double %c, i32 1
399     ret <2 x double> %d
402 ; (negative test) Extracted element is not within Vn
403 define <2 x double> @test_q_lane2_nxv2f64(<2 x double> %a, <vscale x 2 x double> %b) {
404 ; CHECK-LABEL: test_q_lane2_nxv2f64:
405 ; CHECK:       // %bb.0:
406 ; CHECK-NEXT:    mov z1.d, z1.d[2]
407 ; CHECK-NEXT:    mov v0.d[1], v1.d[0]
408 ; CHECK-NEXT:    ret
409     %c = extractelement <vscale x 2 x double> %b, i32 2
410     %d = insertelement <2 x double> %a, double %c, i32 1
411     ret <2 x double> %d
414 ; --------- extraction from nxv2i64
416 define <1 x i64> @test_lane0_nxv2i64(<1 x i64> %a, <vscale x 2 x i64> %b) {
417 ; CHECK-LABEL: test_lane0_nxv2i64:
418 ; CHECK:       // %bb.0:
419 ; CHECK-NEXT:    mov v0.d[0], v1.d[0]
420 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
421 ; CHECK-NEXT:    ret
422     %c = extractelement <vscale x 2 x i64> %b, i32 0
423     %d = insertelement <1 x i64> %a, i64 %c, i32 0
424     ret <1 x i64> %d
427 define <1 x i64> @test_lane1_nxv2i64(<1 x i64> %a, <vscale x 2 x i64> %b) {
428 ; CHECK-LABEL: test_lane1_nxv2i64:
429 ; CHECK:       // %bb.0:
430 ; CHECK-NEXT:    mov v0.d[0], v1.d[1]
431 ; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $q0
432 ; CHECK-NEXT:    ret
433     %c = extractelement <vscale x 2 x i64> %b, i32 1
434     %d = insertelement <1 x i64> %a, i64 %c, i32 0
435     ret <1 x i64> %d
438 define <2 x i64> @test_q_lane0_nxv2i64(<2 x i64> %a, <vscale x 2 x i64> %b) {
439 ; CHECK-LABEL: test_q_lane0_nxv2i64:
440 ; CHECK:       // %bb.0:
441 ; CHECK-NEXT:    mov v0.d[0], v1.d[0]
442 ; CHECK-NEXT:    ret
443     %c = extractelement <vscale x 2 x i64> %b, i32 0
444     %d = insertelement <2 x i64> %a, i64 %c, i32 0
445     ret <2 x i64> %d
448 define <2 x i64> @test_q_lane1_nxv2i64(<2 x i64> %a, <vscale x 2 x i64> %b) {
449 ; CHECK-LABEL: test_q_lane1_nxv2i64:
450 ; CHECK:       // %bb.0:
451 ; CHECK-NEXT:    mov v0.d[1], v1.d[1]
452 ; CHECK-NEXT:    ret
453     %c = extractelement <vscale x 2 x i64> %b, i32 1
454     %d = insertelement <2 x i64> %a, i64 %c, i32 1
455     ret <2 x i64> %d
458 ; (negative test) Extracted element is not within Vn
459 define <2 x i64> @test_q_lane2_nxv2i64(<2 x i64> %a, <vscale x 2 x i64> %b) {
460 ; CHECK-LABEL: test_q_lane2_nxv2i64:
461 ; CHECK:       // %bb.0:
462 ; CHECK-NEXT:    mov z1.d, z1.d[2]
463 ; CHECK-NEXT:    fmov x8, d1
464 ; CHECK-NEXT:    mov v0.d[1], x8
465 ; CHECK-NEXT:    ret
466     %c = extractelement <vscale x 2 x i64> %b, i32 2
467     %d = insertelement <2 x i64> %a, i64 %c, i32 1
468     ret <2 x i64> %d