[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / aarch64-load-ext.ll
blobcc7dffc497495a0c8b82584fd98fa89ecb3d0912
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s --check-prefix CHECK-LE
3 ; RUN: llc -mtriple=aarch64_be-unknown-linux-gnu < %s | FileCheck %s --check-prefix CHECK-BE
5 define <2 x i16> @test0(ptr %i16_ptr, i64 %inc) {
6 ; CHECK-LE-LABEL: test0:
7 ; CHECK-LE:       // %bb.0:
8 ; CHECK-LE-NEXT:    ld1 { v0.h }[0], [x0]
9 ; CHECK-LE-NEXT:    // kill: def $d0 killed $d0 killed $q0
10 ; CHECK-LE-NEXT:    ret
12 ; CHECK-BE-LABEL: test0:
13 ; CHECK-BE:       // %bb.0:
14 ; CHECK-BE-NEXT:    ld1 { v0.h }[0], [x0]
15 ; CHECK-BE-NEXT:    rev64 v0.2s, v0.2s
16 ; CHECK-BE-NEXT:    ret
17   %i_0 = load i16, ptr %i16_ptr
18   %v0 = insertelement <2 x i16> undef, i16 %i_0, i32 0
19   ret <2 x i16> %v0
22 define <2 x i16> @test1(ptr %v2i16_ptr) {
23 ; CHECK-LE-LABEL: test1:
24 ; CHECK-LE:       // %bb.0:
25 ; CHECK-LE-NEXT:    ld1 { v0.h }[0], [x0]
26 ; CHECK-LE-NEXT:    add x8, x0, #2
27 ; CHECK-LE-NEXT:    ld1 { v0.h }[2], [x8]
28 ; CHECK-LE-NEXT:    // kill: def $d0 killed $d0 killed $q0
29 ; CHECK-LE-NEXT:    ret
31 ; CHECK-BE-LABEL: test1:
32 ; CHECK-BE:       // %bb.0:
33 ; CHECK-BE-NEXT:    ld1 { v0.h }[0], [x0]
34 ; CHECK-BE-NEXT:    add x8, x0, #2
35 ; CHECK-BE-NEXT:    ld1 { v0.h }[2], [x8]
36 ; CHECK-BE-NEXT:    rev64 v0.2s, v0.2s
37 ; CHECK-BE-NEXT:    ret
38   %v2i16 = load <2 x i16>, ptr %v2i16_ptr
39   ret <2 x i16> %v2i16
42 define <2 x i16> @test2(ptr %i16_ptr, i64 %inc) {
43 ; CHECK-LE-LABEL: test2:
44 ; CHECK-LE:       // %bb.0:
45 ; CHECK-LE-NEXT:    ld1 { v0.h }[0], [x0]
46 ; CHECK-LE-NEXT:    add x8, x0, x1, lsl #1
47 ; CHECK-LE-NEXT:    ld1 { v0.h }[2], [x8]
48 ; CHECK-LE-NEXT:    // kill: def $d0 killed $d0 killed $q0
49 ; CHECK-LE-NEXT:    ret
51 ; CHECK-BE-LABEL: test2:
52 ; CHECK-BE:       // %bb.0:
53 ; CHECK-BE-NEXT:    ld1 { v0.h }[0], [x0]
54 ; CHECK-BE-NEXT:    add x8, x0, x1, lsl #1
55 ; CHECK-BE-NEXT:    ld1 { v0.h }[2], [x8]
56 ; CHECK-BE-NEXT:    rev64 v0.2s, v0.2s
57 ; CHECK-BE-NEXT:    ret
58   %i_0 = load i16, ptr %i16_ptr
59   %i16_ptr_inc = getelementptr i16, ptr %i16_ptr, i64 %inc
60   %i_1 = load i16, ptr %i16_ptr_inc
61   %v0 = insertelement <2 x i16> undef, i16 %i_0, i32 0
62   %v1 = insertelement <2 x i16> %v0, i16 %i_1, i32 1
63   ret <2 x i16> %v1
66 define <2 x i8> @test3(ptr %v2i8_ptr) {
67 ; CHECK-LE-LABEL: test3:
68 ; CHECK-LE:       // %bb.0:
69 ; CHECK-LE-NEXT:    ld1 { v0.b }[0], [x0]
70 ; CHECK-LE-NEXT:    add x8, x0, #1
71 ; CHECK-LE-NEXT:    ld1 { v0.b }[4], [x8]
72 ; CHECK-LE-NEXT:    // kill: def $d0 killed $d0 killed $q0
73 ; CHECK-LE-NEXT:    ret
75 ; CHECK-BE-LABEL: test3:
76 ; CHECK-BE:       // %bb.0:
77 ; CHECK-BE-NEXT:    ld1 { v0.b }[0], [x0]
78 ; CHECK-BE-NEXT:    add x8, x0, #1
79 ; CHECK-BE-NEXT:    ld1 { v0.b }[4], [x8]
80 ; CHECK-BE-NEXT:    rev64 v0.2s, v0.2s
81 ; CHECK-BE-NEXT:    ret
82   %v2i8 = load <2 x i8>, ptr %v2i8_ptr
83   ret <2 x i8> %v2i8
86 define <4 x i8> @test4(ptr %v4i8_ptr) {
87 ; CHECK-LE-LABEL: test4:
88 ; CHECK-LE:       // %bb.0:
89 ; CHECK-LE-NEXT:    ldr s0, [x0]
90 ; CHECK-LE-NEXT:    ushll v0.8h, v0.8b, #0
91 ; CHECK-LE-NEXT:    // kill: def $d0 killed $d0 killed $q0
92 ; CHECK-LE-NEXT:    ret
94 ; CHECK-BE-LABEL: test4:
95 ; CHECK-BE:       // %bb.0:
96 ; CHECK-BE-NEXT:    ldr s0, [x0]
97 ; CHECK-BE-NEXT:    rev32 v0.8b, v0.8b
98 ; CHECK-BE-NEXT:    ushll v0.8h, v0.8b, #0
99 ; CHECK-BE-NEXT:    rev64 v0.4h, v0.4h
100 ; CHECK-BE-NEXT:    ret
101   %v4i8 = load <4 x i8>, ptr %v4i8_ptr
102   ret <4 x i8> %v4i8
105 define <2 x i32> @fsext_v2i32(ptr %a) {
106 ; CHECK-LE-LABEL: fsext_v2i32:
107 ; CHECK-LE:       // %bb.0:
108 ; CHECK-LE-NEXT:    ldrsb w8, [x0]
109 ; CHECK-LE-NEXT:    ldrsb w9, [x0, #1]
110 ; CHECK-LE-NEXT:    fmov s0, w8
111 ; CHECK-LE-NEXT:    mov v0.s[1], w9
112 ; CHECK-LE-NEXT:    // kill: def $d0 killed $d0 killed $q0
113 ; CHECK-LE-NEXT:    ret
115 ; CHECK-BE-LABEL: fsext_v2i32:
116 ; CHECK-BE:       // %bb.0:
117 ; CHECK-BE-NEXT:    ldrsb w8, [x0]
118 ; CHECK-BE-NEXT:    ldrsb w9, [x0, #1]
119 ; CHECK-BE-NEXT:    fmov s0, w8
120 ; CHECK-BE-NEXT:    mov v0.s[1], w9
121 ; CHECK-BE-NEXT:    rev64 v0.2s, v0.2s
122 ; CHECK-BE-NEXT:    ret
123   %x = load <2 x i8>, ptr %a
124   %y = sext <2 x i8> %x to <2 x i32>
125   ret <2 x i32> %y
128 define <3 x i32> @fsext_v3i32(ptr %a) {
129 ; CHECK-LE-LABEL: fsext_v3i32:
130 ; CHECK-LE:       // %bb.0:
131 ; CHECK-LE-NEXT:    ldr s0, [x0]
132 ; CHECK-LE-NEXT:    zip1 v0.8b, v0.8b, v0.8b
133 ; CHECK-LE-NEXT:    ushll v0.4s, v0.4h, #0
134 ; CHECK-LE-NEXT:    shl v0.4s, v0.4s, #24
135 ; CHECK-LE-NEXT:    sshr v0.4s, v0.4s, #24
136 ; CHECK-LE-NEXT:    ret
138 ; CHECK-BE-LABEL: fsext_v3i32:
139 ; CHECK-BE:       // %bb.0:
140 ; CHECK-BE-NEXT:    ldr s0, [x0]
141 ; CHECK-BE-NEXT:    rev32 v0.8b, v0.8b
142 ; CHECK-BE-NEXT:    zip1 v0.8b, v0.8b, v0.8b
143 ; CHECK-BE-NEXT:    rev16 v0.8b, v0.8b
144 ; CHECK-BE-NEXT:    ushll v0.4s, v0.4h, #0
145 ; CHECK-BE-NEXT:    shl v0.4s, v0.4s, #24
146 ; CHECK-BE-NEXT:    sshr v0.4s, v0.4s, #24
147 ; CHECK-BE-NEXT:    rev64 v0.4s, v0.4s
148 ; CHECK-BE-NEXT:    ext v0.16b, v0.16b, v0.16b, #8
149 ; CHECK-BE-NEXT:    ret
150   %x = load <3 x i8>, ptr %a
151   %y = sext <3 x i8> %x to <3 x i32>
152   ret <3 x i32> %y
155 define <4 x i32> @fsext_v4i32(ptr %a) {
156 ; CHECK-LE-LABEL: fsext_v4i32:
157 ; CHECK-LE:       // %bb.0:
158 ; CHECK-LE-NEXT:    ldr s0, [x0]
159 ; CHECK-LE-NEXT:    sshll v0.8h, v0.8b, #0
160 ; CHECK-LE-NEXT:    sshll v0.4s, v0.4h, #0
161 ; CHECK-LE-NEXT:    ret
163 ; CHECK-BE-LABEL: fsext_v4i32:
164 ; CHECK-BE:       // %bb.0:
165 ; CHECK-BE-NEXT:    ldr s0, [x0]
166 ; CHECK-BE-NEXT:    rev32 v0.8b, v0.8b
167 ; CHECK-BE-NEXT:    sshll v0.8h, v0.8b, #0
168 ; CHECK-BE-NEXT:    sshll v0.4s, v0.4h, #0
169 ; CHECK-BE-NEXT:    rev64 v0.4s, v0.4s
170 ; CHECK-BE-NEXT:    ext v0.16b, v0.16b, v0.16b, #8
171 ; CHECK-BE-NEXT:    ret
172   %x = load <4 x i8>, ptr %a
173   %y = sext <4 x i8> %x to <4 x i32>
174   ret <4 x i32> %y
177 define <8 x i32> @fsext_v8i32(ptr %a) {
178 ; CHECK-LE-LABEL: fsext_v8i32:
179 ; CHECK-LE:       // %bb.0:
180 ; CHECK-LE-NEXT:    ldr d0, [x0]
181 ; CHECK-LE-NEXT:    sshll v0.8h, v0.8b, #0
182 ; CHECK-LE-NEXT:    sshll2 v1.4s, v0.8h, #0
183 ; CHECK-LE-NEXT:    sshll v0.4s, v0.4h, #0
184 ; CHECK-LE-NEXT:    ret
186 ; CHECK-BE-LABEL: fsext_v8i32:
187 ; CHECK-BE:       // %bb.0:
188 ; CHECK-BE-NEXT:    ld1 { v0.8b }, [x0]
189 ; CHECK-BE-NEXT:    sshll v0.8h, v0.8b, #0
190 ; CHECK-BE-NEXT:    sshll v1.4s, v0.4h, #0
191 ; CHECK-BE-NEXT:    sshll2 v0.4s, v0.8h, #0
192 ; CHECK-BE-NEXT:    rev64 v0.4s, v0.4s
193 ; CHECK-BE-NEXT:    rev64 v2.4s, v1.4s
194 ; CHECK-BE-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
195 ; CHECK-BE-NEXT:    ext v0.16b, v2.16b, v2.16b, #8
196 ; CHECK-BE-NEXT:    ret
197   %x = load <8 x i8>, ptr %a
198   %y = sext <8 x i8> %x to <8 x i32>
199   ret <8 x i32> %y
202 define <4 x i32> @fzext_v4i32(ptr %a) {
203 ; CHECK-LE-LABEL: fzext_v4i32:
204 ; CHECK-LE:       // %bb.0:
205 ; CHECK-LE-NEXT:    ldr s0, [x0]
206 ; CHECK-LE-NEXT:    ushll v0.8h, v0.8b, #0
207 ; CHECK-LE-NEXT:    ushll v0.4s, v0.4h, #0
208 ; CHECK-LE-NEXT:    ret
210 ; CHECK-BE-LABEL: fzext_v4i32:
211 ; CHECK-BE:       // %bb.0:
212 ; CHECK-BE-NEXT:    ldr s0, [x0]
213 ; CHECK-BE-NEXT:    rev32 v0.8b, v0.8b
214 ; CHECK-BE-NEXT:    ushll v0.8h, v0.8b, #0
215 ; CHECK-BE-NEXT:    ushll v0.4s, v0.4h, #0
216 ; CHECK-BE-NEXT:    rev64 v0.4s, v0.4s
217 ; CHECK-BE-NEXT:    ext v0.16b, v0.16b, v0.16b, #8
218 ; CHECK-BE-NEXT:    ret
219   %x = load <4 x i8>, ptr %a
220   %y = zext <4 x i8> %x to <4 x i32>
221   ret <4 x i32> %y
224 ; TODO: This codegen could just be:
225 ;   ldrb w0, [x0]
227 define i32 @loadExti32(ptr %ref) {
228 ; CHECK-LE-LABEL: loadExti32:
229 ; CHECK-LE:       // %bb.0:
230 ; CHECK-LE-NEXT:    ldr s0, [x0]
231 ; CHECK-LE-NEXT:    ushll v0.8h, v0.8b, #0
232 ; CHECK-LE-NEXT:    umov w8, v0.h[0]
233 ; CHECK-LE-NEXT:    and w0, w8, #0xff
234 ; CHECK-LE-NEXT:    ret
236 ; CHECK-BE-LABEL: loadExti32:
237 ; CHECK-BE:       // %bb.0:
238 ; CHECK-BE-NEXT:    ldr s0, [x0]
239 ; CHECK-BE-NEXT:    rev32 v0.8b, v0.8b
240 ; CHECK-BE-NEXT:    ushll v0.8h, v0.8b, #0
241 ; CHECK-BE-NEXT:    umov w8, v0.h[0]
242 ; CHECK-BE-NEXT:    and w0, w8, #0xff
243 ; CHECK-BE-NEXT:    ret
244   %a = load <4 x i8>, ptr %ref
245   %vecext = extractelement <4 x i8> %a, i32 0
246   %conv = zext i8 %vecext to i32
247   ret i32 %conv
250 define <2 x i16> @fsext_v2i16(ptr %a) {
251 ; CHECK-LE-LABEL: fsext_v2i16:
252 ; CHECK-LE:       // %bb.0:
253 ; CHECK-LE-NEXT:    ldrsb w8, [x0]
254 ; CHECK-LE-NEXT:    ldrsb w9, [x0, #1]
255 ; CHECK-LE-NEXT:    fmov s0, w8
256 ; CHECK-LE-NEXT:    mov v0.s[1], w9
257 ; CHECK-LE-NEXT:    // kill: def $d0 killed $d0 killed $q0
258 ; CHECK-LE-NEXT:    ret
260 ; CHECK-BE-LABEL: fsext_v2i16:
261 ; CHECK-BE:       // %bb.0:
262 ; CHECK-BE-NEXT:    ldrsb w8, [x0]
263 ; CHECK-BE-NEXT:    ldrsb w9, [x0, #1]
264 ; CHECK-BE-NEXT:    fmov s0, w8
265 ; CHECK-BE-NEXT:    mov v0.s[1], w9
266 ; CHECK-BE-NEXT:    rev64 v0.2s, v0.2s
267 ; CHECK-BE-NEXT:    ret
268   %x = load <2 x i8>, ptr %a
269   %y = sext <2 x i8> %x to <2 x i16>
270   ret <2 x i16> %y
273 define <3 x i16> @fsext_v3i16(ptr %a) {
274 ; CHECK-LE-LABEL: fsext_v3i16:
275 ; CHECK-LE:       // %bb.0:
276 ; CHECK-LE-NEXT:    ldr s0, [x0]
277 ; CHECK-LE-NEXT:    zip1 v0.8b, v0.8b, v0.8b
278 ; CHECK-LE-NEXT:    shl v0.4h, v0.4h, #8
279 ; CHECK-LE-NEXT:    sshr v0.4h, v0.4h, #8
280 ; CHECK-LE-NEXT:    ret
282 ; CHECK-BE-LABEL: fsext_v3i16:
283 ; CHECK-BE:       // %bb.0:
284 ; CHECK-BE-NEXT:    ldr s0, [x0]
285 ; CHECK-BE-NEXT:    rev32 v0.8b, v0.8b
286 ; CHECK-BE-NEXT:    zip1 v0.8b, v0.8b, v0.8b
287 ; CHECK-BE-NEXT:    rev16 v0.8b, v0.8b
288 ; CHECK-BE-NEXT:    shl v0.4h, v0.4h, #8
289 ; CHECK-BE-NEXT:    sshr v0.4h, v0.4h, #8
290 ; CHECK-BE-NEXT:    rev64 v0.4h, v0.4h
291 ; CHECK-BE-NEXT:    ret
292   %x = load <3 x i8>, ptr %a
293   %y = sext <3 x i8> %x to <3 x i16>
294   ret <3 x i16> %y
297 define <4 x i16> @fsext_v4i16(ptr %a) {
298 ; CHECK-LE-LABEL: fsext_v4i16:
299 ; CHECK-LE:       // %bb.0:
300 ; CHECK-LE-NEXT:    ldr s0, [x0]
301 ; CHECK-LE-NEXT:    sshll v0.8h, v0.8b, #0
302 ; CHECK-LE-NEXT:    // kill: def $d0 killed $d0 killed $q0
303 ; CHECK-LE-NEXT:    ret
305 ; CHECK-BE-LABEL: fsext_v4i16:
306 ; CHECK-BE:       // %bb.0:
307 ; CHECK-BE-NEXT:    ldr s0, [x0]
308 ; CHECK-BE-NEXT:    rev32 v0.8b, v0.8b
309 ; CHECK-BE-NEXT:    sshll v0.8h, v0.8b, #0
310 ; CHECK-BE-NEXT:    rev64 v0.4h, v0.4h
311 ; CHECK-BE-NEXT:    ret
312   %x = load <4 x i8>, ptr %a
313   %y = sext <4 x i8> %x to <4 x i16>
314   ret <4 x i16> %y
317 define <8 x i16> @fsext_v8i16(ptr %a) {
318 ; CHECK-LE-LABEL: fsext_v8i16:
319 ; CHECK-LE:       // %bb.0:
320 ; CHECK-LE-NEXT:    ldr d0, [x0]
321 ; CHECK-LE-NEXT:    sshll v0.8h, v0.8b, #0
322 ; CHECK-LE-NEXT:    ret
324 ; CHECK-BE-LABEL: fsext_v8i16:
325 ; CHECK-BE:       // %bb.0:
326 ; CHECK-BE-NEXT:    ld1 { v0.8b }, [x0]
327 ; CHECK-BE-NEXT:    sshll v0.8h, v0.8b, #0
328 ; CHECK-BE-NEXT:    rev64 v0.8h, v0.8h
329 ; CHECK-BE-NEXT:    ext v0.16b, v0.16b, v0.16b, #8
330 ; CHECK-BE-NEXT:    ret
331   %x = load <8 x i8>, ptr %a
332   %y = sext <8 x i8> %x to <8 x i16>
333   ret <8 x i16> %y
336 define <16 x i16> @fsext_v16i16(ptr %a) {
337 ; CHECK-LE-LABEL: fsext_v16i16:
338 ; CHECK-LE:       // %bb.0:
339 ; CHECK-LE-NEXT:    ldr q0, [x0]
340 ; CHECK-LE-NEXT:    sshll2 v1.8h, v0.16b, #0
341 ; CHECK-LE-NEXT:    sshll v0.8h, v0.8b, #0
342 ; CHECK-LE-NEXT:    ret
344 ; CHECK-BE-LABEL: fsext_v16i16:
345 ; CHECK-BE:       // %bb.0:
346 ; CHECK-BE-NEXT:    ld1 { v0.16b }, [x0]
347 ; CHECK-BE-NEXT:    sshll v1.8h, v0.8b, #0
348 ; CHECK-BE-NEXT:    sshll2 v0.8h, v0.16b, #0
349 ; CHECK-BE-NEXT:    rev64 v0.8h, v0.8h
350 ; CHECK-BE-NEXT:    rev64 v2.8h, v1.8h
351 ; CHECK-BE-NEXT:    ext v1.16b, v0.16b, v0.16b, #8
352 ; CHECK-BE-NEXT:    ext v0.16b, v2.16b, v2.16b, #8
353 ; CHECK-BE-NEXT:    ret
354   %x = load <16 x i8>, ptr %a
355   %y = sext <16 x i8> %x to <16 x i16>
356   ret <16 x i16> %y
359 define <4 x i16> @fzext_v4i16(ptr %a) {
360 ; CHECK-LE-LABEL: fzext_v4i16:
361 ; CHECK-LE:       // %bb.0:
362 ; CHECK-LE-NEXT:    ldr s0, [x0]
363 ; CHECK-LE-NEXT:    ushll v0.8h, v0.8b, #0
364 ; CHECK-LE-NEXT:    // kill: def $d0 killed $d0 killed $q0
365 ; CHECK-LE-NEXT:    ret
367 ; CHECK-BE-LABEL: fzext_v4i16:
368 ; CHECK-BE:       // %bb.0:
369 ; CHECK-BE-NEXT:    ldr s0, [x0]
370 ; CHECK-BE-NEXT:    rev32 v0.8b, v0.8b
371 ; CHECK-BE-NEXT:    ushll v0.8h, v0.8b, #0
372 ; CHECK-BE-NEXT:    rev64 v0.4h, v0.4h
373 ; CHECK-BE-NEXT:    ret
374   %x = load <4 x i8>, ptr %a
375   %y = zext <4 x i8> %x to <4 x i16>
376   ret <4 x i16> %y
379 define <4 x i16> @anyext_v4i16(ptr %a, ptr %b) {
380 ; CHECK-LE-LABEL: anyext_v4i16:
381 ; CHECK-LE:       // %bb.0:
382 ; CHECK-LE-NEXT:    ldr s0, [x0]
383 ; CHECK-LE-NEXT:    ldr s1, [x1]
384 ; CHECK-LE-NEXT:    uaddl v0.8h, v0.8b, v1.8b
385 ; CHECK-LE-NEXT:    shl v0.4h, v0.4h, #8
386 ; CHECK-LE-NEXT:    sshr v0.4h, v0.4h, #8
387 ; CHECK-LE-NEXT:    ret
389 ; CHECK-BE-LABEL: anyext_v4i16:
390 ; CHECK-BE:       // %bb.0:
391 ; CHECK-BE-NEXT:    ldr s0, [x0]
392 ; CHECK-BE-NEXT:    ldr s1, [x1]
393 ; CHECK-BE-NEXT:    rev32 v0.8b, v0.8b
394 ; CHECK-BE-NEXT:    rev32 v1.8b, v1.8b
395 ; CHECK-BE-NEXT:    uaddl v0.8h, v0.8b, v1.8b
396 ; CHECK-BE-NEXT:    shl v0.4h, v0.4h, #8
397 ; CHECK-BE-NEXT:    sshr v0.4h, v0.4h, #8
398 ; CHECK-BE-NEXT:    rev64 v0.4h, v0.4h
399 ; CHECK-BE-NEXT:    ret
400   %x = load <4 x i8>, ptr %a, align 4
401   %y = load <4 x i8>, ptr %b, align 4
402   %z = add <4 x i8> %x, %y
403   %s = sext <4 x i8> %z to <4 x i16>
404   ret <4 x i16> %s
407 define <4 x i32> @anyext_v4i32(ptr %a, ptr %b) {
408 ; CHECK-LE-LABEL: anyext_v4i32:
409 ; CHECK-LE:       // %bb.0:
410 ; CHECK-LE-NEXT:    ldr s0, [x0]
411 ; CHECK-LE-NEXT:    ldr s1, [x1]
412 ; CHECK-LE-NEXT:    uaddl v0.8h, v0.8b, v1.8b
413 ; CHECK-LE-NEXT:    ushll v0.4s, v0.4h, #0
414 ; CHECK-LE-NEXT:    shl v0.4s, v0.4s, #24
415 ; CHECK-LE-NEXT:    sshr v0.4s, v0.4s, #24
416 ; CHECK-LE-NEXT:    ret
418 ; CHECK-BE-LABEL: anyext_v4i32:
419 ; CHECK-BE:       // %bb.0:
420 ; CHECK-BE-NEXT:    ldr s0, [x0]
421 ; CHECK-BE-NEXT:    ldr s1, [x1]
422 ; CHECK-BE-NEXT:    rev32 v0.8b, v0.8b
423 ; CHECK-BE-NEXT:    rev32 v1.8b, v1.8b
424 ; CHECK-BE-NEXT:    uaddl v0.8h, v0.8b, v1.8b
425 ; CHECK-BE-NEXT:    ushll v0.4s, v0.4h, #0
426 ; CHECK-BE-NEXT:    shl v0.4s, v0.4s, #24
427 ; CHECK-BE-NEXT:    sshr v0.4s, v0.4s, #24
428 ; CHECK-BE-NEXT:    rev64 v0.4s, v0.4s
429 ; CHECK-BE-NEXT:    ext v0.16b, v0.16b, v0.16b, #8
430 ; CHECK-BE-NEXT:    ret
431   %x = load <4 x i8>, ptr %a, align 4
432   %y = load <4 x i8>, ptr %b, align 4
433   %z = add <4 x i8> %x, %y
434   %s = sext <4 x i8> %z to <4 x i32>
435   ret <4 x i32> %s
438 define <4 x i8> @bitcast(i32 %0) {
439 ; CHECK-LE-LABEL: bitcast:
440 ; CHECK-LE:       // %bb.0:
441 ; CHECK-LE-NEXT:    fmov s0, w0
442 ; CHECK-LE-NEXT:    zip1 v0.8b, v0.8b, v0.8b
443 ; CHECK-LE-NEXT:    ret
445 ; CHECK-BE-LABEL: bitcast:
446 ; CHECK-BE:       // %bb.0:
447 ; CHECK-BE-NEXT:    fmov s0, w0
448 ; CHECK-BE-NEXT:    rev32 v0.8b, v0.8b
449 ; CHECK-BE-NEXT:    zip1 v0.8b, v0.8b, v0.8b
450 ; CHECK-BE-NEXT:    rev64 v0.8b, v0.8b
451 ; CHECK-BE-NEXT:    ret
452   %2 = bitcast i32 %0 to <4 x i8>
453   ret <4 x i8> %2