Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / AArch64 / load-insert-zero.ll
blob23d545459295fc1b590ff56bb949990d5204a66f
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=aarch64 -mattr=+fullfp16,+bf16,+sve | FileCheck %s
4 define <8 x i8> @loadv8i8(ptr %p) {
5 ; CHECK-LABEL: loadv8i8:
6 ; CHECK:       // %bb.0:
7 ; CHECK-NEXT:    ldr b0, [x0]
8 ; CHECK-NEXT:    ret
9   %l = load i8, ptr %p
10   %v = insertelement <8 x i8> zeroinitializer, i8 %l, i32 0
11   ret <8 x i8> %v
14 define <16 x i8> @loadv16i8(ptr %p) {
15 ; CHECK-LABEL: loadv16i8:
16 ; CHECK:       // %bb.0:
17 ; CHECK-NEXT:    ldr b0, [x0]
18 ; CHECK-NEXT:    ret
19   %l = load i8, ptr %p
20   %v = insertelement <16 x i8> zeroinitializer, i8 %l, i32 0
21   ret <16 x i8> %v
24 define <4 x i16> @loadv4i16(ptr %p) {
25 ; CHECK-LABEL: loadv4i16:
26 ; CHECK:       // %bb.0:
27 ; CHECK-NEXT:    ldr h0, [x0]
28 ; CHECK-NEXT:    ret
29   %l = load i16, ptr %p
30   %v = insertelement <4 x i16> zeroinitializer, i16 %l, i32 0
31   ret <4 x i16> %v
34 define <8 x i16> @loadv8i16(ptr %p) {
35 ; CHECK-LABEL: loadv8i16:
36 ; CHECK:       // %bb.0:
37 ; CHECK-NEXT:    ldr h0, [x0]
38 ; CHECK-NEXT:    ret
39   %l = load i16, ptr %p
40   %v = insertelement <8 x i16> zeroinitializer, i16 %l, i32 0
41   ret <8 x i16> %v
44 define <2 x i32> @loadv2i32(ptr %p) {
45 ; CHECK-LABEL: loadv2i32:
46 ; CHECK:       // %bb.0:
47 ; CHECK-NEXT:    ldr s0, [x0]
48 ; CHECK-NEXT:    ret
49   %l = load i32, ptr %p
50   %v = insertelement <2 x i32> zeroinitializer, i32 %l, i32 0
51   ret <2 x i32> %v
54 define <4 x i32> @loadv4i32(ptr %p) {
55 ; CHECK-LABEL: loadv4i32:
56 ; CHECK:       // %bb.0:
57 ; CHECK-NEXT:    ldr s0, [x0]
58 ; CHECK-NEXT:    ret
59   %l = load i32, ptr %p
60   %v = insertelement <4 x i32> zeroinitializer, i32 %l, i32 0
61   ret <4 x i32> %v
64 define <2 x i64> @loadv2i64(ptr %p) {
65 ; CHECK-LABEL: loadv2i64:
66 ; CHECK:       // %bb.0:
67 ; CHECK-NEXT:    ldr d0, [x0]
68 ; CHECK-NEXT:    ret
69   %l = load i64, ptr %p
70   %v = insertelement <2 x i64> zeroinitializer, i64 %l, i32 0
71   ret <2 x i64> %v
75 define <4 x half> @loadv4f16(ptr %p) {
76 ; CHECK-LABEL: loadv4f16:
77 ; CHECK:       // %bb.0:
78 ; CHECK-NEXT:    ldr h0, [x0]
79 ; CHECK-NEXT:    ret
80   %l = load half, ptr %p
81   %v = insertelement <4 x half> zeroinitializer, half %l, i32 0
82   ret <4 x half> %v
85 define <8 x half> @loadv8f16(ptr %p) {
86 ; CHECK-LABEL: loadv8f16:
87 ; CHECK:       // %bb.0:
88 ; CHECK-NEXT:    ldr h0, [x0]
89 ; CHECK-NEXT:    ret
90   %l = load half, ptr %p
91   %v = insertelement <8 x half> zeroinitializer, half %l, i32 0
92   ret <8 x half> %v
95 define <4 x bfloat> @loadv4bf16(ptr %p) {
96 ; CHECK-LABEL: loadv4bf16:
97 ; CHECK:       // %bb.0:
98 ; CHECK-NEXT:    ldr h0, [x0]
99 ; CHECK-NEXT:    ret
100   %l = load bfloat, ptr %p
101   %v = insertelement <4 x bfloat> zeroinitializer, bfloat %l, i32 0
102   ret <4 x bfloat> %v
105 define <8 x bfloat> @loadv8bf16(ptr %p) {
106 ; CHECK-LABEL: loadv8bf16:
107 ; CHECK:       // %bb.0:
108 ; CHECK-NEXT:    ldr h0, [x0]
109 ; CHECK-NEXT:    ret
110   %l = load bfloat, ptr %p
111   %v = insertelement <8 x bfloat> zeroinitializer, bfloat %l, i32 0
112   ret <8 x bfloat> %v
115 define <2 x float> @loadv2f32(ptr %p) {
116 ; CHECK-LABEL: loadv2f32:
117 ; CHECK:       // %bb.0:
118 ; CHECK-NEXT:    ldr s0, [x0]
119 ; CHECK-NEXT:    ret
120   %l = load float, ptr %p
121   %v = insertelement <2 x float> zeroinitializer, float %l, i32 0
122   ret <2 x float> %v
125 define <4 x float> @loadv4f32(ptr %p) {
126 ; CHECK-LABEL: loadv4f32:
127 ; CHECK:       // %bb.0:
128 ; CHECK-NEXT:    ldr s0, [x0]
129 ; CHECK-NEXT:    ret
130   %l = load float, ptr %p
131   %v = insertelement <4 x float> zeroinitializer, float %l, i32 0
132   ret <4 x float> %v
135 define <2 x double> @loadv2f64(ptr %p) {
136 ; CHECK-LABEL: loadv2f64:
137 ; CHECK:       // %bb.0:
138 ; CHECK-NEXT:    ldr d0, [x0]
139 ; CHECK-NEXT:    ret
140   %l = load double, ptr %p
141   %v = insertelement <2 x double> zeroinitializer, double %l, i32 0
142   ret <2 x double> %v
146 ; Unscaled
148 define <8 x i8> @loadv8i8_offset(ptr %p) {
149 ; CHECK-LABEL: loadv8i8_offset:
150 ; CHECK:       // %bb.0:
151 ; CHECK-NEXT:    ldr b0, [x0, #1]
152 ; CHECK-NEXT:    ret
153   %g = getelementptr inbounds i8, ptr %p, i64 1
154   %l = load i8, ptr %g
155   %v = insertelement <8 x i8> zeroinitializer, i8 %l, i32 0
156   ret <8 x i8> %v
159 define <16 x i8> @loadv16i8_offset(ptr %p) {
160 ; CHECK-LABEL: loadv16i8_offset:
161 ; CHECK:       // %bb.0:
162 ; CHECK-NEXT:    ldr b0, [x0, #1]
163 ; CHECK-NEXT:    ret
164   %g = getelementptr inbounds i8, ptr %p, i64 1
165   %l = load i8, ptr %g
166   %v = insertelement <16 x i8> zeroinitializer, i8 %l, i32 0
167   ret <16 x i8> %v
170 define <4 x i16> @loadv4i16_offset(ptr %p) {
171 ; CHECK-LABEL: loadv4i16_offset:
172 ; CHECK:       // %bb.0:
173 ; CHECK-NEXT:    ldur h0, [x0, #1]
174 ; CHECK-NEXT:    ret
175   %g = getelementptr inbounds i8, ptr %p, i64 1
176   %l = load i16, ptr %g
177   %v = insertelement <4 x i16> zeroinitializer, i16 %l, i32 0
178   ret <4 x i16> %v
181 define <8 x i16> @loadv8i16_offset(ptr %p) {
182 ; CHECK-LABEL: loadv8i16_offset:
183 ; CHECK:       // %bb.0:
184 ; CHECK-NEXT:    ldur h0, [x0, #1]
185 ; CHECK-NEXT:    ret
186   %g = getelementptr inbounds i8, ptr %p, i64 1
187   %l = load i16, ptr %g
188   %v = insertelement <8 x i16> zeroinitializer, i16 %l, i32 0
189   ret <8 x i16> %v
192 define <2 x i32> @loadv2i32_offset(ptr %p) {
193 ; CHECK-LABEL: loadv2i32_offset:
194 ; CHECK:       // %bb.0:
195 ; CHECK-NEXT:    ldur s0, [x0, #1]
196 ; CHECK-NEXT:    ret
197   %g = getelementptr inbounds i8, ptr %p, i64 1
198   %l = load i32, ptr %g
199   %v = insertelement <2 x i32> zeroinitializer, i32 %l, i32 0
200   ret <2 x i32> %v
203 define <4 x i32> @loadv4i32_offset(ptr %p) {
204 ; CHECK-LABEL: loadv4i32_offset:
205 ; CHECK:       // %bb.0:
206 ; CHECK-NEXT:    ldur s0, [x0, #1]
207 ; CHECK-NEXT:    ret
208   %g = getelementptr inbounds i8, ptr %p, i64 1
209   %l = load i32, ptr %g
210   %v = insertelement <4 x i32> zeroinitializer, i32 %l, i32 0
211   ret <4 x i32> %v
214 define <2 x i64> @loadv2i64_offset(ptr %p) {
215 ; CHECK-LABEL: loadv2i64_offset:
216 ; CHECK:       // %bb.0:
217 ; CHECK-NEXT:    ldur d0, [x0, #1]
218 ; CHECK-NEXT:    ret
219   %g = getelementptr inbounds i8, ptr %p, i64 1
220   %l = load i64, ptr %g
221   %v = insertelement <2 x i64> zeroinitializer, i64 %l, i32 0
222   ret <2 x i64> %v
226 define <4 x half> @loadv4f16_offset(ptr %p) {
227 ; CHECK-LABEL: loadv4f16_offset:
228 ; CHECK:       // %bb.0:
229 ; CHECK-NEXT:    ldur h0, [x0, #1]
230 ; CHECK-NEXT:    ret
231   %g = getelementptr inbounds i8, ptr %p, i64 1
232   %l = load half, ptr %g
233   %v = insertelement <4 x half> zeroinitializer, half %l, i32 0
234   ret <4 x half> %v
237 define <8 x half> @loadv8f16_offset(ptr %p) {
238 ; CHECK-LABEL: loadv8f16_offset:
239 ; CHECK:       // %bb.0:
240 ; CHECK-NEXT:    ldur h0, [x0, #1]
241 ; CHECK-NEXT:    ret
242   %g = getelementptr inbounds i8, ptr %p, i64 1
243   %l = load half, ptr %g
244   %v = insertelement <8 x half> zeroinitializer, half %l, i32 0
245   ret <8 x half> %v
248 define <4 x bfloat> @loadv4bf16_offset(ptr %p) {
249 ; CHECK-LABEL: loadv4bf16_offset:
250 ; CHECK:       // %bb.0:
251 ; CHECK-NEXT:    ldur h0, [x0, #1]
252 ; CHECK-NEXT:    ret
253   %g = getelementptr inbounds i8, ptr %p, i64 1
254   %l = load bfloat, ptr %g
255   %v = insertelement <4 x bfloat> zeroinitializer, bfloat %l, i32 0
256   ret <4 x bfloat> %v
259 define <8 x bfloat> @loadv8bf16_offset(ptr %p) {
260 ; CHECK-LABEL: loadv8bf16_offset:
261 ; CHECK:       // %bb.0:
262 ; CHECK-NEXT:    ldur h0, [x0, #1]
263 ; CHECK-NEXT:    ret
264   %g = getelementptr inbounds i8, ptr %p, i64 1
265   %l = load bfloat, ptr %g
266   %v = insertelement <8 x bfloat> zeroinitializer, bfloat %l, i32 0
267   ret <8 x bfloat> %v
270 define <2 x float> @loadv2f32_offset(ptr %p) {
271 ; CHECK-LABEL: loadv2f32_offset:
272 ; CHECK:       // %bb.0:
273 ; CHECK-NEXT:    ldur s0, [x0, #1]
274 ; CHECK-NEXT:    ret
275   %g = getelementptr inbounds i8, ptr %p, i64 1
276   %l = load float, ptr %g
277   %v = insertelement <2 x float> zeroinitializer, float %l, i32 0
278   ret <2 x float> %v
281 define <4 x float> @loadv4f32_offset(ptr %p) {
282 ; CHECK-LABEL: loadv4f32_offset:
283 ; CHECK:       // %bb.0:
284 ; CHECK-NEXT:    ldur s0, [x0, #1]
285 ; CHECK-NEXT:    ret
286   %g = getelementptr inbounds i8, ptr %p, i64 1
287   %l = load float, ptr %g
288   %v = insertelement <4 x float> zeroinitializer, float %l, i32 0
289   ret <4 x float> %v
292 define <2 x double> @loadv2f64_offset(ptr %p) {
293 ; CHECK-LABEL: loadv2f64_offset:
294 ; CHECK:       // %bb.0:
295 ; CHECK-NEXT:    ldur d0, [x0, #1]
296 ; CHECK-NEXT:    ret
297   %g = getelementptr inbounds i8, ptr %p, i64 1
298   %l = load double, ptr %g
299   %v = insertelement <2 x double> zeroinitializer, double %l, i32 0
300   ret <2 x double> %v
304 define <8 x i8> @loadv8i8_noffset(ptr %p) {
305 ; CHECK-LABEL: loadv8i8_noffset:
306 ; CHECK:       // %bb.0:
307 ; CHECK-NEXT:    ldur b0, [x0, #-1]
308 ; CHECK-NEXT:    ret
309   %g = getelementptr inbounds i8, ptr %p, i64 -1
310   %l = load i8, ptr %g
311   %v = insertelement <8 x i8> zeroinitializer, i8 %l, i32 0
312   ret <8 x i8> %v
315 define <16 x i8> @loadv16i8_noffset(ptr %p) {
316 ; CHECK-LABEL: loadv16i8_noffset:
317 ; CHECK:       // %bb.0:
318 ; CHECK-NEXT:    ldur b0, [x0, #-1]
319 ; CHECK-NEXT:    ret
320   %g = getelementptr inbounds i8, ptr %p, i64 -1
321   %l = load i8, ptr %g
322   %v = insertelement <16 x i8> zeroinitializer, i8 %l, i32 0
323   ret <16 x i8> %v
326 define <4 x i16> @loadv4i16_noffset(ptr %p) {
327 ; CHECK-LABEL: loadv4i16_noffset:
328 ; CHECK:       // %bb.0:
329 ; CHECK-NEXT:    ldur h0, [x0, #-1]
330 ; CHECK-NEXT:    ret
331   %g = getelementptr inbounds i8, ptr %p, i64 -1
332   %l = load i16, ptr %g
333   %v = insertelement <4 x i16> zeroinitializer, i16 %l, i32 0
334   ret <4 x i16> %v
337 define <8 x i16> @loadv8i16_noffset(ptr %p) {
338 ; CHECK-LABEL: loadv8i16_noffset:
339 ; CHECK:       // %bb.0:
340 ; CHECK-NEXT:    ldur h0, [x0, #-1]
341 ; CHECK-NEXT:    ret
342   %g = getelementptr inbounds i8, ptr %p, i64 -1
343   %l = load i16, ptr %g
344   %v = insertelement <8 x i16> zeroinitializer, i16 %l, i32 0
345   ret <8 x i16> %v
348 define <2 x i32> @loadv2i32_noffset(ptr %p) {
349 ; CHECK-LABEL: loadv2i32_noffset:
350 ; CHECK:       // %bb.0:
351 ; CHECK-NEXT:    ldur s0, [x0, #-1]
352 ; CHECK-NEXT:    ret
353   %g = getelementptr inbounds i8, ptr %p, i64 -1
354   %l = load i32, ptr %g
355   %v = insertelement <2 x i32> zeroinitializer, i32 %l, i32 0
356   ret <2 x i32> %v
359 define <4 x i32> @loadv4i32_noffset(ptr %p) {
360 ; CHECK-LABEL: loadv4i32_noffset:
361 ; CHECK:       // %bb.0:
362 ; CHECK-NEXT:    ldur s0, [x0, #-1]
363 ; CHECK-NEXT:    ret
364   %g = getelementptr inbounds i8, ptr %p, i64 -1
365   %l = load i32, ptr %g
366   %v = insertelement <4 x i32> zeroinitializer, i32 %l, i32 0
367   ret <4 x i32> %v
370 define <2 x i64> @loadv2i64_noffset(ptr %p) {
371 ; CHECK-LABEL: loadv2i64_noffset:
372 ; CHECK:       // %bb.0:
373 ; CHECK-NEXT:    ldur d0, [x0, #-1]
374 ; CHECK-NEXT:    ret
375   %g = getelementptr inbounds i8, ptr %p, i64 -1
376   %l = load i64, ptr %g
377   %v = insertelement <2 x i64> zeroinitializer, i64 %l, i32 0
378   ret <2 x i64> %v
382 define <4 x half> @loadv4f16_noffset(ptr %p) {
383 ; CHECK-LABEL: loadv4f16_noffset:
384 ; CHECK:       // %bb.0:
385 ; CHECK-NEXT:    ldur h0, [x0, #-1]
386 ; CHECK-NEXT:    ret
387   %g = getelementptr inbounds i8, ptr %p, i64 -1
388   %l = load half, ptr %g
389   %v = insertelement <4 x half> zeroinitializer, half %l, i32 0
390   ret <4 x half> %v
393 define <8 x half> @loadv8f16_noffset(ptr %p) {
394 ; CHECK-LABEL: loadv8f16_noffset:
395 ; CHECK:       // %bb.0:
396 ; CHECK-NEXT:    ldur h0, [x0, #-1]
397 ; CHECK-NEXT:    ret
398   %g = getelementptr inbounds i8, ptr %p, i64 -1
399   %l = load half, ptr %g
400   %v = insertelement <8 x half> zeroinitializer, half %l, i32 0
401   ret <8 x half> %v
404 define <4 x bfloat> @loadv4bf16_noffset(ptr %p) {
405 ; CHECK-LABEL: loadv4bf16_noffset:
406 ; CHECK:       // %bb.0:
407 ; CHECK-NEXT:    ldur h0, [x0, #-1]
408 ; CHECK-NEXT:    ret
409   %g = getelementptr inbounds i8, ptr %p, i64 -1
410   %l = load bfloat, ptr %g
411   %v = insertelement <4 x bfloat> zeroinitializer, bfloat %l, i32 0
412   ret <4 x bfloat> %v
415 define <8 x bfloat> @loadv8bf16_noffset(ptr %p) {
416 ; CHECK-LABEL: loadv8bf16_noffset:
417 ; CHECK:       // %bb.0:
418 ; CHECK-NEXT:    ldur h0, [x0, #-1]
419 ; CHECK-NEXT:    ret
420   %g = getelementptr inbounds i8, ptr %p, i64 -1
421   %l = load bfloat, ptr %g
422   %v = insertelement <8 x bfloat> zeroinitializer, bfloat %l, i32 0
423   ret <8 x bfloat> %v
426 define <2 x float> @loadv2f32_noffset(ptr %p) {
427 ; CHECK-LABEL: loadv2f32_noffset:
428 ; CHECK:       // %bb.0:
429 ; CHECK-NEXT:    ldur s0, [x0, #-1]
430 ; CHECK-NEXT:    ret
431   %g = getelementptr inbounds i8, ptr %p, i64 -1
432   %l = load float, ptr %g
433   %v = insertelement <2 x float> zeroinitializer, float %l, i32 0
434   ret <2 x float> %v
437 define <4 x float> @loadv4f32_noffset(ptr %p) {
438 ; CHECK-LABEL: loadv4f32_noffset:
439 ; CHECK:       // %bb.0:
440 ; CHECK-NEXT:    ldur s0, [x0, #-1]
441 ; CHECK-NEXT:    ret
442   %g = getelementptr inbounds i8, ptr %p, i64 -1
443   %l = load float, ptr %g
444   %v = insertelement <4 x float> zeroinitializer, float %l, i32 0
445   ret <4 x float> %v
448 define <2 x double> @loadv2f64_noffset(ptr %p) {
449 ; CHECK-LABEL: loadv2f64_noffset:
450 ; CHECK:       // %bb.0:
451 ; CHECK-NEXT:    ldur d0, [x0, #-1]
452 ; CHECK-NEXT:    ret
453   %g = getelementptr inbounds i8, ptr %p, i64 -1
454   %l = load double, ptr %g
455   %v = insertelement <2 x double> zeroinitializer, double %l, i32 0
456   ret <2 x double> %v
460 define void @predictor_4x4_neon(ptr nocapture noundef writeonly %0, i64 noundef %1, ptr nocapture noundef readonly %2, ptr nocapture noundef readnone %3) {
461 ; CHECK-LABEL: predictor_4x4_neon:
462 ; CHECK:       // %bb.0:
463 ; CHECK-NEXT:    movi v0.2d, #0000000000000000
464 ; CHECK-NEXT:    ldur w8, [x2, #2]
465 ; CHECK-NEXT:    ldr s1, [x2]
466 ; CHECK-NEXT:    ldur s2, [x2, #1]
467 ; CHECK-NEXT:    ushll v3.8h, v2.8b, #1
468 ; CHECK-NEXT:    mov v0.s[0], w8
469 ; CHECK-NEXT:    lsr w8, w8, #24
470 ; CHECK-NEXT:    uaddl v0.8h, v0.8b, v1.8b
471 ; CHECK-NEXT:    urhadd v1.8b, v1.8b, v2.8b
472 ; CHECK-NEXT:    add v0.8h, v0.8h, v3.8h
473 ; CHECK-NEXT:    dup v3.8b, w8
474 ; CHECK-NEXT:    str s1, [x0]
475 ; CHECK-NEXT:    lsl x8, x1, #1
476 ; CHECK-NEXT:    rshrn v0.8b, v0.8h, #2
477 ; CHECK-NEXT:    zip1 v2.2s, v1.2s, v3.2s
478 ; CHECK-NEXT:    str s0, [x0, x1]
479 ; CHECK-NEXT:    zip1 v3.2s, v0.2s, v3.2s
480 ; CHECK-NEXT:    ext v2.8b, v2.8b, v0.8b, #1
481 ; CHECK-NEXT:    ext v1.8b, v3.8b, v0.8b, #1
482 ; CHECK-NEXT:    str s2, [x0, x8]
483 ; CHECK-NEXT:    add x8, x8, x1
484 ; CHECK-NEXT:    str s1, [x0, x8]
485 ; CHECK-NEXT:    ret
486   %5 = load i32, ptr %2, align 4
487   %6 = insertelement <2 x i32> <i32 poison, i32 0>, i32 %5, i64 0
488   %7 = bitcast <2 x i32> %6 to <8 x i8>
489   %8 = getelementptr inbounds i8, ptr %2, i64 1
490   %9 = load i32, ptr %8, align 4
491   %10 = insertelement <2 x i32> <i32 poison, i32 0>, i32 %9, i64 0
492   %11 = bitcast <2 x i32> %10 to <8 x i8>
493   %12 = getelementptr inbounds i8, ptr %2, i64 2
494   %13 = load i32, ptr %12, align 4
495   %14 = insertelement <2 x i32> <i32 poison, i32 0>, i32 %13, i64 0
496   %15 = bitcast <2 x i32> %14 to <8 x i8>
497   %16 = lshr i32 %13, 24
498   %17 = trunc i32 %16 to i8
499   %18 = insertelement <8 x i8> undef, i8 %17, i64 0
500   %19 = shufflevector <8 x i8> %18, <8 x i8> poison, <8 x i32> zeroinitializer
501   %20 = tail call <8 x i8> @llvm.aarch64.neon.urhadd.v8i8(<8 x i8> %7, <8 x i8> %11)
502   %21 = zext <8 x i8> %7 to <8 x i16>
503   %22 = zext <8 x i8> %11 to <8 x i16>
504   %23 = zext <8 x i8> %15 to <8 x i16>
505   %24 = shl nuw nsw <8 x i16> %22, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
506   %25 = add nuw nsw <8 x i16> %23, %21
507   %26 = add nuw nsw <8 x i16> %25, %24
508   %27 = tail call <8 x i8> @llvm.aarch64.neon.rshrn.v8i8(<8 x i16> %26, i32 2)
509   %28 = bitcast <8 x i8> %20 to <2 x i32>
510   %29 = extractelement <2 x i32> %28, i64 0
511   store i32 %29, ptr %0, align 4
512   %30 = bitcast <8 x i8> %27 to <2 x i32>
513   %31 = getelementptr inbounds i8, ptr %0, i64 %1
514   %32 = extractelement <2 x i32> %30, i64 0
515   store i32 %32, ptr %31, align 4
516   %33 = bitcast <8 x i8> %19 to <2 x i32>
517   %34 = shufflevector <2 x i32> %28, <2 x i32> %33, <2 x i32> <i32 0, i32 2>
518   %35 = bitcast <2 x i32> %34 to <8 x i8>
519   %36 = shufflevector <2 x i32> %30, <2 x i32> %33, <2 x i32> <i32 0, i32 2>
520   %37 = bitcast <2 x i32> %36 to <8 x i8>
521   %38 = shufflevector <8 x i8> %35, <8 x i8> poison, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 undef, i32 undef, i32 undef, i32 undef>
522   %39 = bitcast <8 x i8> %38 to <2 x i32>
523   %40 = shl nsw i64 %1, 1
524   %41 = getelementptr inbounds i8, ptr %0, i64 %40
525   %42 = extractelement <2 x i32> %39, i64 0
526   store i32 %42, ptr %41, align 4
527   %43 = shufflevector <8 x i8> %37, <8 x i8> poison, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 undef, i32 undef, i32 undef, i32 undef>
528   %44 = bitcast <8 x i8> %43 to <2 x i32>
529   %45 = mul nsw i64 %1, 3
530   %46 = getelementptr inbounds i8, ptr %0, i64 %45
531   %47 = extractelement <2 x i32> %44, i64 0
532   store i32 %47, ptr %46, align 4
533   ret void
536 define void @predictor_4x4_neon_new(ptr nocapture noundef writeonly %0, i64 noundef %1, ptr nocapture noundef readonly %2, ptr nocapture noundef readnone %3) {
537 ; CHECK-LABEL: predictor_4x4_neon_new:
538 ; CHECK:       // %bb.0:
539 ; CHECK-NEXT:    ldr s0, [x2]
540 ; CHECK-NEXT:    ldur s1, [x2, #1]
541 ; CHECK-NEXT:    lsl x8, x1, #1
542 ; CHECK-NEXT:    ldur s2, [x2, #2]
543 ; CHECK-NEXT:    ldur s3, [x2, #3]
544 ; CHECK-NEXT:    uaddl v4.8h, v1.8b, v0.8b
545 ; CHECK-NEXT:    urhadd v0.8b, v0.8b, v1.8b
546 ; CHECK-NEXT:    add x9, x8, x1
547 ; CHECK-NEXT:    uaddl v5.8h, v2.8b, v1.8b
548 ; CHECK-NEXT:    uaddl v3.8h, v3.8b, v2.8b
549 ; CHECK-NEXT:    urhadd v1.8b, v1.8b, v2.8b
550 ; CHECK-NEXT:    str s0, [x0]
551 ; CHECK-NEXT:    add v4.8h, v4.8h, v5.8h
552 ; CHECK-NEXT:    add v3.8h, v3.8h, v5.8h
553 ; CHECK-NEXT:    rshrn v4.8b, v4.8h, #2
554 ; CHECK-NEXT:    rshrn v0.8b, v3.8h, #2
555 ; CHECK-NEXT:    str s4, [x0, x1]
556 ; CHECK-NEXT:    str s1, [x0, x8]
557 ; CHECK-NEXT:    str s0, [x0, x9]
558 ; CHECK-NEXT:    ret
559   %5 = load i32, ptr %2, align 4
560   %6 = insertelement <2 x i32> <i32 poison, i32 0>, i32 %5, i64 0
561   %7 = bitcast <2 x i32> %6 to <8 x i8>
562   %8 = getelementptr inbounds i8, ptr %2, i64 1
563   %9 = load i32, ptr %8, align 4
564   %10 = insertelement <2 x i32> <i32 poison, i32 0>, i32 %9, i64 0
565   %11 = bitcast <2 x i32> %10 to <8 x i8>
566   %12 = getelementptr inbounds i8, ptr %2, i64 2
567   %13 = load i32, ptr %12, align 4
568   %14 = insertelement <2 x i32> <i32 poison, i32 0>, i32 %13, i64 0
569   %15 = bitcast <2 x i32> %14 to <8 x i8>
570   %16 = getelementptr inbounds i8, ptr %2, i64 3
571   %17 = load i32, ptr %16, align 4
572   %18 = insertelement <2 x i32> <i32 poison, i32 0>, i32 %17, i64 0
573   %19 = bitcast <2 x i32> %18 to <8 x i8>
574   %20 = tail call <8 x i8> @llvm.aarch64.neon.urhadd.v8i8(<8 x i8> %7, <8 x i8> %11)
575   %21 = tail call <8 x i8> @llvm.aarch64.neon.urhadd.v8i8(<8 x i8> %11, <8 x i8> %15)
576   %22 = zext <8 x i8> %7 to <8 x i16>
577   %23 = zext <8 x i8> %11 to <8 x i16>
578   %24 = add nuw nsw <8 x i16> %23, %22
579   %25 = zext <8 x i8> %15 to <8 x i16>
580   %26 = add nuw nsw <8 x i16> %25, %23
581   %27 = add nuw nsw <8 x i16> %24, %26
582   %28 = tail call <8 x i8> @llvm.aarch64.neon.rshrn.v8i8(<8 x i16> %27, i32 2)
583   %29 = zext <8 x i8> %19 to <8 x i16>
584   %30 = add nuw nsw <8 x i16> %29, %25
585   %31 = add nuw nsw <8 x i16> %30, %26
586   %32 = tail call <8 x i8> @llvm.aarch64.neon.rshrn.v8i8(<8 x i16> %31, i32 2)
587   %33 = bitcast <8 x i8> %20 to <2 x i32>
588   %34 = extractelement <2 x i32> %33, i64 0
589   store i32 %34, ptr %0, align 4
590   %35 = bitcast <8 x i8> %28 to <2 x i32>
591   %36 = getelementptr inbounds i8, ptr %0, i64 %1
592   %37 = extractelement <2 x i32> %35, i64 0
593   store i32 %37, ptr %36, align 4
594   %38 = bitcast <8 x i8> %21 to <2 x i32>
595   %39 = shl nsw i64 %1, 1
596   %40 = getelementptr inbounds i8, ptr %0, i64 %39
597   %41 = extractelement <2 x i32> %38, i64 0
598   store i32 %41, ptr %40, align 4
599   %42 = bitcast <8 x i8> %32 to <2 x i32>
600   %43 = mul nsw i64 %1, 3
601   %44 = getelementptr inbounds i8, ptr %0, i64 %43
602   %45 = extractelement <2 x i32> %42, i64 0
603   store i32 %45, ptr %44, align 4
604   ret void
608 define <vscale x 8 x i8> @loadnxv8i8(ptr %p) {
609 ; CHECK-LABEL: loadnxv8i8:
610 ; CHECK:       // %bb.0:
611 ; CHECK-NEXT:    mov z0.h, #0 // =0x0
612 ; CHECK-NEXT:    ldrb w8, [x0]
613 ; CHECK-NEXT:    ptrue p0.h, vl1
614 ; CHECK-NEXT:    mov z0.h, p0/m, w8
615 ; CHECK-NEXT:    ret
616   %l = load i8, ptr %p
617   %v = insertelement <vscale x 8 x i8> zeroinitializer, i8 %l, i32 0
618   ret <vscale x 8 x i8> %v
621 define <vscale x 16 x i8> @loadnxv16i8(ptr %p) {
622 ; CHECK-LABEL: loadnxv16i8:
623 ; CHECK:       // %bb.0:
624 ; CHECK-NEXT:    ldr b0, [x0]
625 ; CHECK-NEXT:    ret
626   %l = load i8, ptr %p
627   %v = insertelement <vscale x 16 x i8> zeroinitializer, i8 %l, i32 0
628   ret <vscale x 16 x i8> %v
631 define <vscale x 4 x i16> @loadnxv4i16(ptr %p) {
632 ; CHECK-LABEL: loadnxv4i16:
633 ; CHECK:       // %bb.0:
634 ; CHECK-NEXT:    mov z0.s, #0 // =0x0
635 ; CHECK-NEXT:    ldrh w8, [x0]
636 ; CHECK-NEXT:    ptrue p0.s, vl1
637 ; CHECK-NEXT:    mov z0.s, p0/m, w8
638 ; CHECK-NEXT:    ret
639   %l = load i16, ptr %p
640   %v = insertelement <vscale x 4 x i16> zeroinitializer, i16 %l, i32 0
641   ret <vscale x 4 x i16> %v
644 define <vscale x 8 x i16> @loadnxv8i16(ptr %p) {
645 ; CHECK-LABEL: loadnxv8i16:
646 ; CHECK:       // %bb.0:
647 ; CHECK-NEXT:    ldr h0, [x0]
648 ; CHECK-NEXT:    ret
649   %l = load i16, ptr %p
650   %v = insertelement <vscale x 8 x i16> zeroinitializer, i16 %l, i32 0
651   ret <vscale x 8 x i16> %v
654 define <vscale x 2 x i32> @loadnxv2i32(ptr %p) {
655 ; CHECK-LABEL: loadnxv2i32:
656 ; CHECK:       // %bb.0:
657 ; CHECK-NEXT:    mov z0.d, #0 // =0x0
658 ; CHECK-NEXT:    ldr w8, [x0]
659 ; CHECK-NEXT:    ptrue p0.d, vl1
660 ; CHECK-NEXT:    mov z0.d, p0/m, x8
661 ; CHECK-NEXT:    ret
662   %l = load i32, ptr %p
663   %v = insertelement <vscale x 2 x i32> zeroinitializer, i32 %l, i32 0
664   ret <vscale x 2 x i32> %v
667 define <vscale x 4 x i32> @loadnxv4i32(ptr %p) {
668 ; CHECK-LABEL: loadnxv4i32:
669 ; CHECK:       // %bb.0:
670 ; CHECK-NEXT:    ldr s0, [x0]
671 ; CHECK-NEXT:    ret
672   %l = load i32, ptr %p
673   %v = insertelement <vscale x 4 x i32> zeroinitializer, i32 %l, i32 0
674   ret <vscale x 4 x i32> %v
677 define <vscale x 2 x i64> @loadnxv2i64(ptr %p) {
678 ; CHECK-LABEL: loadnxv2i64:
679 ; CHECK:       // %bb.0:
680 ; CHECK-NEXT:    ldr d0, [x0]
681 ; CHECK-NEXT:    ret
682   %l = load i64, ptr %p
683   %v = insertelement <vscale x 2 x i64> zeroinitializer, i64 %l, i32 0
684   ret <vscale x 2 x i64> %v
688 define <vscale x 4 x half> @loadnxv4f16(ptr %p) {
689 ; CHECK-LABEL: loadnxv4f16:
690 ; CHECK:       // %bb.0:
691 ; CHECK-NEXT:    mov w8, wzr
692 ; CHECK-NEXT:    index z0.s, #0, #1
693 ; CHECK-NEXT:    ptrue p0.s
694 ; CHECK-NEXT:    mov z1.s, w8
695 ; CHECK-NEXT:    cmpeq p0.s, p0/z, z0.s, z1.s
696 ; CHECK-NEXT:    mov z0.h, #0 // =0x0
697 ; CHECK-NEXT:    ldr h1, [x0]
698 ; CHECK-NEXT:    mov z0.h, p0/m, h1
699 ; CHECK-NEXT:    ret
700   %l = load half, ptr %p
701   %v = insertelement <vscale x 4 x half> zeroinitializer, half %l, i32 0
702   ret <vscale x 4 x half> %v
705 define <vscale x 8 x half> @loadnxv8f16(ptr %p) {
706 ; CHECK-LABEL: loadnxv8f16:
707 ; CHECK:       // %bb.0:
708 ; CHECK-NEXT:    ldr h0, [x0]
709 ; CHECK-NEXT:    ret
710   %l = load half, ptr %p
711   %v = insertelement <vscale x 8 x half> zeroinitializer, half %l, i32 0
712   ret <vscale x 8 x half> %v
715 define <vscale x 4 x bfloat> @loadnxv4bf16(ptr %p) {
716 ; CHECK-LABEL: loadnxv4bf16:
717 ; CHECK:       // %bb.0:
718 ; CHECK-NEXT:    mov w8, wzr
719 ; CHECK-NEXT:    index z0.s, #0, #1
720 ; CHECK-NEXT:    ptrue p0.s
721 ; CHECK-NEXT:    mov z1.s, w8
722 ; CHECK-NEXT:    cmpeq p0.s, p0/z, z0.s, z1.s
723 ; CHECK-NEXT:    mov z0.h, #0 // =0x0
724 ; CHECK-NEXT:    ldr h1, [x0]
725 ; CHECK-NEXT:    mov z0.h, p0/m, h1
726 ; CHECK-NEXT:    ret
727   %l = load bfloat, ptr %p
728   %v = insertelement <vscale x 4 x bfloat> zeroinitializer, bfloat %l, i32 0
729   ret <vscale x 4 x bfloat> %v
732 define <vscale x 8 x bfloat> @loadnxv8bf16(ptr %p) {
733 ; CHECK-LABEL: loadnxv8bf16:
734 ; CHECK:       // %bb.0:
735 ; CHECK-NEXT:    ldr h0, [x0]
736 ; CHECK-NEXT:    ret
737   %l = load bfloat, ptr %p
738   %v = insertelement <vscale x 8 x bfloat> zeroinitializer, bfloat %l, i32 0
739   ret <vscale x 8 x bfloat> %v
742 define <vscale x 2 x float> @loadnxv2f32(ptr %p) {
743 ; CHECK-LABEL: loadnxv2f32:
744 ; CHECK:       // %bb.0:
745 ; CHECK-NEXT:    mov x8, xzr
746 ; CHECK-NEXT:    index z0.d, #0, #1
747 ; CHECK-NEXT:    ptrue p0.d
748 ; CHECK-NEXT:    mov z1.d, x8
749 ; CHECK-NEXT:    cmpeq p0.d, p0/z, z0.d, z1.d
750 ; CHECK-NEXT:    mov z0.s, #0 // =0x0
751 ; CHECK-NEXT:    ldr s1, [x0]
752 ; CHECK-NEXT:    mov z0.s, p0/m, s1
753 ; CHECK-NEXT:    ret
754   %l = load float, ptr %p
755   %v = insertelement <vscale x 2 x float> zeroinitializer, float %l, i32 0
756   ret <vscale x 2 x float> %v
759 define <vscale x 4 x float> @loadnxv4f32(ptr %p) {
760 ; CHECK-LABEL: loadnxv4f32:
761 ; CHECK:       // %bb.0:
762 ; CHECK-NEXT:    ldr s0, [x0]
763 ; CHECK-NEXT:    ret
764   %l = load float, ptr %p
765   %v = insertelement <vscale x 4 x float> zeroinitializer, float %l, i32 0
766   ret <vscale x 4 x float> %v
769 define <vscale x 2 x double> @loadnxv2f64(ptr %p) {
770 ; CHECK-LABEL: loadnxv2f64:
771 ; CHECK:       // %bb.0:
772 ; CHECK-NEXT:    ldr d0, [x0]
773 ; CHECK-NEXT:    ret
774   %l = load double, ptr %p
775   %v = insertelement <vscale x 2 x double> zeroinitializer, double %l, i32 0
776   ret <vscale x 2 x double> %v
780 ; Unscaled
782 define <vscale x 8 x i8> @loadnxv8i8_offset(ptr %p) {
783 ; CHECK-LABEL: loadnxv8i8_offset:
784 ; CHECK:       // %bb.0:
785 ; CHECK-NEXT:    mov z0.h, #0 // =0x0
786 ; CHECK-NEXT:    ldrb w8, [x0, #1]
787 ; CHECK-NEXT:    ptrue p0.h, vl1
788 ; CHECK-NEXT:    mov z0.h, p0/m, w8
789 ; CHECK-NEXT:    ret
790   %g = getelementptr inbounds i8, ptr %p, i64 1
791   %l = load i8, ptr %g
792   %v = insertelement <vscale x 8 x i8> zeroinitializer, i8 %l, i32 0
793   ret <vscale x 8 x i8> %v
796 define <vscale x 16 x i8> @loadnxv16i8_offset(ptr %p) {
797 ; CHECK-LABEL: loadnxv16i8_offset:
798 ; CHECK:       // %bb.0:
799 ; CHECK-NEXT:    ldr b0, [x0, #1]
800 ; CHECK-NEXT:    ret
801   %g = getelementptr inbounds i8, ptr %p, i64 1
802   %l = load i8, ptr %g
803   %v = insertelement <vscale x 16 x i8> zeroinitializer, i8 %l, i32 0
804   ret <vscale x 16 x i8> %v
807 define <vscale x 4 x i16> @loadnxv4i16_offset(ptr %p) {
808 ; CHECK-LABEL: loadnxv4i16_offset:
809 ; CHECK:       // %bb.0:
810 ; CHECK-NEXT:    mov z0.s, #0 // =0x0
811 ; CHECK-NEXT:    ldurh w8, [x0, #1]
812 ; CHECK-NEXT:    ptrue p0.s, vl1
813 ; CHECK-NEXT:    mov z0.s, p0/m, w8
814 ; CHECK-NEXT:    ret
815   %g = getelementptr inbounds i8, ptr %p, i64 1
816   %l = load i16, ptr %g
817   %v = insertelement <vscale x 4 x i16> zeroinitializer, i16 %l, i32 0
818   ret <vscale x 4 x i16> %v
821 define <vscale x 8 x i16> @loadnxv8i16_offset(ptr %p) {
822 ; CHECK-LABEL: loadnxv8i16_offset:
823 ; CHECK:       // %bb.0:
824 ; CHECK-NEXT:    ldur h0, [x0, #1]
825 ; CHECK-NEXT:    ret
826   %g = getelementptr inbounds i8, ptr %p, i64 1
827   %l = load i16, ptr %g
828   %v = insertelement <vscale x 8 x i16> zeroinitializer, i16 %l, i32 0
829   ret <vscale x 8 x i16> %v
832 define <vscale x 2 x i32> @loadnxv2i32_offset(ptr %p) {
833 ; CHECK-LABEL: loadnxv2i32_offset:
834 ; CHECK:       // %bb.0:
835 ; CHECK-NEXT:    mov z0.d, #0 // =0x0
836 ; CHECK-NEXT:    ldur w8, [x0, #1]
837 ; CHECK-NEXT:    ptrue p0.d, vl1
838 ; CHECK-NEXT:    mov z0.d, p0/m, x8
839 ; CHECK-NEXT:    ret
840   %g = getelementptr inbounds i8, ptr %p, i64 1
841   %l = load i32, ptr %g
842   %v = insertelement <vscale x 2 x i32> zeroinitializer, i32 %l, i32 0
843   ret <vscale x 2 x i32> %v
846 define <vscale x 4 x i32> @loadnxv4i32_offset(ptr %p) {
847 ; CHECK-LABEL: loadnxv4i32_offset:
848 ; CHECK:       // %bb.0:
849 ; CHECK-NEXT:    ldur s0, [x0, #1]
850 ; CHECK-NEXT:    ret
851   %g = getelementptr inbounds i8, ptr %p, i64 1
852   %l = load i32, ptr %g
853   %v = insertelement <vscale x 4 x i32> zeroinitializer, i32 %l, i32 0
854   ret <vscale x 4 x i32> %v
857 define <vscale x 2 x i64> @loadnxv2i64_offset(ptr %p) {
858 ; CHECK-LABEL: loadnxv2i64_offset:
859 ; CHECK:       // %bb.0:
860 ; CHECK-NEXT:    ldur d0, [x0, #1]
861 ; CHECK-NEXT:    ret
862   %g = getelementptr inbounds i8, ptr %p, i64 1
863   %l = load i64, ptr %g
864   %v = insertelement <vscale x 2 x i64> zeroinitializer, i64 %l, i32 0
865   ret <vscale x 2 x i64> %v
869 define <vscale x 4 x half> @loadnxv4f16_offset(ptr %p) {
870 ; CHECK-LABEL: loadnxv4f16_offset:
871 ; CHECK:       // %bb.0:
872 ; CHECK-NEXT:    mov w8, wzr
873 ; CHECK-NEXT:    index z0.s, #0, #1
874 ; CHECK-NEXT:    ptrue p0.s
875 ; CHECK-NEXT:    mov z1.s, w8
876 ; CHECK-NEXT:    cmpeq p0.s, p0/z, z0.s, z1.s
877 ; CHECK-NEXT:    mov z0.h, #0 // =0x0
878 ; CHECK-NEXT:    ldur h1, [x0, #1]
879 ; CHECK-NEXT:    mov z0.h, p0/m, h1
880 ; CHECK-NEXT:    ret
881   %g = getelementptr inbounds i8, ptr %p, i64 1
882   %l = load half, ptr %g
883   %v = insertelement <vscale x 4 x half> zeroinitializer, half %l, i32 0
884   ret <vscale x 4 x half> %v
887 define <vscale x 8 x half> @loadnxv8f16_offset(ptr %p) {
888 ; CHECK-LABEL: loadnxv8f16_offset:
889 ; CHECK:       // %bb.0:
890 ; CHECK-NEXT:    ldur h0, [x0, #1]
891 ; CHECK-NEXT:    ret
892   %g = getelementptr inbounds i8, ptr %p, i64 1
893   %l = load half, ptr %g
894   %v = insertelement <vscale x 8 x half> zeroinitializer, half %l, i32 0
895   ret <vscale x 8 x half> %v
898 define <vscale x 4 x bfloat> @loadnxv4bf16_offset(ptr %p) {
899 ; CHECK-LABEL: loadnxv4bf16_offset:
900 ; CHECK:       // %bb.0:
901 ; CHECK-NEXT:    mov w8, wzr
902 ; CHECK-NEXT:    index z0.s, #0, #1
903 ; CHECK-NEXT:    ptrue p0.s
904 ; CHECK-NEXT:    mov z1.s, w8
905 ; CHECK-NEXT:    cmpeq p0.s, p0/z, z0.s, z1.s
906 ; CHECK-NEXT:    mov z0.h, #0 // =0x0
907 ; CHECK-NEXT:    ldur h1, [x0, #1]
908 ; CHECK-NEXT:    mov z0.h, p0/m, h1
909 ; CHECK-NEXT:    ret
910   %g = getelementptr inbounds i8, ptr %p, i64 1
911   %l = load bfloat, ptr %g
912   %v = insertelement <vscale x 4 x bfloat> zeroinitializer, bfloat %l, i32 0
913   ret <vscale x 4 x bfloat> %v
916 define <vscale x 8 x bfloat> @loadnxv8bf16_offset(ptr %p) {
917 ; CHECK-LABEL: loadnxv8bf16_offset:
918 ; CHECK:       // %bb.0:
919 ; CHECK-NEXT:    ldur h0, [x0, #1]
920 ; CHECK-NEXT:    ret
921   %g = getelementptr inbounds i8, ptr %p, i64 1
922   %l = load bfloat, ptr %g
923   %v = insertelement <vscale x 8 x bfloat> zeroinitializer, bfloat %l, i32 0
924   ret <vscale x 8 x bfloat> %v
927 define <vscale x 2 x float> @loadnxv2f32_offset(ptr %p) {
928 ; CHECK-LABEL: loadnxv2f32_offset:
929 ; CHECK:       // %bb.0:
930 ; CHECK-NEXT:    mov x8, xzr
931 ; CHECK-NEXT:    index z0.d, #0, #1
932 ; CHECK-NEXT:    ptrue p0.d
933 ; CHECK-NEXT:    mov z1.d, x8
934 ; CHECK-NEXT:    cmpeq p0.d, p0/z, z0.d, z1.d
935 ; CHECK-NEXT:    mov z0.s, #0 // =0x0
936 ; CHECK-NEXT:    ldur s1, [x0, #1]
937 ; CHECK-NEXT:    mov z0.s, p0/m, s1
938 ; CHECK-NEXT:    ret
939   %g = getelementptr inbounds i8, ptr %p, i64 1
940   %l = load float, ptr %g
941   %v = insertelement <vscale x 2 x float> zeroinitializer, float %l, i32 0
942   ret <vscale x 2 x float> %v
945 define <vscale x 4 x float> @loadnxv4f32_offset(ptr %p) {
946 ; CHECK-LABEL: loadnxv4f32_offset:
947 ; CHECK:       // %bb.0:
948 ; CHECK-NEXT:    ldur s0, [x0, #1]
949 ; CHECK-NEXT:    ret
950   %g = getelementptr inbounds i8, ptr %p, i64 1
951   %l = load float, ptr %g
952   %v = insertelement <vscale x 4 x float> zeroinitializer, float %l, i32 0
953   ret <vscale x 4 x float> %v
956 define <vscale x 2 x double> @loadnxv2f64_offset(ptr %p) {
957 ; CHECK-LABEL: loadnxv2f64_offset:
958 ; CHECK:       // %bb.0:
959 ; CHECK-NEXT:    ldur d0, [x0, #1]
960 ; CHECK-NEXT:    ret
961   %g = getelementptr inbounds i8, ptr %p, i64 1
962   %l = load double, ptr %g
963   %v = insertelement <vscale x 2 x double> zeroinitializer, double %l, i32 0
964   ret <vscale x 2 x double> %v
968 declare <8 x i8> @llvm.aarch64.neon.rshrn.v8i8(<8 x i16>, i32) #1
969 declare <8 x i8> @llvm.aarch64.neon.urhadd.v8i8(<8 x i8>, <8 x i8>) #1