xref: /llvm-project/llvm/test/CodeGen/Thumb2/mve-ldst-preinc.ll (revision b5b663aac17415625340eb29c8010832bfc4c21c)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-LE
3; RUN: llc -mtriple=thumbebv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-BE
4
5define ptr @ldrwu32_4(ptr %x, ptr %y) {
6; CHECK-LABEL: ldrwu32_4:
7; CHECK:       @ %bb.0: @ %entry
8; CHECK-NEXT:    vldrw.u32 q0, [r0, #4]!
9; CHECK-NEXT:    vstrw.32 q0, [r1]
10; CHECK-NEXT:    bx lr
11entry:
12  %z = getelementptr inbounds i8, ptr %x, i32 4
13  %0 = load <4 x i32>, ptr %z, align 4
14  store <4 x i32> %0, ptr %y, align 4
15  ret ptr %z
16}
17
18define ptr @ldrwu32_3(ptr %x, ptr %y) {
19; CHECK-LE-LABEL: ldrwu32_3:
20; CHECK-LE:       @ %bb.0: @ %entry
21; CHECK-LE-NEXT:    vldrb.u8 q0, [r0, #3]!
22; CHECK-LE-NEXT:    vstrw.32 q0, [r1]
23; CHECK-LE-NEXT:    bx lr
24;
25; CHECK-BE-LABEL: ldrwu32_3:
26; CHECK-BE:       @ %bb.0: @ %entry
27; CHECK-BE-NEXT:    adds r0, #3
28; CHECK-BE-NEXT:    vldrw.u32 q0, [r0]
29; CHECK-BE-NEXT:    vstrw.32 q0, [r1]
30; CHECK-BE-NEXT:    bx lr
31entry:
32  %z = getelementptr inbounds i8, ptr %x, i32 3
33  %0 = load <4 x i32>, ptr %z, align 4
34  store <4 x i32> %0, ptr %y, align 4
35  ret ptr %z
36}
37
38define ptr @ldrwu32_m4(ptr %x, ptr %y) {
39; CHECK-LABEL: ldrwu32_m4:
40; CHECK:       @ %bb.0: @ %entry
41; CHECK-NEXT:    vldrw.u32 q0, [r0, #-4]!
42; CHECK-NEXT:    vstrw.32 q0, [r1]
43; CHECK-NEXT:    bx lr
44entry:
45  %z = getelementptr inbounds i8, ptr %x, i32 -4
46  %0 = load <4 x i32>, ptr %z, align 4
47  store <4 x i32> %0, ptr %y, align 4
48  ret ptr %z
49}
50
51define ptr @ldrwu32_508(ptr %x, ptr %y) {
52; CHECK-LABEL: ldrwu32_508:
53; CHECK:       @ %bb.0: @ %entry
54; CHECK-NEXT:    vldrw.u32 q0, [r0, #508]!
55; CHECK-NEXT:    vstrw.32 q0, [r1]
56; CHECK-NEXT:    bx lr
57entry:
58  %z = getelementptr inbounds i8, ptr %x, i32 508
59  %0 = load <4 x i32>, ptr %z, align 4
60  store <4 x i32> %0, ptr %y, align 4
61  ret ptr %z
62}
63
64define ptr @ldrwu32_512(ptr %x, ptr %y) {
65; CHECK-LABEL: ldrwu32_512:
66; CHECK:       @ %bb.0: @ %entry
67; CHECK-NEXT:    add.w r0, r0, #512
68; CHECK-NEXT:    vldrw.u32 q0, [r0]
69; CHECK-NEXT:    vstrw.32 q0, [r1]
70; CHECK-NEXT:    bx lr
71entry:
72  %z = getelementptr inbounds i8, ptr %x, i32 512
73  %0 = load <4 x i32>, ptr %z, align 4
74  store <4 x i32> %0, ptr %y, align 4
75  ret ptr %z
76}
77
78define ptr @ldrwu32_m508(ptr %x, ptr %y) {
79; CHECK-LABEL: ldrwu32_m508:
80; CHECK:       @ %bb.0: @ %entry
81; CHECK-NEXT:    vldrw.u32 q0, [r0, #-508]!
82; CHECK-NEXT:    vstrw.32 q0, [r1]
83; CHECK-NEXT:    bx lr
84entry:
85  %z = getelementptr inbounds i8, ptr %x, i32 -508
86  %0 = load <4 x i32>, ptr %z, align 4
87  store <4 x i32> %0, ptr %y, align 4
88  ret ptr %z
89}
90
91define ptr @ldrwu32_m512(ptr %x, ptr %y) {
92; CHECK-LABEL: ldrwu32_m512:
93; CHECK:       @ %bb.0: @ %entry
94; CHECK-NEXT:    sub.w r0, r0, #512
95; CHECK-NEXT:    vldrw.u32 q0, [r0]
96; CHECK-NEXT:    vstrw.32 q0, [r1]
97; CHECK-NEXT:    bx lr
98entry:
99  %z = getelementptr inbounds i8, ptr %x, i32 -512
100  %0 = load <4 x i32>, ptr %z, align 4
101  store <4 x i32> %0, ptr %y, align 4
102  ret ptr %z
103}
104
105
106define ptr @ldrhu32_4(ptr %x, ptr %y) {
107; CHECK-LABEL: ldrhu32_4:
108; CHECK:       @ %bb.0: @ %entry
109; CHECK-NEXT:    vldrh.u32 q0, [r0, #4]!
110; CHECK-NEXT:    vstrw.32 q0, [r1]
111; CHECK-NEXT:    bx lr
112entry:
113  %z = getelementptr inbounds i8, ptr %x, i32 4
114  %0 = load <4 x i16>, ptr %z, align 2
115  %1 = zext <4 x i16> %0 to <4 x i32>
116  store <4 x i32> %1, ptr %y, align 4
117  ret ptr %z
118}
119
120define ptr @ldrhu32_3(ptr %x, ptr %y) {
121; CHECK-LABEL: ldrhu32_3:
122; CHECK:       @ %bb.0: @ %entry
123; CHECK-NEXT:    adds r0, #3
124; CHECK-NEXT:    vldrh.u32 q0, [r0]
125; CHECK-NEXT:    vstrw.32 q0, [r1]
126; CHECK-NEXT:    bx lr
127entry:
128  %z = getelementptr inbounds i8, ptr %x, i32 3
129  %0 = load <4 x i16>, ptr %z, align 2
130  %1 = zext <4 x i16> %0 to <4 x i32>
131  store <4 x i32> %1, ptr %y, align 4
132  ret ptr %z
133}
134
135define ptr @ldrhu32_2(ptr %x, ptr %y) {
136; CHECK-LABEL: ldrhu32_2:
137; CHECK:       @ %bb.0: @ %entry
138; CHECK-NEXT:    vldrh.u32 q0, [r0, #2]!
139; CHECK-NEXT:    vstrw.32 q0, [r1]
140; CHECK-NEXT:    bx lr
141entry:
142  %z = getelementptr inbounds i8, ptr %x, i32 2
143  %0 = load <4 x i16>, ptr %z, align 2
144  %1 = zext <4 x i16> %0 to <4 x i32>
145  store <4 x i32> %1, ptr %y, align 4
146  ret ptr %z
147}
148
149define ptr @ldrhu32_254(ptr %x, ptr %y) {
150; CHECK-LABEL: ldrhu32_254:
151; CHECK:       @ %bb.0: @ %entry
152; CHECK-NEXT:    vldrh.u32 q0, [r0, #254]!
153; CHECK-NEXT:    vstrw.32 q0, [r1]
154; CHECK-NEXT:    bx lr
155entry:
156  %z = getelementptr inbounds i8, ptr %x, i32 254
157  %0 = load <4 x i16>, ptr %z, align 2
158  %1 = zext <4 x i16> %0 to <4 x i32>
159  store <4 x i32> %1, ptr %y, align 4
160  ret ptr %z
161}
162
163define ptr @ldrhu32_256(ptr %x, ptr %y) {
164; CHECK-LABEL: ldrhu32_256:
165; CHECK:       @ %bb.0: @ %entry
166; CHECK-NEXT:    add.w r0, r0, #256
167; CHECK-NEXT:    vldrh.u32 q0, [r0]
168; CHECK-NEXT:    vstrw.32 q0, [r1]
169; CHECK-NEXT:    bx lr
170entry:
171  %z = getelementptr inbounds i8, ptr %x, i32 256
172  %0 = load <4 x i16>, ptr %z, align 2
173  %1 = zext <4 x i16> %0 to <4 x i32>
174  store <4 x i32> %1, ptr %y, align 4
175  ret ptr %z
176}
177
178define ptr @ldrhu32_m254(ptr %x, ptr %y) {
179; CHECK-LABEL: ldrhu32_m254:
180; CHECK:       @ %bb.0: @ %entry
181; CHECK-NEXT:    vldrh.u32 q0, [r0, #-254]!
182; CHECK-NEXT:    vstrw.32 q0, [r1]
183; CHECK-NEXT:    bx lr
184entry:
185  %z = getelementptr inbounds i8, ptr %x, i32 -254
186  %0 = load <4 x i16>, ptr %z, align 2
187  %1 = zext <4 x i16> %0 to <4 x i32>
188  store <4 x i32> %1, ptr %y, align 4
189  ret ptr %z
190}
191
192define ptr @ldrhu32_m256(ptr %x, ptr %y) {
193; CHECK-LABEL: ldrhu32_m256:
194; CHECK:       @ %bb.0: @ %entry
195; CHECK-NEXT:    sub.w r0, r0, #256
196; CHECK-NEXT:    vldrh.u32 q0, [r0]
197; CHECK-NEXT:    vstrw.32 q0, [r1]
198; CHECK-NEXT:    bx lr
199entry:
200  %z = getelementptr inbounds i8, ptr %x, i32 -256
201  %0 = load <4 x i16>, ptr %z, align 2
202  %1 = zext <4 x i16> %0 to <4 x i32>
203  store <4 x i32> %1, ptr %y, align 4
204  ret ptr %z
205}
206
207
208define ptr @ldrhs32_4(ptr %x, ptr %y) {
209; CHECK-LABEL: ldrhs32_4:
210; CHECK:       @ %bb.0: @ %entry
211; CHECK-NEXT:    vldrh.s32 q0, [r0, #4]!
212; CHECK-NEXT:    vstrw.32 q0, [r1]
213; CHECK-NEXT:    bx lr
214entry:
215  %z = getelementptr inbounds i8, ptr %x, i32 4
216  %0 = load <4 x i16>, ptr %z, align 2
217  %1 = sext <4 x i16> %0 to <4 x i32>
218  store <4 x i32> %1, ptr %y, align 4
219  ret ptr %z
220}
221
222define ptr @ldrhs32_3(ptr %x, ptr %y) {
223; CHECK-LABEL: ldrhs32_3:
224; CHECK:       @ %bb.0: @ %entry
225; CHECK-NEXT:    adds r0, #3
226; CHECK-NEXT:    vldrh.s32 q0, [r0]
227; CHECK-NEXT:    vstrw.32 q0, [r1]
228; CHECK-NEXT:    bx lr
229entry:
230  %z = getelementptr inbounds i8, ptr %x, i32 3
231  %0 = load <4 x i16>, ptr %z, align 2
232  %1 = sext <4 x i16> %0 to <4 x i32>
233  store <4 x i32> %1, ptr %y, align 4
234  ret ptr %z
235}
236
237define ptr @ldrhs32_2(ptr %x, ptr %y) {
238; CHECK-LABEL: ldrhs32_2:
239; CHECK:       @ %bb.0: @ %entry
240; CHECK-NEXT:    vldrh.s32 q0, [r0, #2]!
241; CHECK-NEXT:    vstrw.32 q0, [r1]
242; CHECK-NEXT:    bx lr
243entry:
244  %z = getelementptr inbounds i8, ptr %x, i32 2
245  %0 = load <4 x i16>, ptr %z, align 2
246  %1 = sext <4 x i16> %0 to <4 x i32>
247  store <4 x i32> %1, ptr %y, align 4
248  ret ptr %z
249}
250
251define ptr @ldrhs32_254(ptr %x, ptr %y) {
252; CHECK-LABEL: ldrhs32_254:
253; CHECK:       @ %bb.0: @ %entry
254; CHECK-NEXT:    vldrh.s32 q0, [r0, #254]!
255; CHECK-NEXT:    vstrw.32 q0, [r1]
256; CHECK-NEXT:    bx lr
257entry:
258  %z = getelementptr inbounds i8, ptr %x, i32 254
259  %0 = load <4 x i16>, ptr %z, align 2
260  %1 = sext <4 x i16> %0 to <4 x i32>
261  store <4 x i32> %1, ptr %y, align 4
262  ret ptr %z
263}
264
265define ptr @ldrhs32_256(ptr %x, ptr %y) {
266; CHECK-LABEL: ldrhs32_256:
267; CHECK:       @ %bb.0: @ %entry
268; CHECK-NEXT:    add.w r0, r0, #256
269; CHECK-NEXT:    vldrh.s32 q0, [r0]
270; CHECK-NEXT:    vstrw.32 q0, [r1]
271; CHECK-NEXT:    bx lr
272entry:
273  %z = getelementptr inbounds i8, ptr %x, i32 256
274  %0 = load <4 x i16>, ptr %z, align 2
275  %1 = sext <4 x i16> %0 to <4 x i32>
276  store <4 x i32> %1, ptr %y, align 4
277  ret ptr %z
278}
279
280define ptr @ldrhs32_m254(ptr %x, ptr %y) {
281; CHECK-LABEL: ldrhs32_m254:
282; CHECK:       @ %bb.0: @ %entry
283; CHECK-NEXT:    vldrh.s32 q0, [r0, #-254]!
284; CHECK-NEXT:    vstrw.32 q0, [r1]
285; CHECK-NEXT:    bx lr
286entry:
287  %z = getelementptr inbounds i8, ptr %x, i32 -254
288  %0 = load <4 x i16>, ptr %z, align 2
289  %1 = sext <4 x i16> %0 to <4 x i32>
290  store <4 x i32> %1, ptr %y, align 4
291  ret ptr %z
292}
293
294define ptr @ldrhs32_m256(ptr %x, ptr %y) {
295; CHECK-LABEL: ldrhs32_m256:
296; CHECK:       @ %bb.0: @ %entry
297; CHECK-NEXT:    sub.w r0, r0, #256
298; CHECK-NEXT:    vldrh.s32 q0, [r0]
299; CHECK-NEXT:    vstrw.32 q0, [r1]
300; CHECK-NEXT:    bx lr
301entry:
302  %z = getelementptr inbounds i8, ptr %x, i32 -256
303  %0 = load <4 x i16>, ptr %z, align 2
304  %1 = sext <4 x i16> %0 to <4 x i32>
305  store <4 x i32> %1, ptr %y, align 4
306  ret ptr %z
307}
308
309
310define ptr @ldrhu16_4(ptr %x, ptr %y) {
311; CHECK-LABEL: ldrhu16_4:
312; CHECK:       @ %bb.0: @ %entry
313; CHECK-NEXT:    vldrh.u16 q0, [r0, #4]!
314; CHECK-NEXT:    vstrh.16 q0, [r1]
315; CHECK-NEXT:    bx lr
316entry:
317  %z = getelementptr inbounds i8, ptr %x, i32 4
318  %0 = load <8 x i16>, ptr %z, align 2
319  store <8 x i16> %0, ptr %y, align 2
320  ret ptr %z
321}
322
323define ptr @ldrhu16_3(ptr %x, ptr %y) {
324; CHECK-LE-LABEL: ldrhu16_3:
325; CHECK-LE:       @ %bb.0: @ %entry
326; CHECK-LE-NEXT:    vldrb.u8 q0, [r0, #3]!
327; CHECK-LE-NEXT:    vstrh.16 q0, [r1]
328; CHECK-LE-NEXT:    bx lr
329;
330; CHECK-BE-LABEL: ldrhu16_3:
331; CHECK-BE:       @ %bb.0: @ %entry
332; CHECK-BE-NEXT:    adds r0, #3
333; CHECK-BE-NEXT:    vldrh.u16 q0, [r0]
334; CHECK-BE-NEXT:    vstrh.16 q0, [r1]
335; CHECK-BE-NEXT:    bx lr
336entry:
337  %z = getelementptr inbounds i8, ptr %x, i32 3
338  %0 = load <8 x i16>, ptr %z, align 2
339  store <8 x i16> %0, ptr %y, align 2
340  ret ptr %z
341}
342
343define ptr @ldrhu16_2(ptr %x, ptr %y) {
344; CHECK-LABEL: ldrhu16_2:
345; CHECK:       @ %bb.0: @ %entry
346; CHECK-NEXT:    vldrh.u16 q0, [r0, #2]!
347; CHECK-NEXT:    vstrh.16 q0, [r1]
348; CHECK-NEXT:    bx lr
349entry:
350  %z = getelementptr inbounds i8, ptr %x, i32 2
351  %0 = load <8 x i16>, ptr %z, align 2
352  store <8 x i16> %0, ptr %y, align 2
353  ret ptr %z
354}
355
356define ptr @ldrhu16_254(ptr %x, ptr %y) {
357; CHECK-LABEL: ldrhu16_254:
358; CHECK:       @ %bb.0: @ %entry
359; CHECK-NEXT:    vldrh.u16 q0, [r0, #254]!
360; CHECK-NEXT:    vstrh.16 q0, [r1]
361; CHECK-NEXT:    bx lr
362entry:
363  %z = getelementptr inbounds i8, ptr %x, i32 254
364  %0 = load <8 x i16>, ptr %z, align 2
365  store <8 x i16> %0, ptr %y, align 2
366  ret ptr %z
367}
368
369define ptr @ldrhu16_256(ptr %x, ptr %y) {
370; CHECK-LABEL: ldrhu16_256:
371; CHECK:       @ %bb.0: @ %entry
372; CHECK-NEXT:    add.w r0, r0, #256
373; CHECK-NEXT:    vldrh.u16 q0, [r0]
374; CHECK-NEXT:    vstrh.16 q0, [r1]
375; CHECK-NEXT:    bx lr
376entry:
377  %z = getelementptr inbounds i8, ptr %x, i32 256
378  %0 = load <8 x i16>, ptr %z, align 2
379  store <8 x i16> %0, ptr %y, align 2
380  ret ptr %z
381}
382
383define ptr @ldrhu16_m254(ptr %x, ptr %y) {
384; CHECK-LABEL: ldrhu16_m254:
385; CHECK:       @ %bb.0: @ %entry
386; CHECK-NEXT:    vldrh.u16 q0, [r0, #-254]!
387; CHECK-NEXT:    vstrh.16 q0, [r1]
388; CHECK-NEXT:    bx lr
389entry:
390  %z = getelementptr inbounds i8, ptr %x, i32 -254
391  %0 = load <8 x i16>, ptr %z, align 2
392  store <8 x i16> %0, ptr %y, align 2
393  ret ptr %z
394}
395
396define ptr @ldrhu16_m256(ptr %x, ptr %y) {
397; CHECK-LABEL: ldrhu16_m256:
398; CHECK:       @ %bb.0: @ %entry
399; CHECK-NEXT:    sub.w r0, r0, #256
400; CHECK-NEXT:    vldrh.u16 q0, [r0]
401; CHECK-NEXT:    vstrh.16 q0, [r1]
402; CHECK-NEXT:    bx lr
403entry:
404  %z = getelementptr inbounds i8, ptr %x, i32 -256
405  %0 = load <8 x i16>, ptr %z, align 2
406  store <8 x i16> %0, ptr %y, align 2
407  ret ptr %z
408}
409
410
411define ptr @ldrbu32_4(ptr %x, ptr %y) {
412; CHECK-LABEL: ldrbu32_4:
413; CHECK:       @ %bb.0: @ %entry
414; CHECK-NEXT:    vldrb.u32 q0, [r0, #4]!
415; CHECK-NEXT:    vstrw.32 q0, [r1]
416; CHECK-NEXT:    bx lr
417entry:
418  %z = getelementptr inbounds i8, ptr %x, i32 4
419  %0 = load <4 x i8>, ptr %z, align 1
420  %1 = zext <4 x i8> %0 to <4 x i32>
421  store <4 x i32> %1, ptr %y, align 4
422  ret ptr %z
423}
424
425define ptr @ldrbu32_3(ptr %x, ptr %y) {
426; CHECK-LABEL: ldrbu32_3:
427; CHECK:       @ %bb.0: @ %entry
428; CHECK-NEXT:    vldrb.u32 q0, [r0, #3]!
429; CHECK-NEXT:    vstrw.32 q0, [r1]
430; CHECK-NEXT:    bx lr
431entry:
432  %z = getelementptr inbounds i8, ptr %x, i32 3
433  %0 = load <4 x i8>, ptr %z, align 1
434  %1 = zext <4 x i8> %0 to <4 x i32>
435  store <4 x i32> %1, ptr %y, align 4
436  ret ptr %z
437}
438
439define ptr @ldrbu32_127(ptr %x, ptr %y) {
440; CHECK-LABEL: ldrbu32_127:
441; CHECK:       @ %bb.0: @ %entry
442; CHECK-NEXT:    vldrb.u32 q0, [r0, #127]!
443; CHECK-NEXT:    vstrw.32 q0, [r1]
444; CHECK-NEXT:    bx lr
445entry:
446  %z = getelementptr inbounds i8, ptr %x, i32 127
447  %0 = load <4 x i8>, ptr %z, align 1
448  %1 = zext <4 x i8> %0 to <4 x i32>
449  store <4 x i32> %1, ptr %y, align 4
450  ret ptr %z
451}
452
453define ptr @ldrbu32_128(ptr %x, ptr %y) {
454; CHECK-LABEL: ldrbu32_128:
455; CHECK:       @ %bb.0: @ %entry
456; CHECK-NEXT:    adds r0, #128
457; CHECK-NEXT:    vldrb.u32 q0, [r0]
458; CHECK-NEXT:    vstrw.32 q0, [r1]
459; CHECK-NEXT:    bx lr
460entry:
461  %z = getelementptr inbounds i8, ptr %x, i32 128
462  %0 = load <4 x i8>, ptr %z, align 1
463  %1 = zext <4 x i8> %0 to <4 x i32>
464  store <4 x i32> %1, ptr %y, align 4
465  ret ptr %z
466}
467
468define ptr @ldrbu32_m127(ptr %x, ptr %y) {
469; CHECK-LABEL: ldrbu32_m127:
470; CHECK:       @ %bb.0: @ %entry
471; CHECK-NEXT:    vldrb.u32 q0, [r0, #-127]!
472; CHECK-NEXT:    vstrw.32 q0, [r1]
473; CHECK-NEXT:    bx lr
474entry:
475  %z = getelementptr inbounds i8, ptr %x, i32 -127
476  %0 = load <4 x i8>, ptr %z, align 1
477  %1 = zext <4 x i8> %0 to <4 x i32>
478  store <4 x i32> %1, ptr %y, align 4
479  ret ptr %z
480}
481
482define ptr @ldrbu32_m128(ptr %x, ptr %y) {
483; CHECK-LABEL: ldrbu32_m128:
484; CHECK:       @ %bb.0: @ %entry
485; CHECK-NEXT:    subs r0, #128
486; CHECK-NEXT:    vldrb.u32 q0, [r0]
487; CHECK-NEXT:    vstrw.32 q0, [r1]
488; CHECK-NEXT:    bx lr
489entry:
490  %z = getelementptr inbounds i8, ptr %x, i32 -128
491  %0 = load <4 x i8>, ptr %z, align 1
492  %1 = zext <4 x i8> %0 to <4 x i32>
493  store <4 x i32> %1, ptr %y, align 4
494  ret ptr %z
495}
496
497
498define ptr @ldrbs32_4(ptr %x, ptr %y) {
499; CHECK-LABEL: ldrbs32_4:
500; CHECK:       @ %bb.0: @ %entry
501; CHECK-NEXT:    vldrb.s32 q0, [r0, #4]!
502; CHECK-NEXT:    vstrw.32 q0, [r1]
503; CHECK-NEXT:    bx lr
504entry:
505  %z = getelementptr inbounds i8, ptr %x, i32 4
506  %0 = load <4 x i8>, ptr %z, align 1
507  %1 = sext <4 x i8> %0 to <4 x i32>
508  store <4 x i32> %1, ptr %y, align 4
509  ret ptr %z
510}
511
512define ptr @ldrbs32_3(ptr %x, ptr %y) {
513; CHECK-LABEL: ldrbs32_3:
514; CHECK:       @ %bb.0: @ %entry
515; CHECK-NEXT:    vldrb.s32 q0, [r0, #3]!
516; CHECK-NEXT:    vstrw.32 q0, [r1]
517; CHECK-NEXT:    bx lr
518entry:
519  %z = getelementptr inbounds i8, ptr %x, i32 3
520  %0 = load <4 x i8>, ptr %z, align 1
521  %1 = sext <4 x i8> %0 to <4 x i32>
522  store <4 x i32> %1, ptr %y, align 4
523  ret ptr %z
524}
525
526define ptr @ldrbs32_127(ptr %x, ptr %y) {
527; CHECK-LABEL: ldrbs32_127:
528; CHECK:       @ %bb.0: @ %entry
529; CHECK-NEXT:    vldrb.s32 q0, [r0, #127]!
530; CHECK-NEXT:    vstrw.32 q0, [r1]
531; CHECK-NEXT:    bx lr
532entry:
533  %z = getelementptr inbounds i8, ptr %x, i32 127
534  %0 = load <4 x i8>, ptr %z, align 1
535  %1 = sext <4 x i8> %0 to <4 x i32>
536  store <4 x i32> %1, ptr %y, align 4
537  ret ptr %z
538}
539
540define ptr @ldrbs32_128(ptr %x, ptr %y) {
541; CHECK-LABEL: ldrbs32_128:
542; CHECK:       @ %bb.0: @ %entry
543; CHECK-NEXT:    adds r0, #128
544; CHECK-NEXT:    vldrb.s32 q0, [r0]
545; CHECK-NEXT:    vstrw.32 q0, [r1]
546; CHECK-NEXT:    bx lr
547entry:
548  %z = getelementptr inbounds i8, ptr %x, i32 128
549  %0 = load <4 x i8>, ptr %z, align 1
550  %1 = sext <4 x i8> %0 to <4 x i32>
551  store <4 x i32> %1, ptr %y, align 4
552  ret ptr %z
553}
554
555define ptr @ldrbs32_m127(ptr %x, ptr %y) {
556; CHECK-LABEL: ldrbs32_m127:
557; CHECK:       @ %bb.0: @ %entry
558; CHECK-NEXT:    vldrb.s32 q0, [r0, #-127]!
559; CHECK-NEXT:    vstrw.32 q0, [r1]
560; CHECK-NEXT:    bx lr
561entry:
562  %z = getelementptr inbounds i8, ptr %x, i32 -127
563  %0 = load <4 x i8>, ptr %z, align 1
564  %1 = sext <4 x i8> %0 to <4 x i32>
565  store <4 x i32> %1, ptr %y, align 4
566  ret ptr %z
567}
568
569define ptr @ldrbs32_m128(ptr %x, ptr %y) {
570; CHECK-LABEL: ldrbs32_m128:
571; CHECK:       @ %bb.0: @ %entry
572; CHECK-NEXT:    subs r0, #128
573; CHECK-NEXT:    vldrb.s32 q0, [r0]
574; CHECK-NEXT:    vstrw.32 q0, [r1]
575; CHECK-NEXT:    bx lr
576entry:
577  %z = getelementptr inbounds i8, ptr %x, i32 -128
578  %0 = load <4 x i8>, ptr %z, align 1
579  %1 = sext <4 x i8> %0 to <4 x i32>
580  store <4 x i32> %1, ptr %y, align 4
581  ret ptr %z
582}
583
584
585define ptr @ldrbu16_4(ptr %x, ptr %y) {
586; CHECK-LABEL: ldrbu16_4:
587; CHECK:       @ %bb.0: @ %entry
588; CHECK-NEXT:    vldrb.u16 q0, [r0, #4]!
589; CHECK-NEXT:    vstrh.16 q0, [r1]
590; CHECK-NEXT:    bx lr
591entry:
592  %z = getelementptr inbounds i8, ptr %x, i32 4
593  %0 = load <8 x i8>, ptr %z, align 1
594  %1 = zext <8 x i8> %0 to <8 x i16>
595  store <8 x i16> %1, ptr %y, align 2
596  ret ptr %z
597}
598
599define ptr @ldrbu16_3(ptr %x, ptr %y) {
600; CHECK-LABEL: ldrbu16_3:
601; CHECK:       @ %bb.0: @ %entry
602; CHECK-NEXT:    vldrb.u16 q0, [r0, #3]!
603; CHECK-NEXT:    vstrh.16 q0, [r1]
604; CHECK-NEXT:    bx lr
605entry:
606  %z = getelementptr inbounds i8, ptr %x, i32 3
607  %0 = load <8 x i8>, ptr %z, align 1
608  %1 = zext <8 x i8> %0 to <8 x i16>
609  store <8 x i16> %1, ptr %y, align 2
610  ret ptr %z
611}
612
613define ptr @ldrbu16_127(ptr %x, ptr %y) {
614; CHECK-LABEL: ldrbu16_127:
615; CHECK:       @ %bb.0: @ %entry
616; CHECK-NEXT:    vldrb.u16 q0, [r0, #127]!
617; CHECK-NEXT:    vstrh.16 q0, [r1]
618; CHECK-NEXT:    bx lr
619entry:
620  %z = getelementptr inbounds i8, ptr %x, i32 127
621  %0 = load <8 x i8>, ptr %z, align 1
622  %1 = zext <8 x i8> %0 to <8 x i16>
623  store <8 x i16> %1, ptr %y, align 2
624  ret ptr %z
625}
626
627define ptr @ldrbu16_128(ptr %x, ptr %y) {
628; CHECK-LABEL: ldrbu16_128:
629; CHECK:       @ %bb.0: @ %entry
630; CHECK-NEXT:    adds r0, #128
631; CHECK-NEXT:    vldrb.u16 q0, [r0]
632; CHECK-NEXT:    vstrh.16 q0, [r1]
633; CHECK-NEXT:    bx lr
634entry:
635  %z = getelementptr inbounds i8, ptr %x, i32 128
636  %0 = load <8 x i8>, ptr %z, align 1
637  %1 = zext <8 x i8> %0 to <8 x i16>
638  store <8 x i16> %1, ptr %y, align 2
639  ret ptr %z
640}
641
642define ptr @ldrbu16_m127(ptr %x, ptr %y) {
643; CHECK-LABEL: ldrbu16_m127:
644; CHECK:       @ %bb.0: @ %entry
645; CHECK-NEXT:    vldrb.u16 q0, [r0, #-127]!
646; CHECK-NEXT:    vstrh.16 q0, [r1]
647; CHECK-NEXT:    bx lr
648entry:
649  %z = getelementptr inbounds i8, ptr %x, i32 -127
650  %0 = load <8 x i8>, ptr %z, align 1
651  %1 = zext <8 x i8> %0 to <8 x i16>
652  store <8 x i16> %1, ptr %y, align 2
653  ret ptr %z
654}
655
656define ptr @ldrbu16_m128(ptr %x, ptr %y) {
657; CHECK-LABEL: ldrbu16_m128:
658; CHECK:       @ %bb.0: @ %entry
659; CHECK-NEXT:    subs r0, #128
660; CHECK-NEXT:    vldrb.u16 q0, [r0]
661; CHECK-NEXT:    vstrh.16 q0, [r1]
662; CHECK-NEXT:    bx lr
663entry:
664  %z = getelementptr inbounds i8, ptr %x, i32 -128
665  %0 = load <8 x i8>, ptr %z, align 1
666  %1 = zext <8 x i8> %0 to <8 x i16>
667  store <8 x i16> %1, ptr %y, align 2
668  ret ptr %z
669}
670
671
672define ptr @ldrbs16_4(ptr %x, ptr %y) {
673; CHECK-LABEL: ldrbs16_4:
674; CHECK:       @ %bb.0: @ %entry
675; CHECK-NEXT:    vldrb.s16 q0, [r0, #4]!
676; CHECK-NEXT:    vstrh.16 q0, [r1]
677; CHECK-NEXT:    bx lr
678entry:
679  %z = getelementptr inbounds i8, ptr %x, i32 4
680  %0 = load <8 x i8>, ptr %z, align 1
681  %1 = sext <8 x i8> %0 to <8 x i16>
682  store <8 x i16> %1, ptr %y, align 2
683  ret ptr %z
684}
685
686define ptr @ldrbs16_3(ptr %x, ptr %y) {
687; CHECK-LABEL: ldrbs16_3:
688; CHECK:       @ %bb.0: @ %entry
689; CHECK-NEXT:    vldrb.s16 q0, [r0, #3]!
690; CHECK-NEXT:    vstrh.16 q0, [r1]
691; CHECK-NEXT:    bx lr
692entry:
693  %z = getelementptr inbounds i8, ptr %x, i32 3
694  %0 = load <8 x i8>, ptr %z, align 1
695  %1 = sext <8 x i8> %0 to <8 x i16>
696  store <8 x i16> %1, ptr %y, align 2
697  ret ptr %z
698}
699
700define ptr @ldrbs16_127(ptr %x, ptr %y) {
701; CHECK-LABEL: ldrbs16_127:
702; CHECK:       @ %bb.0: @ %entry
703; CHECK-NEXT:    vldrb.s16 q0, [r0, #127]!
704; CHECK-NEXT:    vstrh.16 q0, [r1]
705; CHECK-NEXT:    bx lr
706entry:
707  %z = getelementptr inbounds i8, ptr %x, i32 127
708  %0 = load <8 x i8>, ptr %z, align 1
709  %1 = sext <8 x i8> %0 to <8 x i16>
710  store <8 x i16> %1, ptr %y, align 2
711  ret ptr %z
712}
713
714define ptr @ldrbs16_128(ptr %x, ptr %y) {
715; CHECK-LABEL: ldrbs16_128:
716; CHECK:       @ %bb.0: @ %entry
717; CHECK-NEXT:    adds r0, #128
718; CHECK-NEXT:    vldrb.s16 q0, [r0]
719; CHECK-NEXT:    vstrh.16 q0, [r1]
720; CHECK-NEXT:    bx lr
721entry:
722  %z = getelementptr inbounds i8, ptr %x, i32 128
723  %0 = load <8 x i8>, ptr %z, align 1
724  %1 = sext <8 x i8> %0 to <8 x i16>
725  store <8 x i16> %1, ptr %y, align 2
726  ret ptr %z
727}
728
729define ptr @ldrbs16_m127(ptr %x, ptr %y) {
730; CHECK-LABEL: ldrbs16_m127:
731; CHECK:       @ %bb.0: @ %entry
732; CHECK-NEXT:    vldrb.s16 q0, [r0, #-127]!
733; CHECK-NEXT:    vstrh.16 q0, [r1]
734; CHECK-NEXT:    bx lr
735entry:
736  %z = getelementptr inbounds i8, ptr %x, i32 -127
737  %0 = load <8 x i8>, ptr %z, align 1
738  %1 = sext <8 x i8> %0 to <8 x i16>
739  store <8 x i16> %1, ptr %y, align 2
740  ret ptr %z
741}
742
743define ptr @ldrbs16_m128(ptr %x, ptr %y) {
744; CHECK-LABEL: ldrbs16_m128:
745; CHECK:       @ %bb.0: @ %entry
746; CHECK-NEXT:    subs r0, #128
747; CHECK-NEXT:    vldrb.s16 q0, [r0]
748; CHECK-NEXT:    vstrh.16 q0, [r1]
749; CHECK-NEXT:    bx lr
750entry:
751  %z = getelementptr inbounds i8, ptr %x, i32 -128
752  %0 = load <8 x i8>, ptr %z, align 1
753  %1 = sext <8 x i8> %0 to <8 x i16>
754  store <8 x i16> %1, ptr %y, align 2
755  ret ptr %z
756}
757
758
759define ptr @ldrbu8_4(ptr %x, ptr %y) {
760; CHECK-LABEL: ldrbu8_4:
761; CHECK:       @ %bb.0: @ %entry
762; CHECK-NEXT:    vldrb.u8 q0, [r0, #4]!
763; CHECK-NEXT:    vstrb.8 q0, [r1]
764; CHECK-NEXT:    bx lr
765entry:
766  %z = getelementptr inbounds i8, ptr %x, i32 4
767  %0 = load <16 x i8>, ptr %z, align 1
768  store <16 x i8> %0, ptr %y, align 1
769  ret ptr %z
770}
771
772define ptr @ldrbu8_3(ptr %x, ptr %y) {
773; CHECK-LABEL: ldrbu8_3:
774; CHECK:       @ %bb.0: @ %entry
775; CHECK-NEXT:    vldrb.u8 q0, [r0, #3]!
776; CHECK-NEXT:    vstrb.8 q0, [r1]
777; CHECK-NEXT:    bx lr
778entry:
779  %z = getelementptr inbounds i8, ptr %x, i32 3
780  %0 = load <16 x i8>, ptr %z, align 1
781  store <16 x i8> %0, ptr %y, align 1
782  ret ptr %z
783}
784
785define ptr @ldrbu8_127(ptr %x, ptr %y) {
786; CHECK-LABEL: ldrbu8_127:
787; CHECK:       @ %bb.0: @ %entry
788; CHECK-NEXT:    vldrb.u8 q0, [r0, #127]!
789; CHECK-NEXT:    vstrb.8 q0, [r1]
790; CHECK-NEXT:    bx lr
791entry:
792  %z = getelementptr inbounds i8, ptr %x, i32 127
793  %0 = load <16 x i8>, ptr %z, align 1
794  store <16 x i8> %0, ptr %y, align 1
795  ret ptr %z
796}
797
798define ptr @ldrbu8_128(ptr %x, ptr %y) {
799; CHECK-LABEL: ldrbu8_128:
800; CHECK:       @ %bb.0: @ %entry
801; CHECK-NEXT:    adds r0, #128
802; CHECK-NEXT:    vldrb.u8 q0, [r0]
803; CHECK-NEXT:    vstrb.8 q0, [r1]
804; CHECK-NEXT:    bx lr
805entry:
806  %z = getelementptr inbounds i8, ptr %x, i32 128
807  %0 = load <16 x i8>, ptr %z, align 1
808  store <16 x i8> %0, ptr %y, align 1
809  ret ptr %z
810}
811
812define ptr @ldrbu8_m127(ptr %x, ptr %y) {
813; CHECK-LABEL: ldrbu8_m127:
814; CHECK:       @ %bb.0: @ %entry
815; CHECK-NEXT:    vldrb.u8 q0, [r0, #-127]!
816; CHECK-NEXT:    vstrb.8 q0, [r1]
817; CHECK-NEXT:    bx lr
818entry:
819  %z = getelementptr inbounds i8, ptr %x, i32 -127
820  %0 = load <16 x i8>, ptr %z, align 1
821  store <16 x i8> %0, ptr %y, align 1
822  ret ptr %z
823}
824
825define ptr @ldrbu8_m128(ptr %x, ptr %y) {
826; CHECK-LABEL: ldrbu8_m128:
827; CHECK:       @ %bb.0: @ %entry
828; CHECK-NEXT:    subs r0, #128
829; CHECK-NEXT:    vldrb.u8 q0, [r0]
830; CHECK-NEXT:    vstrb.8 q0, [r1]
831; CHECK-NEXT:    bx lr
832entry:
833  %z = getelementptr inbounds i8, ptr %x, i32 -128
834  %0 = load <16 x i8>, ptr %z, align 1
835  store <16 x i8> %0, ptr %y, align 1
836  ret ptr %z
837}
838
839
840define ptr @ldrwf32_4(ptr %x, ptr %y) {
841; CHECK-LABEL: ldrwf32_4:
842; CHECK:       @ %bb.0: @ %entry
843; CHECK-NEXT:    vldrw.u32 q0, [r0, #4]!
844; CHECK-NEXT:    vstrw.32 q0, [r1]
845; CHECK-NEXT:    bx lr
846entry:
847  %z = getelementptr inbounds i8, ptr %x, i32 4
848  %0 = load <4 x float>, ptr %z, align 4
849  store <4 x float> %0, ptr %y, align 4
850  ret ptr %z
851}
852
853define ptr @ldrwf16_4(ptr %x, ptr %y) {
854; CHECK-LABEL: ldrwf16_4:
855; CHECK:       @ %bb.0: @ %entry
856; CHECK-NEXT:    vldrh.u16 q0, [r0, #4]!
857; CHECK-NEXT:    vstrh.16 q0, [r1]
858; CHECK-NEXT:    bx lr
859entry:
860  %z = getelementptr inbounds i8, ptr %x, i32 4
861  %0 = load <8 x half>, ptr %z, align 2
862  store <8 x half> %0, ptr %y, align 2
863  ret ptr %z
864}
865
866define ptr @ldrwi32_align1(ptr %x, ptr %y) {
867; CHECK-LE-LABEL: ldrwi32_align1:
868; CHECK-LE:       @ %bb.0: @ %entry
869; CHECK-LE-NEXT:    vldrb.u8 q0, [r0, #3]!
870; CHECK-LE-NEXT:    vstrw.32 q0, [r1]
871; CHECK-LE-NEXT:    bx lr
872;
873; CHECK-BE-LABEL: ldrwi32_align1:
874; CHECK-BE:       @ %bb.0: @ %entry
875; CHECK-BE-NEXT:    vldrb.u8 q0, [r0, #3]
876; CHECK-BE-NEXT:    adds r0, #3
877; CHECK-BE-NEXT:    vrev32.8 q0, q0
878; CHECK-BE-NEXT:    vstrw.32 q0, [r1]
879; CHECK-BE-NEXT:    bx lr
880entry:
881  %z = getelementptr inbounds i8, ptr %x, i32 3
882  %0 = load <4 x i32>, ptr %z, align 1
883  store <4 x i32> %0, ptr %y, align 4
884  ret ptr %z
885}
886
887define ptr @ldrhi16_align1(ptr %x, ptr %y) {
888; CHECK-LE-LABEL: ldrhi16_align1:
889; CHECK-LE:       @ %bb.0: @ %entry
890; CHECK-LE-NEXT:    vldrb.u8 q0, [r0, #3]!
891; CHECK-LE-NEXT:    vstrh.16 q0, [r1]
892; CHECK-LE-NEXT:    bx lr
893;
894; CHECK-BE-LABEL: ldrhi16_align1:
895; CHECK-BE:       @ %bb.0: @ %entry
896; CHECK-BE-NEXT:    vldrb.u8 q0, [r0, #3]
897; CHECK-BE-NEXT:    adds r0, #3
898; CHECK-BE-NEXT:    vrev16.8 q0, q0
899; CHECK-BE-NEXT:    vstrh.16 q0, [r1]
900; CHECK-BE-NEXT:    bx lr
901entry:
902  %z = getelementptr inbounds i8, ptr %x, i32 3
903  %0 = load <8 x i16>, ptr %z, align 1
904  store <8 x i16> %0, ptr %y, align 2
905  ret ptr %z
906}
907
908define ptr @ldrhi32_align1(ptr %x, ptr %y) {
909; CHECK-LABEL: ldrhi32_align1:
910; CHECK:       @ %bb.0: @ %entry
911; CHECK-NEXT:    .pad #8
912; CHECK-NEXT:    sub sp, #8
913; CHECK-NEXT:    ldr r2, [r0, #3]!
914; CHECK-NEXT:    str r2, [sp]
915; CHECK-NEXT:    ldr r2, [r0, #4]
916; CHECK-NEXT:    str r2, [sp, #4]
917; CHECK-NEXT:    mov r2, sp
918; CHECK-NEXT:    vldrh.s32 q0, [r2]
919; CHECK-NEXT:    vstrw.32 q0, [r1]
920; CHECK-NEXT:    add sp, #8
921; CHECK-NEXT:    bx lr
922entry:
923  %z = getelementptr inbounds i8, ptr %x, i32 3
924  %0 = load <4 x i16>, ptr %z, align 1
925  %1 = sext <4 x i16> %0 to <4 x i32>
926  store <4 x i32> %1, ptr %y, align 4
927  ret ptr %z
928}
929
930define ptr @ldrf32_align1(ptr %x, ptr %y) {
931; CHECK-LE-LABEL: ldrf32_align1:
932; CHECK-LE:       @ %bb.0: @ %entry
933; CHECK-LE-NEXT:    vldrb.u8 q0, [r0, #3]!
934; CHECK-LE-NEXT:    vstrw.32 q0, [r1]
935; CHECK-LE-NEXT:    bx lr
936;
937; CHECK-BE-LABEL: ldrf32_align1:
938; CHECK-BE:       @ %bb.0: @ %entry
939; CHECK-BE-NEXT:    vldrb.u8 q0, [r0, #3]
940; CHECK-BE-NEXT:    adds r0, #3
941; CHECK-BE-NEXT:    vrev32.8 q0, q0
942; CHECK-BE-NEXT:    vstrw.32 q0, [r1]
943; CHECK-BE-NEXT:    bx lr
944entry:
945  %z = getelementptr inbounds i8, ptr %x, i32 3
946  %0 = load <4 x float>, ptr %z, align 1
947  store <4 x float> %0, ptr %y, align 4
948  ret ptr %z
949}
950
951define ptr @ldrf16_align1(ptr %x, ptr %y) {
952; CHECK-LE-LABEL: ldrf16_align1:
953; CHECK-LE:       @ %bb.0: @ %entry
954; CHECK-LE-NEXT:    vldrb.u8 q0, [r0, #3]!
955; CHECK-LE-NEXT:    vstrh.16 q0, [r1]
956; CHECK-LE-NEXT:    bx lr
957;
958; CHECK-BE-LABEL: ldrf16_align1:
959; CHECK-BE:       @ %bb.0: @ %entry
960; CHECK-BE-NEXT:    vldrb.u8 q0, [r0, #3]
961; CHECK-BE-NEXT:    adds r0, #3
962; CHECK-BE-NEXT:    vrev16.8 q0, q0
963; CHECK-BE-NEXT:    vstrh.16 q0, [r1]
964; CHECK-BE-NEXT:    bx lr
965entry:
966  %z = getelementptr inbounds i8, ptr %x, i32 3
967  %0 = load <8 x half>, ptr %z, align 1
968  store <8 x half> %0, ptr %y, align 2
969  ret ptr %z
970}
971
972define ptr @ldrh16_align8(ptr %x, ptr %y) {
973; CHECK-LE-LABEL: ldrh16_align8:
974; CHECK-LE:       @ %bb.0: @ %entry
975; CHECK-LE-NEXT:    vldrw.u32 q0, [r0, #4]!
976; CHECK-LE-NEXT:    vstrh.16 q0, [r1]
977; CHECK-LE-NEXT:    bx lr
978;
979; CHECK-BE-LABEL: ldrh16_align8:
980; CHECK-BE:       @ %bb.0: @ %entry
981; CHECK-BE-NEXT:    vldrh.u16 q0, [r0, #4]!
982; CHECK-BE-NEXT:    vstrh.16 q0, [r1]
983; CHECK-BE-NEXT:    bx lr
984entry:
985  %z = getelementptr inbounds i8, ptr %x, i32 4
986  %0 = load <8 x i16>, ptr %z, align 8
987  store <8 x i16> %0, ptr %y, align 2
988  ret ptr %z
989}
990
991
992
993
994
995define ptr @strw32_4(ptr %y, ptr %x) {
996; CHECK-LE-LABEL: strw32_4:
997; CHECK-LE:       @ %bb.0: @ %entry
998; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
999; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #4]!
1000; CHECK-LE-NEXT:    bx lr
1001;
1002; CHECK-BE-LABEL: strw32_4:
1003; CHECK-BE:       @ %bb.0: @ %entry
1004; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
1005; CHECK-BE-NEXT:    vstrw.32 q0, [r0, #4]!
1006; CHECK-BE-NEXT:    bx lr
1007entry:
1008  %z = getelementptr inbounds i8, ptr %y, i32 4
1009  %0 = load <4 x i32>, ptr %x, align 4
1010  store <4 x i32> %0, ptr %z, align 4
1011  ret ptr %z
1012}
1013
1014define ptr @strw32_3(ptr %y, ptr %x) {
1015; CHECK-LE-LABEL: strw32_3:
1016; CHECK-LE:       @ %bb.0: @ %entry
1017; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
1018; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #3]!
1019; CHECK-LE-NEXT:    bx lr
1020;
1021; CHECK-BE-LABEL: strw32_3:
1022; CHECK-BE:       @ %bb.0: @ %entry
1023; CHECK-BE-NEXT:    adds r0, #3
1024; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
1025; CHECK-BE-NEXT:    vstrw.32 q0, [r0]
1026; CHECK-BE-NEXT:    bx lr
1027entry:
1028  %z = getelementptr inbounds i8, ptr %y, i32 3
1029  %0 = load <4 x i32>, ptr %x, align 4
1030  store <4 x i32> %0, ptr %z, align 4
1031  ret ptr %z
1032}
1033
1034define ptr @strw32_m4(ptr %y, ptr %x) {
1035; CHECK-LE-LABEL: strw32_m4:
1036; CHECK-LE:       @ %bb.0: @ %entry
1037; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
1038; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #-4]!
1039; CHECK-LE-NEXT:    bx lr
1040;
1041; CHECK-BE-LABEL: strw32_m4:
1042; CHECK-BE:       @ %bb.0: @ %entry
1043; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
1044; CHECK-BE-NEXT:    vstrw.32 q0, [r0, #-4]!
1045; CHECK-BE-NEXT:    bx lr
1046entry:
1047  %z = getelementptr inbounds i8, ptr %y, i32 -4
1048  %0 = load <4 x i32>, ptr %x, align 4
1049  store <4 x i32> %0, ptr %z, align 4
1050  ret ptr %z
1051}
1052
1053define ptr @strw32_508(ptr %y, ptr %x) {
1054; CHECK-LABEL: strw32_508:
1055; CHECK:       @ %bb.0: @ %entry
1056; CHECK-NEXT:    vldrw.u32 q0, [r1]
1057; CHECK-NEXT:    vstrw.32 q0, [r0, #508]!
1058; CHECK-NEXT:    bx lr
1059entry:
1060  %z = getelementptr inbounds i8, ptr %y, i32 508
1061  %0 = load <4 x i32>, ptr %x, align 4
1062  store <4 x i32> %0, ptr %z, align 4
1063  ret ptr %z
1064}
1065
1066define ptr @strw32_512(ptr %y, ptr %x) {
1067; CHECK-LABEL: strw32_512:
1068; CHECK:       @ %bb.0: @ %entry
1069; CHECK-NEXT:    add.w r0, r0, #512
1070; CHECK-NEXT:    vldrw.u32 q0, [r1]
1071; CHECK-NEXT:    vstrw.32 q0, [r0]
1072; CHECK-NEXT:    bx lr
1073entry:
1074  %z = getelementptr inbounds i8, ptr %y, i32 512
1075  %0 = load <4 x i32>, ptr %x, align 4
1076  store <4 x i32> %0, ptr %z, align 4
1077  ret ptr %z
1078}
1079
1080define ptr @strw32_m508(ptr %y, ptr %x) {
1081; CHECK-LABEL: strw32_m508:
1082; CHECK:       @ %bb.0: @ %entry
1083; CHECK-NEXT:    vldrw.u32 q0, [r1]
1084; CHECK-NEXT:    vstrw.32 q0, [r0, #-508]!
1085; CHECK-NEXT:    bx lr
1086entry:
1087  %z = getelementptr inbounds i8, ptr %y, i32 -508
1088  %0 = load <4 x i32>, ptr %x, align 4
1089  store <4 x i32> %0, ptr %z, align 4
1090  ret ptr %z
1091}
1092
1093define ptr @strw32_m512(ptr %y, ptr %x) {
1094; CHECK-LABEL: strw32_m512:
1095; CHECK:       @ %bb.0: @ %entry
1096; CHECK-NEXT:    sub.w r0, r0, #512
1097; CHECK-NEXT:    vldrw.u32 q0, [r1]
1098; CHECK-NEXT:    vstrw.32 q0, [r0]
1099; CHECK-NEXT:    bx lr
1100entry:
1101  %z = getelementptr inbounds i8, ptr %y, i32 -512
1102  %0 = load <4 x i32>, ptr %x, align 4
1103  store <4 x i32> %0, ptr %z, align 4
1104  ret ptr %z
1105}
1106
1107
1108define ptr @strh32_4(ptr %y, ptr %x) {
1109; CHECK-LABEL: strh32_4:
1110; CHECK:       @ %bb.0: @ %entry
1111; CHECK-NEXT:    vldrh.u32 q0, [r1]
1112; CHECK-NEXT:    vstrh.32 q0, [r0, #4]!
1113; CHECK-NEXT:    bx lr
1114entry:
1115  %z = getelementptr inbounds i8, ptr %y, i32 4
1116  %0 = load <4 x i16>, ptr %x, align 2
1117  store <4 x i16> %0, ptr %z, align 2
1118  ret ptr %z
1119}
1120
1121define ptr @strh32_3(ptr %y, ptr %x) {
1122; CHECK-LABEL: strh32_3:
1123; CHECK:       @ %bb.0: @ %entry
1124; CHECK-NEXT:    adds r0, #3
1125; CHECK-NEXT:    vldrh.u32 q0, [r1]
1126; CHECK-NEXT:    vstrh.32 q0, [r0]
1127; CHECK-NEXT:    bx lr
1128entry:
1129  %z = getelementptr inbounds i8, ptr %y, i32 3
1130  %0 = load <4 x i16>, ptr %x, align 2
1131  store <4 x i16> %0, ptr %z, align 2
1132  ret ptr %z
1133}
1134
1135define ptr @strh32_2(ptr %y, ptr %x) {
1136; CHECK-LABEL: strh32_2:
1137; CHECK:       @ %bb.0: @ %entry
1138; CHECK-NEXT:    vldrh.u32 q0, [r1]
1139; CHECK-NEXT:    vstrh.32 q0, [r0, #2]!
1140; CHECK-NEXT:    bx lr
1141entry:
1142  %z = getelementptr inbounds i8, ptr %y, i32 2
1143  %0 = load <4 x i16>, ptr %x, align 2
1144  store <4 x i16> %0, ptr %z, align 2
1145  ret ptr %z
1146}
1147
1148define ptr @strh32_254(ptr %y, ptr %x) {
1149; CHECK-LABEL: strh32_254:
1150; CHECK:       @ %bb.0: @ %entry
1151; CHECK-NEXT:    vldrh.u32 q0, [r1]
1152; CHECK-NEXT:    vstrh.32 q0, [r0, #254]!
1153; CHECK-NEXT:    bx lr
1154entry:
1155  %z = getelementptr inbounds i8, ptr %y, i32 254
1156  %0 = load <4 x i16>, ptr %x, align 2
1157  store <4 x i16> %0, ptr %z, align 2
1158  ret ptr %z
1159}
1160
1161define ptr @strh32_256(ptr %y, ptr %x) {
1162; CHECK-LABEL: strh32_256:
1163; CHECK:       @ %bb.0: @ %entry
1164; CHECK-NEXT:    add.w r0, r0, #256
1165; CHECK-NEXT:    vldrh.u32 q0, [r1]
1166; CHECK-NEXT:    vstrh.32 q0, [r0]
1167; CHECK-NEXT:    bx lr
1168entry:
1169  %z = getelementptr inbounds i8, ptr %y, i32 256
1170  %0 = load <4 x i16>, ptr %x, align 2
1171  store <4 x i16> %0, ptr %z, align 2
1172  ret ptr %z
1173}
1174
1175define ptr @strh32_m254(ptr %y, ptr %x) {
1176; CHECK-LABEL: strh32_m254:
1177; CHECK:       @ %bb.0: @ %entry
1178; CHECK-NEXT:    vldrh.u32 q0, [r1]
1179; CHECK-NEXT:    vstrh.32 q0, [r0, #-254]!
1180; CHECK-NEXT:    bx lr
1181entry:
1182  %z = getelementptr inbounds i8, ptr %y, i32 -254
1183  %0 = load <4 x i16>, ptr %x, align 2
1184  store <4 x i16> %0, ptr %z, align 2
1185  ret ptr %z
1186}
1187
1188define ptr @strh32_m256(ptr %y, ptr %x) {
1189; CHECK-LABEL: strh32_m256:
1190; CHECK:       @ %bb.0: @ %entry
1191; CHECK-NEXT:    sub.w r0, r0, #256
1192; CHECK-NEXT:    vldrh.u32 q0, [r1]
1193; CHECK-NEXT:    vstrh.32 q0, [r0]
1194; CHECK-NEXT:    bx lr
1195entry:
1196  %z = getelementptr inbounds i8, ptr %y, i32 -256
1197  %0 = load <4 x i16>, ptr %x, align 2
1198  store <4 x i16> %0, ptr %z, align 2
1199  ret ptr %z
1200}
1201
1202
1203define ptr @strh16_4(ptr %y, ptr %x) {
1204; CHECK-LE-LABEL: strh16_4:
1205; CHECK-LE:       @ %bb.0: @ %entry
1206; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1207; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #4]!
1208; CHECK-LE-NEXT:    bx lr
1209;
1210; CHECK-BE-LABEL: strh16_4:
1211; CHECK-BE:       @ %bb.0: @ %entry
1212; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1213; CHECK-BE-NEXT:    vstrh.16 q0, [r0, #4]!
1214; CHECK-BE-NEXT:    bx lr
1215entry:
1216  %z = getelementptr inbounds i8, ptr %y, i32 4
1217  %0 = load <8 x i16>, ptr %x, align 2
1218  store <8 x i16> %0, ptr %z, align 2
1219  ret ptr %z
1220}
1221
1222define ptr @strh16_3(ptr %y, ptr %x) {
1223; CHECK-LE-LABEL: strh16_3:
1224; CHECK-LE:       @ %bb.0: @ %entry
1225; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1226; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #3]!
1227; CHECK-LE-NEXT:    bx lr
1228;
1229; CHECK-BE-LABEL: strh16_3:
1230; CHECK-BE:       @ %bb.0: @ %entry
1231; CHECK-BE-NEXT:    adds r0, #3
1232; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1233; CHECK-BE-NEXT:    vstrh.16 q0, [r0]
1234; CHECK-BE-NEXT:    bx lr
1235entry:
1236  %z = getelementptr inbounds i8, ptr %y, i32 3
1237  %0 = load <8 x i16>, ptr %x, align 2
1238  store <8 x i16> %0, ptr %z, align 2
1239  ret ptr %z
1240}
1241
1242define ptr @strh16_2(ptr %y, ptr %x) {
1243; CHECK-LE-LABEL: strh16_2:
1244; CHECK-LE:       @ %bb.0: @ %entry
1245; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1246; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #2]!
1247; CHECK-LE-NEXT:    bx lr
1248;
1249; CHECK-BE-LABEL: strh16_2:
1250; CHECK-BE:       @ %bb.0: @ %entry
1251; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1252; CHECK-BE-NEXT:    vstrh.16 q0, [r0, #2]!
1253; CHECK-BE-NEXT:    bx lr
1254entry:
1255  %z = getelementptr inbounds i8, ptr %y, i32 2
1256  %0 = load <8 x i16>, ptr %x, align 2
1257  store <8 x i16> %0, ptr %z, align 2
1258  ret ptr %z
1259}
1260
1261define ptr @strh16_254(ptr %y, ptr %x) {
1262; CHECK-LABEL: strh16_254:
1263; CHECK:       @ %bb.0: @ %entry
1264; CHECK-NEXT:    vldrh.u16 q0, [r1]
1265; CHECK-NEXT:    vstrh.16 q0, [r0, #254]!
1266; CHECK-NEXT:    bx lr
1267entry:
1268  %z = getelementptr inbounds i8, ptr %y, i32 254
1269  %0 = load <8 x i16>, ptr %x, align 2
1270  store <8 x i16> %0, ptr %z, align 2
1271  ret ptr %z
1272}
1273
1274define ptr @strh16_256(ptr %y, ptr %x) {
1275; CHECK-LABEL: strh16_256:
1276; CHECK:       @ %bb.0: @ %entry
1277; CHECK-NEXT:    add.w r0, r0, #256
1278; CHECK-NEXT:    vldrh.u16 q0, [r1]
1279; CHECK-NEXT:    vstrh.16 q0, [r0]
1280; CHECK-NEXT:    bx lr
1281entry:
1282  %z = getelementptr inbounds i8, ptr %y, i32 256
1283  %0 = load <8 x i16>, ptr %x, align 2
1284  store <8 x i16> %0, ptr %z, align 2
1285  ret ptr %z
1286}
1287
1288define ptr @strh16_m254(ptr %y, ptr %x) {
1289; CHECK-LABEL: strh16_m254:
1290; CHECK:       @ %bb.0: @ %entry
1291; CHECK-NEXT:    vldrh.u16 q0, [r1]
1292; CHECK-NEXT:    vstrh.16 q0, [r0, #-254]!
1293; CHECK-NEXT:    bx lr
1294entry:
1295  %z = getelementptr inbounds i8, ptr %y, i32 -254
1296  %0 = load <8 x i16>, ptr %x, align 2
1297  store <8 x i16> %0, ptr %z, align 2
1298  ret ptr %z
1299}
1300
1301define ptr @strh16_m256(ptr %y, ptr %x) {
1302; CHECK-LABEL: strh16_m256:
1303; CHECK:       @ %bb.0: @ %entry
1304; CHECK-NEXT:    sub.w r0, r0, #256
1305; CHECK-NEXT:    vldrh.u16 q0, [r1]
1306; CHECK-NEXT:    vstrh.16 q0, [r0]
1307; CHECK-NEXT:    bx lr
1308entry:
1309  %z = getelementptr inbounds i8, ptr %y, i32 -256
1310  %0 = load <8 x i16>, ptr %x, align 2
1311  store <8 x i16> %0, ptr %z, align 2
1312  ret ptr %z
1313}
1314
1315
1316define ptr @strb32_4(ptr %y, ptr %x) {
1317; CHECK-LABEL: strb32_4:
1318; CHECK:       @ %bb.0: @ %entry
1319; CHECK-NEXT:    vldrb.u32 q0, [r1]
1320; CHECK-NEXT:    vstrb.32 q0, [r0, #4]!
1321; CHECK-NEXT:    bx lr
1322entry:
1323  %z = getelementptr inbounds i8, ptr %y, i32 4
1324  %0 = load <4 x i8>, ptr %x, align 1
1325  store <4 x i8> %0, ptr %z, align 1
1326  ret ptr %z
1327}
1328
1329define ptr @strb32_3(ptr %y, ptr %x) {
1330; CHECK-LABEL: strb32_3:
1331; CHECK:       @ %bb.0: @ %entry
1332; CHECK-NEXT:    vldrb.u32 q0, [r1]
1333; CHECK-NEXT:    vstrb.32 q0, [r0, #3]!
1334; CHECK-NEXT:    bx lr
1335entry:
1336  %z = getelementptr inbounds i8, ptr %y, i32 3
1337  %0 = load <4 x i8>, ptr %x, align 1
1338  store <4 x i8> %0, ptr %z, align 1
1339  ret ptr %z
1340}
1341
1342define ptr @strb32_127(ptr %y, ptr %x) {
1343; CHECK-LABEL: strb32_127:
1344; CHECK:       @ %bb.0: @ %entry
1345; CHECK-NEXT:    vldrb.u32 q0, [r1]
1346; CHECK-NEXT:    vstrb.32 q0, [r0, #127]!
1347; CHECK-NEXT:    bx lr
1348entry:
1349  %z = getelementptr inbounds i8, ptr %y, i32 127
1350  %0 = load <4 x i8>, ptr %x, align 1
1351  store <4 x i8> %0, ptr %z, align 1
1352  ret ptr %z
1353}
1354
1355define ptr @strb32_128(ptr %y, ptr %x) {
1356; CHECK-LABEL: strb32_128:
1357; CHECK:       @ %bb.0: @ %entry
1358; CHECK-NEXT:    adds r0, #128
1359; CHECK-NEXT:    vldrb.u32 q0, [r1]
1360; CHECK-NEXT:    vstrb.32 q0, [r0]
1361; CHECK-NEXT:    bx lr
1362entry:
1363  %z = getelementptr inbounds i8, ptr %y, i32 128
1364  %0 = load <4 x i8>, ptr %x, align 1
1365  store <4 x i8> %0, ptr %z, align 1
1366  ret ptr %z
1367}
1368
1369define ptr @strb32_m127(ptr %y, ptr %x) {
1370; CHECK-LABEL: strb32_m127:
1371; CHECK:       @ %bb.0: @ %entry
1372; CHECK-NEXT:    vldrb.u32 q0, [r1]
1373; CHECK-NEXT:    vstrb.32 q0, [r0, #-127]!
1374; CHECK-NEXT:    bx lr
1375entry:
1376  %z = getelementptr inbounds i8, ptr %y, i32 -127
1377  %0 = load <4 x i8>, ptr %x, align 1
1378  store <4 x i8> %0, ptr %z, align 1
1379  ret ptr %z
1380}
1381
1382define ptr @strb32_m128(ptr %y, ptr %x) {
1383; CHECK-LABEL: strb32_m128:
1384; CHECK:       @ %bb.0: @ %entry
1385; CHECK-NEXT:    subs r0, #128
1386; CHECK-NEXT:    vldrb.u32 q0, [r1]
1387; CHECK-NEXT:    vstrb.32 q0, [r0]
1388; CHECK-NEXT:    bx lr
1389entry:
1390  %z = getelementptr inbounds i8, ptr %y, i32 -128
1391  %0 = load <4 x i8>, ptr %x, align 1
1392  store <4 x i8> %0, ptr %z, align 1
1393  ret ptr %z
1394}
1395
1396
1397define ptr @strb16_4(ptr %y, ptr %x) {
1398; CHECK-LABEL: strb16_4:
1399; CHECK:       @ %bb.0: @ %entry
1400; CHECK-NEXT:    vldrb.u16 q0, [r1]
1401; CHECK-NEXT:    vstrb.16 q0, [r0, #4]!
1402; CHECK-NEXT:    bx lr
1403entry:
1404  %z = getelementptr inbounds i8, ptr %y, i32 4
1405  %0 = load <8 x i8>, ptr %x, align 1
1406  store <8 x i8> %0, ptr %z, align 1
1407  ret ptr %z
1408}
1409
1410define ptr @strb16_3(ptr %y, ptr %x) {
1411; CHECK-LABEL: strb16_3:
1412; CHECK:       @ %bb.0: @ %entry
1413; CHECK-NEXT:    vldrb.u16 q0, [r1]
1414; CHECK-NEXT:    vstrb.16 q0, [r0, #3]!
1415; CHECK-NEXT:    bx lr
1416entry:
1417  %z = getelementptr inbounds i8, ptr %y, i32 3
1418  %0 = load <8 x i8>, ptr %x, align 1
1419  store <8 x i8> %0, ptr %z, align 1
1420  ret ptr %z
1421}
1422
1423define ptr @strb16_127(ptr %y, ptr %x) {
1424; CHECK-LABEL: strb16_127:
1425; CHECK:       @ %bb.0: @ %entry
1426; CHECK-NEXT:    vldrb.u16 q0, [r1]
1427; CHECK-NEXT:    vstrb.16 q0, [r0, #127]!
1428; CHECK-NEXT:    bx lr
1429entry:
1430  %z = getelementptr inbounds i8, ptr %y, i32 127
1431  %0 = load <8 x i8>, ptr %x, align 1
1432  store <8 x i8> %0, ptr %z, align 1
1433  ret ptr %z
1434}
1435
1436define ptr @strb16_128(ptr %y, ptr %x) {
1437; CHECK-LABEL: strb16_128:
1438; CHECK:       @ %bb.0: @ %entry
1439; CHECK-NEXT:    adds r0, #128
1440; CHECK-NEXT:    vldrb.u16 q0, [r1]
1441; CHECK-NEXT:    vstrb.16 q0, [r0]
1442; CHECK-NEXT:    bx lr
1443entry:
1444  %z = getelementptr inbounds i8, ptr %y, i32 128
1445  %0 = load <8 x i8>, ptr %x, align 1
1446  store <8 x i8> %0, ptr %z, align 1
1447  ret ptr %z
1448}
1449
1450define ptr @strb16_m127(ptr %y, ptr %x) {
1451; CHECK-LABEL: strb16_m127:
1452; CHECK:       @ %bb.0: @ %entry
1453; CHECK-NEXT:    vldrb.u16 q0, [r1]
1454; CHECK-NEXT:    vstrb.16 q0, [r0, #-127]!
1455; CHECK-NEXT:    bx lr
1456entry:
1457  %z = getelementptr inbounds i8, ptr %y, i32 -127
1458  %0 = load <8 x i8>, ptr %x, align 1
1459  store <8 x i8> %0, ptr %z, align 1
1460  ret ptr %z
1461}
1462
1463define ptr @strb16_m128(ptr %y, ptr %x) {
1464; CHECK-LABEL: strb16_m128:
1465; CHECK:       @ %bb.0: @ %entry
1466; CHECK-NEXT:    subs r0, #128
1467; CHECK-NEXT:    vldrb.u16 q0, [r1]
1468; CHECK-NEXT:    vstrb.16 q0, [r0]
1469; CHECK-NEXT:    bx lr
1470entry:
1471  %z = getelementptr inbounds i8, ptr %y, i32 -128
1472  %0 = load <8 x i8>, ptr %x, align 1
1473  store <8 x i8> %0, ptr %z, align 1
1474  ret ptr %z
1475}
1476
1477
1478define ptr @strb8_4(ptr %y, ptr %x) {
1479; CHECK-LABEL: strb8_4:
1480; CHECK:       @ %bb.0: @ %entry
1481; CHECK-NEXT:    vldrb.u8 q0, [r1]
1482; CHECK-NEXT:    vstrb.8 q0, [r0, #4]!
1483; CHECK-NEXT:    bx lr
1484entry:
1485  %z = getelementptr inbounds i8, ptr %y, i32 4
1486  %0 = load <16 x i8>, ptr %x, align 1
1487  store <16 x i8> %0, ptr %z, align 1
1488  ret ptr %z
1489}
1490
1491define ptr @strb8_3(ptr %y, ptr %x) {
1492; CHECK-LABEL: strb8_3:
1493; CHECK:       @ %bb.0: @ %entry
1494; CHECK-NEXT:    vldrb.u8 q0, [r1]
1495; CHECK-NEXT:    vstrb.8 q0, [r0, #3]!
1496; CHECK-NEXT:    bx lr
1497entry:
1498  %z = getelementptr inbounds i8, ptr %y, i32 3
1499  %0 = load <16 x i8>, ptr %x, align 1
1500  store <16 x i8> %0, ptr %z, align 1
1501  ret ptr %z
1502}
1503
1504define ptr @strb8_127(ptr %y, ptr %x) {
1505; CHECK-LABEL: strb8_127:
1506; CHECK:       @ %bb.0: @ %entry
1507; CHECK-NEXT:    vldrb.u8 q0, [r1]
1508; CHECK-NEXT:    vstrb.8 q0, [r0, #127]!
1509; CHECK-NEXT:    bx lr
1510entry:
1511  %z = getelementptr inbounds i8, ptr %y, i32 127
1512  %0 = load <16 x i8>, ptr %x, align 1
1513  store <16 x i8> %0, ptr %z, align 1
1514  ret ptr %z
1515}
1516
1517define ptr @strb8_128(ptr %y, ptr %x) {
1518; CHECK-LABEL: strb8_128:
1519; CHECK:       @ %bb.0: @ %entry
1520; CHECK-NEXT:    adds r0, #128
1521; CHECK-NEXT:    vldrb.u8 q0, [r1]
1522; CHECK-NEXT:    vstrb.8 q0, [r0]
1523; CHECK-NEXT:    bx lr
1524entry:
1525  %z = getelementptr inbounds i8, ptr %y, i32 128
1526  %0 = load <16 x i8>, ptr %x, align 1
1527  store <16 x i8> %0, ptr %z, align 1
1528  ret ptr %z
1529}
1530
1531define ptr @strb8_m127(ptr %y, ptr %x) {
1532; CHECK-LABEL: strb8_m127:
1533; CHECK:       @ %bb.0: @ %entry
1534; CHECK-NEXT:    vldrb.u8 q0, [r1]
1535; CHECK-NEXT:    vstrb.8 q0, [r0, #-127]!
1536; CHECK-NEXT:    bx lr
1537entry:
1538  %z = getelementptr inbounds i8, ptr %y, i32 -127
1539  %0 = load <16 x i8>, ptr %x, align 1
1540  store <16 x i8> %0, ptr %z, align 1
1541  ret ptr %z
1542}
1543
1544define ptr @strb8_m128(ptr %y, ptr %x) {
1545; CHECK-LABEL: strb8_m128:
1546; CHECK:       @ %bb.0: @ %entry
1547; CHECK-NEXT:    subs r0, #128
1548; CHECK-NEXT:    vldrb.u8 q0, [r1]
1549; CHECK-NEXT:    vstrb.8 q0, [r0]
1550; CHECK-NEXT:    bx lr
1551entry:
1552  %z = getelementptr inbounds i8, ptr %y, i32 -128
1553  %0 = load <16 x i8>, ptr %x, align 1
1554  store <16 x i8> %0, ptr %z, align 1
1555  ret ptr %z
1556}
1557
1558
1559define ptr @strf32_4(ptr %y, ptr %x) {
1560; CHECK-LE-LABEL: strf32_4:
1561; CHECK-LE:       @ %bb.0: @ %entry
1562; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
1563; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #4]!
1564; CHECK-LE-NEXT:    bx lr
1565;
1566; CHECK-BE-LABEL: strf32_4:
1567; CHECK-BE:       @ %bb.0: @ %entry
1568; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
1569; CHECK-BE-NEXT:    vstrw.32 q0, [r0, #4]!
1570; CHECK-BE-NEXT:    bx lr
1571entry:
1572  %z = getelementptr inbounds i8, ptr %y, i32 4
1573  %0 = load <4 x float>, ptr %x, align 4
1574  store <4 x float> %0, ptr %z, align 4
1575  ret ptr %z
1576}
1577
1578define ptr @strf16_4(ptr %y, ptr %x) {
1579; CHECK-LE-LABEL: strf16_4:
1580; CHECK-LE:       @ %bb.0: @ %entry
1581; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1582; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #4]!
1583; CHECK-LE-NEXT:    bx lr
1584;
1585; CHECK-BE-LABEL: strf16_4:
1586; CHECK-BE:       @ %bb.0: @ %entry
1587; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1588; CHECK-BE-NEXT:    vstrh.16 q0, [r0, #4]!
1589; CHECK-BE-NEXT:    bx lr
1590entry:
1591  %z = getelementptr inbounds i8, ptr %y, i32 4
1592  %0 = load <8 x half>, ptr %x, align 2
1593  store <8 x half> %0, ptr %z, align 2
1594  ret ptr %z
1595}
1596
1597define ptr @strwi32_align1(ptr %y, ptr %x) {
1598; CHECK-LE-LABEL: strwi32_align1:
1599; CHECK-LE:       @ %bb.0: @ %entry
1600; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
1601; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #3]!
1602; CHECK-LE-NEXT:    bx lr
1603;
1604; CHECK-BE-LABEL: strwi32_align1:
1605; CHECK-BE:       @ %bb.0: @ %entry
1606; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
1607; CHECK-BE-NEXT:    vrev32.8 q0, q0
1608; CHECK-BE-NEXT:    vstrb.8 q0, [r0, #3]
1609; CHECK-BE-NEXT:    adds r0, #3
1610; CHECK-BE-NEXT:    bx lr
1611entry:
1612  %z = getelementptr inbounds i8, ptr %y, i32 3
1613  %0 = load <4 x i32>, ptr %x, align 4
1614  store <4 x i32> %0, ptr %z, align 1
1615  ret ptr %z
1616}
1617
1618define ptr @strhi16_align1(ptr %y, ptr %x) {
1619; CHECK-LE-LABEL: strhi16_align1:
1620; CHECK-LE:       @ %bb.0: @ %entry
1621; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1622; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #3]!
1623; CHECK-LE-NEXT:    bx lr
1624;
1625; CHECK-BE-LABEL: strhi16_align1:
1626; CHECK-BE:       @ %bb.0: @ %entry
1627; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1628; CHECK-BE-NEXT:    vrev16.8 q0, q0
1629; CHECK-BE-NEXT:    vstrb.8 q0, [r0, #3]
1630; CHECK-BE-NEXT:    adds r0, #3
1631; CHECK-BE-NEXT:    bx lr
1632entry:
1633  %z = getelementptr inbounds i8, ptr %y, i32 3
1634  %0 = load <8 x i16>, ptr %x, align 2
1635  store <8 x i16> %0, ptr %z, align 1
1636  ret ptr %z
1637}
1638
1639define ptr @strhi32_align1(ptr %y, ptr %x) {
1640; CHECK-LABEL: strhi32_align1:
1641; CHECK:       @ %bb.0: @ %entry
1642; CHECK-NEXT:    .pad #8
1643; CHECK-NEXT:    sub sp, #8
1644; CHECK-NEXT:    vldrw.u32 q0, [r1]
1645; CHECK-NEXT:    mov r1, sp
1646; CHECK-NEXT:    vstrh.32 q0, [r1]
1647; CHECK-NEXT:    ldrd r1, r2, [sp]
1648; CHECK-NEXT:    str r1, [r0, #3]!
1649; CHECK-NEXT:    str r2, [r0, #4]
1650; CHECK-NEXT:    add sp, #8
1651; CHECK-NEXT:    bx lr
1652entry:
1653  %z = getelementptr inbounds i8, ptr %y, i32 3
1654  %0 = load <4 x i32>, ptr %x, align 4
1655  %1 = trunc <4 x i32> %0 to <4 x i16>
1656  store <4 x i16> %1, ptr %z, align 1
1657  ret ptr %z
1658}
1659
1660define ptr @strf32_align1(ptr %y, ptr %x) {
1661; CHECK-LE-LABEL: strf32_align1:
1662; CHECK-LE:       @ %bb.0: @ %entry
1663; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
1664; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #3]!
1665; CHECK-LE-NEXT:    bx lr
1666;
1667; CHECK-BE-LABEL: strf32_align1:
1668; CHECK-BE:       @ %bb.0: @ %entry
1669; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
1670; CHECK-BE-NEXT:    vrev32.8 q0, q0
1671; CHECK-BE-NEXT:    vstrb.8 q0, [r0, #3]
1672; CHECK-BE-NEXT:    adds r0, #3
1673; CHECK-BE-NEXT:    bx lr
1674entry:
1675  %z = getelementptr inbounds i8, ptr %y, i32 3
1676  %0 = load <4 x float>, ptr %x, align 4
1677  store <4 x float> %0, ptr %z, align 1
1678  ret ptr %z
1679}
1680
1681define ptr @strf16_align1(ptr %y, ptr %x) {
1682; CHECK-LE-LABEL: strf16_align1:
1683; CHECK-LE:       @ %bb.0: @ %entry
1684; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1685; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #3]!
1686; CHECK-LE-NEXT:    bx lr
1687;
1688; CHECK-BE-LABEL: strf16_align1:
1689; CHECK-BE:       @ %bb.0: @ %entry
1690; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1691; CHECK-BE-NEXT:    vrev16.8 q0, q0
1692; CHECK-BE-NEXT:    vstrb.8 q0, [r0, #3]
1693; CHECK-BE-NEXT:    adds r0, #3
1694; CHECK-BE-NEXT:    bx lr
1695entry:
1696  %z = getelementptr inbounds i8, ptr %y, i32 3
1697  %0 = load <8 x half>, ptr %x, align 2
1698  store <8 x half> %0, ptr %z, align 1
1699  ret ptr %z
1700}
1701
1702define ptr @strf16_align8(ptr %y, ptr %x) {
1703; CHECK-LE-LABEL: strf16_align8:
1704; CHECK-LE:       @ %bb.0: @ %entry
1705; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1706; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #16]!
1707; CHECK-LE-NEXT:    bx lr
1708;
1709; CHECK-BE-LABEL: strf16_align8:
1710; CHECK-BE:       @ %bb.0: @ %entry
1711; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1712; CHECK-BE-NEXT:    vstrh.16 q0, [r0, #16]!
1713; CHECK-BE-NEXT:    bx lr
1714entry:
1715  %z = getelementptr inbounds i8, ptr %y, i32 16
1716  %0 = load <8 x i16>, ptr %x, align 2
1717  store <8 x i16> %0, ptr %z, align 8
1718  ret ptr %z
1719}
1720