[ARM] Tighten up VLDRH.32 with low alignments
[llvm-complete.git] / test / CodeGen / Thumb2 / mve-ldst-preinc.ll
blob09662d2819ec6383a36d02242363a8cb3156486e
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=thumbv8.1m.main-arm-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s
4 define i8* @ldrwu32_4(i8* %x, i8* %y) {
5 ; CHECK-LABEL: ldrwu32_4:
6 ; CHECK:       @ %bb.0: @ %entry
7 ; CHECK-NEXT:    vldrw.u32 q0, [r0, #4]
8 ; CHECK-NEXT:    adds r0, #4
9 ; CHECK-NEXT:    vstrw.32 q0, [r1]
10 ; CHECK-NEXT:    bx lr
11 entry:
12   %z = getelementptr inbounds i8, i8* %x, i32 4
13   %0 = bitcast i8* %z to <4 x i32>*
14   %1 = load <4 x i32>, <4 x i32>* %0, align 4
15   %2 = bitcast i8* %y to <4 x i32>*
16   store <4 x i32> %1, <4 x i32>* %2, align 4
17   ret i8* %z
20 define i8* @ldrwu32_3(i8* %x, i8* %y) {
21 ; CHECK-LABEL: ldrwu32_3:
22 ; CHECK:       @ %bb.0: @ %entry
23 ; CHECK-NEXT:    adds r0, #3
24 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
25 ; CHECK-NEXT:    vstrw.32 q0, [r1]
26 ; CHECK-NEXT:    bx lr
27 entry:
28   %z = getelementptr inbounds i8, i8* %x, i32 3
29   %0 = bitcast i8* %z to <4 x i32>*
30   %1 = load <4 x i32>, <4 x i32>* %0, align 4
31   %2 = bitcast i8* %y to <4 x i32>*
32   store <4 x i32> %1, <4 x i32>* %2, align 4
33   ret i8* %z
36 define i8* @ldrwu32_m4(i8* %x, i8* %y) {
37 ; CHECK-LABEL: ldrwu32_m4:
38 ; CHECK:       @ %bb.0: @ %entry
39 ; CHECK-NEXT:    vldrw.u32 q0, [r0, #-4]
40 ; CHECK-NEXT:    subs r0, #4
41 ; CHECK-NEXT:    vstrw.32 q0, [r1]
42 ; CHECK-NEXT:    bx lr
43 entry:
44   %z = getelementptr inbounds i8, i8* %x, i32 -4
45   %0 = bitcast i8* %z to <4 x i32>*
46   %1 = load <4 x i32>, <4 x i32>* %0, align 4
47   %2 = bitcast i8* %y to <4 x i32>*
48   store <4 x i32> %1, <4 x i32>* %2, align 4
49   ret i8* %z
52 define i8* @ldrwu32_508(i8* %x, i8* %y) {
53 ; CHECK-LABEL: ldrwu32_508:
54 ; CHECK:       @ %bb.0: @ %entry
55 ; CHECK-NEXT:    add.w r0, r0, #508
56 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
57 ; CHECK-NEXT:    vstrw.32 q0, [r1]
58 ; CHECK-NEXT:    bx lr
59 entry:
60   %z = getelementptr inbounds i8, i8* %x, i32 508
61   %0 = bitcast i8* %z to <4 x i32>*
62   %1 = load <4 x i32>, <4 x i32>* %0, align 4
63   %2 = bitcast i8* %y to <4 x i32>*
64   store <4 x i32> %1, <4 x i32>* %2, align 4
65   ret i8* %z
68 define i8* @ldrwu32_512(i8* %x, i8* %y) {
69 ; CHECK-LABEL: ldrwu32_512:
70 ; CHECK:       @ %bb.0: @ %entry
71 ; CHECK-NEXT:    add.w r0, r0, #512
72 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
73 ; CHECK-NEXT:    vstrw.32 q0, [r1]
74 ; CHECK-NEXT:    bx lr
75 entry:
76   %z = getelementptr inbounds i8, i8* %x, i32 512
77   %0 = bitcast i8* %z to <4 x i32>*
78   %1 = load <4 x i32>, <4 x i32>* %0, align 4
79   %2 = bitcast i8* %y to <4 x i32>*
80   store <4 x i32> %1, <4 x i32>* %2, align 4
81   ret i8* %z
84 define i8* @ldrwu32_m508(i8* %x, i8* %y) {
85 ; CHECK-LABEL: ldrwu32_m508:
86 ; CHECK:       @ %bb.0: @ %entry
87 ; CHECK-NEXT:    sub.w r0, r0, #508
88 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
89 ; CHECK-NEXT:    vstrw.32 q0, [r1]
90 ; CHECK-NEXT:    bx lr
91 entry:
92   %z = getelementptr inbounds i8, i8* %x, i32 -508
93   %0 = bitcast i8* %z to <4 x i32>*
94   %1 = load <4 x i32>, <4 x i32>* %0, align 4
95   %2 = bitcast i8* %y to <4 x i32>*
96   store <4 x i32> %1, <4 x i32>* %2, align 4
97   ret i8* %z
100 define i8* @ldrwu32_m512(i8* %x, i8* %y) {
101 ; CHECK-LABEL: ldrwu32_m512:
102 ; CHECK:       @ %bb.0: @ %entry
103 ; CHECK-NEXT:    sub.w r0, r0, #512
104 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
105 ; CHECK-NEXT:    vstrw.32 q0, [r1]
106 ; CHECK-NEXT:    bx lr
107 entry:
108   %z = getelementptr inbounds i8, i8* %x, i32 -512
109   %0 = bitcast i8* %z to <4 x i32>*
110   %1 = load <4 x i32>, <4 x i32>* %0, align 4
111   %2 = bitcast i8* %y to <4 x i32>*
112   store <4 x i32> %1, <4 x i32>* %2, align 4
113   ret i8* %z
117 define i8* @ldrhu32_4(i8* %x, i8* %y) {
118 ; CHECK-LABEL: ldrhu32_4:
119 ; CHECK:       @ %bb.0: @ %entry
120 ; CHECK-NEXT:    vldrh.u32 q0, [r0, #4]
121 ; CHECK-NEXT:    adds r0, #4
122 ; CHECK-NEXT:    vstrw.32 q0, [r1]
123 ; CHECK-NEXT:    bx lr
124 entry:
125   %z = getelementptr inbounds i8, i8* %x, i32 4
126   %0 = bitcast i8* %z to <4 x i16>*
127   %1 = load <4 x i16>, <4 x i16>* %0, align 2
128   %2 = zext <4 x i16> %1 to <4 x i32>
129   %3 = bitcast i8* %y to <4 x i32>*
130   store <4 x i32> %2, <4 x i32>* %3, align 4
131   ret i8* %z
134 define i8* @ldrhu32_3(i8* %x, i8* %y) {
135 ; CHECK-LABEL: ldrhu32_3:
136 ; CHECK:       @ %bb.0: @ %entry
137 ; CHECK-NEXT:    adds r0, #3
138 ; CHECK-NEXT:    vldrh.u32 q0, [r0]
139 ; CHECK-NEXT:    vstrw.32 q0, [r1]
140 ; CHECK-NEXT:    bx lr
141 entry:
142   %z = getelementptr inbounds i8, i8* %x, i32 3
143   %0 = bitcast i8* %z to <4 x i16>*
144   %1 = load <4 x i16>, <4 x i16>* %0, align 2
145   %2 = zext <4 x i16> %1 to <4 x i32>
146   %3 = bitcast i8* %y to <4 x i32>*
147   store <4 x i32> %2, <4 x i32>* %3, align 4
148   ret i8* %z
151 define i8* @ldrhu32_2(i8* %x, i8* %y) {
152 ; CHECK-LABEL: ldrhu32_2:
153 ; CHECK:       @ %bb.0: @ %entry
154 ; CHECK-NEXT:    vldrh.u32 q0, [r0, #2]
155 ; CHECK-NEXT:    adds r0, #2
156 ; CHECK-NEXT:    vstrw.32 q0, [r1]
157 ; CHECK-NEXT:    bx lr
158 entry:
159   %z = getelementptr inbounds i8, i8* %x, i32 2
160   %0 = bitcast i8* %z to <4 x i16>*
161   %1 = load <4 x i16>, <4 x i16>* %0, align 2
162   %2 = zext <4 x i16> %1 to <4 x i32>
163   %3 = bitcast i8* %y to <4 x i32>*
164   store <4 x i32> %2, <4 x i32>* %3, align 4
165   ret i8* %z
168 define i8* @ldrhu32_254(i8* %x, i8* %y) {
169 ; CHECK-LABEL: ldrhu32_254:
170 ; CHECK:       @ %bb.0: @ %entry
171 ; CHECK-NEXT:    adds r0, #254
172 ; CHECK-NEXT:    vldrh.u32 q0, [r0]
173 ; CHECK-NEXT:    vstrw.32 q0, [r1]
174 ; CHECK-NEXT:    bx lr
175 entry:
176   %z = getelementptr inbounds i8, i8* %x, i32 254
177   %0 = bitcast i8* %z to <4 x i16>*
178   %1 = load <4 x i16>, <4 x i16>* %0, align 2
179   %2 = zext <4 x i16> %1 to <4 x i32>
180   %3 = bitcast i8* %y to <4 x i32>*
181   store <4 x i32> %2, <4 x i32>* %3, align 4
182   ret i8* %z
185 define i8* @ldrhu32_256(i8* %x, i8* %y) {
186 ; CHECK-LABEL: ldrhu32_256:
187 ; CHECK:       @ %bb.0: @ %entry
188 ; CHECK-NEXT:    add.w r0, r0, #256
189 ; CHECK-NEXT:    vldrh.u32 q0, [r0]
190 ; CHECK-NEXT:    vstrw.32 q0, [r1]
191 ; CHECK-NEXT:    bx lr
192 entry:
193   %z = getelementptr inbounds i8, i8* %x, i32 256
194   %0 = bitcast i8* %z to <4 x i16>*
195   %1 = load <4 x i16>, <4 x i16>* %0, align 2
196   %2 = zext <4 x i16> %1 to <4 x i32>
197   %3 = bitcast i8* %y to <4 x i32>*
198   store <4 x i32> %2, <4 x i32>* %3, align 4
199   ret i8* %z
203 define i8* @ldrhs32_4(i8* %x, i8* %y) {
204 ; CHECK-LABEL: ldrhs32_4:
205 ; CHECK:       @ %bb.0: @ %entry
206 ; CHECK-NEXT:    vldrh.s32 q0, [r0, #4]
207 ; CHECK-NEXT:    adds r0, #4
208 ; CHECK-NEXT:    vstrw.32 q0, [r1]
209 ; CHECK-NEXT:    bx lr
210 entry:
211   %z = getelementptr inbounds i8, i8* %x, i32 4
212   %0 = bitcast i8* %z to <4 x i16>*
213   %1 = load <4 x i16>, <4 x i16>* %0, align 2
214   %2 = sext <4 x i16> %1 to <4 x i32>
215   %3 = bitcast i8* %y to <4 x i32>*
216   store <4 x i32> %2, <4 x i32>* %3, align 4
217   ret i8* %z
220 define i8* @ldrhs32_3(i8* %x, i8* %y) {
221 ; CHECK-LABEL: ldrhs32_3:
222 ; CHECK:       @ %bb.0: @ %entry
223 ; CHECK-NEXT:    adds r0, #3
224 ; CHECK-NEXT:    vldrh.s32 q0, [r0]
225 ; CHECK-NEXT:    vstrw.32 q0, [r1]
226 ; CHECK-NEXT:    bx lr
227 entry:
228   %z = getelementptr inbounds i8, i8* %x, i32 3
229   %0 = bitcast i8* %z to <4 x i16>*
230   %1 = load <4 x i16>, <4 x i16>* %0, align 2
231   %2 = sext <4 x i16> %1 to <4 x i32>
232   %3 = bitcast i8* %y to <4 x i32>*
233   store <4 x i32> %2, <4 x i32>* %3, align 4
234   ret i8* %z
237 define i8* @ldrhs32_2(i8* %x, i8* %y) {
238 ; CHECK-LABEL: ldrhs32_2:
239 ; CHECK:       @ %bb.0: @ %entry
240 ; CHECK-NEXT:    vldrh.s32 q0, [r0, #2]
241 ; CHECK-NEXT:    adds r0, #2
242 ; CHECK-NEXT:    vstrw.32 q0, [r1]
243 ; CHECK-NEXT:    bx lr
244 entry:
245   %z = getelementptr inbounds i8, i8* %x, i32 2
246   %0 = bitcast i8* %z to <4 x i16>*
247   %1 = load <4 x i16>, <4 x i16>* %0, align 2
248   %2 = sext <4 x i16> %1 to <4 x i32>
249   %3 = bitcast i8* %y to <4 x i32>*
250   store <4 x i32> %2, <4 x i32>* %3, align 4
251   ret i8* %z
254 define i8* @ldrhs32_254(i8* %x, i8* %y) {
255 ; CHECK-LABEL: ldrhs32_254:
256 ; CHECK:       @ %bb.0: @ %entry
257 ; CHECK-NEXT:    adds r0, #254
258 ; CHECK-NEXT:    vldrh.s32 q0, [r0]
259 ; CHECK-NEXT:    vstrw.32 q0, [r1]
260 ; CHECK-NEXT:    bx lr
261 entry:
262   %z = getelementptr inbounds i8, i8* %x, i32 254
263   %0 = bitcast i8* %z to <4 x i16>*
264   %1 = load <4 x i16>, <4 x i16>* %0, align 2
265   %2 = sext <4 x i16> %1 to <4 x i32>
266   %3 = bitcast i8* %y to <4 x i32>*
267   store <4 x i32> %2, <4 x i32>* %3, align 4
268   ret i8* %z
271 define i8* @ldrhs32_256(i8* %x, i8* %y) {
272 ; CHECK-LABEL: ldrhs32_256:
273 ; CHECK:       @ %bb.0: @ %entry
274 ; CHECK-NEXT:    add.w r0, r0, #256
275 ; CHECK-NEXT:    vldrh.s32 q0, [r0]
276 ; CHECK-NEXT:    vstrw.32 q0, [r1]
277 ; CHECK-NEXT:    bx lr
278 entry:
279   %z = getelementptr inbounds i8, i8* %x, i32 256
280   %0 = bitcast i8* %z to <4 x i16>*
281   %1 = load <4 x i16>, <4 x i16>* %0, align 2
282   %2 = sext <4 x i16> %1 to <4 x i32>
283   %3 = bitcast i8* %y to <4 x i32>*
284   store <4 x i32> %2, <4 x i32>* %3, align 4
285   ret i8* %z
289 define i8* @ldrhu16_4(i8* %x, i8* %y) {
290 ; CHECK-LABEL: ldrhu16_4:
291 ; CHECK:       @ %bb.0: @ %entry
292 ; CHECK-NEXT:    vldrh.u16 q0, [r0, #4]
293 ; CHECK-NEXT:    adds r0, #4
294 ; CHECK-NEXT:    vstrh.16 q0, [r1]
295 ; CHECK-NEXT:    bx lr
296 entry:
297   %z = getelementptr inbounds i8, i8* %x, i32 4
298   %0 = bitcast i8* %z to <8 x i16>*
299   %1 = load <8 x i16>, <8 x i16>* %0, align 2
300   %2 = bitcast i8* %y to <8 x i16>*
301   store <8 x i16> %1, <8 x i16>* %2, align 2
302   ret i8* %z
305 define i8* @ldrhu16_3(i8* %x, i8* %y) {
306 ; CHECK-LABEL: ldrhu16_3:
307 ; CHECK:       @ %bb.0: @ %entry
308 ; CHECK-NEXT:    adds r0, #3
309 ; CHECK-NEXT:    vldrh.u16 q0, [r0]
310 ; CHECK-NEXT:    vstrh.16 q0, [r1]
311 ; CHECK-NEXT:    bx lr
312 entry:
313   %z = getelementptr inbounds i8, i8* %x, i32 3
314   %0 = bitcast i8* %z to <8 x i16>*
315   %1 = load <8 x i16>, <8 x i16>* %0, align 2
316   %2 = bitcast i8* %y to <8 x i16>*
317   store <8 x i16> %1, <8 x i16>* %2, align 2
318   ret i8* %z
321 define i8* @ldrhu16_2(i8* %x, i8* %y) {
322 ; CHECK-LABEL: ldrhu16_2:
323 ; CHECK:       @ %bb.0: @ %entry
324 ; CHECK-NEXT:    vldrh.u16 q0, [r0, #2]
325 ; CHECK-NEXT:    adds r0, #2
326 ; CHECK-NEXT:    vstrh.16 q0, [r1]
327 ; CHECK-NEXT:    bx lr
328 entry:
329   %z = getelementptr inbounds i8, i8* %x, i32 2
330   %0 = bitcast i8* %z to <8 x i16>*
331   %1 = load <8 x i16>, <8 x i16>* %0, align 2
332   %2 = bitcast i8* %y to <8 x i16>*
333   store <8 x i16> %1, <8 x i16>* %2, align 2
334   ret i8* %z
337 define i8* @ldrhu16_254(i8* %x, i8* %y) {
338 ; CHECK-LABEL: ldrhu16_254:
339 ; CHECK:       @ %bb.0: @ %entry
340 ; CHECK-NEXT:    adds r0, #254
341 ; CHECK-NEXT:    vldrh.u16 q0, [r0]
342 ; CHECK-NEXT:    vstrh.16 q0, [r1]
343 ; CHECK-NEXT:    bx lr
344 entry:
345   %z = getelementptr inbounds i8, i8* %x, i32 254
346   %0 = bitcast i8* %z to <8 x i16>*
347   %1 = load <8 x i16>, <8 x i16>* %0, align 2
348   %2 = bitcast i8* %y to <8 x i16>*
349   store <8 x i16> %1, <8 x i16>* %2, align 2
350   ret i8* %z
353 define i8* @ldrhu16_256(i8* %x, i8* %y) {
354 ; CHECK-LABEL: ldrhu16_256:
355 ; CHECK:       @ %bb.0: @ %entry
356 ; CHECK-NEXT:    add.w r0, r0, #256
357 ; CHECK-NEXT:    vldrh.u16 q0, [r0]
358 ; CHECK-NEXT:    vstrh.16 q0, [r1]
359 ; CHECK-NEXT:    bx lr
360 entry:
361   %z = getelementptr inbounds i8, i8* %x, i32 256
362   %0 = bitcast i8* %z to <8 x i16>*
363   %1 = load <8 x i16>, <8 x i16>* %0, align 2
364   %2 = bitcast i8* %y to <8 x i16>*
365   store <8 x i16> %1, <8 x i16>* %2, align 2
366   ret i8* %z
370 define i8* @ldrbu32_4(i8* %x, i8* %y) {
371 ; CHECK-LABEL: ldrbu32_4:
372 ; CHECK:       @ %bb.0: @ %entry
373 ; CHECK-NEXT:    vldrb.u32 q0, [r0, #4]
374 ; CHECK-NEXT:    adds r0, #4
375 ; CHECK-NEXT:    vstrw.32 q0, [r1]
376 ; CHECK-NEXT:    bx lr
377 entry:
378   %z = getelementptr inbounds i8, i8* %x, i32 4
379   %0 = bitcast i8* %z to <4 x i8>*
380   %1 = load <4 x i8>, <4 x i8>* %0, align 1
381   %2 = zext <4 x i8> %1 to <4 x i32>
382   %3 = bitcast i8* %y to <4 x i32>*
383   store <4 x i32> %2, <4 x i32>* %3, align 4
384   ret i8* %z
387 define i8* @ldrbu32_3(i8* %x, i8* %y) {
388 ; CHECK-LABEL: ldrbu32_3:
389 ; CHECK:       @ %bb.0: @ %entry
390 ; CHECK-NEXT:    vldrb.u32 q0, [r0, #3]
391 ; CHECK-NEXT:    adds r0, #3
392 ; CHECK-NEXT:    vstrw.32 q0, [r1]
393 ; CHECK-NEXT:    bx lr
394 entry:
395   %z = getelementptr inbounds i8, i8* %x, i32 3
396   %0 = bitcast i8* %z to <4 x i8>*
397   %1 = load <4 x i8>, <4 x i8>* %0, align 1
398   %2 = zext <4 x i8> %1 to <4 x i32>
399   %3 = bitcast i8* %y to <4 x i32>*
400   store <4 x i32> %2, <4 x i32>* %3, align 4
401   ret i8* %z
404 define i8* @ldrbu32_127(i8* %x, i8* %y) {
405 ; CHECK-LABEL: ldrbu32_127:
406 ; CHECK:       @ %bb.0: @ %entry
407 ; CHECK-NEXT:    adds r0, #127
408 ; CHECK-NEXT:    vldrb.u32 q0, [r0]
409 ; CHECK-NEXT:    vstrw.32 q0, [r1]
410 ; CHECK-NEXT:    bx lr
411 entry:
412   %z = getelementptr inbounds i8, i8* %x, i32 127
413   %0 = bitcast i8* %z to <4 x i8>*
414   %1 = load <4 x i8>, <4 x i8>* %0, align 1
415   %2 = zext <4 x i8> %1 to <4 x i32>
416   %3 = bitcast i8* %y to <4 x i32>*
417   store <4 x i32> %2, <4 x i32>* %3, align 4
418   ret i8* %z
421 define i8* @ldrbu32_128(i8* %x, i8* %y) {
422 ; CHECK-LABEL: ldrbu32_128:
423 ; CHECK:       @ %bb.0: @ %entry
424 ; CHECK-NEXT:    adds r0, #128
425 ; CHECK-NEXT:    vldrb.u32 q0, [r0]
426 ; CHECK-NEXT:    vstrw.32 q0, [r1]
427 ; CHECK-NEXT:    bx lr
428 entry:
429   %z = getelementptr inbounds i8, i8* %x, i32 128
430   %0 = bitcast i8* %z to <4 x i8>*
431   %1 = load <4 x i8>, <4 x i8>* %0, align 1
432   %2 = zext <4 x i8> %1 to <4 x i32>
433   %3 = bitcast i8* %y to <4 x i32>*
434   store <4 x i32> %2, <4 x i32>* %3, align 4
435   ret i8* %z
439 define i8* @ldrbs32_4(i8* %x, i8* %y) {
440 ; CHECK-LABEL: ldrbs32_4:
441 ; CHECK:       @ %bb.0: @ %entry
442 ; CHECK-NEXT:    vldrb.s32 q0, [r0, #4]
443 ; CHECK-NEXT:    adds r0, #4
444 ; CHECK-NEXT:    vstrw.32 q0, [r1]
445 ; CHECK-NEXT:    bx lr
446 entry:
447   %z = getelementptr inbounds i8, i8* %x, i32 4
448   %0 = bitcast i8* %z to <4 x i8>*
449   %1 = load <4 x i8>, <4 x i8>* %0, align 1
450   %2 = sext <4 x i8> %1 to <4 x i32>
451   %3 = bitcast i8* %y to <4 x i32>*
452   store <4 x i32> %2, <4 x i32>* %3, align 4
453   ret i8* %z
456 define i8* @ldrbs32_3(i8* %x, i8* %y) {
457 ; CHECK-LABEL: ldrbs32_3:
458 ; CHECK:       @ %bb.0: @ %entry
459 ; CHECK-NEXT:    vldrb.s32 q0, [r0, #3]
460 ; CHECK-NEXT:    adds r0, #3
461 ; CHECK-NEXT:    vstrw.32 q0, [r1]
462 ; CHECK-NEXT:    bx lr
463 entry:
464   %z = getelementptr inbounds i8, i8* %x, i32 3
465   %0 = bitcast i8* %z to <4 x i8>*
466   %1 = load <4 x i8>, <4 x i8>* %0, align 1
467   %2 = sext <4 x i8> %1 to <4 x i32>
468   %3 = bitcast i8* %y to <4 x i32>*
469   store <4 x i32> %2, <4 x i32>* %3, align 4
470   ret i8* %z
473 define i8* @ldrbs32_127(i8* %x, i8* %y) {
474 ; CHECK-LABEL: ldrbs32_127:
475 ; CHECK:       @ %bb.0: @ %entry
476 ; CHECK-NEXT:    adds r0, #127
477 ; CHECK-NEXT:    vldrb.s32 q0, [r0]
478 ; CHECK-NEXT:    vstrw.32 q0, [r1]
479 ; CHECK-NEXT:    bx lr
480 entry:
481   %z = getelementptr inbounds i8, i8* %x, i32 127
482   %0 = bitcast i8* %z to <4 x i8>*
483   %1 = load <4 x i8>, <4 x i8>* %0, align 1
484   %2 = sext <4 x i8> %1 to <4 x i32>
485   %3 = bitcast i8* %y to <4 x i32>*
486   store <4 x i32> %2, <4 x i32>* %3, align 4
487   ret i8* %z
490 define i8* @ldrbs32_128(i8* %x, i8* %y) {
491 ; CHECK-LABEL: ldrbs32_128:
492 ; CHECK:       @ %bb.0: @ %entry
493 ; CHECK-NEXT:    adds r0, #128
494 ; CHECK-NEXT:    vldrb.s32 q0, [r0]
495 ; CHECK-NEXT:    vstrw.32 q0, [r1]
496 ; CHECK-NEXT:    bx lr
497 entry:
498   %z = getelementptr inbounds i8, i8* %x, i32 128
499   %0 = bitcast i8* %z to <4 x i8>*
500   %1 = load <4 x i8>, <4 x i8>* %0, align 1
501   %2 = sext <4 x i8> %1 to <4 x i32>
502   %3 = bitcast i8* %y to <4 x i32>*
503   store <4 x i32> %2, <4 x i32>* %3, align 4
504   ret i8* %z
508 define i8* @ldrbu16_4(i8* %x, i8* %y) {
509 ; CHECK-LABEL: ldrbu16_4:
510 ; CHECK:       @ %bb.0: @ %entry
511 ; CHECK-NEXT:    vldrb.u16 q0, [r0, #4]
512 ; CHECK-NEXT:    adds r0, #4
513 ; CHECK-NEXT:    vstrh.16 q0, [r1]
514 ; CHECK-NEXT:    bx lr
515 entry:
516   %z = getelementptr inbounds i8, i8* %x, i32 4
517   %0 = bitcast i8* %z to <8 x i8>*
518   %1 = load <8 x i8>, <8 x i8>* %0, align 1
519   %2 = zext <8 x i8> %1 to <8 x i16>
520   %3 = bitcast i8* %y to <8 x i16>*
521   store <8 x i16> %2, <8 x i16>* %3, align 2
522   ret i8* %z
525 define i8* @ldrbu16_3(i8* %x, i8* %y) {
526 ; CHECK-LABEL: ldrbu16_3:
527 ; CHECK:       @ %bb.0: @ %entry
528 ; CHECK-NEXT:    vldrb.u16 q0, [r0, #3]
529 ; CHECK-NEXT:    adds r0, #3
530 ; CHECK-NEXT:    vstrh.16 q0, [r1]
531 ; CHECK-NEXT:    bx lr
532 entry:
533   %z = getelementptr inbounds i8, i8* %x, i32 3
534   %0 = bitcast i8* %z to <8 x i8>*
535   %1 = load <8 x i8>, <8 x i8>* %0, align 1
536   %2 = zext <8 x i8> %1 to <8 x i16>
537   %3 = bitcast i8* %y to <8 x i16>*
538   store <8 x i16> %2, <8 x i16>* %3, align 2
539   ret i8* %z
542 define i8* @ldrbu16_127(i8* %x, i8* %y) {
543 ; CHECK-LABEL: ldrbu16_127:
544 ; CHECK:       @ %bb.0: @ %entry
545 ; CHECK-NEXT:    adds r0, #127
546 ; CHECK-NEXT:    vldrb.u16 q0, [r0]
547 ; CHECK-NEXT:    vstrh.16 q0, [r1]
548 ; CHECK-NEXT:    bx lr
549 entry:
550   %z = getelementptr inbounds i8, i8* %x, i32 127
551   %0 = bitcast i8* %z to <8 x i8>*
552   %1 = load <8 x i8>, <8 x i8>* %0, align 1
553   %2 = zext <8 x i8> %1 to <8 x i16>
554   %3 = bitcast i8* %y to <8 x i16>*
555   store <8 x i16> %2, <8 x i16>* %3, align 2
556   ret i8* %z
559 define i8* @ldrbu16_128(i8* %x, i8* %y) {
560 ; CHECK-LABEL: ldrbu16_128:
561 ; CHECK:       @ %bb.0: @ %entry
562 ; CHECK-NEXT:    adds r0, #128
563 ; CHECK-NEXT:    vldrb.u16 q0, [r0]
564 ; CHECK-NEXT:    vstrh.16 q0, [r1]
565 ; CHECK-NEXT:    bx lr
566 entry:
567   %z = getelementptr inbounds i8, i8* %x, i32 128
568   %0 = bitcast i8* %z to <8 x i8>*
569   %1 = load <8 x i8>, <8 x i8>* %0, align 1
570   %2 = zext <8 x i8> %1 to <8 x i16>
571   %3 = bitcast i8* %y to <8 x i16>*
572   store <8 x i16> %2, <8 x i16>* %3, align 2
573   ret i8* %z
577 define i8* @ldrbs16_4(i8* %x, i8* %y) {
578 ; CHECK-LABEL: ldrbs16_4:
579 ; CHECK:       @ %bb.0: @ %entry
580 ; CHECK-NEXT:    vldrb.s16 q0, [r0, #4]
581 ; CHECK-NEXT:    adds r0, #4
582 ; CHECK-NEXT:    vstrh.16 q0, [r1]
583 ; CHECK-NEXT:    bx lr
584 entry:
585   %z = getelementptr inbounds i8, i8* %x, i32 4
586   %0 = bitcast i8* %z to <8 x i8>*
587   %1 = load <8 x i8>, <8 x i8>* %0, align 1
588   %2 = sext <8 x i8> %1 to <8 x i16>
589   %3 = bitcast i8* %y to <8 x i16>*
590   store <8 x i16> %2, <8 x i16>* %3, align 2
591   ret i8* %z
594 define i8* @ldrbs16_3(i8* %x, i8* %y) {
595 ; CHECK-LABEL: ldrbs16_3:
596 ; CHECK:       @ %bb.0: @ %entry
597 ; CHECK-NEXT:    vldrb.s16 q0, [r0, #3]
598 ; CHECK-NEXT:    adds r0, #3
599 ; CHECK-NEXT:    vstrh.16 q0, [r1]
600 ; CHECK-NEXT:    bx lr
601 entry:
602   %z = getelementptr inbounds i8, i8* %x, i32 3
603   %0 = bitcast i8* %z to <8 x i8>*
604   %1 = load <8 x i8>, <8 x i8>* %0, align 1
605   %2 = sext <8 x i8> %1 to <8 x i16>
606   %3 = bitcast i8* %y to <8 x i16>*
607   store <8 x i16> %2, <8 x i16>* %3, align 2
608   ret i8* %z
611 define i8* @ldrbs16_127(i8* %x, i8* %y) {
612 ; CHECK-LABEL: ldrbs16_127:
613 ; CHECK:       @ %bb.0: @ %entry
614 ; CHECK-NEXT:    adds r0, #127
615 ; CHECK-NEXT:    vldrb.s16 q0, [r0]
616 ; CHECK-NEXT:    vstrh.16 q0, [r1]
617 ; CHECK-NEXT:    bx lr
618 entry:
619   %z = getelementptr inbounds i8, i8* %x, i32 127
620   %0 = bitcast i8* %z to <8 x i8>*
621   %1 = load <8 x i8>, <8 x i8>* %0, align 1
622   %2 = sext <8 x i8> %1 to <8 x i16>
623   %3 = bitcast i8* %y to <8 x i16>*
624   store <8 x i16> %2, <8 x i16>* %3, align 2
625   ret i8* %z
628 define i8* @ldrbs16_128(i8* %x, i8* %y) {
629 ; CHECK-LABEL: ldrbs16_128:
630 ; CHECK:       @ %bb.0: @ %entry
631 ; CHECK-NEXT:    adds r0, #128
632 ; CHECK-NEXT:    vldrb.s16 q0, [r0]
633 ; CHECK-NEXT:    vstrh.16 q0, [r1]
634 ; CHECK-NEXT:    bx lr
635 entry:
636   %z = getelementptr inbounds i8, i8* %x, i32 128
637   %0 = bitcast i8* %z to <8 x i8>*
638   %1 = load <8 x i8>, <8 x i8>* %0, align 1
639   %2 = sext <8 x i8> %1 to <8 x i16>
640   %3 = bitcast i8* %y to <8 x i16>*
641   store <8 x i16> %2, <8 x i16>* %3, align 2
642   ret i8* %z
646 define i8* @ldrbu8_4(i8* %x, i8* %y) {
647 ; CHECK-LABEL: ldrbu8_4:
648 ; CHECK:       @ %bb.0: @ %entry
649 ; CHECK-NEXT:    vldrb.u8 q0, [r0, #4]
650 ; CHECK-NEXT:    adds r0, #4
651 ; CHECK-NEXT:    vstrb.8 q0, [r1]
652 ; CHECK-NEXT:    bx lr
653 entry:
654   %z = getelementptr inbounds i8, i8* %x, i32 4
655   %0 = bitcast i8* %z to <16 x i8>*
656   %1 = load <16 x i8>, <16 x i8>* %0, align 1
657   %2 = bitcast i8* %y to <16 x i8>*
658   store <16 x i8> %1, <16 x i8>* %2, align 1
659   ret i8* %z
662 define i8* @ldrbu8_3(i8* %x, i8* %y) {
663 ; CHECK-LABEL: ldrbu8_3:
664 ; CHECK:       @ %bb.0: @ %entry
665 ; CHECK-NEXT:    vldrb.u8 q0, [r0, #3]
666 ; CHECK-NEXT:    adds r0, #3
667 ; CHECK-NEXT:    vstrb.8 q0, [r1]
668 ; CHECK-NEXT:    bx lr
669 entry:
670   %z = getelementptr inbounds i8, i8* %x, i32 3
671   %0 = bitcast i8* %z to <16 x i8>*
672   %1 = load <16 x i8>, <16 x i8>* %0, align 1
673   %2 = bitcast i8* %y to <16 x i8>*
674   store <16 x i8> %1, <16 x i8>* %2, align 1
675   ret i8* %z
678 define i8* @ldrbu8_127(i8* %x, i8* %y) {
679 ; CHECK-LABEL: ldrbu8_127:
680 ; CHECK:       @ %bb.0: @ %entry
681 ; CHECK-NEXT:    adds r0, #127
682 ; CHECK-NEXT:    vldrb.u8 q0, [r0]
683 ; CHECK-NEXT:    vstrb.8 q0, [r1]
684 ; CHECK-NEXT:    bx lr
685 entry:
686   %z = getelementptr inbounds i8, i8* %x, i32 127
687   %0 = bitcast i8* %z to <16 x i8>*
688   %1 = load <16 x i8>, <16 x i8>* %0, align 1
689   %2 = bitcast i8* %y to <16 x i8>*
690   store <16 x i8> %1, <16 x i8>* %2, align 1
691   ret i8* %z
694 define i8* @ldrbu8_128(i8* %x, i8* %y) {
695 ; CHECK-LABEL: ldrbu8_128:
696 ; CHECK:       @ %bb.0: @ %entry
697 ; CHECK-NEXT:    adds r0, #128
698 ; CHECK-NEXT:    vldrb.u8 q0, [r0]
699 ; CHECK-NEXT:    vstrb.8 q0, [r1]
700 ; CHECK-NEXT:    bx lr
701 entry:
702   %z = getelementptr inbounds i8, i8* %x, i32 128
703   %0 = bitcast i8* %z to <16 x i8>*
704   %1 = load <16 x i8>, <16 x i8>* %0, align 1
705   %2 = bitcast i8* %y to <16 x i8>*
706   store <16 x i8> %1, <16 x i8>* %2, align 1
707   ret i8* %z
710 define i8* @ldrwf32_4(i8* %x, i8* %y) {
711 ; CHECK-LABEL: ldrwf32_4:
712 ; CHECK:       @ %bb.0: @ %entry
713 ; CHECK-NEXT:    vldrw.u32 q0, [r0, #4]
714 ; CHECK-NEXT:    adds r0, #4
715 ; CHECK-NEXT:    vstrw.32 q0, [r1]
716 ; CHECK-NEXT:    bx lr
717 entry:
718   %z = getelementptr inbounds i8, i8* %x, i32 4
719   %0 = bitcast i8* %z to <4 x float>*
720   %1 = load <4 x float>, <4 x float>* %0, align 4
721   %2 = bitcast i8* %y to <4 x float>*
722   store <4 x float> %1, <4 x float>* %2, align 4
723   ret i8* %z
726 define i8* @ldrwf16_4(i8* %x, i8* %y) {
727 ; CHECK-LABEL: ldrwf16_4:
728 ; CHECK:       @ %bb.0: @ %entry
729 ; CHECK-NEXT:    vldrh.u16 q0, [r0, #4]
730 ; CHECK-NEXT:    adds r0, #4
731 ; CHECK-NEXT:    vstrh.16 q0, [r1]
732 ; CHECK-NEXT:    bx lr
733 entry:
734   %z = getelementptr inbounds i8, i8* %x, i32 4
735   %0 = bitcast i8* %z to <8 x half>*
736   %1 = load <8 x half>, <8 x half>* %0, align 2
737   %2 = bitcast i8* %y to <8 x half>*
738   store <8 x half> %1, <8 x half>* %2, align 2
739   ret i8* %z
742 define i8* @ldrwi32_align1(i8* %x, i8* %y) {
743 ; CHECK-LABEL: ldrwi32_align1:
744 ; CHECK:       @ %bb.0: @ %entry
745 ; CHECK-NEXT:    vldrb.u8 q0, [r0, #3]
746 ; CHECK-NEXT:    adds r0, #3
747 ; CHECK-NEXT:    vstrw.32 q0, [r1]
748 ; CHECK-NEXT:    bx lr
749 entry:
750   %z = getelementptr inbounds i8, i8* %x, i32 3
751   %0 = bitcast i8* %z to <4 x i32>*
752   %1 = load <4 x i32>, <4 x i32>* %0, align 1
753   %2 = bitcast i8* %y to <4 x i32>*
754   store <4 x i32> %1, <4 x i32>* %2, align 4
755   ret i8* %z
758 define i8* @ldrhi16_align1(i8* %x, i8* %y) {
759 ; CHECK-LABEL: ldrhi16_align1:
760 ; CHECK:       @ %bb.0: @ %entry
761 ; CHECK-NEXT:    vldrb.u8 q0, [r0, #3]
762 ; CHECK-NEXT:    adds r0, #3
763 ; CHECK-NEXT:    vstrh.16 q0, [r1]
764 ; CHECK-NEXT:    bx lr
765 entry:
766   %z = getelementptr inbounds i8, i8* %x, i32 3
767   %0 = bitcast i8* %z to <8 x i16>*
768   %1 = load <8 x i16>, <8 x i16>* %0, align 1
769   %2 = bitcast i8* %y to <8 x i16>*
770   store <8 x i16> %1, <8 x i16>* %2, align 2
771   ret i8* %z
774 define i8* @ldrhi32_align1(i8* %x, i8* %y) {
775 ; CHECK-LABEL: ldrhi32_align1:
776 ; CHECK:       @ %bb.0: @ %entry
777 ; CHECK-NEXT:    .pad #8
778 ; CHECK-NEXT:    sub sp, #8
779 ; CHECK-NEXT:    ldr r2, [r0, #3]!
780 ; CHECK-NEXT:    str r2, [sp]
781 ; CHECK-NEXT:    ldr r2, [r0, #4]
782 ; CHECK-NEXT:    str r2, [sp, #4]
783 ; CHECK-NEXT:    mov r2, sp
784 ; CHECK-NEXT:    vldrh.s32 q0, [r2]
785 ; CHECK-NEXT:    vstrw.32 q0, [r1]
786 ; CHECK-NEXT:    add sp, #8
787 ; CHECK-NEXT:    bx lr
788 entry:
789   %z = getelementptr inbounds i8, i8* %x, i32 3
790   %0 = bitcast i8* %z to <4 x i16>*
791   %1 = load <4 x i16>, <4 x i16>* %0, align 1
792   %2 = bitcast i8* %y to <4 x i32>*
793   %3 = sext <4 x i16> %1 to <4 x i32>
794   store <4 x i32> %3, <4 x i32>* %2, align 4
795   ret i8* %z
798 define i8* @ldrf32_align1(i8* %x, i8* %y) {
799 ; CHECK-LABEL: ldrf32_align1:
800 ; CHECK:       @ %bb.0: @ %entry
801 ; CHECK-NEXT:    vldrb.u8 q0, [r0, #3]
802 ; CHECK-NEXT:    adds r0, #3
803 ; CHECK-NEXT:    vstrw.32 q0, [r1]
804 ; CHECK-NEXT:    bx lr
805 entry:
806   %z = getelementptr inbounds i8, i8* %x, i32 3
807   %0 = bitcast i8* %z to <4 x float>*
808   %1 = load <4 x float>, <4 x float>* %0, align 1
809   %2 = bitcast i8* %y to <4 x float>*
810   store <4 x float> %1, <4 x float>* %2, align 4
811   ret i8* %z
814 define i8* @ldrf16_align1(i8* %x, i8* %y) {
815 ; CHECK-LABEL: ldrf16_align1:
816 ; CHECK:       @ %bb.0: @ %entry
817 ; CHECK-NEXT:    vldrb.u8 q0, [r0, #3]
818 ; CHECK-NEXT:    adds r0, #3
819 ; CHECK-NEXT:    vstrh.16 q0, [r1]
820 ; CHECK-NEXT:    bx lr
821 entry:
822   %z = getelementptr inbounds i8, i8* %x, i32 3
823   %0 = bitcast i8* %z to <8 x half>*
824   %1 = load <8 x half>, <8 x half>* %0, align 1
825   %2 = bitcast i8* %y to <8 x half>*
826   store <8 x half> %1, <8 x half>* %2, align 2
827   ret i8* %z
834 define i8* @strw32_4(i8* %y, i8* %x) {
835 ; CHECK-LABEL: strw32_4:
836 ; CHECK:       @ %bb.0: @ %entry
837 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
838 ; CHECK-NEXT:    vstrw.32 q0, [r0, #4]
839 ; CHECK-NEXT:    adds r0, #4
840 ; CHECK-NEXT:    bx lr
841 entry:
842   %z = getelementptr inbounds i8, i8* %y, i32 4
843   %0 = bitcast i8* %x to <4 x i32>*
844   %1 = load <4 x i32>, <4 x i32>* %0, align 4
845   %2 = bitcast i8* %z to <4 x i32>*
846   store <4 x i32> %1, <4 x i32>* %2, align 4
847   ret i8* %z
850 define i8* @strw32_3(i8* %y, i8* %x) {
851 ; CHECK-LABEL: strw32_3:
852 ; CHECK:       @ %bb.0: @ %entry
853 ; CHECK-NEXT:    adds r0, #3
854 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
855 ; CHECK-NEXT:    vstrw.32 q0, [r0]
856 ; CHECK-NEXT:    bx lr
857 entry:
858   %z = getelementptr inbounds i8, i8* %y, i32 3
859   %0 = bitcast i8* %x to <4 x i32>*
860   %1 = load <4 x i32>, <4 x i32>* %0, align 4
861   %2 = bitcast i8* %z to <4 x i32>*
862   store <4 x i32> %1, <4 x i32>* %2, align 4
863   ret i8* %z
866 define i8* @strw32_m4(i8* %y, i8* %x) {
867 ; CHECK-LABEL: strw32_m4:
868 ; CHECK:       @ %bb.0: @ %entry
869 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
870 ; CHECK-NEXT:    vstrw.32 q0, [r0, #-4]
871 ; CHECK-NEXT:    subs r0, #4
872 ; CHECK-NEXT:    bx lr
873 entry:
874   %z = getelementptr inbounds i8, i8* %y, i32 -4
875   %0 = bitcast i8* %x to <4 x i32>*
876   %1 = load <4 x i32>, <4 x i32>* %0, align 4
877   %2 = bitcast i8* %z to <4 x i32>*
878   store <4 x i32> %1, <4 x i32>* %2, align 4
879   ret i8* %z
882 define i8* @strw32_508(i8* %y, i8* %x) {
883 ; CHECK-LABEL: strw32_508:
884 ; CHECK:       @ %bb.0: @ %entry
885 ; CHECK-NEXT:    add.w r0, r0, #508
886 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
887 ; CHECK-NEXT:    vstrw.32 q0, [r0]
888 ; CHECK-NEXT:    bx lr
889 entry:
890   %z = getelementptr inbounds i8, i8* %y, i32 508
891   %0 = bitcast i8* %x to <4 x i32>*
892   %1 = load <4 x i32>, <4 x i32>* %0, align 4
893   %2 = bitcast i8* %z to <4 x i32>*
894   store <4 x i32> %1, <4 x i32>* %2, align 4
895   ret i8* %z
898 define i8* @strw32_512(i8* %y, i8* %x) {
899 ; CHECK-LABEL: strw32_512:
900 ; CHECK:       @ %bb.0: @ %entry
901 ; CHECK-NEXT:    add.w r0, r0, #512
902 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
903 ; CHECK-NEXT:    vstrw.32 q0, [r0]
904 ; CHECK-NEXT:    bx lr
905 entry:
906   %z = getelementptr inbounds i8, i8* %y, i32 512
907   %0 = bitcast i8* %x to <4 x i32>*
908   %1 = load <4 x i32>, <4 x i32>* %0, align 4
909   %2 = bitcast i8* %z to <4 x i32>*
910   store <4 x i32> %1, <4 x i32>* %2, align 4
911   ret i8* %z
914 define i8* @strw32_m508(i8* %y, i8* %x) {
915 ; CHECK-LABEL: strw32_m508:
916 ; CHECK:       @ %bb.0: @ %entry
917 ; CHECK-NEXT:    sub.w r0, r0, #508
918 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
919 ; CHECK-NEXT:    vstrw.32 q0, [r0]
920 ; CHECK-NEXT:    bx lr
921 entry:
922   %z = getelementptr inbounds i8, i8* %y, i32 -508
923   %0 = bitcast i8* %x to <4 x i32>*
924   %1 = load <4 x i32>, <4 x i32>* %0, align 4
925   %2 = bitcast i8* %z to <4 x i32>*
926   store <4 x i32> %1, <4 x i32>* %2, align 4
927   ret i8* %z
930 define i8* @strw32_m512(i8* %y, i8* %x) {
931 ; CHECK-LABEL: strw32_m512:
932 ; CHECK:       @ %bb.0: @ %entry
933 ; CHECK-NEXT:    sub.w r0, r0, #512
934 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
935 ; CHECK-NEXT:    vstrw.32 q0, [r0]
936 ; CHECK-NEXT:    bx lr
937 entry:
938   %z = getelementptr inbounds i8, i8* %y, i32 -512
939   %0 = bitcast i8* %x to <4 x i32>*
940   %1 = load <4 x i32>, <4 x i32>* %0, align 4
941   %2 = bitcast i8* %z to <4 x i32>*
942   store <4 x i32> %1, <4 x i32>* %2, align 4
943   ret i8* %z
947 define i8* @strh32_4(i8* %y, i8* %x) {
948 ; CHECK-LABEL: strh32_4:
949 ; CHECK:       @ %bb.0: @ %entry
950 ; CHECK-NEXT:    vldrh.u32 q0, [r1]
951 ; CHECK-NEXT:    vstrh.32 q0, [r0, #4]
952 ; CHECK-NEXT:    adds r0, #4
953 ; CHECK-NEXT:    bx lr
954 entry:
955   %z = getelementptr inbounds i8, i8* %y, i32 4
956   %0 = bitcast i8* %x to <4 x i16>*
957   %1 = load <4 x i16>, <4 x i16>* %0, align 2
958   %2 = bitcast i8* %z to <4 x i16>*
959   store <4 x i16> %1, <4 x i16>* %2, align 2
960   ret i8* %z
963 define i8* @strh32_3(i8* %y, i8* %x) {
964 ; CHECK-LABEL: strh32_3:
965 ; CHECK:       @ %bb.0: @ %entry
966 ; CHECK-NEXT:    adds r0, #3
967 ; CHECK-NEXT:    vldrh.u32 q0, [r1]
968 ; CHECK-NEXT:    vstrh.32 q0, [r0]
969 ; CHECK-NEXT:    bx lr
970 entry:
971   %z = getelementptr inbounds i8, i8* %y, i32 3
972   %0 = bitcast i8* %x to <4 x i16>*
973   %1 = load <4 x i16>, <4 x i16>* %0, align 2
974   %2 = bitcast i8* %z to <4 x i16>*
975   store <4 x i16> %1, <4 x i16>* %2, align 2
976   ret i8* %z
979 define i8* @strh32_2(i8* %y, i8* %x) {
980 ; CHECK-LABEL: strh32_2:
981 ; CHECK:       @ %bb.0: @ %entry
982 ; CHECK-NEXT:    vldrh.u32 q0, [r1]
983 ; CHECK-NEXT:    vstrh.32 q0, [r0, #2]
984 ; CHECK-NEXT:    adds r0, #2
985 ; CHECK-NEXT:    bx lr
986 entry:
987   %z = getelementptr inbounds i8, i8* %y, i32 2
988   %0 = bitcast i8* %x to <4 x i16>*
989   %1 = load <4 x i16>, <4 x i16>* %0, align 2
990   %2 = bitcast i8* %z to <4 x i16>*
991   store <4 x i16> %1, <4 x i16>* %2, align 2
992   ret i8* %z
995 define i8* @strh32_254(i8* %y, i8* %x) {
996 ; CHECK-LABEL: strh32_254:
997 ; CHECK:       @ %bb.0: @ %entry
998 ; CHECK-NEXT:    adds r0, #254
999 ; CHECK-NEXT:    vldrh.u32 q0, [r1]
1000 ; CHECK-NEXT:    vstrh.32 q0, [r0]
1001 ; CHECK-NEXT:    bx lr
1002 entry:
1003   %z = getelementptr inbounds i8, i8* %y, i32 254
1004   %0 = bitcast i8* %x to <4 x i16>*
1005   %1 = load <4 x i16>, <4 x i16>* %0, align 2
1006   %2 = bitcast i8* %z to <4 x i16>*
1007   store <4 x i16> %1, <4 x i16>* %2, align 2
1008   ret i8* %z
1011 define i8* @strh32_256(i8* %y, i8* %x) {
1012 ; CHECK-LABEL: strh32_256:
1013 ; CHECK:       @ %bb.0: @ %entry
1014 ; CHECK-NEXT:    add.w r0, r0, #256
1015 ; CHECK-NEXT:    vldrh.u32 q0, [r1]
1016 ; CHECK-NEXT:    vstrh.32 q0, [r0]
1017 ; CHECK-NEXT:    bx lr
1018 entry:
1019   %z = getelementptr inbounds i8, i8* %y, i32 256
1020   %0 = bitcast i8* %x to <4 x i16>*
1021   %1 = load <4 x i16>, <4 x i16>* %0, align 2
1022   %2 = bitcast i8* %z to <4 x i16>*
1023   store <4 x i16> %1, <4 x i16>* %2, align 2
1024   ret i8* %z
1028 define i8* @strh16_4(i8* %y, i8* %x) {
1029 ; CHECK-LABEL: strh16_4:
1030 ; CHECK:       @ %bb.0: @ %entry
1031 ; CHECK-NEXT:    vldrh.u16 q0, [r1]
1032 ; CHECK-NEXT:    vstrh.16 q0, [r0, #4]
1033 ; CHECK-NEXT:    adds r0, #4
1034 ; CHECK-NEXT:    bx lr
1035 entry:
1036   %z = getelementptr inbounds i8, i8* %y, i32 4
1037   %0 = bitcast i8* %x to <8 x i16>*
1038   %1 = load <8 x i16>, <8 x i16>* %0, align 2
1039   %2 = bitcast i8* %z to <8 x i16>*
1040   store <8 x i16> %1, <8 x i16>* %2, align 2
1041   ret i8* %z
1044 define i8* @strh16_3(i8* %y, i8* %x) {
1045 ; CHECK-LABEL: strh16_3:
1046 ; CHECK:       @ %bb.0: @ %entry
1047 ; CHECK-NEXT:    adds r0, #3
1048 ; CHECK-NEXT:    vldrh.u16 q0, [r1]
1049 ; CHECK-NEXT:    vstrh.16 q0, [r0]
1050 ; CHECK-NEXT:    bx lr
1051 entry:
1052   %z = getelementptr inbounds i8, i8* %y, i32 3
1053   %0 = bitcast i8* %x to <8 x i16>*
1054   %1 = load <8 x i16>, <8 x i16>* %0, align 2
1055   %2 = bitcast i8* %z to <8 x i16>*
1056   store <8 x i16> %1, <8 x i16>* %2, align 2
1057   ret i8* %z
1060 define i8* @strh16_2(i8* %y, i8* %x) {
1061 ; CHECK-LABEL: strh16_2:
1062 ; CHECK:       @ %bb.0: @ %entry
1063 ; CHECK-NEXT:    vldrh.u16 q0, [r1]
1064 ; CHECK-NEXT:    vstrh.16 q0, [r0, #2]
1065 ; CHECK-NEXT:    adds r0, #2
1066 ; CHECK-NEXT:    bx lr
1067 entry:
1068   %z = getelementptr inbounds i8, i8* %y, i32 2
1069   %0 = bitcast i8* %x to <8 x i16>*
1070   %1 = load <8 x i16>, <8 x i16>* %0, align 2
1071   %2 = bitcast i8* %z to <8 x i16>*
1072   store <8 x i16> %1, <8 x i16>* %2, align 2
1073   ret i8* %z
1076 define i8* @strh16_254(i8* %y, i8* %x) {
1077 ; CHECK-LABEL: strh16_254:
1078 ; CHECK:       @ %bb.0: @ %entry
1079 ; CHECK-NEXT:    adds r0, #254
1080 ; CHECK-NEXT:    vldrh.u16 q0, [r1]
1081 ; CHECK-NEXT:    vstrh.16 q0, [r0]
1082 ; CHECK-NEXT:    bx lr
1083 entry:
1084   %z = getelementptr inbounds i8, i8* %y, i32 254
1085   %0 = bitcast i8* %x to <8 x i16>*
1086   %1 = load <8 x i16>, <8 x i16>* %0, align 2
1087   %2 = bitcast i8* %z to <8 x i16>*
1088   store <8 x i16> %1, <8 x i16>* %2, align 2
1089   ret i8* %z
1092 define i8* @strh16_256(i8* %y, i8* %x) {
1093 ; CHECK-LABEL: strh16_256:
1094 ; CHECK:       @ %bb.0: @ %entry
1095 ; CHECK-NEXT:    add.w r0, r0, #256
1096 ; CHECK-NEXT:    vldrh.u16 q0, [r1]
1097 ; CHECK-NEXT:    vstrh.16 q0, [r0]
1098 ; CHECK-NEXT:    bx lr
1099 entry:
1100   %z = getelementptr inbounds i8, i8* %y, i32 256
1101   %0 = bitcast i8* %x to <8 x i16>*
1102   %1 = load <8 x i16>, <8 x i16>* %0, align 2
1103   %2 = bitcast i8* %z to <8 x i16>*
1104   store <8 x i16> %1, <8 x i16>* %2, align 2
1105   ret i8* %z
1109 define i8* @strb32_4(i8* %y, i8* %x) {
1110 ; CHECK-LABEL: strb32_4:
1111 ; CHECK:       @ %bb.0: @ %entry
1112 ; CHECK-NEXT:    vldrb.u32 q0, [r1]
1113 ; CHECK-NEXT:    vstrb.32 q0, [r0, #4]
1114 ; CHECK-NEXT:    adds r0, #4
1115 ; CHECK-NEXT:    bx lr
1116 entry:
1117   %z = getelementptr inbounds i8, i8* %y, i32 4
1118   %0 = bitcast i8* %x to <4 x i8>*
1119   %1 = load <4 x i8>, <4 x i8>* %0, align 1
1120   %2 = bitcast i8* %z to <4 x i8>*
1121   store <4 x i8> %1, <4 x i8>* %2, align 1
1122   ret i8* %z
1125 define i8* @strb32_3(i8* %y, i8* %x) {
1126 ; CHECK-LABEL: strb32_3:
1127 ; CHECK:       @ %bb.0: @ %entry
1128 ; CHECK-NEXT:    vldrb.u32 q0, [r1]
1129 ; CHECK-NEXT:    vstrb.32 q0, [r0, #3]
1130 ; CHECK-NEXT:    adds r0, #3
1131 ; CHECK-NEXT:    bx lr
1132 entry:
1133   %z = getelementptr inbounds i8, i8* %y, i32 3
1134   %0 = bitcast i8* %x to <4 x i8>*
1135   %1 = load <4 x i8>, <4 x i8>* %0, align 1
1136   %2 = bitcast i8* %z to <4 x i8>*
1137   store <4 x i8> %1, <4 x i8>* %2, align 1
1138   ret i8* %z
1141 define i8* @strb32_127(i8* %y, i8* %x) {
1142 ; CHECK-LABEL: strb32_127:
1143 ; CHECK:       @ %bb.0: @ %entry
1144 ; CHECK-NEXT:    adds r0, #127
1145 ; CHECK-NEXT:    vldrb.u32 q0, [r1]
1146 ; CHECK-NEXT:    vstrb.32 q0, [r0]
1147 ; CHECK-NEXT:    bx lr
1148 entry:
1149   %z = getelementptr inbounds i8, i8* %y, i32 127
1150   %0 = bitcast i8* %x to <4 x i8>*
1151   %1 = load <4 x i8>, <4 x i8>* %0, align 1
1152   %2 = bitcast i8* %z to <4 x i8>*
1153   store <4 x i8> %1, <4 x i8>* %2, align 1
1154   ret i8* %z
1157 define i8* @strb32_128(i8* %y, i8* %x) {
1158 ; CHECK-LABEL: strb32_128:
1159 ; CHECK:       @ %bb.0: @ %entry
1160 ; CHECK-NEXT:    adds r0, #128
1161 ; CHECK-NEXT:    vldrb.u32 q0, [r1]
1162 ; CHECK-NEXT:    vstrb.32 q0, [r0]
1163 ; CHECK-NEXT:    bx lr
1164 entry:
1165   %z = getelementptr inbounds i8, i8* %y, i32 128
1166   %0 = bitcast i8* %x to <4 x i8>*
1167   %1 = load <4 x i8>, <4 x i8>* %0, align 1
1168   %2 = bitcast i8* %z to <4 x i8>*
1169   store <4 x i8> %1, <4 x i8>* %2, align 1
1170   ret i8* %z
1174 define i8* @strb16_4(i8* %y, i8* %x) {
1175 ; CHECK-LABEL: strb16_4:
1176 ; CHECK:       @ %bb.0: @ %entry
1177 ; CHECK-NEXT:    vldrb.u16 q0, [r1]
1178 ; CHECK-NEXT:    vstrb.16 q0, [r0, #4]
1179 ; CHECK-NEXT:    adds r0, #4
1180 ; CHECK-NEXT:    bx lr
1181 entry:
1182   %z = getelementptr inbounds i8, i8* %y, i32 4
1183   %0 = bitcast i8* %x to <8 x i8>*
1184   %1 = load <8 x i8>, <8 x i8>* %0, align 1
1185   %2 = bitcast i8* %z to <8 x i8>*
1186   store <8 x i8> %1, <8 x i8>* %2, align 1
1187   ret i8* %z
1190 define i8* @strb16_3(i8* %y, i8* %x) {
1191 ; CHECK-LABEL: strb16_3:
1192 ; CHECK:       @ %bb.0: @ %entry
1193 ; CHECK-NEXT:    vldrb.u16 q0, [r1]
1194 ; CHECK-NEXT:    vstrb.16 q0, [r0, #3]
1195 ; CHECK-NEXT:    adds r0, #3
1196 ; CHECK-NEXT:    bx lr
1197 entry:
1198   %z = getelementptr inbounds i8, i8* %y, i32 3
1199   %0 = bitcast i8* %x to <8 x i8>*
1200   %1 = load <8 x i8>, <8 x i8>* %0, align 1
1201   %2 = bitcast i8* %z to <8 x i8>*
1202   store <8 x i8> %1, <8 x i8>* %2, align 1
1203   ret i8* %z
1206 define i8* @strb16_127(i8* %y, i8* %x) {
1207 ; CHECK-LABEL: strb16_127:
1208 ; CHECK:       @ %bb.0: @ %entry
1209 ; CHECK-NEXT:    adds r0, #127
1210 ; CHECK-NEXT:    vldrb.u16 q0, [r1]
1211 ; CHECK-NEXT:    vstrb.16 q0, [r0]
1212 ; CHECK-NEXT:    bx lr
1213 entry:
1214   %z = getelementptr inbounds i8, i8* %y, i32 127
1215   %0 = bitcast i8* %x to <8 x i8>*
1216   %1 = load <8 x i8>, <8 x i8>* %0, align 1
1217   %2 = bitcast i8* %z to <8 x i8>*
1218   store <8 x i8> %1, <8 x i8>* %2, align 1
1219   ret i8* %z
1222 define i8* @strb16_128(i8* %y, i8* %x) {
1223 ; CHECK-LABEL: strb16_128:
1224 ; CHECK:       @ %bb.0: @ %entry
1225 ; CHECK-NEXT:    adds r0, #128
1226 ; CHECK-NEXT:    vldrb.u16 q0, [r1]
1227 ; CHECK-NEXT:    vstrb.16 q0, [r0]
1228 ; CHECK-NEXT:    bx lr
1229 entry:
1230   %z = getelementptr inbounds i8, i8* %y, i32 128
1231   %0 = bitcast i8* %x to <8 x i8>*
1232   %1 = load <8 x i8>, <8 x i8>* %0, align 1
1233   %2 = bitcast i8* %z to <8 x i8>*
1234   store <8 x i8> %1, <8 x i8>* %2, align 1
1235   ret i8* %z
1239 define i8* @strb8_4(i8* %y, i8* %x) {
1240 ; CHECK-LABEL: strb8_4:
1241 ; CHECK:       @ %bb.0: @ %entry
1242 ; CHECK-NEXT:    vldrb.u8 q0, [r1]
1243 ; CHECK-NEXT:    vstrb.8 q0, [r0, #4]
1244 ; CHECK-NEXT:    adds r0, #4
1245 ; CHECK-NEXT:    bx lr
1246 entry:
1247   %z = getelementptr inbounds i8, i8* %y, i32 4
1248   %0 = bitcast i8* %x to <16 x i8>*
1249   %1 = load <16 x i8>, <16 x i8>* %0, align 1
1250   %2 = bitcast i8* %z to <16 x i8>*
1251   store <16 x i8> %1, <16 x i8>* %2, align 1
1252   ret i8* %z
1255 define i8* @strb8_3(i8* %y, i8* %x) {
1256 ; CHECK-LABEL: strb8_3:
1257 ; CHECK:       @ %bb.0: @ %entry
1258 ; CHECK-NEXT:    vldrb.u8 q0, [r1]
1259 ; CHECK-NEXT:    vstrb.8 q0, [r0, #3]
1260 ; CHECK-NEXT:    adds r0, #3
1261 ; CHECK-NEXT:    bx lr
1262 entry:
1263   %z = getelementptr inbounds i8, i8* %y, i32 3
1264   %0 = bitcast i8* %x to <16 x i8>*
1265   %1 = load <16 x i8>, <16 x i8>* %0, align 1
1266   %2 = bitcast i8* %z to <16 x i8>*
1267   store <16 x i8> %1, <16 x i8>* %2, align 1
1268   ret i8* %z
1271 define i8* @strb8_127(i8* %y, i8* %x) {
1272 ; CHECK-LABEL: strb8_127:
1273 ; CHECK:       @ %bb.0: @ %entry
1274 ; CHECK-NEXT:    adds r0, #127
1275 ; CHECK-NEXT:    vldrb.u8 q0, [r1]
1276 ; CHECK-NEXT:    vstrb.8 q0, [r0]
1277 ; CHECK-NEXT:    bx lr
1278 entry:
1279   %z = getelementptr inbounds i8, i8* %y, i32 127
1280   %0 = bitcast i8* %x to <16 x i8>*
1281   %1 = load <16 x i8>, <16 x i8>* %0, align 1
1282   %2 = bitcast i8* %z to <16 x i8>*
1283   store <16 x i8> %1, <16 x i8>* %2, align 1
1284   ret i8* %z
1287 define i8* @strb8_128(i8* %y, i8* %x) {
1288 ; CHECK-LABEL: strb8_128:
1289 ; CHECK:       @ %bb.0: @ %entry
1290 ; CHECK-NEXT:    adds r0, #128
1291 ; CHECK-NEXT:    vldrb.u8 q0, [r1]
1292 ; CHECK-NEXT:    vstrb.8 q0, [r0]
1293 ; CHECK-NEXT:    bx lr
1294 entry:
1295   %z = getelementptr inbounds i8, i8* %y, i32 128
1296   %0 = bitcast i8* %x to <16 x i8>*
1297   %1 = load <16 x i8>, <16 x i8>* %0, align 1
1298   %2 = bitcast i8* %z to <16 x i8>*
1299   store <16 x i8> %1, <16 x i8>* %2, align 1
1300   ret i8* %z
1303 define i8* @strf32_4(i8* %y, i8* %x) {
1304 ; CHECK-LABEL: strf32_4:
1305 ; CHECK:       @ %bb.0: @ %entry
1306 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
1307 ; CHECK-NEXT:    vstrw.32 q0, [r0, #4]
1308 ; CHECK-NEXT:    adds r0, #4
1309 ; CHECK-NEXT:    bx lr
1310 entry:
1311   %z = getelementptr inbounds i8, i8* %y, i32 4
1312   %0 = bitcast i8* %x to <4 x float>*
1313   %1 = load <4 x float>, <4 x float>* %0, align 4
1314   %2 = bitcast i8* %z to <4 x float>*
1315   store <4 x float> %1, <4 x float>* %2, align 4
1316   ret i8* %z
1319 define i8* @strf16_4(i8* %y, i8* %x) {
1320 ; CHECK-LABEL: strf16_4:
1321 ; CHECK:       @ %bb.0: @ %entry
1322 ; CHECK-NEXT:    vldrh.u16 q0, [r1]
1323 ; CHECK-NEXT:    vstrh.16 q0, [r0, #4]
1324 ; CHECK-NEXT:    adds r0, #4
1325 ; CHECK-NEXT:    bx lr
1326 entry:
1327   %z = getelementptr inbounds i8, i8* %y, i32 4
1328   %0 = bitcast i8* %x to <8 x half>*
1329   %1 = load <8 x half>, <8 x half>* %0, align 2
1330   %2 = bitcast i8* %z to <8 x half>*
1331   store <8 x half> %1, <8 x half>* %2, align 2
1332   ret i8* %z
1335 define i8* @strwi32_align1(i8* %y, i8* %x) {
1336 ; CHECK-LABEL: strwi32_align1:
1337 ; CHECK:       @ %bb.0: @ %entry
1338 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
1339 ; CHECK-NEXT:    vstrb.8 q0, [r0, #3]
1340 ; CHECK-NEXT:    adds r0, #3
1341 ; CHECK-NEXT:    bx lr
1342 entry:
1343   %z = getelementptr inbounds i8, i8* %y, i32 3
1344   %0 = bitcast i8* %x to <4 x i32>*
1345   %1 = load <4 x i32>, <4 x i32>* %0, align 4
1346   %2 = bitcast i8* %z to <4 x i32>*
1347   store <4 x i32> %1, <4 x i32>* %2, align 1
1348   ret i8* %z
1351 define i8* @strhi16_align1(i8* %y, i8* %x) {
1352 ; CHECK-LABEL: strhi16_align1:
1353 ; CHECK:       @ %bb.0: @ %entry
1354 ; CHECK-NEXT:    vldrh.u16 q0, [r1]
1355 ; CHECK-NEXT:    vstrb.8 q0, [r0, #3]
1356 ; CHECK-NEXT:    adds r0, #3
1357 ; CHECK-NEXT:    bx lr
1358 entry:
1359   %z = getelementptr inbounds i8, i8* %y, i32 3
1360   %0 = bitcast i8* %x to <8 x i16>*
1361   %1 = load <8 x i16>, <8 x i16>* %0, align 2
1362   %2 = bitcast i8* %z to <8 x i16>*
1363   store <8 x i16> %1, <8 x i16>* %2, align 1
1364   ret i8* %z
1367 define i8* @strhi32_align1(i8* %y, i8* %x) {
1368 ; CHECK-LABEL: strhi32_align1:
1369 ; CHECK:       @ %bb.0: @ %entry
1370 ; CHECK-NEXT:    .pad #8
1371 ; CHECK-NEXT:    sub sp, #8
1372 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
1373 ; CHECK-NEXT:    mov r1, sp
1374 ; CHECK-NEXT:    vstrh.32 q0, [r1]
1375 ; CHECK-NEXT:    ldrd r1, r2, [sp]
1376 ; CHECK-NEXT:    str r1, [r0, #3]!
1377 ; CHECK-NEXT:    str r2, [r0, #4]
1378 ; CHECK-NEXT:    add sp, #8
1379 ; CHECK-NEXT:    bx lr
1380 entry:
1381   %z = getelementptr inbounds i8, i8* %y, i32 3
1382   %0 = bitcast i8* %x to <4 x i32>*
1383   %1 = load <4 x i32>, <4 x i32>* %0, align 4
1384   %2 = bitcast i8* %z to <4 x i16>*
1385   %3 = trunc <4 x i32> %1 to <4 x i16>
1386   store <4 x i16> %3, <4 x i16>* %2, align 1
1387   ret i8* %z
1390 define i8* @strf32_align1(i8* %y, i8* %x) {
1391 ; CHECK-LABEL: strf32_align1:
1392 ; CHECK:       @ %bb.0: @ %entry
1393 ; CHECK-NEXT:    vldrw.u32 q0, [r1]
1394 ; CHECK-NEXT:    vstrb.8 q0, [r0, #3]
1395 ; CHECK-NEXT:    adds r0, #3
1396 ; CHECK-NEXT:    bx lr
1397 entry:
1398   %z = getelementptr inbounds i8, i8* %y, i32 3
1399   %0 = bitcast i8* %x to <4 x float>*
1400   %1 = load <4 x float>, <4 x float>* %0, align 4
1401   %2 = bitcast i8* %z to <4 x float>*
1402   store <4 x float> %1, <4 x float>* %2, align 1
1403   ret i8* %z
1406 define i8* @strf16_align1(i8* %y, i8* %x) {
1407 ; CHECK-LABEL: strf16_align1:
1408 ; CHECK:       @ %bb.0: @ %entry
1409 ; CHECK-NEXT:    vldrh.u16 q0, [r1]
1410 ; CHECK-NEXT:    vstrb.8 q0, [r0, #3]
1411 ; CHECK-NEXT:    adds r0, #3
1412 ; CHECK-NEXT:    bx lr
1413 entry:
1414   %z = getelementptr inbounds i8, i8* %y, i32 3
1415   %0 = bitcast i8* %x to <8 x half>*
1416   %1 = load <8 x half>, <8 x half>* %0, align 2
1417   %2 = bitcast i8* %z to <8 x half>*
1418   store <8 x half> %1, <8 x half>* %2, align 1
1419   ret i8* %z