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