Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / Thumb2 / mve-ldst-postinc.ll
bloba9be723dd9107b5942c4e93e4cf34d93d7c3bab3
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
5 define 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
11 entry:
12   %z = getelementptr inbounds i8, ptr %x, i32 4
13   %0 = load <4 x i32>, ptr %x, align 4
14   store <4 x i32> %0, ptr %y, align 4
15   ret ptr %z
18 define 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
25 ; CHECK-BE-LABEL: ldrwu32_3:
26 ; CHECK-BE:       @ %bb.0: @ %entry
27 ; CHECK-BE-NEXT:    vldrw.u32 q0, [r0]
28 ; CHECK-BE-NEXT:    adds r0, #3
29 ; CHECK-BE-NEXT:    vstrw.32 q0, [r1]
30 ; CHECK-BE-NEXT:    bx lr
31 entry:
32   %z = getelementptr inbounds i8, ptr %x, i32 3
33   %0 = load <4 x i32>, ptr %x, align 4
34   store <4 x i32> %0, ptr %y, align 4
35   ret ptr %z
38 define 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
44 entry:
45   %z = getelementptr inbounds i8, ptr %x, i32 -4
46   %0 = load <4 x i32>, ptr %x, align 4
47   store <4 x i32> %0, ptr %y, align 4
48   ret ptr %z
51 define 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
57 entry:
58   %z = getelementptr inbounds i8, ptr %x, i32 508
59   %0 = load <4 x i32>, ptr %x, align 4
60   store <4 x i32> %0, ptr %y, align 4
61   ret ptr %z
64 define ptr @ldrwu32_512(ptr %x, ptr %y) {
65 ; CHECK-LABEL: ldrwu32_512:
66 ; CHECK:       @ %bb.0: @ %entry
67 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
68 ; CHECK-NEXT:    add.w r0, r0, #512
69 ; CHECK-NEXT:    vstrw.32 q0, [r1]
70 ; CHECK-NEXT:    bx lr
71 entry:
72   %z = getelementptr inbounds i8, ptr %x, i32 512
73   %0 = load <4 x i32>, ptr %x, align 4
74   store <4 x i32> %0, ptr %y, align 4
75   ret ptr %z
78 define 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
84 entry:
85   %z = getelementptr inbounds i8, ptr %x, i32 -508
86   %0 = load <4 x i32>, ptr %x, align 4
87   store <4 x i32> %0, ptr %y, align 4
88   ret ptr %z
91 define ptr @ldrwu32_m512(ptr %x, ptr %y) {
92 ; CHECK-LABEL: ldrwu32_m512:
93 ; CHECK:       @ %bb.0: @ %entry
94 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
95 ; CHECK-NEXT:    sub.w r0, r0, #512
96 ; CHECK-NEXT:    vstrw.32 q0, [r1]
97 ; CHECK-NEXT:    bx lr
98 entry:
99   %z = getelementptr inbounds i8, ptr %x, i32 -512
100   %0 = load <4 x i32>, ptr %x, align 4
101   store <4 x i32> %0, ptr %y, align 4
102   ret ptr %z
106 define 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
112 entry:
113   %z = getelementptr inbounds i8, ptr %x, i32 4
114   %0 = load <4 x i16>, ptr %x, 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
120 define ptr @ldrhu32_3(ptr %x, ptr %y) {
121 ; CHECK-LABEL: ldrhu32_3:
122 ; CHECK:       @ %bb.0: @ %entry
123 ; CHECK-NEXT:    vldrh.u32 q0, [r0]
124 ; CHECK-NEXT:    adds r0, #3
125 ; CHECK-NEXT:    vstrw.32 q0, [r1]
126 ; CHECK-NEXT:    bx lr
127 entry:
128   %z = getelementptr inbounds i8, ptr %x, i32 3
129   %0 = load <4 x i16>, ptr %x, 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
135 define 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
141 entry:
142   %z = getelementptr inbounds i8, ptr %x, i32 2
143   %0 = load <4 x i16>, ptr %x, 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
149 define 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
155 entry:
156   %z = getelementptr inbounds i8, ptr %x, i32 254
157   %0 = load <4 x i16>, ptr %x, 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
163 define ptr @ldrhu32_256(ptr %x, ptr %y) {
164 ; CHECK-LABEL: ldrhu32_256:
165 ; CHECK:       @ %bb.0: @ %entry
166 ; CHECK-NEXT:    vldrh.u32 q0, [r0]
167 ; CHECK-NEXT:    add.w r0, r0, #256
168 ; CHECK-NEXT:    vstrw.32 q0, [r1]
169 ; CHECK-NEXT:    bx lr
170 entry:
171   %z = getelementptr inbounds i8, ptr %x, i32 256
172   %0 = load <4 x i16>, ptr %x, 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
178 define 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
184 entry:
185   %z = getelementptr inbounds i8, ptr %x, i32 -254
186   %0 = load <4 x i16>, ptr %x, 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
192 define ptr @ldrhu32_m256(ptr %x, ptr %y) {
193 ; CHECK-LABEL: ldrhu32_m256:
194 ; CHECK:       @ %bb.0: @ %entry
195 ; CHECK-NEXT:    vldrh.u32 q0, [r0]
196 ; CHECK-NEXT:    sub.w r0, r0, #256
197 ; CHECK-NEXT:    vstrw.32 q0, [r1]
198 ; CHECK-NEXT:    bx lr
199 entry:
200   %z = getelementptr inbounds i8, ptr %x, i32 -256
201   %0 = load <4 x i16>, ptr %x, 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
208 define 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
214 entry:
215   %z = getelementptr inbounds i8, ptr %x, i32 4
216   %0 = load <4 x i16>, ptr %x, 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
222 define ptr @ldrhs32_3(ptr %x, ptr %y) {
223 ; CHECK-LABEL: ldrhs32_3:
224 ; CHECK:       @ %bb.0: @ %entry
225 ; CHECK-NEXT:    vldrh.s32 q0, [r0]
226 ; CHECK-NEXT:    adds r0, #3
227 ; CHECK-NEXT:    vstrw.32 q0, [r1]
228 ; CHECK-NEXT:    bx lr
229 entry:
230   %z = getelementptr inbounds i8, ptr %x, i32 3
231   %0 = load <4 x i16>, ptr %x, 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
237 define 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
243 entry:
244   %z = getelementptr inbounds i8, ptr %x, i32 2
245   %0 = load <4 x i16>, ptr %x, 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
251 define 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
257 entry:
258   %z = getelementptr inbounds i8, ptr %x, i32 254
259   %0 = load <4 x i16>, ptr %x, 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
265 define ptr @ldrhs32_256(ptr %x, ptr %y) {
266 ; CHECK-LABEL: ldrhs32_256:
267 ; CHECK:       @ %bb.0: @ %entry
268 ; CHECK-NEXT:    vldrh.s32 q0, [r0]
269 ; CHECK-NEXT:    add.w r0, r0, #256
270 ; CHECK-NEXT:    vstrw.32 q0, [r1]
271 ; CHECK-NEXT:    bx lr
272 entry:
273   %z = getelementptr inbounds i8, ptr %x, i32 256
274   %0 = load <4 x i16>, ptr %x, 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
280 define 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
286 entry:
287   %z = getelementptr inbounds i8, ptr %x, i32 -254
288   %0 = load <4 x i16>, ptr %x, 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
294 define ptr @ldrhs32_m256(ptr %x, ptr %y) {
295 ; CHECK-LABEL: ldrhs32_m256:
296 ; CHECK:       @ %bb.0: @ %entry
297 ; CHECK-NEXT:    vldrh.s32 q0, [r0]
298 ; CHECK-NEXT:    sub.w r0, r0, #256
299 ; CHECK-NEXT:    vstrw.32 q0, [r1]
300 ; CHECK-NEXT:    bx lr
301 entry:
302   %z = getelementptr inbounds i8, ptr %x, i32 -256
303   %0 = load <4 x i16>, ptr %x, 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
310 define 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
316 entry:
317   %z = getelementptr inbounds i8, ptr %x, i32 4
318   %0 = load <8 x i16>, ptr %x, align 2
319   store <8 x i16> %0, ptr %y, align 2
320   ret ptr %z
323 define 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
330 ; CHECK-BE-LABEL: ldrhu16_3:
331 ; CHECK-BE:       @ %bb.0: @ %entry
332 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r0]
333 ; CHECK-BE-NEXT:    adds r0, #3
334 ; CHECK-BE-NEXT:    vstrh.16 q0, [r1]
335 ; CHECK-BE-NEXT:    bx lr
336 entry:
337   %z = getelementptr inbounds i8, ptr %x, i32 3
338   %0 = load <8 x i16>, ptr %x, align 2
339   store <8 x i16> %0, ptr %y, align 2
340   ret ptr %z
343 define 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
349 entry:
350   %z = getelementptr inbounds i8, ptr %x, i32 2
351   %0 = load <8 x i16>, ptr %x, align 2
352   store <8 x i16> %0, ptr %y, align 2
353   ret ptr %z
356 define 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
362 entry:
363   %z = getelementptr inbounds i8, ptr %x, i32 254
364   %0 = load <8 x i16>, ptr %x, align 2
365   store <8 x i16> %0, ptr %y, align 2
366   ret ptr %z
369 define ptr @ldrhu16_256(ptr %x, ptr %y) {
370 ; CHECK-LABEL: ldrhu16_256:
371 ; CHECK:       @ %bb.0: @ %entry
372 ; CHECK-NEXT:    vldrh.u16 q0, [r0]
373 ; CHECK-NEXT:    add.w r0, r0, #256
374 ; CHECK-NEXT:    vstrh.16 q0, [r1]
375 ; CHECK-NEXT:    bx lr
376 entry:
377   %z = getelementptr inbounds i8, ptr %x, i32 256
378   %0 = load <8 x i16>, ptr %x, align 2
379   store <8 x i16> %0, ptr %y, align 2
380   ret ptr %z
383 define 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
389 entry:
390   %z = getelementptr inbounds i8, ptr %x, i32 -254
391   %0 = load <8 x i16>, ptr %x, align 2
392   store <8 x i16> %0, ptr %y, align 2
393   ret ptr %z
396 define ptr @ldrhu16_m256(ptr %x, ptr %y) {
397 ; CHECK-LABEL: ldrhu16_m256:
398 ; CHECK:       @ %bb.0: @ %entry
399 ; CHECK-NEXT:    vldrh.u16 q0, [r0]
400 ; CHECK-NEXT:    sub.w r0, r0, #256
401 ; CHECK-NEXT:    vstrh.16 q0, [r1]
402 ; CHECK-NEXT:    bx lr
403 entry:
404   %z = getelementptr inbounds i8, ptr %x, i32 -256
405   %0 = load <8 x i16>, ptr %x, align 2
406   store <8 x i16> %0, ptr %y, align 2
407   ret ptr %z
411 define 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
417 entry:
418   %z = getelementptr inbounds i8, ptr %x, i32 4
419   %0 = load <4 x i8>, ptr %x, 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
425 define 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
431 entry:
432   %z = getelementptr inbounds i8, ptr %x, i32 3
433   %0 = load <4 x i8>, ptr %x, 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
439 define 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
445 entry:
446   %z = getelementptr inbounds i8, ptr %x, i32 127
447   %0 = load <4 x i8>, ptr %x, 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
453 define ptr @ldrbu32_128(ptr %x, ptr %y) {
454 ; CHECK-LABEL: ldrbu32_128:
455 ; CHECK:       @ %bb.0: @ %entry
456 ; CHECK-NEXT:    vldrb.u32 q0, [r0]
457 ; CHECK-NEXT:    adds r0, #128
458 ; CHECK-NEXT:    vstrw.32 q0, [r1]
459 ; CHECK-NEXT:    bx lr
460 entry:
461   %z = getelementptr inbounds i8, ptr %x, i32 128
462   %0 = load <4 x i8>, ptr %x, 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
468 define 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
474 entry:
475   %z = getelementptr inbounds i8, ptr %x, i32 -127
476   %0 = load <4 x i8>, ptr %x, 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
482 define ptr @ldrbu32_m128(ptr %x, ptr %y) {
483 ; CHECK-LABEL: ldrbu32_m128:
484 ; CHECK:       @ %bb.0: @ %entry
485 ; CHECK-NEXT:    vldrb.u32 q0, [r0]
486 ; CHECK-NEXT:    subs r0, #128
487 ; CHECK-NEXT:    vstrw.32 q0, [r1]
488 ; CHECK-NEXT:    bx lr
489 entry:
490   %z = getelementptr inbounds i8, ptr %x, i32 -128
491   %0 = load <4 x i8>, ptr %x, 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
498 define 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
504 entry:
505   %z = getelementptr inbounds i8, ptr %x, i32 4
506   %0 = load <4 x i8>, ptr %x, 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
512 define 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
518 entry:
519   %z = getelementptr inbounds i8, ptr %x, i32 3
520   %0 = load <4 x i8>, ptr %x, 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
526 define 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
532 entry:
533   %z = getelementptr inbounds i8, ptr %x, i32 127
534   %0 = load <4 x i8>, ptr %x, 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
540 define ptr @ldrbs32_128(ptr %x, ptr %y) {
541 ; CHECK-LABEL: ldrbs32_128:
542 ; CHECK:       @ %bb.0: @ %entry
543 ; CHECK-NEXT:    vldrb.s32 q0, [r0]
544 ; CHECK-NEXT:    adds r0, #128
545 ; CHECK-NEXT:    vstrw.32 q0, [r1]
546 ; CHECK-NEXT:    bx lr
547 entry:
548   %z = getelementptr inbounds i8, ptr %x, i32 128
549   %0 = load <4 x i8>, ptr %x, 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
555 define 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
561 entry:
562   %z = getelementptr inbounds i8, ptr %x, i32 -127
563   %0 = load <4 x i8>, ptr %x, 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
569 define ptr @ldrbs32_m128(ptr %x, ptr %y) {
570 ; CHECK-LABEL: ldrbs32_m128:
571 ; CHECK:       @ %bb.0: @ %entry
572 ; CHECK-NEXT:    vldrb.s32 q0, [r0]
573 ; CHECK-NEXT:    subs r0, #128
574 ; CHECK-NEXT:    vstrw.32 q0, [r1]
575 ; CHECK-NEXT:    bx lr
576 entry:
577   %z = getelementptr inbounds i8, ptr %x, i32 -128
578   %0 = load <4 x i8>, ptr %x, 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
585 define 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
591 entry:
592   %z = getelementptr inbounds i8, ptr %x, i32 4
593   %0 = load <8 x i8>, ptr %x, 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
599 define 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
605 entry:
606   %z = getelementptr inbounds i8, ptr %x, i32 3
607   %0 = load <8 x i8>, ptr %x, 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
613 define 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
619 entry:
620   %z = getelementptr inbounds i8, ptr %x, i32 127
621   %0 = load <8 x i8>, ptr %x, 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
627 define ptr @ldrbu16_128(ptr %x, ptr %y) {
628 ; CHECK-LABEL: ldrbu16_128:
629 ; CHECK:       @ %bb.0: @ %entry
630 ; CHECK-NEXT:    vldrb.u16 q0, [r0]
631 ; CHECK-NEXT:    adds r0, #128
632 ; CHECK-NEXT:    vstrh.16 q0, [r1]
633 ; CHECK-NEXT:    bx lr
634 entry:
635   %z = getelementptr inbounds i8, ptr %x, i32 128
636   %0 = load <8 x i8>, ptr %x, 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
642 define 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
648 entry:
649   %z = getelementptr inbounds i8, ptr %x, i32 -127
650   %0 = load <8 x i8>, ptr %x, 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
656 define ptr @ldrbu16_m128(ptr %x, ptr %y) {
657 ; CHECK-LABEL: ldrbu16_m128:
658 ; CHECK:       @ %bb.0: @ %entry
659 ; CHECK-NEXT:    vldrb.u16 q0, [r0]
660 ; CHECK-NEXT:    subs r0, #128
661 ; CHECK-NEXT:    vstrh.16 q0, [r1]
662 ; CHECK-NEXT:    bx lr
663 entry:
664   %z = getelementptr inbounds i8, ptr %x, i32 -128
665   %0 = load <8 x i8>, ptr %x, 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
672 define 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
678 entry:
679   %z = getelementptr inbounds i8, ptr %x, i32 4
680   %0 = load <8 x i8>, ptr %x, 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
686 define 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
692 entry:
693   %z = getelementptr inbounds i8, ptr %x, i32 3
694   %0 = load <8 x i8>, ptr %x, 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
700 define 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
706 entry:
707   %z = getelementptr inbounds i8, ptr %x, i32 127
708   %0 = load <8 x i8>, ptr %x, 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
714 define ptr @ldrbs16_128(ptr %x, ptr %y) {
715 ; CHECK-LABEL: ldrbs16_128:
716 ; CHECK:       @ %bb.0: @ %entry
717 ; CHECK-NEXT:    vldrb.s16 q0, [r0]
718 ; CHECK-NEXT:    adds r0, #128
719 ; CHECK-NEXT:    vstrh.16 q0, [r1]
720 ; CHECK-NEXT:    bx lr
721 entry:
722   %z = getelementptr inbounds i8, ptr %x, i32 128
723   %0 = load <8 x i8>, ptr %x, 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
729 define 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
735 entry:
736   %z = getelementptr inbounds i8, ptr %x, i32 -127
737   %0 = load <8 x i8>, ptr %x, 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
743 define ptr @ldrbs16_m128(ptr %x, ptr %y) {
744 ; CHECK-LABEL: ldrbs16_m128:
745 ; CHECK:       @ %bb.0: @ %entry
746 ; CHECK-NEXT:    vldrb.s16 q0, [r0]
747 ; CHECK-NEXT:    subs r0, #128
748 ; CHECK-NEXT:    vstrh.16 q0, [r1]
749 ; CHECK-NEXT:    bx lr
750 entry:
751   %z = getelementptr inbounds i8, ptr %x, i32 -128
752   %0 = load <8 x i8>, ptr %x, 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
759 define 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
765 entry:
766   %z = getelementptr inbounds i8, ptr %x, i32 4
767   %0 = load <16 x i8>, ptr %x, align 1
768   store <16 x i8> %0, ptr %y, align 1
769   ret ptr %z
772 define 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
778 entry:
779   %z = getelementptr inbounds i8, ptr %x, i32 3
780   %0 = load <16 x i8>, ptr %x, align 1
781   store <16 x i8> %0, ptr %y, align 1
782   ret ptr %z
785 define 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
791 entry:
792   %z = getelementptr inbounds i8, ptr %x, i32 127
793   %0 = load <16 x i8>, ptr %x, align 1
794   store <16 x i8> %0, ptr %y, align 1
795   ret ptr %z
798 define ptr @ldrbu8_128(ptr %x, ptr %y) {
799 ; CHECK-LABEL: ldrbu8_128:
800 ; CHECK:       @ %bb.0: @ %entry
801 ; CHECK-NEXT:    vldrb.u8 q0, [r0]
802 ; CHECK-NEXT:    adds r0, #128
803 ; CHECK-NEXT:    vstrb.8 q0, [r1]
804 ; CHECK-NEXT:    bx lr
805 entry:
806   %z = getelementptr inbounds i8, ptr %x, i32 128
807   %0 = load <16 x i8>, ptr %x, align 1
808   store <16 x i8> %0, ptr %y, align 1
809   ret ptr %z
812 define 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
818 entry:
819   %z = getelementptr inbounds i8, ptr %x, i32 -127
820   %0 = load <16 x i8>, ptr %x, align 1
821   store <16 x i8> %0, ptr %y, align 1
822   ret ptr %z
825 define ptr @ldrbu8_m128(ptr %x, ptr %y) {
826 ; CHECK-LABEL: ldrbu8_m128:
827 ; CHECK:       @ %bb.0: @ %entry
828 ; CHECK-NEXT:    vldrb.u8 q0, [r0]
829 ; CHECK-NEXT:    subs r0, #128
830 ; CHECK-NEXT:    vstrb.8 q0, [r1]
831 ; CHECK-NEXT:    bx lr
832 entry:
833   %z = getelementptr inbounds i8, ptr %x, i32 -128
834   %0 = load <16 x i8>, ptr %x, align 1
835   store <16 x i8> %0, ptr %y, align 1
836   ret ptr %z
840 define 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
846 entry:
847   %z = getelementptr inbounds i8, ptr %x, i32 4
848   %0 = load <4 x float>, ptr %x, align 4
849   store <4 x float> %0, ptr %y, align 4
850   ret ptr %z
853 define 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
859 entry:
860   %z = getelementptr inbounds i8, ptr %x, i32 4
861   %0 = load <8 x half>, ptr %x, align 2
862   store <8 x half> %0, ptr %y, align 2
863   ret ptr %z
866 define 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
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:    vrev32.8 q0, q0
877 ; CHECK-BE-NEXT:    vstrw.32 q0, [r1]
878 ; CHECK-BE-NEXT:    bx lr
879 entry:
880   %z = getelementptr inbounds i8, ptr %x, i32 3
881   %0 = load <4 x i32>, ptr %x, align 1
882   store <4 x i32> %0, ptr %y, align 4
883   ret ptr %z
886 define ptr @ldrhi16_align1(ptr %x, ptr %y) {
887 ; CHECK-LE-LABEL: ldrhi16_align1:
888 ; CHECK-LE:       @ %bb.0: @ %entry
889 ; CHECK-LE-NEXT:    vldrb.u8 q0, [r0], #3
890 ; CHECK-LE-NEXT:    vstrh.16 q0, [r1]
891 ; CHECK-LE-NEXT:    bx lr
893 ; CHECK-BE-LABEL: ldrhi16_align1:
894 ; CHECK-BE:       @ %bb.0: @ %entry
895 ; CHECK-BE-NEXT:    vldrb.u8 q0, [r0], #3
896 ; CHECK-BE-NEXT:    vrev16.8 q0, q0
897 ; CHECK-BE-NEXT:    vstrh.16 q0, [r1]
898 ; CHECK-BE-NEXT:    bx lr
899 entry:
900   %z = getelementptr inbounds i8, ptr %x, i32 3
901   %0 = load <8 x i16>, ptr %x, align 1
902   store <8 x i16> %0, ptr %y, align 2
903   ret ptr %z
906 define ptr @ldrhi32_align1(ptr %x, ptr %y) {
907 ; CHECK-LABEL: ldrhi32_align1:
908 ; CHECK:       @ %bb.0: @ %entry
909 ; CHECK-NEXT:    .pad #8
910 ; CHECK-NEXT:    sub sp, #8
911 ; CHECK-NEXT:    ldr r3, [r0, #4]
912 ; CHECK-NEXT:    ldr r2, [r0]
913 ; CHECK-NEXT:    adds r0, #3
914 ; CHECK-NEXT:    strd r2, r3, [sp]
915 ; CHECK-NEXT:    mov r2, sp
916 ; CHECK-NEXT:    vldrh.s32 q0, [r2]
917 ; CHECK-NEXT:    vstrw.32 q0, [r1]
918 ; CHECK-NEXT:    add sp, #8
919 ; CHECK-NEXT:    bx lr
920 entry:
921   %z = getelementptr inbounds i8, ptr %x, i32 3
922   %0 = load <4 x i16>, ptr %x, align 1
923   %1 = sext <4 x i16> %0 to <4 x i32>
924   store <4 x i32> %1, ptr %y, align 4
925   ret ptr %z
928 define ptr @ldrf32_align1(ptr %x, ptr %y) {
929 ; CHECK-LE-LABEL: ldrf32_align1:
930 ; CHECK-LE:       @ %bb.0: @ %entry
931 ; CHECK-LE-NEXT:    vldrb.u8 q0, [r0], #3
932 ; CHECK-LE-NEXT:    vstrw.32 q0, [r1]
933 ; CHECK-LE-NEXT:    bx lr
935 ; CHECK-BE-LABEL: ldrf32_align1:
936 ; CHECK-BE:       @ %bb.0: @ %entry
937 ; CHECK-BE-NEXT:    vldrb.u8 q0, [r0], #3
938 ; CHECK-BE-NEXT:    vrev32.8 q0, q0
939 ; CHECK-BE-NEXT:    vstrw.32 q0, [r1]
940 ; CHECK-BE-NEXT:    bx lr
941 entry:
942   %z = getelementptr inbounds i8, ptr %x, i32 3
943   %0 = load <4 x float>, ptr %x, align 1
944   store <4 x float> %0, ptr %y, align 4
945   ret ptr %z
948 define ptr @ldrf16_align1(ptr %x, ptr %y) {
949 ; CHECK-LE-LABEL: ldrf16_align1:
950 ; CHECK-LE:       @ %bb.0: @ %entry
951 ; CHECK-LE-NEXT:    vldrb.u8 q0, [r0], #3
952 ; CHECK-LE-NEXT:    vstrh.16 q0, [r1]
953 ; CHECK-LE-NEXT:    bx lr
955 ; CHECK-BE-LABEL: ldrf16_align1:
956 ; CHECK-BE:       @ %bb.0: @ %entry
957 ; CHECK-BE-NEXT:    vldrb.u8 q0, [r0], #3
958 ; CHECK-BE-NEXT:    vrev16.8 q0, q0
959 ; CHECK-BE-NEXT:    vstrh.16 q0, [r1]
960 ; CHECK-BE-NEXT:    bx lr
961 entry:
962   %z = getelementptr inbounds i8, ptr %x, i32 3
963   %0 = load <8 x half>, ptr %x, align 1
964   store <8 x half> %0, ptr %y, align 2
965   ret ptr %z
968 define ptr @ldrh16_align8(ptr %x, ptr %y) {
969 ; CHECK-LE-LABEL: ldrh16_align8:
970 ; CHECK-LE:       @ %bb.0: @ %entry
971 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r0], #4
972 ; CHECK-LE-NEXT:    vstrh.16 q0, [r1]
973 ; CHECK-LE-NEXT:    bx lr
975 ; CHECK-BE-LABEL: ldrh16_align8:
976 ; CHECK-BE:       @ %bb.0: @ %entry
977 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r0], #4
978 ; CHECK-BE-NEXT:    vstrh.16 q0, [r1]
979 ; CHECK-BE-NEXT:    bx lr
980 entry:
981   %z = getelementptr inbounds i8, ptr %x, i32 4
982   %0 = load <8 x i16>, ptr %x, align 8
983   store <8 x i16> %0, ptr %y, align 2
984   ret ptr %z
991 define ptr @strw32_4(ptr %y, ptr %x) {
992 ; CHECK-LE-LABEL: strw32_4:
993 ; CHECK-LE:       @ %bb.0: @ %entry
994 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
995 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0], #4
996 ; CHECK-LE-NEXT:    bx lr
998 ; CHECK-BE-LABEL: strw32_4:
999 ; CHECK-BE:       @ %bb.0: @ %entry
1000 ; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
1001 ; CHECK-BE-NEXT:    vstrw.32 q0, [r0], #4
1002 ; CHECK-BE-NEXT:    bx lr
1003 entry:
1004   %z = getelementptr inbounds i8, ptr %y, i32 4
1005   %0 = load <4 x i32>, ptr %x, align 4
1006   store <4 x i32> %0, ptr %y, align 4
1007   ret ptr %z
1010 define ptr @strw32_3(ptr %y, ptr %x) {
1011 ; CHECK-LE-LABEL: strw32_3:
1012 ; CHECK-LE:       @ %bb.0: @ %entry
1013 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
1014 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0], #3
1015 ; CHECK-LE-NEXT:    bx lr
1017 ; CHECK-BE-LABEL: strw32_3:
1018 ; CHECK-BE:       @ %bb.0: @ %entry
1019 ; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
1020 ; CHECK-BE-NEXT:    vstrw.32 q0, [r0]
1021 ; CHECK-BE-NEXT:    adds r0, #3
1022 ; CHECK-BE-NEXT:    bx lr
1023 entry:
1024   %z = getelementptr inbounds i8, ptr %y, i32 3
1025   %0 = load <4 x i32>, ptr %x, align 4
1026   store <4 x i32> %0, ptr %y, align 4
1027   ret ptr %z
1030 define ptr @strw32_m4(ptr %y, ptr %x) {
1031 ; CHECK-LE-LABEL: strw32_m4:
1032 ; CHECK-LE:       @ %bb.0: @ %entry
1033 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
1034 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0], #-4
1035 ; CHECK-LE-NEXT:    bx lr
1037 ; CHECK-BE-LABEL: strw32_m4:
1038 ; CHECK-BE:       @ %bb.0: @ %entry
1039 ; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
1040 ; CHECK-BE-NEXT:    vstrw.32 q0, [r0], #-4
1041 ; CHECK-BE-NEXT:    bx lr
1042 entry:
1043   %z = getelementptr inbounds i8, ptr %y, i32 -4
1044   %0 = load <4 x i32>, ptr %x, align 4
1045   store <4 x i32> %0, ptr %y, align 4
1046   ret ptr %z
1049 define ptr @strw32_508(ptr %y, ptr %x) {
1050 ; CHECK-LABEL: strw32_508:
1051 ; CHECK:       @ %bb.0: @ %entry
1052 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
1053 ; CHECK-NEXT:    vstrw.32 q0, [r0], #508
1054 ; CHECK-NEXT:    bx lr
1055 entry:
1056   %z = getelementptr inbounds i8, ptr %y, i32 508
1057   %0 = load <4 x i32>, ptr %x, align 4
1058   store <4 x i32> %0, ptr %y, align 4
1059   ret ptr %z
1062 define ptr @strw32_512(ptr %y, ptr %x) {
1063 ; CHECK-LABEL: strw32_512:
1064 ; CHECK:       @ %bb.0: @ %entry
1065 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
1066 ; CHECK-NEXT:    vstrw.32 q0, [r0]
1067 ; CHECK-NEXT:    add.w r0, r0, #512
1068 ; CHECK-NEXT:    bx lr
1069 entry:
1070   %z = getelementptr inbounds i8, ptr %y, i32 512
1071   %0 = load <4 x i32>, ptr %x, align 4
1072   store <4 x i32> %0, ptr %y, align 4
1073   ret ptr %z
1076 define ptr @strw32_m508(ptr %y, ptr %x) {
1077 ; CHECK-LABEL: strw32_m508:
1078 ; CHECK:       @ %bb.0: @ %entry
1079 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
1080 ; CHECK-NEXT:    vstrw.32 q0, [r0], #-508
1081 ; CHECK-NEXT:    bx lr
1082 entry:
1083   %z = getelementptr inbounds i8, ptr %y, i32 -508
1084   %0 = load <4 x i32>, ptr %x, align 4
1085   store <4 x i32> %0, ptr %y, align 4
1086   ret ptr %z
1089 define ptr @strw32_m512(ptr %y, ptr %x) {
1090 ; CHECK-LABEL: strw32_m512:
1091 ; CHECK:       @ %bb.0: @ %entry
1092 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
1093 ; CHECK-NEXT:    vstrw.32 q0, [r0]
1094 ; CHECK-NEXT:    sub.w r0, r0, #512
1095 ; CHECK-NEXT:    bx lr
1096 entry:
1097   %z = getelementptr inbounds i8, ptr %y, i32 -512
1098   %0 = load <4 x i32>, ptr %x, align 4
1099   store <4 x i32> %0, ptr %y, align 4
1100   ret ptr %z
1104 define ptr @strh32_4(ptr %y, ptr %x) {
1105 ; CHECK-LABEL: strh32_4:
1106 ; CHECK:       @ %bb.0: @ %entry
1107 ; CHECK-NEXT:    vldrh.u32 q0, [r1]
1108 ; CHECK-NEXT:    vstrh.32 q0, [r0], #4
1109 ; CHECK-NEXT:    bx lr
1110 entry:
1111   %z = getelementptr inbounds i8, ptr %y, i32 4
1112   %0 = load <4 x i16>, ptr %x, align 2
1113   store <4 x i16> %0, ptr %y, align 2
1114   ret ptr %z
1117 define ptr @strh32_3(ptr %y, ptr %x) {
1118 ; CHECK-LABEL: strh32_3:
1119 ; CHECK:       @ %bb.0: @ %entry
1120 ; CHECK-NEXT:    vldrh.u32 q0, [r1]
1121 ; CHECK-NEXT:    vstrh.32 q0, [r0]
1122 ; CHECK-NEXT:    adds r0, #3
1123 ; CHECK-NEXT:    bx lr
1124 entry:
1125   %z = getelementptr inbounds i8, ptr %y, i32 3
1126   %0 = load <4 x i16>, ptr %x, align 2
1127   store <4 x i16> %0, ptr %y, align 2
1128   ret ptr %z
1131 define ptr @strh32_2(ptr %y, ptr %x) {
1132 ; CHECK-LABEL: strh32_2:
1133 ; CHECK:       @ %bb.0: @ %entry
1134 ; CHECK-NEXT:    vldrh.u32 q0, [r1]
1135 ; CHECK-NEXT:    vstrh.32 q0, [r0], #2
1136 ; CHECK-NEXT:    bx lr
1137 entry:
1138   %z = getelementptr inbounds i8, ptr %y, i32 2
1139   %0 = load <4 x i16>, ptr %x, align 2
1140   store <4 x i16> %0, ptr %y, align 2
1141   ret ptr %z
1144 define ptr @strh32_254(ptr %y, ptr %x) {
1145 ; CHECK-LABEL: strh32_254:
1146 ; CHECK:       @ %bb.0: @ %entry
1147 ; CHECK-NEXT:    vldrh.u32 q0, [r1]
1148 ; CHECK-NEXT:    vstrh.32 q0, [r0], #254
1149 ; CHECK-NEXT:    bx lr
1150 entry:
1151   %z = getelementptr inbounds i8, ptr %y, i32 254
1152   %0 = load <4 x i16>, ptr %x, align 2
1153   store <4 x i16> %0, ptr %y, align 2
1154   ret ptr %z
1157 define ptr @strh32_256(ptr %y, ptr %x) {
1158 ; CHECK-LABEL: strh32_256:
1159 ; CHECK:       @ %bb.0: @ %entry
1160 ; CHECK-NEXT:    vldrh.u32 q0, [r1]
1161 ; CHECK-NEXT:    vstrh.32 q0, [r0]
1162 ; CHECK-NEXT:    add.w r0, r0, #256
1163 ; CHECK-NEXT:    bx lr
1164 entry:
1165   %z = getelementptr inbounds i8, ptr %y, i32 256
1166   %0 = load <4 x i16>, ptr %x, align 2
1167   store <4 x i16> %0, ptr %y, align 2
1168   ret ptr %z
1171 define ptr @strh32_m254(ptr %y, ptr %x) {
1172 ; CHECK-LABEL: strh32_m254:
1173 ; CHECK:       @ %bb.0: @ %entry
1174 ; CHECK-NEXT:    vldrh.u32 q0, [r1]
1175 ; CHECK-NEXT:    vstrh.32 q0, [r0], #-254
1176 ; CHECK-NEXT:    bx lr
1177 entry:
1178   %z = getelementptr inbounds i8, ptr %y, i32 -254
1179   %0 = load <4 x i16>, ptr %x, align 2
1180   store <4 x i16> %0, ptr %y, align 2
1181   ret ptr %z
1184 define ptr @strh32_m256(ptr %y, ptr %x) {
1185 ; CHECK-LABEL: strh32_m256:
1186 ; CHECK:       @ %bb.0: @ %entry
1187 ; CHECK-NEXT:    vldrh.u32 q0, [r1]
1188 ; CHECK-NEXT:    vstrh.32 q0, [r0]
1189 ; CHECK-NEXT:    sub.w r0, r0, #256
1190 ; CHECK-NEXT:    bx lr
1191 entry:
1192   %z = getelementptr inbounds i8, ptr %y, i32 -256
1193   %0 = load <4 x i16>, ptr %x, align 2
1194   store <4 x i16> %0, ptr %y, align 2
1195   ret ptr %z
1199 define ptr @strh16_4(ptr %y, ptr %x) {
1200 ; CHECK-LE-LABEL: strh16_4:
1201 ; CHECK-LE:       @ %bb.0: @ %entry
1202 ; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1203 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0], #4
1204 ; CHECK-LE-NEXT:    bx lr
1206 ; CHECK-BE-LABEL: strh16_4:
1207 ; CHECK-BE:       @ %bb.0: @ %entry
1208 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1209 ; CHECK-BE-NEXT:    vstrh.16 q0, [r0], #4
1210 ; CHECK-BE-NEXT:    bx lr
1211 entry:
1212   %z = getelementptr inbounds i8, ptr %y, i32 4
1213   %0 = load <8 x i16>, ptr %x, align 2
1214   store <8 x i16> %0, ptr %y, align 2
1215   ret ptr %z
1218 define ptr @strh16_3(ptr %y, ptr %x) {
1219 ; CHECK-LE-LABEL: strh16_3:
1220 ; CHECK-LE:       @ %bb.0: @ %entry
1221 ; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1222 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0], #3
1223 ; CHECK-LE-NEXT:    bx lr
1225 ; CHECK-BE-LABEL: strh16_3:
1226 ; CHECK-BE:       @ %bb.0: @ %entry
1227 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1228 ; CHECK-BE-NEXT:    vstrh.16 q0, [r0]
1229 ; CHECK-BE-NEXT:    adds r0, #3
1230 ; CHECK-BE-NEXT:    bx lr
1231 entry:
1232   %z = getelementptr inbounds i8, ptr %y, i32 3
1233   %0 = load <8 x i16>, ptr %x, align 2
1234   store <8 x i16> %0, ptr %y, align 2
1235   ret ptr %z
1238 define ptr @strh16_2(ptr %y, ptr %x) {
1239 ; CHECK-LE-LABEL: strh16_2:
1240 ; CHECK-LE:       @ %bb.0: @ %entry
1241 ; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1242 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0], #2
1243 ; CHECK-LE-NEXT:    bx lr
1245 ; CHECK-BE-LABEL: strh16_2:
1246 ; CHECK-BE:       @ %bb.0: @ %entry
1247 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1248 ; CHECK-BE-NEXT:    vstrh.16 q0, [r0], #2
1249 ; CHECK-BE-NEXT:    bx lr
1250 entry:
1251   %z = getelementptr inbounds i8, ptr %y, i32 2
1252   %0 = load <8 x i16>, ptr %x, align 2
1253   store <8 x i16> %0, ptr %y, align 2
1254   ret ptr %z
1257 define ptr @strh16_254(ptr %y, ptr %x) {
1258 ; CHECK-LABEL: strh16_254:
1259 ; CHECK:       @ %bb.0: @ %entry
1260 ; CHECK-NEXT:    vldrh.u16 q0, [r1]
1261 ; CHECK-NEXT:    vstrh.16 q0, [r0], #254
1262 ; CHECK-NEXT:    bx lr
1263 entry:
1264   %z = getelementptr inbounds i8, ptr %y, i32 254
1265   %0 = load <8 x i16>, ptr %x, align 2
1266   store <8 x i16> %0, ptr %y, align 2
1267   ret ptr %z
1270 define ptr @strh16_256(ptr %y, ptr %x) {
1271 ; CHECK-LABEL: strh16_256:
1272 ; CHECK:       @ %bb.0: @ %entry
1273 ; CHECK-NEXT:    vldrh.u16 q0, [r1]
1274 ; CHECK-NEXT:    vstrh.16 q0, [r0]
1275 ; CHECK-NEXT:    add.w r0, r0, #256
1276 ; CHECK-NEXT:    bx lr
1277 entry:
1278   %z = getelementptr inbounds i8, ptr %y, i32 256
1279   %0 = load <8 x i16>, ptr %x, align 2
1280   store <8 x i16> %0, ptr %y, align 2
1281   ret ptr %z
1284 define ptr @strh16_m254(ptr %y, ptr %x) {
1285 ; CHECK-LABEL: strh16_m254:
1286 ; CHECK:       @ %bb.0: @ %entry
1287 ; CHECK-NEXT:    vldrh.u16 q0, [r1]
1288 ; CHECK-NEXT:    vstrh.16 q0, [r0], #-254
1289 ; CHECK-NEXT:    bx lr
1290 entry:
1291   %z = getelementptr inbounds i8, ptr %y, i32 -254
1292   %0 = load <8 x i16>, ptr %x, align 2
1293   store <8 x i16> %0, ptr %y, align 2
1294   ret ptr %z
1297 define ptr @strh16_m256(ptr %y, ptr %x) {
1298 ; CHECK-LABEL: strh16_m256:
1299 ; CHECK:       @ %bb.0: @ %entry
1300 ; CHECK-NEXT:    vldrh.u16 q0, [r1]
1301 ; CHECK-NEXT:    vstrh.16 q0, [r0]
1302 ; CHECK-NEXT:    sub.w r0, r0, #256
1303 ; CHECK-NEXT:    bx lr
1304 entry:
1305   %z = getelementptr inbounds i8, ptr %y, i32 -256
1306   %0 = load <8 x i16>, ptr %x, align 2
1307   store <8 x i16> %0, ptr %y, align 2
1308   ret ptr %z
1312 define ptr @strb32_4(ptr %y, ptr %x) {
1313 ; CHECK-LABEL: strb32_4:
1314 ; CHECK:       @ %bb.0: @ %entry
1315 ; CHECK-NEXT:    vldrb.u32 q0, [r1]
1316 ; CHECK-NEXT:    vstrb.32 q0, [r0], #4
1317 ; CHECK-NEXT:    bx lr
1318 entry:
1319   %z = getelementptr inbounds i8, ptr %y, i32 4
1320   %0 = load <4 x i8>, ptr %x, align 1
1321   store <4 x i8> %0, ptr %y, align 1
1322   ret ptr %z
1325 define ptr @strb32_3(ptr %y, ptr %x) {
1326 ; CHECK-LABEL: strb32_3:
1327 ; CHECK:       @ %bb.0: @ %entry
1328 ; CHECK-NEXT:    vldrb.u32 q0, [r1]
1329 ; CHECK-NEXT:    vstrb.32 q0, [r0], #3
1330 ; CHECK-NEXT:    bx lr
1331 entry:
1332   %z = getelementptr inbounds i8, ptr %y, i32 3
1333   %0 = load <4 x i8>, ptr %x, align 1
1334   store <4 x i8> %0, ptr %y, align 1
1335   ret ptr %z
1338 define ptr @strb32_127(ptr %y, ptr %x) {
1339 ; CHECK-LABEL: strb32_127:
1340 ; CHECK:       @ %bb.0: @ %entry
1341 ; CHECK-NEXT:    vldrb.u32 q0, [r1]
1342 ; CHECK-NEXT:    vstrb.32 q0, [r0], #127
1343 ; CHECK-NEXT:    bx lr
1344 entry:
1345   %z = getelementptr inbounds i8, ptr %y, i32 127
1346   %0 = load <4 x i8>, ptr %x, align 1
1347   store <4 x i8> %0, ptr %y, align 1
1348   ret ptr %z
1351 define ptr @strb32_128(ptr %y, ptr %x) {
1352 ; CHECK-LABEL: strb32_128:
1353 ; CHECK:       @ %bb.0: @ %entry
1354 ; CHECK-NEXT:    vldrb.u32 q0, [r1]
1355 ; CHECK-NEXT:    vstrb.32 q0, [r0]
1356 ; CHECK-NEXT:    adds r0, #128
1357 ; CHECK-NEXT:    bx lr
1358 entry:
1359   %z = getelementptr inbounds i8, ptr %y, i32 128
1360   %0 = load <4 x i8>, ptr %x, align 1
1361   store <4 x i8> %0, ptr %y, align 1
1362   ret ptr %z
1365 define ptr @strb32_m127(ptr %y, ptr %x) {
1366 ; CHECK-LABEL: strb32_m127:
1367 ; CHECK:       @ %bb.0: @ %entry
1368 ; CHECK-NEXT:    vldrb.u32 q0, [r1]
1369 ; CHECK-NEXT:    vstrb.32 q0, [r0], #-127
1370 ; CHECK-NEXT:    bx lr
1371 entry:
1372   %z = getelementptr inbounds i8, ptr %y, i32 -127
1373   %0 = load <4 x i8>, ptr %x, align 1
1374   store <4 x i8> %0, ptr %y, align 1
1375   ret ptr %z
1378 define ptr @strb32_m128(ptr %y, ptr %x) {
1379 ; CHECK-LABEL: strb32_m128:
1380 ; CHECK:       @ %bb.0: @ %entry
1381 ; CHECK-NEXT:    vldrb.u32 q0, [r1]
1382 ; CHECK-NEXT:    vstrb.32 q0, [r0]
1383 ; CHECK-NEXT:    subs r0, #128
1384 ; CHECK-NEXT:    bx lr
1385 entry:
1386   %z = getelementptr inbounds i8, ptr %y, i32 -128
1387   %0 = load <4 x i8>, ptr %x, align 1
1388   store <4 x i8> %0, ptr %y, align 1
1389   ret ptr %z
1393 define ptr @strb16_4(ptr %y, ptr %x) {
1394 ; CHECK-LABEL: strb16_4:
1395 ; CHECK:       @ %bb.0: @ %entry
1396 ; CHECK-NEXT:    vldrb.u16 q0, [r1]
1397 ; CHECK-NEXT:    vstrb.16 q0, [r0], #4
1398 ; CHECK-NEXT:    bx lr
1399 entry:
1400   %z = getelementptr inbounds i8, ptr %y, i32 4
1401   %0 = load <8 x i8>, ptr %x, align 1
1402   store <8 x i8> %0, ptr %y, align 1
1403   ret ptr %z
1406 define ptr @strb16_3(ptr %y, ptr %x) {
1407 ; CHECK-LABEL: strb16_3:
1408 ; CHECK:       @ %bb.0: @ %entry
1409 ; CHECK-NEXT:    vldrb.u16 q0, [r1]
1410 ; CHECK-NEXT:    vstrb.16 q0, [r0], #3
1411 ; CHECK-NEXT:    bx lr
1412 entry:
1413   %z = getelementptr inbounds i8, ptr %y, i32 3
1414   %0 = load <8 x i8>, ptr %x, align 1
1415   store <8 x i8> %0, ptr %y, align 1
1416   ret ptr %z
1419 define ptr @strb16_127(ptr %y, ptr %x) {
1420 ; CHECK-LABEL: strb16_127:
1421 ; CHECK:       @ %bb.0: @ %entry
1422 ; CHECK-NEXT:    vldrb.u16 q0, [r1]
1423 ; CHECK-NEXT:    vstrb.16 q0, [r0], #127
1424 ; CHECK-NEXT:    bx lr
1425 entry:
1426   %z = getelementptr inbounds i8, ptr %y, i32 127
1427   %0 = load <8 x i8>, ptr %x, align 1
1428   store <8 x i8> %0, ptr %y, align 1
1429   ret ptr %z
1432 define ptr @strb16_128(ptr %y, ptr %x) {
1433 ; CHECK-LABEL: strb16_128:
1434 ; CHECK:       @ %bb.0: @ %entry
1435 ; CHECK-NEXT:    vldrb.u16 q0, [r1]
1436 ; CHECK-NEXT:    vstrb.16 q0, [r0]
1437 ; CHECK-NEXT:    adds r0, #128
1438 ; CHECK-NEXT:    bx lr
1439 entry:
1440   %z = getelementptr inbounds i8, ptr %y, i32 128
1441   %0 = load <8 x i8>, ptr %x, align 1
1442   store <8 x i8> %0, ptr %y, align 1
1443   ret ptr %z
1446 define ptr @strb16_m127(ptr %y, ptr %x) {
1447 ; CHECK-LABEL: strb16_m127:
1448 ; CHECK:       @ %bb.0: @ %entry
1449 ; CHECK-NEXT:    vldrb.u16 q0, [r1]
1450 ; CHECK-NEXT:    vstrb.16 q0, [r0], #-127
1451 ; CHECK-NEXT:    bx lr
1452 entry:
1453   %z = getelementptr inbounds i8, ptr %y, i32 -127
1454   %0 = load <8 x i8>, ptr %x, align 1
1455   store <8 x i8> %0, ptr %y, align 1
1456   ret ptr %z
1459 define ptr @strb16_m128(ptr %y, ptr %x) {
1460 ; CHECK-LABEL: strb16_m128:
1461 ; CHECK:       @ %bb.0: @ %entry
1462 ; CHECK-NEXT:    vldrb.u16 q0, [r1]
1463 ; CHECK-NEXT:    vstrb.16 q0, [r0]
1464 ; CHECK-NEXT:    subs r0, #128
1465 ; CHECK-NEXT:    bx lr
1466 entry:
1467   %z = getelementptr inbounds i8, ptr %y, i32 -128
1468   %0 = load <8 x i8>, ptr %x, align 1
1469   store <8 x i8> %0, ptr %y, align 1
1470   ret ptr %z
1474 define ptr @strb8_4(ptr %y, ptr %x) {
1475 ; CHECK-LABEL: strb8_4:
1476 ; CHECK:       @ %bb.0: @ %entry
1477 ; CHECK-NEXT:    vldrb.u8 q0, [r1]
1478 ; CHECK-NEXT:    vstrb.8 q0, [r0], #4
1479 ; CHECK-NEXT:    bx lr
1480 entry:
1481   %z = getelementptr inbounds i8, ptr %y, i32 4
1482   %0 = load <16 x i8>, ptr %x, align 1
1483   store <16 x i8> %0, ptr %y, align 1
1484   ret ptr %z
1487 define ptr @strb8_3(ptr %y, ptr %x) {
1488 ; CHECK-LABEL: strb8_3:
1489 ; CHECK:       @ %bb.0: @ %entry
1490 ; CHECK-NEXT:    vldrb.u8 q0, [r1]
1491 ; CHECK-NEXT:    vstrb.8 q0, [r0], #3
1492 ; CHECK-NEXT:    bx lr
1493 entry:
1494   %z = getelementptr inbounds i8, ptr %y, i32 3
1495   %0 = load <16 x i8>, ptr %x, align 1
1496   store <16 x i8> %0, ptr %y, align 1
1497   ret ptr %z
1500 define ptr @strb8_127(ptr %y, ptr %x) {
1501 ; CHECK-LABEL: strb8_127:
1502 ; CHECK:       @ %bb.0: @ %entry
1503 ; CHECK-NEXT:    vldrb.u8 q0, [r1]
1504 ; CHECK-NEXT:    vstrb.8 q0, [r0], #127
1505 ; CHECK-NEXT:    bx lr
1506 entry:
1507   %z = getelementptr inbounds i8, ptr %y, i32 127
1508   %0 = load <16 x i8>, ptr %x, align 1
1509   store <16 x i8> %0, ptr %y, align 1
1510   ret ptr %z
1513 define ptr @strb8_128(ptr %y, ptr %x) {
1514 ; CHECK-LABEL: strb8_128:
1515 ; CHECK:       @ %bb.0: @ %entry
1516 ; CHECK-NEXT:    vldrb.u8 q0, [r1]
1517 ; CHECK-NEXT:    vstrb.8 q0, [r0]
1518 ; CHECK-NEXT:    adds r0, #128
1519 ; CHECK-NEXT:    bx lr
1520 entry:
1521   %z = getelementptr inbounds i8, ptr %y, i32 128
1522   %0 = load <16 x i8>, ptr %x, align 1
1523   store <16 x i8> %0, ptr %y, align 1
1524   ret ptr %z
1527 define ptr @strb8_m127(ptr %y, ptr %x) {
1528 ; CHECK-LABEL: strb8_m127:
1529 ; CHECK:       @ %bb.0: @ %entry
1530 ; CHECK-NEXT:    vldrb.u8 q0, [r1]
1531 ; CHECK-NEXT:    vstrb.8 q0, [r0], #-127
1532 ; CHECK-NEXT:    bx lr
1533 entry:
1534   %z = getelementptr inbounds i8, ptr %y, i32 -127
1535   %0 = load <16 x i8>, ptr %x, align 1
1536   store <16 x i8> %0, ptr %y, align 1
1537   ret ptr %z
1540 define ptr @strb8_m128(ptr %y, ptr %x) {
1541 ; CHECK-LABEL: strb8_m128:
1542 ; CHECK:       @ %bb.0: @ %entry
1543 ; CHECK-NEXT:    vldrb.u8 q0, [r1]
1544 ; CHECK-NEXT:    vstrb.8 q0, [r0]
1545 ; CHECK-NEXT:    subs r0, #128
1546 ; CHECK-NEXT:    bx lr
1547 entry:
1548   %z = getelementptr inbounds i8, ptr %y, i32 -128
1549   %0 = load <16 x i8>, ptr %x, align 1
1550   store <16 x i8> %0, ptr %y, align 1
1551   ret ptr %z
1555 define ptr @strf32_4(ptr %y, ptr %x) {
1556 ; CHECK-LE-LABEL: strf32_4:
1557 ; CHECK-LE:       @ %bb.0: @ %entry
1558 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
1559 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0], #4
1560 ; CHECK-LE-NEXT:    bx lr
1562 ; CHECK-BE-LABEL: strf32_4:
1563 ; CHECK-BE:       @ %bb.0: @ %entry
1564 ; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
1565 ; CHECK-BE-NEXT:    vstrw.32 q0, [r0], #4
1566 ; CHECK-BE-NEXT:    bx lr
1567 entry:
1568   %z = getelementptr inbounds i8, ptr %y, i32 4
1569   %0 = load <4 x float>, ptr %x, align 4
1570   store <4 x float> %0, ptr %y, align 4
1571   ret ptr %z
1574 define ptr @strf16_4(ptr %y, ptr %x) {
1575 ; CHECK-LE-LABEL: strf16_4:
1576 ; CHECK-LE:       @ %bb.0: @ %entry
1577 ; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1578 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0], #4
1579 ; CHECK-LE-NEXT:    bx lr
1581 ; CHECK-BE-LABEL: strf16_4:
1582 ; CHECK-BE:       @ %bb.0: @ %entry
1583 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1584 ; CHECK-BE-NEXT:    vstrh.16 q0, [r0], #4
1585 ; CHECK-BE-NEXT:    bx lr
1586 entry:
1587   %z = getelementptr inbounds i8, ptr %y, i32 4
1588   %0 = load <8 x half>, ptr %x, align 2
1589   store <8 x half> %0, ptr %y, align 2
1590   ret ptr %z
1593 define ptr @strwi32_align1(ptr %y, ptr %x) {
1594 ; CHECK-LE-LABEL: strwi32_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
1600 ; CHECK-BE-LABEL: strwi32_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
1606 entry:
1607   %z = getelementptr inbounds i8, ptr %y, i32 3
1608   %0 = load <4 x i32>, ptr %x, align 4
1609   store <4 x i32> %0, ptr %y, align 1
1610   ret ptr %z
1613 define ptr @strhi16_align1(ptr %y, ptr %x) {
1614 ; CHECK-LE-LABEL: strhi16_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
1620 ; CHECK-BE-LABEL: strhi16_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
1626 entry:
1627   %z = getelementptr inbounds i8, ptr %y, i32 3
1628   %0 = load <8 x i16>, ptr %x, align 2
1629   store <8 x i16> %0, ptr %y, align 1
1630   ret ptr %z
1633 define ptr @strhi32_align1(ptr %y, ptr %x) {
1634 ; CHECK-LABEL: strhi32_align1:
1635 ; CHECK:       @ %bb.0: @ %entry
1636 ; CHECK-NEXT:    .pad #8
1637 ; CHECK-NEXT:    sub sp, #8
1638 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
1639 ; CHECK-NEXT:    mov r1, sp
1640 ; CHECK-NEXT:    vstrh.32 q0, [r1]
1641 ; CHECK-NEXT:    ldrd r1, r2, [sp]
1642 ; CHECK-NEXT:    str r1, [r0]
1643 ; CHECK-NEXT:    str r2, [r0, #4]
1644 ; CHECK-NEXT:    adds r0, #3
1645 ; CHECK-NEXT:    add sp, #8
1646 ; CHECK-NEXT:    bx lr
1647 entry:
1648   %z = getelementptr inbounds i8, ptr %y, i32 3
1649   %0 = load <4 x i32>, ptr %x, align 4
1650   %1 = trunc <4 x i32> %0 to <4 x i16>
1651   store <4 x i16> %1, ptr %y, align 1
1652   ret ptr %z
1655 define ptr @strf32_align1(ptr %y, ptr %x) {
1656 ; CHECK-LE-LABEL: strf32_align1:
1657 ; CHECK-LE:       @ %bb.0: @ %entry
1658 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
1659 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0], #3
1660 ; CHECK-LE-NEXT:    bx lr
1662 ; CHECK-BE-LABEL: strf32_align1:
1663 ; CHECK-BE:       @ %bb.0: @ %entry
1664 ; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
1665 ; CHECK-BE-NEXT:    vrev32.8 q0, q0
1666 ; CHECK-BE-NEXT:    vstrb.8 q0, [r0], #3
1667 ; CHECK-BE-NEXT:    bx lr
1668 entry:
1669   %z = getelementptr inbounds i8, ptr %y, i32 3
1670   %0 = load <4 x float>, ptr %x, align 4
1671   store <4 x float> %0, ptr %y, align 1
1672   ret ptr %z
1675 define ptr @strf16_align1(ptr %y, ptr %x) {
1676 ; CHECK-LE-LABEL: strf16_align1:
1677 ; CHECK-LE:       @ %bb.0: @ %entry
1678 ; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1679 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0], #3
1680 ; CHECK-LE-NEXT:    bx lr
1682 ; CHECK-BE-LABEL: strf16_align1:
1683 ; CHECK-BE:       @ %bb.0: @ %entry
1684 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1685 ; CHECK-BE-NEXT:    vrev16.8 q0, q0
1686 ; CHECK-BE-NEXT:    vstrb.8 q0, [r0], #3
1687 ; CHECK-BE-NEXT:    bx lr
1688 entry:
1689   %z = getelementptr inbounds i8, ptr %y, i32 3
1690   %0 = load <8 x half>, ptr %x, align 2
1691   store <8 x half> %0, ptr %y, align 1
1692   ret ptr %z
1695 define ptr @strf16_align8(ptr %y, ptr %x) {
1696 ; CHECK-LE-LABEL: strf16_align8:
1697 ; CHECK-LE:       @ %bb.0: @ %entry
1698 ; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1699 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0], #16
1700 ; CHECK-LE-NEXT:    bx lr
1702 ; CHECK-BE-LABEL: strf16_align8:
1703 ; CHECK-BE:       @ %bb.0: @ %entry
1704 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1705 ; CHECK-BE-NEXT:    vstrh.16 q0, [r0], #16
1706 ; CHECK-BE-NEXT:    bx lr
1707 entry:
1708   %z = getelementptr inbounds i8, ptr %y, i32 16
1709   %0 = load <8 x i16>, ptr %x, align 2
1710   store <8 x i16> %0, ptr %y, align 8
1711   ret ptr %z