xref: /llvm-project/llvm/test/CodeGen/AArch64/load-insert-undef.ll (revision 02a1d311bde4a90cffa661215c81f9fef1bc7967)
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
3
4define <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> poison, i8 %l, i32 0
11  ret <8 x i8> %v
12}
13
14define <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> poison, i8 %l, i32 0
21  ret <16 x i8> %v
22}
23
24define <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> poison, i16 %l, i32 0
31  ret <4 x i16> %v
32}
33
34define <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> poison, i16 %l, i32 0
41  ret <8 x i16> %v
42}
43
44define <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> poison, i32 %l, i32 0
51  ret <2 x i32> %v
52}
53
54define <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> poison, i32 %l, i32 0
61  ret <4 x i32> %v
62}
63
64define <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> poison, i64 %l, i32 0
71  ret <2 x i64> %v
72}
73
74
75define <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> poison, half %l, i32 0
82  ret <4 x half> %v
83}
84
85define <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> poison, half %l, i32 0
92  ret <8 x half> %v
93}
94
95define <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> poison, bfloat %l, i32 0
102  ret <4 x bfloat> %v
103}
104
105define <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> poison, bfloat %l, i32 0
112  ret <8 x bfloat> %v
113}
114
115define <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> poison, float %l, i32 0
122  ret <2 x float> %v
123}
124
125define <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> poison, float %l, i32 0
132  ret <4 x float> %v
133}
134
135define <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> poison, double %l, i32 0
142  ret <2 x double> %v
143}
144
145
146; Unscaled
147
148define <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> poison, i8 %l, i32 0
156  ret <8 x i8> %v
157}
158
159define <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> poison, i8 %l, i32 0
167  ret <16 x i8> %v
168}
169
170define <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> poison, i16 %l, i32 0
178  ret <4 x i16> %v
179}
180
181define <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> poison, i16 %l, i32 0
189  ret <8 x i16> %v
190}
191
192define <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> poison, i32 %l, i32 0
200  ret <2 x i32> %v
201}
202
203define <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> poison, i32 %l, i32 0
211  ret <4 x i32> %v
212}
213
214define <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> poison, i64 %l, i32 0
222  ret <2 x i64> %v
223}
224
225
226define <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> poison, half %l, i32 0
234  ret <4 x half> %v
235}
236
237define <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> poison, half %l, i32 0
245  ret <8 x half> %v
246}
247
248define <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> poison, bfloat %l, i32 0
256  ret <4 x bfloat> %v
257}
258
259define <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> poison, bfloat %l, i32 0
267  ret <8 x bfloat> %v
268}
269
270define <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> poison, float %l, i32 0
278  ret <2 x float> %v
279}
280
281define <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> poison, float %l, i32 0
289  ret <4 x float> %v
290}
291
292define <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> poison, double %l, i32 0
300  ret <2 x double> %v
301}
302
303
304define <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> poison, i8 %l, i32 0
312  ret <8 x i8> %v
313}
314
315define <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> poison, i8 %l, i32 0
323  ret <16 x i8> %v
324}
325
326define <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> poison, i16 %l, i32 0
334  ret <4 x i16> %v
335}
336
337define <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> poison, i16 %l, i32 0
345  ret <8 x i16> %v
346}
347
348define <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> poison, i32 %l, i32 0
356  ret <2 x i32> %v
357}
358
359define <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> poison, i32 %l, i32 0
367  ret <4 x i32> %v
368}
369
370define <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> poison, i64 %l, i32 0
378  ret <2 x i64> %v
379}
380
381
382define <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> poison, half %l, i32 0
390  ret <4 x half> %v
391}
392
393define <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> poison, half %l, i32 0
401  ret <8 x half> %v
402}
403
404define <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> poison, bfloat %l, i32 0
412  ret <4 x bfloat> %v
413}
414
415define <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> poison, bfloat %l, i32 0
423  ret <8 x bfloat> %v
424}
425
426define <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> poison, float %l, i32 0
434  ret <2 x float> %v
435}
436
437define <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> poison, float %l, i32 0
445  ret <4 x float> %v
446}
447
448define <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> poison, double %l, i32 0
456  ret <2 x double> %v
457}
458
459
460; ROW addressing modes
461
462define <8 x i8> @loadv8i8_roW(ptr %p, i32 %o) {
463; CHECK-LABEL: loadv8i8_roW:
464; CHECK:       // %bb.0:
465; CHECK-NEXT:    ldr b0, [x0, w1, sxtw]
466; CHECK-NEXT:    ret
467  %g = getelementptr inbounds i8, ptr %p, i32 %o
468  %l = load i8, ptr %g
469  %v = insertelement <8 x i8> poison, i8 %l, i32 0
470  ret <8 x i8> %v
471}
472
473define <16 x i8> @loadv16i8_roW(ptr %p, i32 %o) {
474; CHECK-LABEL: loadv16i8_roW:
475; CHECK:       // %bb.0:
476; CHECK-NEXT:    ldr b0, [x0, w1, sxtw]
477; CHECK-NEXT:    ret
478  %g = getelementptr inbounds i8, ptr %p, i32 %o
479  %l = load i8, ptr %g
480  %v = insertelement <16 x i8> poison, i8 %l, i32 0
481  ret <16 x i8> %v
482}
483
484define <4 x i16> @loadv4i16_roW(ptr %p, i32 %o) {
485; CHECK-LABEL: loadv4i16_roW:
486; CHECK:       // %bb.0:
487; CHECK-NEXT:    ldr h0, [x0, w1, sxtw #1]
488; CHECK-NEXT:    ret
489  %g = getelementptr inbounds i16, ptr %p, i32 %o
490  %l = load i16, ptr %g
491  %v = insertelement <4 x i16> poison, i16 %l, i32 0
492  ret <4 x i16> %v
493}
494
495define <8 x i16> @loadv8i16_roW(ptr %p, i32 %o) {
496; CHECK-LABEL: loadv8i16_roW:
497; CHECK:       // %bb.0:
498; CHECK-NEXT:    ldr h0, [x0, w1, sxtw #1]
499; CHECK-NEXT:    ret
500  %g = getelementptr inbounds i16, ptr %p, i32 %o
501  %l = load i16, ptr %g
502  %v = insertelement <8 x i16> poison, i16 %l, i32 0
503  ret <8 x i16> %v
504}
505
506define <2 x i32> @loadv2i32_roW(ptr %p, i32 %o) {
507; CHECK-LABEL: loadv2i32_roW:
508; CHECK:       // %bb.0:
509; CHECK-NEXT:    ldr s0, [x0, w1, sxtw #2]
510; CHECK-NEXT:    ret
511  %g = getelementptr inbounds i32, ptr %p, i32 %o
512  %l = load i32, ptr %g
513  %v = insertelement <2 x i32> poison, i32 %l, i32 0
514  ret <2 x i32> %v
515}
516
517define <4 x i32> @loadv4i32_roW(ptr %p, i32 %o) {
518; CHECK-LABEL: loadv4i32_roW:
519; CHECK:       // %bb.0:
520; CHECK-NEXT:    ldr s0, [x0, w1, sxtw #2]
521; CHECK-NEXT:    ret
522  %g = getelementptr inbounds i32, ptr %p, i32 %o
523  %l = load i32, ptr %g
524  %v = insertelement <4 x i32> poison, i32 %l, i32 0
525  ret <4 x i32> %v
526}
527
528define <2 x i64> @loadv2i64_roW(ptr %p, i32 %o) {
529; CHECK-LABEL: loadv2i64_roW:
530; CHECK:       // %bb.0:
531; CHECK-NEXT:    ldr d0, [x0, w1, sxtw #3]
532; CHECK-NEXT:    ret
533  %g = getelementptr inbounds i64, ptr %p, i32 %o
534  %l = load i64, ptr %g
535  %v = insertelement <2 x i64> poison, i64 %l, i32 0
536  ret <2 x i64> %v
537}
538
539define <4 x half> @loadv4f16_roW(ptr %p, i32 %o) {
540; CHECK-LABEL: loadv4f16_roW:
541; CHECK:       // %bb.0:
542; CHECK-NEXT:    ldr h0, [x0, w1, sxtw #1]
543; CHECK-NEXT:    ret
544  %g = getelementptr inbounds half, ptr %p, i32 %o
545  %l = load half, ptr %g
546  %v = insertelement <4 x half> poison, half %l, i32 0
547  ret <4 x half> %v
548}
549
550define <8 x half> @loadv8f16_roW(ptr %p, i32 %o) {
551; CHECK-LABEL: loadv8f16_roW:
552; CHECK:       // %bb.0:
553; CHECK-NEXT:    ldr h0, [x0, w1, sxtw #1]
554; CHECK-NEXT:    ret
555  %g = getelementptr inbounds half, ptr %p, i32 %o
556  %l = load half, ptr %g
557  %v = insertelement <8 x half> poison, half %l, i32 0
558  ret <8 x half> %v
559}
560
561define <4 x bfloat> @loadv4bf16_roW(ptr %p, i32 %o) {
562; CHECK-LABEL: loadv4bf16_roW:
563; CHECK:       // %bb.0:
564; CHECK-NEXT:    ldr h0, [x0, w1, sxtw #1]
565; CHECK-NEXT:    ret
566  %g = getelementptr inbounds bfloat, ptr %p, i32 %o
567  %l = load bfloat, ptr %g
568  %v = insertelement <4 x bfloat> poison, bfloat %l, i32 0
569  ret <4 x bfloat> %v
570}
571
572define <8 x bfloat> @loadv8bf16_roW(ptr %p, i32 %o) {
573; CHECK-LABEL: loadv8bf16_roW:
574; CHECK:       // %bb.0:
575; CHECK-NEXT:    ldr h0, [x0, w1, sxtw #1]
576; CHECK-NEXT:    ret
577  %g = getelementptr inbounds bfloat, ptr %p, i32 %o
578  %l = load bfloat, ptr %g
579  %v = insertelement <8 x bfloat> poison, bfloat %l, i32 0
580  ret <8 x bfloat> %v
581}
582
583define <2 x float> @loadv2f32_roW(ptr %p, i32 %o) {
584; CHECK-LABEL: loadv2f32_roW:
585; CHECK:       // %bb.0:
586; CHECK-NEXT:    ldr s0, [x0, w1, sxtw #2]
587; CHECK-NEXT:    ret
588  %g = getelementptr inbounds float, ptr %p, i32 %o
589  %l = load float, ptr %g
590  %v = insertelement <2 x float> poison, float %l, i32 0
591  ret <2 x float> %v
592}
593
594define <4 x float> @loadv4f32_roW(ptr %p, i32 %o) {
595; CHECK-LABEL: loadv4f32_roW:
596; CHECK:       // %bb.0:
597; CHECK-NEXT:    ldr s0, [x0, w1, sxtw #2]
598; CHECK-NEXT:    ret
599  %g = getelementptr inbounds float, ptr %p, i32 %o
600  %l = load float, ptr %g
601  %v = insertelement <4 x float> poison, float %l, i32 0
602  ret <4 x float> %v
603}
604
605define <2 x double> @loadv2f64_roW(ptr %p, i32 %o) {
606; CHECK-LABEL: loadv2f64_roW:
607; CHECK:       // %bb.0:
608; CHECK-NEXT:    ldr d0, [x0, w1, sxtw #3]
609; CHECK-NEXT:    ret
610  %g = getelementptr inbounds double, ptr %p, i32 %o
611  %l = load double, ptr %g
612  %v = insertelement <2 x double> poison, double %l, i32 0
613  ret <2 x double> %v
614}
615
616; roX
617
618define <8 x i8> @loadv8i8_roX(ptr %p, i64 %o) {
619; CHECK-LABEL: loadv8i8_roX:
620; CHECK:       // %bb.0:
621; CHECK-NEXT:    ldr b0, [x0, x1]
622; CHECK-NEXT:    ret
623  %g = getelementptr inbounds i8, ptr %p, i64 %o
624  %l = load i8, ptr %g
625  %v = insertelement <8 x i8> poison, i8 %l, i32 0
626  ret <8 x i8> %v
627}
628
629define <16 x i8> @loadv16i8_roX(ptr %p, i64 %o) {
630; CHECK-LABEL: loadv16i8_roX:
631; CHECK:       // %bb.0:
632; CHECK-NEXT:    ldr b0, [x0, x1]
633; CHECK-NEXT:    ret
634  %g = getelementptr inbounds i8, ptr %p, i64 %o
635  %l = load i8, ptr %g
636  %v = insertelement <16 x i8> poison, i8 %l, i32 0
637  ret <16 x i8> %v
638}
639
640define <4 x i16> @loadv4i16_roX(ptr %p, i64 %o) {
641; CHECK-LABEL: loadv4i16_roX:
642; CHECK:       // %bb.0:
643; CHECK-NEXT:    ldr h0, [x0, x1, lsl #1]
644; CHECK-NEXT:    ret
645  %g = getelementptr inbounds i16, ptr %p, i64 %o
646  %l = load i16, ptr %g
647  %v = insertelement <4 x i16> poison, i16 %l, i32 0
648  ret <4 x i16> %v
649}
650
651define <8 x i16> @loadv8i16_roX(ptr %p, i64 %o) {
652; CHECK-LABEL: loadv8i16_roX:
653; CHECK:       // %bb.0:
654; CHECK-NEXT:    ldr h0, [x0, x1, lsl #1]
655; CHECK-NEXT:    ret
656  %g = getelementptr inbounds i16, ptr %p, i64 %o
657  %l = load i16, ptr %g
658  %v = insertelement <8 x i16> poison, i16 %l, i32 0
659  ret <8 x i16> %v
660}
661
662define <2 x i32> @loadv2i32_roX(ptr %p, i64 %o) {
663; CHECK-LABEL: loadv2i32_roX:
664; CHECK:       // %bb.0:
665; CHECK-NEXT:    ldr s0, [x0, x1, lsl #2]
666; CHECK-NEXT:    ret
667  %g = getelementptr inbounds i32, ptr %p, i64 %o
668  %l = load i32, ptr %g
669  %v = insertelement <2 x i32> poison, i32 %l, i32 0
670  ret <2 x i32> %v
671}
672
673define <4 x i32> @loadv4i32_roX(ptr %p, i64 %o) {
674; CHECK-LABEL: loadv4i32_roX:
675; CHECK:       // %bb.0:
676; CHECK-NEXT:    ldr s0, [x0, x1, lsl #2]
677; CHECK-NEXT:    ret
678  %g = getelementptr inbounds i32, ptr %p, i64 %o
679  %l = load i32, ptr %g
680  %v = insertelement <4 x i32> poison, i32 %l, i32 0
681  ret <4 x i32> %v
682}
683
684define <2 x i64> @loadv2i64_roX(ptr %p, i64 %o) {
685; CHECK-LABEL: loadv2i64_roX:
686; CHECK:       // %bb.0:
687; CHECK-NEXT:    ldr d0, [x0, x1, lsl #3]
688; CHECK-NEXT:    ret
689  %g = getelementptr inbounds i64, ptr %p, i64 %o
690  %l = load i64, ptr %g
691  %v = insertelement <2 x i64> poison, i64 %l, i32 0
692  ret <2 x i64> %v
693}
694
695define <4 x half> @loadv4f16_roX(ptr %p, i64 %o) {
696; CHECK-LABEL: loadv4f16_roX:
697; CHECK:       // %bb.0:
698; CHECK-NEXT:    ldr h0, [x0, x1, lsl #1]
699; CHECK-NEXT:    ret
700  %g = getelementptr inbounds half, ptr %p, i64 %o
701  %l = load half, ptr %g
702  %v = insertelement <4 x half> poison, half %l, i32 0
703  ret <4 x half> %v
704}
705
706define <8 x half> @loadv8f16_roX(ptr %p, i64 %o) {
707; CHECK-LABEL: loadv8f16_roX:
708; CHECK:       // %bb.0:
709; CHECK-NEXT:    ldr h0, [x0, x1, lsl #1]
710; CHECK-NEXT:    ret
711  %g = getelementptr inbounds half, ptr %p, i64 %o
712  %l = load half, ptr %g
713  %v = insertelement <8 x half> poison, half %l, i32 0
714  ret <8 x half> %v
715}
716
717define <4 x bfloat> @loadv4bf16_roX(ptr %p, i64 %o) {
718; CHECK-LABEL: loadv4bf16_roX:
719; CHECK:       // %bb.0:
720; CHECK-NEXT:    ldr h0, [x0, x1, lsl #1]
721; CHECK-NEXT:    ret
722  %g = getelementptr inbounds bfloat, ptr %p, i64 %o
723  %l = load bfloat, ptr %g
724  %v = insertelement <4 x bfloat> poison, bfloat %l, i32 0
725  ret <4 x bfloat> %v
726}
727
728define <8 x bfloat> @loadv8bf16_roX(ptr %p, i64 %o) {
729; CHECK-LABEL: loadv8bf16_roX:
730; CHECK:       // %bb.0:
731; CHECK-NEXT:    ldr h0, [x0, x1, lsl #1]
732; CHECK-NEXT:    ret
733  %g = getelementptr inbounds bfloat, ptr %p, i64 %o
734  %l = load bfloat, ptr %g
735  %v = insertelement <8 x bfloat> poison, bfloat %l, i32 0
736  ret <8 x bfloat> %v
737}
738
739define <2 x float> @loadv2f32_roX(ptr %p, i64 %o) {
740; CHECK-LABEL: loadv2f32_roX:
741; CHECK:       // %bb.0:
742; CHECK-NEXT:    ldr s0, [x0, x1, lsl #2]
743; CHECK-NEXT:    ret
744  %g = getelementptr inbounds float, ptr %p, i64 %o
745  %l = load float, ptr %g
746  %v = insertelement <2 x float> poison, float %l, i32 0
747  ret <2 x float> %v
748}
749
750define <4 x float> @loadv4f32_roX(ptr %p, i64 %o) {
751; CHECK-LABEL: loadv4f32_roX:
752; CHECK:       // %bb.0:
753; CHECK-NEXT:    ldr s0, [x0, x1, lsl #2]
754; CHECK-NEXT:    ret
755  %g = getelementptr inbounds float, ptr %p, i64 %o
756  %l = load float, ptr %g
757  %v = insertelement <4 x float> poison, float %l, i32 0
758  ret <4 x float> %v
759}
760
761define <2 x double> @loadv2f64_roX(ptr %p, i64 %o) {
762; CHECK-LABEL: loadv2f64_roX:
763; CHECK:       // %bb.0:
764; CHECK-NEXT:    ldr d0, [x0, x1, lsl #3]
765; CHECK-NEXT:    ret
766  %g = getelementptr inbounds double, ptr %p, i64 %o
767  %l = load double, ptr %g
768  %v = insertelement <2 x double> poison, double %l, i32 0
769  ret <2 x double> %v
770}
771
772
773; SVE
774
775define <vscale x 8 x i8> @loadnxv8i8(ptr %p) {
776; CHECK-LABEL: loadnxv8i8:
777; CHECK:       // %bb.0:
778; CHECK-NEXT:    ldrb w8, [x0]
779; CHECK-NEXT:    fmov s0, w8
780; CHECK-NEXT:    ret
781  %l = load i8, ptr %p
782  %v = insertelement <vscale x 8 x i8> poison, i8 %l, i32 0
783  ret <vscale x 8 x i8> %v
784}
785
786define <vscale x 16 x i8> @loadnxv16i8(ptr %p) {
787; CHECK-LABEL: loadnxv16i8:
788; CHECK:       // %bb.0:
789; CHECK-NEXT:    ldr b0, [x0]
790; CHECK-NEXT:    ret
791  %l = load i8, ptr %p
792  %v = insertelement <vscale x 16 x i8> poison, i8 %l, i32 0
793  ret <vscale x 16 x i8> %v
794}
795
796define <vscale x 4 x i16> @loadnxv4i16(ptr %p) {
797; CHECK-LABEL: loadnxv4i16:
798; CHECK:       // %bb.0:
799; CHECK-NEXT:    ldrh w8, [x0]
800; CHECK-NEXT:    fmov s0, w8
801; CHECK-NEXT:    ret
802  %l = load i16, ptr %p
803  %v = insertelement <vscale x 4 x i16> poison, i16 %l, i32 0
804  ret <vscale x 4 x i16> %v
805}
806
807define <vscale x 8 x i16> @loadnxv8i16(ptr %p) {
808; CHECK-LABEL: loadnxv8i16:
809; CHECK:       // %bb.0:
810; CHECK-NEXT:    ldr h0, [x0]
811; CHECK-NEXT:    ret
812  %l = load i16, ptr %p
813  %v = insertelement <vscale x 8 x i16> poison, i16 %l, i32 0
814  ret <vscale x 8 x i16> %v
815}
816
817define <vscale x 2 x i32> @loadnxv2i32(ptr %p) {
818; CHECK-LABEL: loadnxv2i32:
819; CHECK:       // %bb.0:
820; CHECK-NEXT:    ldr w8, [x0]
821; CHECK-NEXT:    fmov d0, x8
822; CHECK-NEXT:    ret
823  %l = load i32, ptr %p
824  %v = insertelement <vscale x 2 x i32> poison, i32 %l, i32 0
825  ret <vscale x 2 x i32> %v
826}
827
828define <vscale x 4 x i32> @loadnxv4i32(ptr %p) {
829; CHECK-LABEL: loadnxv4i32:
830; CHECK:       // %bb.0:
831; CHECK-NEXT:    ldr s0, [x0]
832; CHECK-NEXT:    ret
833  %l = load i32, ptr %p
834  %v = insertelement <vscale x 4 x i32> poison, i32 %l, i32 0
835  ret <vscale x 4 x i32> %v
836}
837
838define <vscale x 2 x i64> @loadnxv2i64(ptr %p) {
839; CHECK-LABEL: loadnxv2i64:
840; CHECK:       // %bb.0:
841; CHECK-NEXT:    ldr d0, [x0]
842; CHECK-NEXT:    ret
843  %l = load i64, ptr %p
844  %v = insertelement <vscale x 2 x i64> poison, i64 %l, i32 0
845  ret <vscale x 2 x i64> %v
846}
847
848
849define <vscale x 4 x half> @loadnxv4f16(ptr %p) {
850; CHECK-LABEL: loadnxv4f16:
851; CHECK:       // %bb.0:
852; CHECK-NEXT:    ldr h0, [x0]
853; CHECK-NEXT:    ret
854  %l = load half, ptr %p
855  %v = insertelement <vscale x 4 x half> poison, half %l, i32 0
856  ret <vscale x 4 x half> %v
857}
858
859define <vscale x 8 x half> @loadnxv8f16(ptr %p) {
860; CHECK-LABEL: loadnxv8f16:
861; CHECK:       // %bb.0:
862; CHECK-NEXT:    ldr h0, [x0]
863; CHECK-NEXT:    ret
864  %l = load half, ptr %p
865  %v = insertelement <vscale x 8 x half> poison, half %l, i32 0
866  ret <vscale x 8 x half> %v
867}
868
869define <vscale x 4 x bfloat> @loadnxv4bf16(ptr %p) {
870; CHECK-LABEL: loadnxv4bf16:
871; CHECK:       // %bb.0:
872; CHECK-NEXT:    ldr h0, [x0]
873; CHECK-NEXT:    ret
874  %l = load bfloat, ptr %p
875  %v = insertelement <vscale x 4 x bfloat> poison, bfloat %l, i32 0
876  ret <vscale x 4 x bfloat> %v
877}
878
879define <vscale x 8 x bfloat> @loadnxv8bf16(ptr %p) {
880; CHECK-LABEL: loadnxv8bf16:
881; CHECK:       // %bb.0:
882; CHECK-NEXT:    ldr h0, [x0]
883; CHECK-NEXT:    ret
884  %l = load bfloat, ptr %p
885  %v = insertelement <vscale x 8 x bfloat> poison, bfloat %l, i32 0
886  ret <vscale x 8 x bfloat> %v
887}
888
889define <vscale x 2 x float> @loadnxv2f32(ptr %p) {
890; CHECK-LABEL: loadnxv2f32:
891; CHECK:       // %bb.0:
892; CHECK-NEXT:    ldr s0, [x0]
893; CHECK-NEXT:    ret
894  %l = load float, ptr %p
895  %v = insertelement <vscale x 2 x float> poison, float %l, i32 0
896  ret <vscale x 2 x float> %v
897}
898
899define <vscale x 4 x float> @loadnxv4f32(ptr %p) {
900; CHECK-LABEL: loadnxv4f32:
901; CHECK:       // %bb.0:
902; CHECK-NEXT:    ldr s0, [x0]
903; CHECK-NEXT:    ret
904  %l = load float, ptr %p
905  %v = insertelement <vscale x 4 x float> poison, float %l, i32 0
906  ret <vscale x 4 x float> %v
907}
908
909define <vscale x 2 x double> @loadnxv2f64(ptr %p) {
910; CHECK-LABEL: loadnxv2f64:
911; CHECK:       // %bb.0:
912; CHECK-NEXT:    ldr d0, [x0]
913; CHECK-NEXT:    ret
914  %l = load double, ptr %p
915  %v = insertelement <vscale x 2 x double> poison, double %l, i32 0
916  ret <vscale x 2 x double> %v
917}
918
919
920; Unscaled
921
922define <vscale x 8 x i8> @loadnxv8i8_offset(ptr %p) {
923; CHECK-LABEL: loadnxv8i8_offset:
924; CHECK:       // %bb.0:
925; CHECK-NEXT:    ldrb w8, [x0, #1]
926; CHECK-NEXT:    fmov s0, w8
927; CHECK-NEXT:    ret
928  %g = getelementptr inbounds i8, ptr %p, i64 1
929  %l = load i8, ptr %g
930  %v = insertelement <vscale x 8 x i8> poison, i8 %l, i32 0
931  ret <vscale x 8 x i8> %v
932}
933
934define <vscale x 16 x i8> @loadnxv16i8_offset(ptr %p) {
935; CHECK-LABEL: loadnxv16i8_offset:
936; CHECK:       // %bb.0:
937; CHECK-NEXT:    ldr b0, [x0, #1]
938; CHECK-NEXT:    ret
939  %g = getelementptr inbounds i8, ptr %p, i64 1
940  %l = load i8, ptr %g
941  %v = insertelement <vscale x 16 x i8> poison, i8 %l, i32 0
942  ret <vscale x 16 x i8> %v
943}
944
945define <vscale x 4 x i16> @loadnxv4i16_offset(ptr %p) {
946; CHECK-LABEL: loadnxv4i16_offset:
947; CHECK:       // %bb.0:
948; CHECK-NEXT:    ldurh w8, [x0, #1]
949; CHECK-NEXT:    fmov s0, w8
950; CHECK-NEXT:    ret
951  %g = getelementptr inbounds i8, ptr %p, i64 1
952  %l = load i16, ptr %g
953  %v = insertelement <vscale x 4 x i16> poison, i16 %l, i32 0
954  ret <vscale x 4 x i16> %v
955}
956
957define <vscale x 8 x i16> @loadnxv8i16_offset(ptr %p) {
958; CHECK-LABEL: loadnxv8i16_offset:
959; CHECK:       // %bb.0:
960; CHECK-NEXT:    ldur h0, [x0, #1]
961; CHECK-NEXT:    ret
962  %g = getelementptr inbounds i8, ptr %p, i64 1
963  %l = load i16, ptr %g
964  %v = insertelement <vscale x 8 x i16> poison, i16 %l, i32 0
965  ret <vscale x 8 x i16> %v
966}
967
968define <vscale x 2 x i32> @loadnxv2i32_offset(ptr %p) {
969; CHECK-LABEL: loadnxv2i32_offset:
970; CHECK:       // %bb.0:
971; CHECK-NEXT:    ldur w8, [x0, #1]
972; CHECK-NEXT:    fmov d0, x8
973; CHECK-NEXT:    ret
974  %g = getelementptr inbounds i8, ptr %p, i64 1
975  %l = load i32, ptr %g
976  %v = insertelement <vscale x 2 x i32> poison, i32 %l, i32 0
977  ret <vscale x 2 x i32> %v
978}
979
980define <vscale x 4 x i32> @loadnxv4i32_offset(ptr %p) {
981; CHECK-LABEL: loadnxv4i32_offset:
982; CHECK:       // %bb.0:
983; CHECK-NEXT:    ldur s0, [x0, #1]
984; CHECK-NEXT:    ret
985  %g = getelementptr inbounds i8, ptr %p, i64 1
986  %l = load i32, ptr %g
987  %v = insertelement <vscale x 4 x i32> poison, i32 %l, i32 0
988  ret <vscale x 4 x i32> %v
989}
990
991define <vscale x 2 x i64> @loadnxv2i64_offset(ptr %p) {
992; CHECK-LABEL: loadnxv2i64_offset:
993; CHECK:       // %bb.0:
994; CHECK-NEXT:    ldur d0, [x0, #1]
995; CHECK-NEXT:    ret
996  %g = getelementptr inbounds i8, ptr %p, i64 1
997  %l = load i64, ptr %g
998  %v = insertelement <vscale x 2 x i64> poison, i64 %l, i32 0
999  ret <vscale x 2 x i64> %v
1000}
1001
1002
1003define <vscale x 4 x half> @loadnxv4f16_offset(ptr %p) {
1004; CHECK-LABEL: loadnxv4f16_offset:
1005; CHECK:       // %bb.0:
1006; CHECK-NEXT:    ldur h0, [x0, #1]
1007; CHECK-NEXT:    ret
1008  %g = getelementptr inbounds i8, ptr %p, i64 1
1009  %l = load half, ptr %g
1010  %v = insertelement <vscale x 4 x half> poison, half %l, i32 0
1011  ret <vscale x 4 x half> %v
1012}
1013
1014define <vscale x 8 x half> @loadnxv8f16_offset(ptr %p) {
1015; CHECK-LABEL: loadnxv8f16_offset:
1016; CHECK:       // %bb.0:
1017; CHECK-NEXT:    ldur h0, [x0, #1]
1018; CHECK-NEXT:    ret
1019  %g = getelementptr inbounds i8, ptr %p, i64 1
1020  %l = load half, ptr %g
1021  %v = insertelement <vscale x 8 x half> poison, half %l, i32 0
1022  ret <vscale x 8 x half> %v
1023}
1024
1025define <vscale x 4 x bfloat> @loadnxv4bf16_offset(ptr %p) {
1026; CHECK-LABEL: loadnxv4bf16_offset:
1027; CHECK:       // %bb.0:
1028; CHECK-NEXT:    ldur h0, [x0, #1]
1029; CHECK-NEXT:    ret
1030  %g = getelementptr inbounds i8, ptr %p, i64 1
1031  %l = load bfloat, ptr %g
1032  %v = insertelement <vscale x 4 x bfloat> poison, bfloat %l, i32 0
1033  ret <vscale x 4 x bfloat> %v
1034}
1035
1036define <vscale x 8 x bfloat> @loadnxv8bf16_offset(ptr %p) {
1037; CHECK-LABEL: loadnxv8bf16_offset:
1038; CHECK:       // %bb.0:
1039; CHECK-NEXT:    ldur h0, [x0, #1]
1040; CHECK-NEXT:    ret
1041  %g = getelementptr inbounds i8, ptr %p, i64 1
1042  %l = load bfloat, ptr %g
1043  %v = insertelement <vscale x 8 x bfloat> poison, bfloat %l, i32 0
1044  ret <vscale x 8 x bfloat> %v
1045}
1046
1047define <vscale x 2 x float> @loadnxv2f32_offset(ptr %p) {
1048; CHECK-LABEL: loadnxv2f32_offset:
1049; CHECK:       // %bb.0:
1050; CHECK-NEXT:    ldur s0, [x0, #1]
1051; CHECK-NEXT:    ret
1052  %g = getelementptr inbounds i8, ptr %p, i64 1
1053  %l = load float, ptr %g
1054  %v = insertelement <vscale x 2 x float> poison, float %l, i32 0
1055  ret <vscale x 2 x float> %v
1056}
1057
1058define <vscale x 4 x float> @loadnxv4f32_offset(ptr %p) {
1059; CHECK-LABEL: loadnxv4f32_offset:
1060; CHECK:       // %bb.0:
1061; CHECK-NEXT:    ldur s0, [x0, #1]
1062; CHECK-NEXT:    ret
1063  %g = getelementptr inbounds i8, ptr %p, i64 1
1064  %l = load float, ptr %g
1065  %v = insertelement <vscale x 4 x float> poison, float %l, i32 0
1066  ret <vscale x 4 x float> %v
1067}
1068
1069define <vscale x 2 x double> @loadnxv2f64_offset(ptr %p) {
1070; CHECK-LABEL: loadnxv2f64_offset:
1071; CHECK:       // %bb.0:
1072; CHECK-NEXT:    ldur d0, [x0, #1]
1073; CHECK-NEXT:    ret
1074  %g = getelementptr inbounds i8, ptr %p, i64 1
1075  %l = load double, ptr %g
1076  %v = insertelement <vscale x 2 x double> poison, double %l, i32 0
1077  ret <vscale x 2 x double> %v
1078}
1079