[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / Thumb2 / mve-ldst-preinc.ll
blob11b0115d27d3357d985005337a8f594258d285db
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 %z, 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:    adds r0, #3
28 ; CHECK-BE-NEXT:    vldrw.u32 q0, [r0]
29 ; CHECK-BE-NEXT:    vstrw.32 q0, [r1]
30 ; CHECK-BE-NEXT:    bx lr
31 entry:
32   %z = getelementptr inbounds i8, ptr %x, i32 3
33   %0 = load <4 x i32>, ptr %z, align 4
34   store <4 x i32> %0, ptr %y, align 4
35   ret ptr %z
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 %z, 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 %z, 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:    add.w r0, r0, #512
68 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
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 %z, 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 %z, 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:    sub.w r0, r0, #512
95 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
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 %z, 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 %z, align 2
115   %1 = zext <4 x i16> %0 to <4 x i32>
116   store <4 x i32> %1, ptr %y, align 4
117   ret ptr %z
120 define ptr @ldrhu32_3(ptr %x, ptr %y) {
121 ; CHECK-LABEL: ldrhu32_3:
122 ; CHECK:       @ %bb.0: @ %entry
123 ; CHECK-NEXT:    adds r0, #3
124 ; CHECK-NEXT:    vldrh.u32 q0, [r0]
125 ; CHECK-NEXT:    vstrw.32 q0, [r1]
126 ; CHECK-NEXT:    bx lr
127 entry:
128   %z = getelementptr inbounds i8, ptr %x, i32 3
129   %0 = load <4 x i16>, ptr %z, align 2
130   %1 = zext <4 x i16> %0 to <4 x i32>
131   store <4 x i32> %1, ptr %y, align 4
132   ret ptr %z
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 %z, align 2
144   %1 = zext <4 x i16> %0 to <4 x i32>
145   store <4 x i32> %1, ptr %y, align 4
146   ret ptr %z
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 %z, align 2
158   %1 = zext <4 x i16> %0 to <4 x i32>
159   store <4 x i32> %1, ptr %y, align 4
160   ret ptr %z
163 define ptr @ldrhu32_256(ptr %x, ptr %y) {
164 ; CHECK-LABEL: ldrhu32_256:
165 ; CHECK:       @ %bb.0: @ %entry
166 ; CHECK-NEXT:    add.w r0, r0, #256
167 ; CHECK-NEXT:    vldrh.u32 q0, [r0]
168 ; CHECK-NEXT:    vstrw.32 q0, [r1]
169 ; CHECK-NEXT:    bx lr
170 entry:
171   %z = getelementptr inbounds i8, ptr %x, i32 256
172   %0 = load <4 x i16>, ptr %z, align 2
173   %1 = zext <4 x i16> %0 to <4 x i32>
174   store <4 x i32> %1, ptr %y, align 4
175   ret ptr %z
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 %z, align 2
187   %1 = zext <4 x i16> %0 to <4 x i32>
188   store <4 x i32> %1, ptr %y, align 4
189   ret ptr %z
192 define ptr @ldrhu32_m256(ptr %x, ptr %y) {
193 ; CHECK-LABEL: ldrhu32_m256:
194 ; CHECK:       @ %bb.0: @ %entry
195 ; CHECK-NEXT:    sub.w r0, r0, #256
196 ; CHECK-NEXT:    vldrh.u32 q0, [r0]
197 ; CHECK-NEXT:    vstrw.32 q0, [r1]
198 ; CHECK-NEXT:    bx lr
199 entry:
200   %z = getelementptr inbounds i8, ptr %x, i32 -256
201   %0 = load <4 x i16>, ptr %z, align 2
202   %1 = zext <4 x i16> %0 to <4 x i32>
203   store <4 x i32> %1, ptr %y, align 4
204   ret ptr %z
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 %z, align 2
217   %1 = sext <4 x i16> %0 to <4 x i32>
218   store <4 x i32> %1, ptr %y, align 4
219   ret ptr %z
222 define ptr @ldrhs32_3(ptr %x, ptr %y) {
223 ; CHECK-LABEL: ldrhs32_3:
224 ; CHECK:       @ %bb.0: @ %entry
225 ; CHECK-NEXT:    adds r0, #3
226 ; CHECK-NEXT:    vldrh.s32 q0, [r0]
227 ; CHECK-NEXT:    vstrw.32 q0, [r1]
228 ; CHECK-NEXT:    bx lr
229 entry:
230   %z = getelementptr inbounds i8, ptr %x, i32 3
231   %0 = load <4 x i16>, ptr %z, align 2
232   %1 = sext <4 x i16> %0 to <4 x i32>
233   store <4 x i32> %1, ptr %y, align 4
234   ret ptr %z
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 %z, align 2
246   %1 = sext <4 x i16> %0 to <4 x i32>
247   store <4 x i32> %1, ptr %y, align 4
248   ret ptr %z
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 %z, align 2
260   %1 = sext <4 x i16> %0 to <4 x i32>
261   store <4 x i32> %1, ptr %y, align 4
262   ret ptr %z
265 define ptr @ldrhs32_256(ptr %x, ptr %y) {
266 ; CHECK-LABEL: ldrhs32_256:
267 ; CHECK:       @ %bb.0: @ %entry
268 ; CHECK-NEXT:    add.w r0, r0, #256
269 ; CHECK-NEXT:    vldrh.s32 q0, [r0]
270 ; CHECK-NEXT:    vstrw.32 q0, [r1]
271 ; CHECK-NEXT:    bx lr
272 entry:
273   %z = getelementptr inbounds i8, ptr %x, i32 256
274   %0 = load <4 x i16>, ptr %z, align 2
275   %1 = sext <4 x i16> %0 to <4 x i32>
276   store <4 x i32> %1, ptr %y, align 4
277   ret ptr %z
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 %z, align 2
289   %1 = sext <4 x i16> %0 to <4 x i32>
290   store <4 x i32> %1, ptr %y, align 4
291   ret ptr %z
294 define ptr @ldrhs32_m256(ptr %x, ptr %y) {
295 ; CHECK-LABEL: ldrhs32_m256:
296 ; CHECK:       @ %bb.0: @ %entry
297 ; CHECK-NEXT:    sub.w r0, r0, #256
298 ; CHECK-NEXT:    vldrh.s32 q0, [r0]
299 ; CHECK-NEXT:    vstrw.32 q0, [r1]
300 ; CHECK-NEXT:    bx lr
301 entry:
302   %z = getelementptr inbounds i8, ptr %x, i32 -256
303   %0 = load <4 x i16>, ptr %z, align 2
304   %1 = sext <4 x i16> %0 to <4 x i32>
305   store <4 x i32> %1, ptr %y, align 4
306   ret ptr %z
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 %z, 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:    adds r0, #3
333 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r0]
334 ; CHECK-BE-NEXT:    vstrh.16 q0, [r1]
335 ; CHECK-BE-NEXT:    bx lr
336 entry:
337   %z = getelementptr inbounds i8, ptr %x, i32 3
338   %0 = load <8 x i16>, ptr %z, align 2
339   store <8 x i16> %0, ptr %y, align 2
340   ret ptr %z
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 %z, 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 %z, 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:    add.w r0, r0, #256
373 ; CHECK-NEXT:    vldrh.u16 q0, [r0]
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 %z, 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 %z, 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:    sub.w r0, r0, #256
400 ; CHECK-NEXT:    vldrh.u16 q0, [r0]
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 %z, 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 %z, align 1
420   %1 = zext <4 x i8> %0 to <4 x i32>
421   store <4 x i32> %1, ptr %y, align 4
422   ret ptr %z
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 %z, align 1
434   %1 = zext <4 x i8> %0 to <4 x i32>
435   store <4 x i32> %1, ptr %y, align 4
436   ret ptr %z
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 %z, align 1
448   %1 = zext <4 x i8> %0 to <4 x i32>
449   store <4 x i32> %1, ptr %y, align 4
450   ret ptr %z
453 define ptr @ldrbu32_128(ptr %x, ptr %y) {
454 ; CHECK-LABEL: ldrbu32_128:
455 ; CHECK:       @ %bb.0: @ %entry
456 ; CHECK-NEXT:    adds r0, #128
457 ; CHECK-NEXT:    vldrb.u32 q0, [r0]
458 ; CHECK-NEXT:    vstrw.32 q0, [r1]
459 ; CHECK-NEXT:    bx lr
460 entry:
461   %z = getelementptr inbounds i8, ptr %x, i32 128
462   %0 = load <4 x i8>, ptr %z, align 1
463   %1 = zext <4 x i8> %0 to <4 x i32>
464   store <4 x i32> %1, ptr %y, align 4
465   ret ptr %z
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 %z, align 1
477   %1 = zext <4 x i8> %0 to <4 x i32>
478   store <4 x i32> %1, ptr %y, align 4
479   ret ptr %z
482 define ptr @ldrbu32_m128(ptr %x, ptr %y) {
483 ; CHECK-LABEL: ldrbu32_m128:
484 ; CHECK:       @ %bb.0: @ %entry
485 ; CHECK-NEXT:    subs r0, #128
486 ; CHECK-NEXT:    vldrb.u32 q0, [r0]
487 ; CHECK-NEXT:    vstrw.32 q0, [r1]
488 ; CHECK-NEXT:    bx lr
489 entry:
490   %z = getelementptr inbounds i8, ptr %x, i32 -128
491   %0 = load <4 x i8>, ptr %z, align 1
492   %1 = zext <4 x i8> %0 to <4 x i32>
493   store <4 x i32> %1, ptr %y, align 4
494   ret ptr %z
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 %z, align 1
507   %1 = sext <4 x i8> %0 to <4 x i32>
508   store <4 x i32> %1, ptr %y, align 4
509   ret ptr %z
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 %z, align 1
521   %1 = sext <4 x i8> %0 to <4 x i32>
522   store <4 x i32> %1, ptr %y, align 4
523   ret ptr %z
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 %z, align 1
535   %1 = sext <4 x i8> %0 to <4 x i32>
536   store <4 x i32> %1, ptr %y, align 4
537   ret ptr %z
540 define ptr @ldrbs32_128(ptr %x, ptr %y) {
541 ; CHECK-LABEL: ldrbs32_128:
542 ; CHECK:       @ %bb.0: @ %entry
543 ; CHECK-NEXT:    adds r0, #128
544 ; CHECK-NEXT:    vldrb.s32 q0, [r0]
545 ; CHECK-NEXT:    vstrw.32 q0, [r1]
546 ; CHECK-NEXT:    bx lr
547 entry:
548   %z = getelementptr inbounds i8, ptr %x, i32 128
549   %0 = load <4 x i8>, ptr %z, align 1
550   %1 = sext <4 x i8> %0 to <4 x i32>
551   store <4 x i32> %1, ptr %y, align 4
552   ret ptr %z
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 %z, align 1
564   %1 = sext <4 x i8> %0 to <4 x i32>
565   store <4 x i32> %1, ptr %y, align 4
566   ret ptr %z
569 define ptr @ldrbs32_m128(ptr %x, ptr %y) {
570 ; CHECK-LABEL: ldrbs32_m128:
571 ; CHECK:       @ %bb.0: @ %entry
572 ; CHECK-NEXT:    subs r0, #128
573 ; CHECK-NEXT:    vldrb.s32 q0, [r0]
574 ; CHECK-NEXT:    vstrw.32 q0, [r1]
575 ; CHECK-NEXT:    bx lr
576 entry:
577   %z = getelementptr inbounds i8, ptr %x, i32 -128
578   %0 = load <4 x i8>, ptr %z, align 1
579   %1 = sext <4 x i8> %0 to <4 x i32>
580   store <4 x i32> %1, ptr %y, align 4
581   ret ptr %z
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 %z, align 1
594   %1 = zext <8 x i8> %0 to <8 x i16>
595   store <8 x i16> %1, ptr %y, align 2
596   ret ptr %z
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 %z, align 1
608   %1 = zext <8 x i8> %0 to <8 x i16>
609   store <8 x i16> %1, ptr %y, align 2
610   ret ptr %z
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 %z, align 1
622   %1 = zext <8 x i8> %0 to <8 x i16>
623   store <8 x i16> %1, ptr %y, align 2
624   ret ptr %z
627 define ptr @ldrbu16_128(ptr %x, ptr %y) {
628 ; CHECK-LABEL: ldrbu16_128:
629 ; CHECK:       @ %bb.0: @ %entry
630 ; CHECK-NEXT:    adds r0, #128
631 ; CHECK-NEXT:    vldrb.u16 q0, [r0]
632 ; CHECK-NEXT:    vstrh.16 q0, [r1]
633 ; CHECK-NEXT:    bx lr
634 entry:
635   %z = getelementptr inbounds i8, ptr %x, i32 128
636   %0 = load <8 x i8>, ptr %z, align 1
637   %1 = zext <8 x i8> %0 to <8 x i16>
638   store <8 x i16> %1, ptr %y, align 2
639   ret ptr %z
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 %z, align 1
651   %1 = zext <8 x i8> %0 to <8 x i16>
652   store <8 x i16> %1, ptr %y, align 2
653   ret ptr %z
656 define ptr @ldrbu16_m128(ptr %x, ptr %y) {
657 ; CHECK-LABEL: ldrbu16_m128:
658 ; CHECK:       @ %bb.0: @ %entry
659 ; CHECK-NEXT:    subs r0, #128
660 ; CHECK-NEXT:    vldrb.u16 q0, [r0]
661 ; CHECK-NEXT:    vstrh.16 q0, [r1]
662 ; CHECK-NEXT:    bx lr
663 entry:
664   %z = getelementptr inbounds i8, ptr %x, i32 -128
665   %0 = load <8 x i8>, ptr %z, align 1
666   %1 = zext <8 x i8> %0 to <8 x i16>
667   store <8 x i16> %1, ptr %y, align 2
668   ret ptr %z
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 %z, align 1
681   %1 = sext <8 x i8> %0 to <8 x i16>
682   store <8 x i16> %1, ptr %y, align 2
683   ret ptr %z
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 %z, align 1
695   %1 = sext <8 x i8> %0 to <8 x i16>
696   store <8 x i16> %1, ptr %y, align 2
697   ret ptr %z
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 %z, align 1
709   %1 = sext <8 x i8> %0 to <8 x i16>
710   store <8 x i16> %1, ptr %y, align 2
711   ret ptr %z
714 define ptr @ldrbs16_128(ptr %x, ptr %y) {
715 ; CHECK-LABEL: ldrbs16_128:
716 ; CHECK:       @ %bb.0: @ %entry
717 ; CHECK-NEXT:    adds r0, #128
718 ; CHECK-NEXT:    vldrb.s16 q0, [r0]
719 ; CHECK-NEXT:    vstrh.16 q0, [r1]
720 ; CHECK-NEXT:    bx lr
721 entry:
722   %z = getelementptr inbounds i8, ptr %x, i32 128
723   %0 = load <8 x i8>, ptr %z, align 1
724   %1 = sext <8 x i8> %0 to <8 x i16>
725   store <8 x i16> %1, ptr %y, align 2
726   ret ptr %z
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 %z, align 1
738   %1 = sext <8 x i8> %0 to <8 x i16>
739   store <8 x i16> %1, ptr %y, align 2
740   ret ptr %z
743 define ptr @ldrbs16_m128(ptr %x, ptr %y) {
744 ; CHECK-LABEL: ldrbs16_m128:
745 ; CHECK:       @ %bb.0: @ %entry
746 ; CHECK-NEXT:    subs r0, #128
747 ; CHECK-NEXT:    vldrb.s16 q0, [r0]
748 ; CHECK-NEXT:    vstrh.16 q0, [r1]
749 ; CHECK-NEXT:    bx lr
750 entry:
751   %z = getelementptr inbounds i8, ptr %x, i32 -128
752   %0 = load <8 x i8>, ptr %z, align 1
753   %1 = sext <8 x i8> %0 to <8 x i16>
754   store <8 x i16> %1, ptr %y, align 2
755   ret ptr %z
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 %z, 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 %z, 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 %z, 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:    adds r0, #128
802 ; CHECK-NEXT:    vldrb.u8 q0, [r0]
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 %z, 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 %z, 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:    subs r0, #128
829 ; CHECK-NEXT:    vldrb.u8 q0, [r0]
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 %z, 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 %z, 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 %z, 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:    adds r0, #3
877 ; CHECK-BE-NEXT:    vrev32.8 q0, q0
878 ; CHECK-BE-NEXT:    vstrw.32 q0, [r1]
879 ; CHECK-BE-NEXT:    bx lr
880 entry:
881   %z = getelementptr inbounds i8, ptr %x, i32 3
882   %0 = load <4 x i32>, ptr %z, align 1
883   store <4 x i32> %0, ptr %y, align 4
884   ret ptr %z
887 define ptr @ldrhi16_align1(ptr %x, ptr %y) {
888 ; CHECK-LE-LABEL: ldrhi16_align1:
889 ; CHECK-LE:       @ %bb.0: @ %entry
890 ; CHECK-LE-NEXT:    vldrb.u8 q0, [r0, #3]!
891 ; CHECK-LE-NEXT:    vstrh.16 q0, [r1]
892 ; CHECK-LE-NEXT:    bx lr
894 ; CHECK-BE-LABEL: ldrhi16_align1:
895 ; CHECK-BE:       @ %bb.0: @ %entry
896 ; CHECK-BE-NEXT:    vldrb.u8 q0, [r0, #3]
897 ; CHECK-BE-NEXT:    adds r0, #3
898 ; CHECK-BE-NEXT:    vrev16.8 q0, q0
899 ; CHECK-BE-NEXT:    vstrh.16 q0, [r1]
900 ; CHECK-BE-NEXT:    bx lr
901 entry:
902   %z = getelementptr inbounds i8, ptr %x, i32 3
903   %0 = load <8 x i16>, ptr %z, align 1
904   store <8 x i16> %0, ptr %y, align 2
905   ret ptr %z
908 define ptr @ldrhi32_align1(ptr %x, ptr %y) {
909 ; CHECK-LABEL: ldrhi32_align1:
910 ; CHECK:       @ %bb.0: @ %entry
911 ; CHECK-NEXT:    .pad #8
912 ; CHECK-NEXT:    sub sp, #8
913 ; CHECK-NEXT:    ldr r2, [r0, #3]!
914 ; CHECK-NEXT:    str r2, [sp]
915 ; CHECK-NEXT:    ldr r2, [r0, #4]
916 ; CHECK-NEXT:    str r2, [sp, #4]
917 ; CHECK-NEXT:    mov r2, sp
918 ; CHECK-NEXT:    vldrh.s32 q0, [r2]
919 ; CHECK-NEXT:    vstrw.32 q0, [r1]
920 ; CHECK-NEXT:    add sp, #8
921 ; CHECK-NEXT:    bx lr
922 entry:
923   %z = getelementptr inbounds i8, ptr %x, i32 3
924   %0 = load <4 x i16>, ptr %z, align 1
925   %1 = sext <4 x i16> %0 to <4 x i32>
926   store <4 x i32> %1, ptr %y, align 4
927   ret ptr %z
930 define ptr @ldrf32_align1(ptr %x, ptr %y) {
931 ; CHECK-LE-LABEL: ldrf32_align1:
932 ; CHECK-LE:       @ %bb.0: @ %entry
933 ; CHECK-LE-NEXT:    vldrb.u8 q0, [r0, #3]!
934 ; CHECK-LE-NEXT:    vstrw.32 q0, [r1]
935 ; CHECK-LE-NEXT:    bx lr
937 ; CHECK-BE-LABEL: ldrf32_align1:
938 ; CHECK-BE:       @ %bb.0: @ %entry
939 ; CHECK-BE-NEXT:    vldrb.u8 q0, [r0, #3]
940 ; CHECK-BE-NEXT:    adds r0, #3
941 ; CHECK-BE-NEXT:    vrev32.8 q0, q0
942 ; CHECK-BE-NEXT:    vstrw.32 q0, [r1]
943 ; CHECK-BE-NEXT:    bx lr
944 entry:
945   %z = getelementptr inbounds i8, ptr %x, i32 3
946   %0 = load <4 x float>, ptr %z, align 1
947   store <4 x float> %0, ptr %y, align 4
948   ret ptr %z
951 define ptr @ldrf16_align1(ptr %x, ptr %y) {
952 ; CHECK-LE-LABEL: ldrf16_align1:
953 ; CHECK-LE:       @ %bb.0: @ %entry
954 ; CHECK-LE-NEXT:    vldrb.u8 q0, [r0, #3]!
955 ; CHECK-LE-NEXT:    vstrh.16 q0, [r1]
956 ; CHECK-LE-NEXT:    bx lr
958 ; CHECK-BE-LABEL: ldrf16_align1:
959 ; CHECK-BE:       @ %bb.0: @ %entry
960 ; CHECK-BE-NEXT:    vldrb.u8 q0, [r0, #3]
961 ; CHECK-BE-NEXT:    adds r0, #3
962 ; CHECK-BE-NEXT:    vrev16.8 q0, q0
963 ; CHECK-BE-NEXT:    vstrh.16 q0, [r1]
964 ; CHECK-BE-NEXT:    bx lr
965 entry:
966   %z = getelementptr inbounds i8, ptr %x, i32 3
967   %0 = load <8 x half>, ptr %z, align 1
968   store <8 x half> %0, ptr %y, align 2
969   ret ptr %z
972 define ptr @ldrh16_align8(ptr %x, ptr %y) {
973 ; CHECK-LE-LABEL: ldrh16_align8:
974 ; CHECK-LE:       @ %bb.0: @ %entry
975 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r0, #4]!
976 ; CHECK-LE-NEXT:    vstrh.16 q0, [r1]
977 ; CHECK-LE-NEXT:    bx lr
979 ; CHECK-BE-LABEL: ldrh16_align8:
980 ; CHECK-BE:       @ %bb.0: @ %entry
981 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r0, #4]!
982 ; CHECK-BE-NEXT:    vstrh.16 q0, [r1]
983 ; CHECK-BE-NEXT:    bx lr
984 entry:
985   %z = getelementptr inbounds i8, ptr %x, i32 4
986   %0 = load <8 x i16>, ptr %z, align 8
987   store <8 x i16> %0, ptr %y, align 2
988   ret ptr %z
995 define ptr @strw32_4(ptr %y, ptr %x) {
996 ; CHECK-LE-LABEL: strw32_4:
997 ; CHECK-LE:       @ %bb.0: @ %entry
998 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
999 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #4]!
1000 ; CHECK-LE-NEXT:    bx lr
1002 ; CHECK-BE-LABEL: strw32_4:
1003 ; CHECK-BE:       @ %bb.0: @ %entry
1004 ; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
1005 ; CHECK-BE-NEXT:    vstrw.32 q0, [r0, #4]!
1006 ; CHECK-BE-NEXT:    bx lr
1007 entry:
1008   %z = getelementptr inbounds i8, ptr %y, i32 4
1009   %0 = load <4 x i32>, ptr %x, align 4
1010   store <4 x i32> %0, ptr %z, align 4
1011   ret ptr %z
1014 define ptr @strw32_3(ptr %y, ptr %x) {
1015 ; CHECK-LE-LABEL: strw32_3:
1016 ; CHECK-LE:       @ %bb.0: @ %entry
1017 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
1018 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #3]!
1019 ; CHECK-LE-NEXT:    bx lr
1021 ; CHECK-BE-LABEL: strw32_3:
1022 ; CHECK-BE:       @ %bb.0: @ %entry
1023 ; CHECK-BE-NEXT:    adds r0, #3
1024 ; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
1025 ; CHECK-BE-NEXT:    vstrw.32 q0, [r0]
1026 ; CHECK-BE-NEXT:    bx lr
1027 entry:
1028   %z = getelementptr inbounds i8, ptr %y, i32 3
1029   %0 = load <4 x i32>, ptr %x, align 4
1030   store <4 x i32> %0, ptr %z, align 4
1031   ret ptr %z
1034 define ptr @strw32_m4(ptr %y, ptr %x) {
1035 ; CHECK-LE-LABEL: strw32_m4:
1036 ; CHECK-LE:       @ %bb.0: @ %entry
1037 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
1038 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #-4]!
1039 ; CHECK-LE-NEXT:    bx lr
1041 ; CHECK-BE-LABEL: strw32_m4:
1042 ; CHECK-BE:       @ %bb.0: @ %entry
1043 ; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
1044 ; CHECK-BE-NEXT:    vstrw.32 q0, [r0, #-4]!
1045 ; CHECK-BE-NEXT:    bx lr
1046 entry:
1047   %z = getelementptr inbounds i8, ptr %y, i32 -4
1048   %0 = load <4 x i32>, ptr %x, align 4
1049   store <4 x i32> %0, ptr %z, align 4
1050   ret ptr %z
1053 define ptr @strw32_508(ptr %y, ptr %x) {
1054 ; CHECK-LABEL: strw32_508:
1055 ; CHECK:       @ %bb.0: @ %entry
1056 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
1057 ; CHECK-NEXT:    vstrw.32 q0, [r0, #508]!
1058 ; CHECK-NEXT:    bx lr
1059 entry:
1060   %z = getelementptr inbounds i8, ptr %y, i32 508
1061   %0 = load <4 x i32>, ptr %x, align 4
1062   store <4 x i32> %0, ptr %z, align 4
1063   ret ptr %z
1066 define ptr @strw32_512(ptr %y, ptr %x) {
1067 ; CHECK-LABEL: strw32_512:
1068 ; CHECK:       @ %bb.0: @ %entry
1069 ; CHECK-NEXT:    add.w r0, r0, #512
1070 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
1071 ; CHECK-NEXT:    vstrw.32 q0, [r0]
1072 ; CHECK-NEXT:    bx lr
1073 entry:
1074   %z = getelementptr inbounds i8, ptr %y, i32 512
1075   %0 = load <4 x i32>, ptr %x, align 4
1076   store <4 x i32> %0, ptr %z, align 4
1077   ret ptr %z
1080 define ptr @strw32_m508(ptr %y, ptr %x) {
1081 ; CHECK-LABEL: strw32_m508:
1082 ; CHECK:       @ %bb.0: @ %entry
1083 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
1084 ; CHECK-NEXT:    vstrw.32 q0, [r0, #-508]!
1085 ; CHECK-NEXT:    bx lr
1086 entry:
1087   %z = getelementptr inbounds i8, ptr %y, i32 -508
1088   %0 = load <4 x i32>, ptr %x, align 4
1089   store <4 x i32> %0, ptr %z, align 4
1090   ret ptr %z
1093 define ptr @strw32_m512(ptr %y, ptr %x) {
1094 ; CHECK-LABEL: strw32_m512:
1095 ; CHECK:       @ %bb.0: @ %entry
1096 ; CHECK-NEXT:    sub.w r0, r0, #512
1097 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
1098 ; CHECK-NEXT:    vstrw.32 q0, [r0]
1099 ; CHECK-NEXT:    bx lr
1100 entry:
1101   %z = getelementptr inbounds i8, ptr %y, i32 -512
1102   %0 = load <4 x i32>, ptr %x, align 4
1103   store <4 x i32> %0, ptr %z, align 4
1104   ret ptr %z
1108 define ptr @strh32_4(ptr %y, ptr %x) {
1109 ; CHECK-LABEL: strh32_4:
1110 ; CHECK:       @ %bb.0: @ %entry
1111 ; CHECK-NEXT:    vldrh.u32 q0, [r1]
1112 ; CHECK-NEXT:    vstrh.32 q0, [r0, #4]!
1113 ; CHECK-NEXT:    bx lr
1114 entry:
1115   %z = getelementptr inbounds i8, ptr %y, i32 4
1116   %0 = load <4 x i16>, ptr %x, align 2
1117   store <4 x i16> %0, ptr %z, align 2
1118   ret ptr %z
1121 define ptr @strh32_3(ptr %y, ptr %x) {
1122 ; CHECK-LABEL: strh32_3:
1123 ; CHECK:       @ %bb.0: @ %entry
1124 ; CHECK-NEXT:    adds r0, #3
1125 ; CHECK-NEXT:    vldrh.u32 q0, [r1]
1126 ; CHECK-NEXT:    vstrh.32 q0, [r0]
1127 ; CHECK-NEXT:    bx lr
1128 entry:
1129   %z = getelementptr inbounds i8, ptr %y, i32 3
1130   %0 = load <4 x i16>, ptr %x, align 2
1131   store <4 x i16> %0, ptr %z, align 2
1132   ret ptr %z
1135 define ptr @strh32_2(ptr %y, ptr %x) {
1136 ; CHECK-LABEL: strh32_2:
1137 ; CHECK:       @ %bb.0: @ %entry
1138 ; CHECK-NEXT:    vldrh.u32 q0, [r1]
1139 ; CHECK-NEXT:    vstrh.32 q0, [r0, #2]!
1140 ; CHECK-NEXT:    bx lr
1141 entry:
1142   %z = getelementptr inbounds i8, ptr %y, i32 2
1143   %0 = load <4 x i16>, ptr %x, align 2
1144   store <4 x i16> %0, ptr %z, align 2
1145   ret ptr %z
1148 define ptr @strh32_254(ptr %y, ptr %x) {
1149 ; CHECK-LABEL: strh32_254:
1150 ; CHECK:       @ %bb.0: @ %entry
1151 ; CHECK-NEXT:    vldrh.u32 q0, [r1]
1152 ; CHECK-NEXT:    vstrh.32 q0, [r0, #254]!
1153 ; CHECK-NEXT:    bx lr
1154 entry:
1155   %z = getelementptr inbounds i8, ptr %y, i32 254
1156   %0 = load <4 x i16>, ptr %x, align 2
1157   store <4 x i16> %0, ptr %z, align 2
1158   ret ptr %z
1161 define ptr @strh32_256(ptr %y, ptr %x) {
1162 ; CHECK-LABEL: strh32_256:
1163 ; CHECK:       @ %bb.0: @ %entry
1164 ; CHECK-NEXT:    add.w r0, r0, #256
1165 ; CHECK-NEXT:    vldrh.u32 q0, [r1]
1166 ; CHECK-NEXT:    vstrh.32 q0, [r0]
1167 ; CHECK-NEXT:    bx lr
1168 entry:
1169   %z = getelementptr inbounds i8, ptr %y, i32 256
1170   %0 = load <4 x i16>, ptr %x, align 2
1171   store <4 x i16> %0, ptr %z, align 2
1172   ret ptr %z
1175 define ptr @strh32_m254(ptr %y, ptr %x) {
1176 ; CHECK-LABEL: strh32_m254:
1177 ; CHECK:       @ %bb.0: @ %entry
1178 ; CHECK-NEXT:    vldrh.u32 q0, [r1]
1179 ; CHECK-NEXT:    vstrh.32 q0, [r0, #-254]!
1180 ; CHECK-NEXT:    bx lr
1181 entry:
1182   %z = getelementptr inbounds i8, ptr %y, i32 -254
1183   %0 = load <4 x i16>, ptr %x, align 2
1184   store <4 x i16> %0, ptr %z, align 2
1185   ret ptr %z
1188 define ptr @strh32_m256(ptr %y, ptr %x) {
1189 ; CHECK-LABEL: strh32_m256:
1190 ; CHECK:       @ %bb.0: @ %entry
1191 ; CHECK-NEXT:    sub.w r0, r0, #256
1192 ; CHECK-NEXT:    vldrh.u32 q0, [r1]
1193 ; CHECK-NEXT:    vstrh.32 q0, [r0]
1194 ; CHECK-NEXT:    bx lr
1195 entry:
1196   %z = getelementptr inbounds i8, ptr %y, i32 -256
1197   %0 = load <4 x i16>, ptr %x, align 2
1198   store <4 x i16> %0, ptr %z, align 2
1199   ret ptr %z
1203 define ptr @strh16_4(ptr %y, ptr %x) {
1204 ; CHECK-LE-LABEL: strh16_4:
1205 ; CHECK-LE:       @ %bb.0: @ %entry
1206 ; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1207 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #4]!
1208 ; CHECK-LE-NEXT:    bx lr
1210 ; CHECK-BE-LABEL: strh16_4:
1211 ; CHECK-BE:       @ %bb.0: @ %entry
1212 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1213 ; CHECK-BE-NEXT:    vstrh.16 q0, [r0, #4]!
1214 ; CHECK-BE-NEXT:    bx lr
1215 entry:
1216   %z = getelementptr inbounds i8, ptr %y, i32 4
1217   %0 = load <8 x i16>, ptr %x, align 2
1218   store <8 x i16> %0, ptr %z, align 2
1219   ret ptr %z
1222 define ptr @strh16_3(ptr %y, ptr %x) {
1223 ; CHECK-LE-LABEL: strh16_3:
1224 ; CHECK-LE:       @ %bb.0: @ %entry
1225 ; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1226 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #3]!
1227 ; CHECK-LE-NEXT:    bx lr
1229 ; CHECK-BE-LABEL: strh16_3:
1230 ; CHECK-BE:       @ %bb.0: @ %entry
1231 ; CHECK-BE-NEXT:    adds r0, #3
1232 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1233 ; CHECK-BE-NEXT:    vstrh.16 q0, [r0]
1234 ; CHECK-BE-NEXT:    bx lr
1235 entry:
1236   %z = getelementptr inbounds i8, ptr %y, i32 3
1237   %0 = load <8 x i16>, ptr %x, align 2
1238   store <8 x i16> %0, ptr %z, align 2
1239   ret ptr %z
1242 define ptr @strh16_2(ptr %y, ptr %x) {
1243 ; CHECK-LE-LABEL: strh16_2:
1244 ; CHECK-LE:       @ %bb.0: @ %entry
1245 ; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1246 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #2]!
1247 ; CHECK-LE-NEXT:    bx lr
1249 ; CHECK-BE-LABEL: strh16_2:
1250 ; CHECK-BE:       @ %bb.0: @ %entry
1251 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1252 ; CHECK-BE-NEXT:    vstrh.16 q0, [r0, #2]!
1253 ; CHECK-BE-NEXT:    bx lr
1254 entry:
1255   %z = getelementptr inbounds i8, ptr %y, i32 2
1256   %0 = load <8 x i16>, ptr %x, align 2
1257   store <8 x i16> %0, ptr %z, align 2
1258   ret ptr %z
1261 define ptr @strh16_254(ptr %y, ptr %x) {
1262 ; CHECK-LABEL: strh16_254:
1263 ; CHECK:       @ %bb.0: @ %entry
1264 ; CHECK-NEXT:    vldrh.u16 q0, [r1]
1265 ; CHECK-NEXT:    vstrh.16 q0, [r0, #254]!
1266 ; CHECK-NEXT:    bx lr
1267 entry:
1268   %z = getelementptr inbounds i8, ptr %y, i32 254
1269   %0 = load <8 x i16>, ptr %x, align 2
1270   store <8 x i16> %0, ptr %z, align 2
1271   ret ptr %z
1274 define ptr @strh16_256(ptr %y, ptr %x) {
1275 ; CHECK-LABEL: strh16_256:
1276 ; CHECK:       @ %bb.0: @ %entry
1277 ; CHECK-NEXT:    add.w r0, r0, #256
1278 ; CHECK-NEXT:    vldrh.u16 q0, [r1]
1279 ; CHECK-NEXT:    vstrh.16 q0, [r0]
1280 ; CHECK-NEXT:    bx lr
1281 entry:
1282   %z = getelementptr inbounds i8, ptr %y, i32 256
1283   %0 = load <8 x i16>, ptr %x, align 2
1284   store <8 x i16> %0, ptr %z, align 2
1285   ret ptr %z
1288 define ptr @strh16_m254(ptr %y, ptr %x) {
1289 ; CHECK-LABEL: strh16_m254:
1290 ; CHECK:       @ %bb.0: @ %entry
1291 ; CHECK-NEXT:    vldrh.u16 q0, [r1]
1292 ; CHECK-NEXT:    vstrh.16 q0, [r0, #-254]!
1293 ; CHECK-NEXT:    bx lr
1294 entry:
1295   %z = getelementptr inbounds i8, ptr %y, i32 -254
1296   %0 = load <8 x i16>, ptr %x, align 2
1297   store <8 x i16> %0, ptr %z, align 2
1298   ret ptr %z
1301 define ptr @strh16_m256(ptr %y, ptr %x) {
1302 ; CHECK-LABEL: strh16_m256:
1303 ; CHECK:       @ %bb.0: @ %entry
1304 ; CHECK-NEXT:    sub.w r0, r0, #256
1305 ; CHECK-NEXT:    vldrh.u16 q0, [r1]
1306 ; CHECK-NEXT:    vstrh.16 q0, [r0]
1307 ; CHECK-NEXT:    bx lr
1308 entry:
1309   %z = getelementptr inbounds i8, ptr %y, i32 -256
1310   %0 = load <8 x i16>, ptr %x, align 2
1311   store <8 x i16> %0, ptr %z, align 2
1312   ret ptr %z
1316 define ptr @strb32_4(ptr %y, ptr %x) {
1317 ; CHECK-LABEL: strb32_4:
1318 ; CHECK:       @ %bb.0: @ %entry
1319 ; CHECK-NEXT:    vldrb.u32 q0, [r1]
1320 ; CHECK-NEXT:    vstrb.32 q0, [r0, #4]!
1321 ; CHECK-NEXT:    bx lr
1322 entry:
1323   %z = getelementptr inbounds i8, ptr %y, i32 4
1324   %0 = load <4 x i8>, ptr %x, align 1
1325   store <4 x i8> %0, ptr %z, align 1
1326   ret ptr %z
1329 define ptr @strb32_3(ptr %y, ptr %x) {
1330 ; CHECK-LABEL: strb32_3:
1331 ; CHECK:       @ %bb.0: @ %entry
1332 ; CHECK-NEXT:    vldrb.u32 q0, [r1]
1333 ; CHECK-NEXT:    vstrb.32 q0, [r0, #3]!
1334 ; CHECK-NEXT:    bx lr
1335 entry:
1336   %z = getelementptr inbounds i8, ptr %y, i32 3
1337   %0 = load <4 x i8>, ptr %x, align 1
1338   store <4 x i8> %0, ptr %z, align 1
1339   ret ptr %z
1342 define ptr @strb32_127(ptr %y, ptr %x) {
1343 ; CHECK-LABEL: strb32_127:
1344 ; CHECK:       @ %bb.0: @ %entry
1345 ; CHECK-NEXT:    vldrb.u32 q0, [r1]
1346 ; CHECK-NEXT:    vstrb.32 q0, [r0, #127]!
1347 ; CHECK-NEXT:    bx lr
1348 entry:
1349   %z = getelementptr inbounds i8, ptr %y, i32 127
1350   %0 = load <4 x i8>, ptr %x, align 1
1351   store <4 x i8> %0, ptr %z, align 1
1352   ret ptr %z
1355 define ptr @strb32_128(ptr %y, ptr %x) {
1356 ; CHECK-LABEL: strb32_128:
1357 ; CHECK:       @ %bb.0: @ %entry
1358 ; CHECK-NEXT:    adds r0, #128
1359 ; CHECK-NEXT:    vldrb.u32 q0, [r1]
1360 ; CHECK-NEXT:    vstrb.32 q0, [r0]
1361 ; CHECK-NEXT:    bx lr
1362 entry:
1363   %z = getelementptr inbounds i8, ptr %y, i32 128
1364   %0 = load <4 x i8>, ptr %x, align 1
1365   store <4 x i8> %0, ptr %z, align 1
1366   ret ptr %z
1369 define ptr @strb32_m127(ptr %y, ptr %x) {
1370 ; CHECK-LABEL: strb32_m127:
1371 ; CHECK:       @ %bb.0: @ %entry
1372 ; CHECK-NEXT:    vldrb.u32 q0, [r1]
1373 ; CHECK-NEXT:    vstrb.32 q0, [r0, #-127]!
1374 ; CHECK-NEXT:    bx lr
1375 entry:
1376   %z = getelementptr inbounds i8, ptr %y, i32 -127
1377   %0 = load <4 x i8>, ptr %x, align 1
1378   store <4 x i8> %0, ptr %z, align 1
1379   ret ptr %z
1382 define ptr @strb32_m128(ptr %y, ptr %x) {
1383 ; CHECK-LABEL: strb32_m128:
1384 ; CHECK:       @ %bb.0: @ %entry
1385 ; CHECK-NEXT:    subs r0, #128
1386 ; CHECK-NEXT:    vldrb.u32 q0, [r1]
1387 ; CHECK-NEXT:    vstrb.32 q0, [r0]
1388 ; CHECK-NEXT:    bx lr
1389 entry:
1390   %z = getelementptr inbounds i8, ptr %y, i32 -128
1391   %0 = load <4 x i8>, ptr %x, align 1
1392   store <4 x i8> %0, ptr %z, align 1
1393   ret ptr %z
1397 define ptr @strb16_4(ptr %y, ptr %x) {
1398 ; CHECK-LABEL: strb16_4:
1399 ; CHECK:       @ %bb.0: @ %entry
1400 ; CHECK-NEXT:    vldrb.u16 q0, [r1]
1401 ; CHECK-NEXT:    vstrb.16 q0, [r0, #4]!
1402 ; CHECK-NEXT:    bx lr
1403 entry:
1404   %z = getelementptr inbounds i8, ptr %y, i32 4
1405   %0 = load <8 x i8>, ptr %x, align 1
1406   store <8 x i8> %0, ptr %z, align 1
1407   ret ptr %z
1410 define ptr @strb16_3(ptr %y, ptr %x) {
1411 ; CHECK-LABEL: strb16_3:
1412 ; CHECK:       @ %bb.0: @ %entry
1413 ; CHECK-NEXT:    vldrb.u16 q0, [r1]
1414 ; CHECK-NEXT:    vstrb.16 q0, [r0, #3]!
1415 ; CHECK-NEXT:    bx lr
1416 entry:
1417   %z = getelementptr inbounds i8, ptr %y, i32 3
1418   %0 = load <8 x i8>, ptr %x, align 1
1419   store <8 x i8> %0, ptr %z, align 1
1420   ret ptr %z
1423 define ptr @strb16_127(ptr %y, ptr %x) {
1424 ; CHECK-LABEL: strb16_127:
1425 ; CHECK:       @ %bb.0: @ %entry
1426 ; CHECK-NEXT:    vldrb.u16 q0, [r1]
1427 ; CHECK-NEXT:    vstrb.16 q0, [r0, #127]!
1428 ; CHECK-NEXT:    bx lr
1429 entry:
1430   %z = getelementptr inbounds i8, ptr %y, i32 127
1431   %0 = load <8 x i8>, ptr %x, align 1
1432   store <8 x i8> %0, ptr %z, align 1
1433   ret ptr %z
1436 define ptr @strb16_128(ptr %y, ptr %x) {
1437 ; CHECK-LABEL: strb16_128:
1438 ; CHECK:       @ %bb.0: @ %entry
1439 ; CHECK-NEXT:    adds r0, #128
1440 ; CHECK-NEXT:    vldrb.u16 q0, [r1]
1441 ; CHECK-NEXT:    vstrb.16 q0, [r0]
1442 ; CHECK-NEXT:    bx lr
1443 entry:
1444   %z = getelementptr inbounds i8, ptr %y, i32 128
1445   %0 = load <8 x i8>, ptr %x, align 1
1446   store <8 x i8> %0, ptr %z, align 1
1447   ret ptr %z
1450 define ptr @strb16_m127(ptr %y, ptr %x) {
1451 ; CHECK-LABEL: strb16_m127:
1452 ; CHECK:       @ %bb.0: @ %entry
1453 ; CHECK-NEXT:    vldrb.u16 q0, [r1]
1454 ; CHECK-NEXT:    vstrb.16 q0, [r0, #-127]!
1455 ; CHECK-NEXT:    bx lr
1456 entry:
1457   %z = getelementptr inbounds i8, ptr %y, i32 -127
1458   %0 = load <8 x i8>, ptr %x, align 1
1459   store <8 x i8> %0, ptr %z, align 1
1460   ret ptr %z
1463 define ptr @strb16_m128(ptr %y, ptr %x) {
1464 ; CHECK-LABEL: strb16_m128:
1465 ; CHECK:       @ %bb.0: @ %entry
1466 ; CHECK-NEXT:    subs r0, #128
1467 ; CHECK-NEXT:    vldrb.u16 q0, [r1]
1468 ; CHECK-NEXT:    vstrb.16 q0, [r0]
1469 ; CHECK-NEXT:    bx lr
1470 entry:
1471   %z = getelementptr inbounds i8, ptr %y, i32 -128
1472   %0 = load <8 x i8>, ptr %x, align 1
1473   store <8 x i8> %0, ptr %z, align 1
1474   ret ptr %z
1478 define ptr @strb8_4(ptr %y, ptr %x) {
1479 ; CHECK-LABEL: strb8_4:
1480 ; CHECK:       @ %bb.0: @ %entry
1481 ; CHECK-NEXT:    vldrb.u8 q0, [r1]
1482 ; CHECK-NEXT:    vstrb.8 q0, [r0, #4]!
1483 ; CHECK-NEXT:    bx lr
1484 entry:
1485   %z = getelementptr inbounds i8, ptr %y, i32 4
1486   %0 = load <16 x i8>, ptr %x, align 1
1487   store <16 x i8> %0, ptr %z, align 1
1488   ret ptr %z
1491 define ptr @strb8_3(ptr %y, ptr %x) {
1492 ; CHECK-LABEL: strb8_3:
1493 ; CHECK:       @ %bb.0: @ %entry
1494 ; CHECK-NEXT:    vldrb.u8 q0, [r1]
1495 ; CHECK-NEXT:    vstrb.8 q0, [r0, #3]!
1496 ; CHECK-NEXT:    bx lr
1497 entry:
1498   %z = getelementptr inbounds i8, ptr %y, i32 3
1499   %0 = load <16 x i8>, ptr %x, align 1
1500   store <16 x i8> %0, ptr %z, align 1
1501   ret ptr %z
1504 define ptr @strb8_127(ptr %y, ptr %x) {
1505 ; CHECK-LABEL: strb8_127:
1506 ; CHECK:       @ %bb.0: @ %entry
1507 ; CHECK-NEXT:    vldrb.u8 q0, [r1]
1508 ; CHECK-NEXT:    vstrb.8 q0, [r0, #127]!
1509 ; CHECK-NEXT:    bx lr
1510 entry:
1511   %z = getelementptr inbounds i8, ptr %y, i32 127
1512   %0 = load <16 x i8>, ptr %x, align 1
1513   store <16 x i8> %0, ptr %z, align 1
1514   ret ptr %z
1517 define ptr @strb8_128(ptr %y, ptr %x) {
1518 ; CHECK-LABEL: strb8_128:
1519 ; CHECK:       @ %bb.0: @ %entry
1520 ; CHECK-NEXT:    adds r0, #128
1521 ; CHECK-NEXT:    vldrb.u8 q0, [r1]
1522 ; CHECK-NEXT:    vstrb.8 q0, [r0]
1523 ; CHECK-NEXT:    bx lr
1524 entry:
1525   %z = getelementptr inbounds i8, ptr %y, i32 128
1526   %0 = load <16 x i8>, ptr %x, align 1
1527   store <16 x i8> %0, ptr %z, align 1
1528   ret ptr %z
1531 define ptr @strb8_m127(ptr %y, ptr %x) {
1532 ; CHECK-LABEL: strb8_m127:
1533 ; CHECK:       @ %bb.0: @ %entry
1534 ; CHECK-NEXT:    vldrb.u8 q0, [r1]
1535 ; CHECK-NEXT:    vstrb.8 q0, [r0, #-127]!
1536 ; CHECK-NEXT:    bx lr
1537 entry:
1538   %z = getelementptr inbounds i8, ptr %y, i32 -127
1539   %0 = load <16 x i8>, ptr %x, align 1
1540   store <16 x i8> %0, ptr %z, align 1
1541   ret ptr %z
1544 define ptr @strb8_m128(ptr %y, ptr %x) {
1545 ; CHECK-LABEL: strb8_m128:
1546 ; CHECK:       @ %bb.0: @ %entry
1547 ; CHECK-NEXT:    subs r0, #128
1548 ; CHECK-NEXT:    vldrb.u8 q0, [r1]
1549 ; CHECK-NEXT:    vstrb.8 q0, [r0]
1550 ; CHECK-NEXT:    bx lr
1551 entry:
1552   %z = getelementptr inbounds i8, ptr %y, i32 -128
1553   %0 = load <16 x i8>, ptr %x, align 1
1554   store <16 x i8> %0, ptr %z, align 1
1555   ret ptr %z
1559 define ptr @strf32_4(ptr %y, ptr %x) {
1560 ; CHECK-LE-LABEL: strf32_4:
1561 ; CHECK-LE:       @ %bb.0: @ %entry
1562 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
1563 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #4]!
1564 ; CHECK-LE-NEXT:    bx lr
1566 ; CHECK-BE-LABEL: strf32_4:
1567 ; CHECK-BE:       @ %bb.0: @ %entry
1568 ; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
1569 ; CHECK-BE-NEXT:    vstrw.32 q0, [r0, #4]!
1570 ; CHECK-BE-NEXT:    bx lr
1571 entry:
1572   %z = getelementptr inbounds i8, ptr %y, i32 4
1573   %0 = load <4 x float>, ptr %x, align 4
1574   store <4 x float> %0, ptr %z, align 4
1575   ret ptr %z
1578 define ptr @strf16_4(ptr %y, ptr %x) {
1579 ; CHECK-LE-LABEL: strf16_4:
1580 ; CHECK-LE:       @ %bb.0: @ %entry
1581 ; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1582 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #4]!
1583 ; CHECK-LE-NEXT:    bx lr
1585 ; CHECK-BE-LABEL: strf16_4:
1586 ; CHECK-BE:       @ %bb.0: @ %entry
1587 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1588 ; CHECK-BE-NEXT:    vstrh.16 q0, [r0, #4]!
1589 ; CHECK-BE-NEXT:    bx lr
1590 entry:
1591   %z = getelementptr inbounds i8, ptr %y, i32 4
1592   %0 = load <8 x half>, ptr %x, align 2
1593   store <8 x half> %0, ptr %z, align 2
1594   ret ptr %z
1597 define ptr @strwi32_align1(ptr %y, ptr %x) {
1598 ; CHECK-LE-LABEL: strwi32_align1:
1599 ; CHECK-LE:       @ %bb.0: @ %entry
1600 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
1601 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #3]!
1602 ; CHECK-LE-NEXT:    bx lr
1604 ; CHECK-BE-LABEL: strwi32_align1:
1605 ; CHECK-BE:       @ %bb.0: @ %entry
1606 ; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
1607 ; CHECK-BE-NEXT:    vrev32.8 q0, q0
1608 ; CHECK-BE-NEXT:    vstrb.8 q0, [r0, #3]
1609 ; CHECK-BE-NEXT:    adds r0, #3
1610 ; CHECK-BE-NEXT:    bx lr
1611 entry:
1612   %z = getelementptr inbounds i8, ptr %y, i32 3
1613   %0 = load <4 x i32>, ptr %x, align 4
1614   store <4 x i32> %0, ptr %z, align 1
1615   ret ptr %z
1618 define ptr @strhi16_align1(ptr %y, ptr %x) {
1619 ; CHECK-LE-LABEL: strhi16_align1:
1620 ; CHECK-LE:       @ %bb.0: @ %entry
1621 ; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1622 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #3]!
1623 ; CHECK-LE-NEXT:    bx lr
1625 ; CHECK-BE-LABEL: strhi16_align1:
1626 ; CHECK-BE:       @ %bb.0: @ %entry
1627 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1628 ; CHECK-BE-NEXT:    vrev16.8 q0, q0
1629 ; CHECK-BE-NEXT:    vstrb.8 q0, [r0, #3]
1630 ; CHECK-BE-NEXT:    adds r0, #3
1631 ; CHECK-BE-NEXT:    bx lr
1632 entry:
1633   %z = getelementptr inbounds i8, ptr %y, i32 3
1634   %0 = load <8 x i16>, ptr %x, align 2
1635   store <8 x i16> %0, ptr %z, align 1
1636   ret ptr %z
1639 define ptr @strhi32_align1(ptr %y, ptr %x) {
1640 ; CHECK-LABEL: strhi32_align1:
1641 ; CHECK:       @ %bb.0: @ %entry
1642 ; CHECK-NEXT:    .pad #8
1643 ; CHECK-NEXT:    sub sp, #8
1644 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
1645 ; CHECK-NEXT:    mov r1, sp
1646 ; CHECK-NEXT:    vstrh.32 q0, [r1]
1647 ; CHECK-NEXT:    ldrd r1, r2, [sp]
1648 ; CHECK-NEXT:    str r1, [r0, #3]!
1649 ; CHECK-NEXT:    str r2, [r0, #4]
1650 ; CHECK-NEXT:    add sp, #8
1651 ; CHECK-NEXT:    bx lr
1652 entry:
1653   %z = getelementptr inbounds i8, ptr %y, i32 3
1654   %0 = load <4 x i32>, ptr %x, align 4
1655   %1 = trunc <4 x i32> %0 to <4 x i16>
1656   store <4 x i16> %1, ptr %z, align 1
1657   ret ptr %z
1660 define ptr @strf32_align1(ptr %y, ptr %x) {
1661 ; CHECK-LE-LABEL: strf32_align1:
1662 ; CHECK-LE:       @ %bb.0: @ %entry
1663 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
1664 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #3]!
1665 ; CHECK-LE-NEXT:    bx lr
1667 ; CHECK-BE-LABEL: strf32_align1:
1668 ; CHECK-BE:       @ %bb.0: @ %entry
1669 ; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
1670 ; CHECK-BE-NEXT:    vrev32.8 q0, q0
1671 ; CHECK-BE-NEXT:    vstrb.8 q0, [r0, #3]
1672 ; CHECK-BE-NEXT:    adds r0, #3
1673 ; CHECK-BE-NEXT:    bx lr
1674 entry:
1675   %z = getelementptr inbounds i8, ptr %y, i32 3
1676   %0 = load <4 x float>, ptr %x, align 4
1677   store <4 x float> %0, ptr %z, align 1
1678   ret ptr %z
1681 define ptr @strf16_align1(ptr %y, ptr %x) {
1682 ; CHECK-LE-LABEL: strf16_align1:
1683 ; CHECK-LE:       @ %bb.0: @ %entry
1684 ; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1685 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #3]!
1686 ; CHECK-LE-NEXT:    bx lr
1688 ; CHECK-BE-LABEL: strf16_align1:
1689 ; CHECK-BE:       @ %bb.0: @ %entry
1690 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1691 ; CHECK-BE-NEXT:    vrev16.8 q0, q0
1692 ; CHECK-BE-NEXT:    vstrb.8 q0, [r0, #3]
1693 ; CHECK-BE-NEXT:    adds r0, #3
1694 ; CHECK-BE-NEXT:    bx lr
1695 entry:
1696   %z = getelementptr inbounds i8, ptr %y, i32 3
1697   %0 = load <8 x half>, ptr %x, align 2
1698   store <8 x half> %0, ptr %z, align 1
1699   ret ptr %z
1702 define ptr @strf16_align8(ptr %y, ptr %x) {
1703 ; CHECK-LE-LABEL: strf16_align8:
1704 ; CHECK-LE:       @ %bb.0: @ %entry
1705 ; CHECK-LE-NEXT:    vldrh.u16 q0, [r1]
1706 ; CHECK-LE-NEXT:    vstrb.8 q0, [r0, #16]!
1707 ; CHECK-LE-NEXT:    bx lr
1709 ; CHECK-BE-LABEL: strf16_align8:
1710 ; CHECK-BE:       @ %bb.0: @ %entry
1711 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1712 ; CHECK-BE-NEXT:    vstrh.16 q0, [r0, #16]!
1713 ; CHECK-BE-NEXT:    bx lr
1714 entry:
1715   %z = getelementptr inbounds i8, ptr %y, i32 16
1716   %0 = load <8 x i16>, ptr %x, align 2
1717   store <8 x i16> %0, ptr %z, align 8
1718   ret ptr %z