[ARM] Generate 8.1-m CSINC, CSNEG and CSINV instructions.
[llvm-core.git] / test / CodeGen / Thumb2 / mve-pred-shuffle.ll
blob895c91e3087f6534df138bd7d253efd7e750edc1
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 <4 x i32> @shuffle1_v4i32(<4 x i32> %src, <4 x i32> %a, <4 x i32> %b) {
5 ; CHECK-LABEL: shuffle1_v4i32:
6 ; CHECK:       @ %bb.0: @ %entry
7 ; CHECK-NEXT:    vmov d1, r2, r3
8 ; CHECK-NEXT:    vmov d0, r0, r1
9 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
10 ; CHECK-NEXT:    vmrs r0, p0
11 ; CHECK-NEXT:    rbit r0, r0
12 ; CHECK-NEXT:    lsrs r0, r0, #16
13 ; CHECK-NEXT:    vmsr p0, r0
14 ; CHECK-NEXT:    add r0, sp, #16
15 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
16 ; CHECK-NEXT:    mov r0, sp
17 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
18 ; CHECK-NEXT:    vpsel q0, q1, q0
19 ; CHECK-NEXT:    vmov r0, r1, d0
20 ; CHECK-NEXT:    vmov r2, r3, d1
21 ; CHECK-NEXT:    bx lr
22 entry:
23   %c = icmp eq <4 x i32> %src, zeroinitializer
24   %sh = shufflevector <4 x i1> %c, <4 x i1> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
25   %s = select <4 x i1> %sh, <4 x i32> %a, <4 x i32> %b
26   ret <4 x i32> %s
29 define <8 x i16> @shuffle1_v8i16(<8 x i16> %src, <8 x i16> %a, <8 x i16> %b) {
30 ; CHECK-LABEL: shuffle1_v8i16:
31 ; CHECK:       @ %bb.0: @ %entry
32 ; CHECK-NEXT:    vmov d1, r2, r3
33 ; CHECK-NEXT:    vmov d0, r0, r1
34 ; CHECK-NEXT:    vcmp.i16 eq, q0, zr
35 ; CHECK-NEXT:    vmrs r0, p0
36 ; CHECK-NEXT:    rbit r0, r0
37 ; CHECK-NEXT:    lsrs r0, r0, #16
38 ; CHECK-NEXT:    vmsr p0, r0
39 ; CHECK-NEXT:    add r0, sp, #16
40 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
41 ; CHECK-NEXT:    mov r0, sp
42 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
43 ; CHECK-NEXT:    vpsel q0, q1, q0
44 ; CHECK-NEXT:    vmov r0, r1, d0
45 ; CHECK-NEXT:    vmov r2, r3, d1
46 ; CHECK-NEXT:    bx lr
47 entry:
48   %c = icmp eq <8 x i16> %src, zeroinitializer
49   %sh = shufflevector <8 x i1> %c, <8 x i1> undef, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
50   %s = select <8 x i1> %sh, <8 x i16> %a, <8 x i16> %b
51   ret <8 x i16> %s
54 define <16 x i8> @shuffle1_v16i8(<16 x i8> %src, <16 x i8> %a, <16 x i8> %b) {
55 ; CHECK-LABEL: shuffle1_v16i8:
56 ; CHECK:       @ %bb.0: @ %entry
57 ; CHECK-NEXT:    vmov d1, r2, r3
58 ; CHECK-NEXT:    vmov d0, r0, r1
59 ; CHECK-NEXT:    vcmp.i8 eq, q0, zr
60 ; CHECK-NEXT:    vmrs r0, p0
61 ; CHECK-NEXT:    rbit r0, r0
62 ; CHECK-NEXT:    lsrs r0, r0, #16
63 ; CHECK-NEXT:    vmsr p0, r0
64 ; CHECK-NEXT:    add r0, sp, #16
65 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
66 ; CHECK-NEXT:    mov r0, sp
67 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
68 ; CHECK-NEXT:    vpsel q0, q1, q0
69 ; CHECK-NEXT:    vmov r0, r1, d0
70 ; CHECK-NEXT:    vmov r2, r3, d1
71 ; CHECK-NEXT:    bx lr
72 entry:
73   %c = icmp eq <16 x i8> %src, zeroinitializer
74   %sh = shufflevector <16 x i1> %c, <16 x i1> undef, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
75   %s = select <16 x i1> %sh, <16 x i8> %a, <16 x i8> %b
76   ret <16 x i8> %s
79 define <4 x i32> @shuffle2_v4i32(<4 x i32> %src, <4 x i32> %a, <4 x i32> %b) {
80 ; CHECK-LABEL: shuffle2_v4i32:
81 ; CHECK:       @ %bb.0: @ %entry
82 ; CHECK-NEXT:    vmov d1, r2, r3
83 ; CHECK-NEXT:    vmov d0, r0, r1
84 ; CHECK-NEXT:    add r0, sp, #16
85 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
86 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
87 ; CHECK-NEXT:    mov r0, sp
88 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
89 ; CHECK-NEXT:    vpsel q0, q1, q0
90 ; CHECK-NEXT:    vmov r0, r1, d0
91 ; CHECK-NEXT:    vmov r2, r3, d1
92 ; CHECK-NEXT:    bx lr
93 entry:
94   %c = icmp eq <4 x i32> %src, zeroinitializer
95   %sh = shufflevector <4 x i1> %c, <4 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
96   %s = select <4 x i1> %sh, <4 x i32> %a, <4 x i32> %b
97   ret <4 x i32> %s
100 define <8 x i16> @shuffle2_v8i16(<8 x i16> %src, <8 x i16> %a, <8 x i16> %b) {
101 ; CHECK-LABEL: shuffle2_v8i16:
102 ; CHECK:       @ %bb.0: @ %entry
103 ; CHECK-NEXT:    vmov d1, r2, r3
104 ; CHECK-NEXT:    vmov d0, r0, r1
105 ; CHECK-NEXT:    add r0, sp, #16
106 ; CHECK-NEXT:    vcmp.i16 eq, q0, zr
107 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
108 ; CHECK-NEXT:    mov r0, sp
109 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
110 ; CHECK-NEXT:    vpsel q0, q1, q0
111 ; CHECK-NEXT:    vmov r0, r1, d0
112 ; CHECK-NEXT:    vmov r2, r3, d1
113 ; CHECK-NEXT:    bx lr
114 entry:
115   %c = icmp eq <8 x i16> %src, zeroinitializer
116   %sh = shufflevector <8 x i1> %c, <8 x i1> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
117   %s = select <8 x i1> %sh, <8 x i16> %a, <8 x i16> %b
118   ret <8 x i16> %s
121 define <16 x i8> @shuffle2_v16i8(<16 x i8> %src, <16 x i8> %a, <16 x i8> %b) {
122 ; CHECK-LABEL: shuffle2_v16i8:
123 ; CHECK:       @ %bb.0: @ %entry
124 ; CHECK-NEXT:    vmov d1, r2, r3
125 ; CHECK-NEXT:    vmov d0, r0, r1
126 ; CHECK-NEXT:    add r0, sp, #16
127 ; CHECK-NEXT:    vcmp.i8 eq, q0, zr
128 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
129 ; CHECK-NEXT:    mov r0, sp
130 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
131 ; CHECK-NEXT:    vpsel q0, q1, q0
132 ; CHECK-NEXT:    vmov r0, r1, d0
133 ; CHECK-NEXT:    vmov r2, r3, d1
134 ; CHECK-NEXT:    bx lr
135 entry:
136   %c = icmp eq <16 x i8> %src, zeroinitializer
137   %sh = shufflevector <16 x i1> %c, <16 x i1> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
138   %s = select <16 x i1> %sh, <16 x i8> %a, <16 x i8> %b
139   ret <16 x i8> %s
142 define <4 x i32> @shuffle3_v4i32(<4 x i32> %src, <4 x i32> %a, <4 x i32> %b) {
143 ; CHECK-LABEL: shuffle3_v4i32:
144 ; CHECK:       @ %bb.0: @ %entry
145 ; CHECK-NEXT:    vmov d1, r2, r3
146 ; CHECK-NEXT:    vmov.i8 q1, #0xff
147 ; CHECK-NEXT:    vmov d0, r0, r1
148 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
149 ; CHECK-NEXT:    vmov.i8 q0, #0x0
150 ; CHECK-NEXT:    vpsel q0, q1, q0
151 ; CHECK-NEXT:    vmov.32 r0, q0[0]
152 ; CHECK-NEXT:    vdup.32 q0, r0
153 ; CHECK-NEXT:    add r0, sp, #16
154 ; CHECK-NEXT:    vcmp.i32 ne, q0, zr
155 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
156 ; CHECK-NEXT:    mov r0, sp
157 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
158 ; CHECK-NEXT:    vpsel q0, q1, q0
159 ; CHECK-NEXT:    vmov r0, r1, d0
160 ; CHECK-NEXT:    vmov r2, r3, d1
161 ; CHECK-NEXT:    bx lr
162 entry:
163   %c = icmp eq <4 x i32> %src, zeroinitializer
164   %sh = shufflevector <4 x i1> %c, <4 x i1> undef, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
165   %s = select <4 x i1> %sh, <4 x i32> %a, <4 x i32> %b
166   ret <4 x i32> %s
169 define <8 x i16> @shuffle3_v8i16(<8 x i16> %src, <8 x i16> %a, <8 x i16> %b) {
170 ; CHECK-LABEL: shuffle3_v8i16:
171 ; CHECK:       @ %bb.0: @ %entry
172 ; CHECK-NEXT:    vmov d1, r2, r3
173 ; CHECK-NEXT:    vmov.i8 q1, #0xff
174 ; CHECK-NEXT:    vmov d0, r0, r1
175 ; CHECK-NEXT:    vcmp.i16 eq, q0, zr
176 ; CHECK-NEXT:    vmov.i8 q0, #0x0
177 ; CHECK-NEXT:    vpsel q0, q1, q0
178 ; CHECK-NEXT:    vmov.u16 r0, q0[0]
179 ; CHECK-NEXT:    vdup.16 q0, r0
180 ; CHECK-NEXT:    add r0, sp, #16
181 ; CHECK-NEXT:    vcmp.i16 ne, q0, zr
182 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
183 ; CHECK-NEXT:    mov r0, sp
184 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
185 ; CHECK-NEXT:    vpsel q0, q1, q0
186 ; CHECK-NEXT:    vmov r0, r1, d0
187 ; CHECK-NEXT:    vmov r2, r3, d1
188 ; CHECK-NEXT:    bx lr
189 entry:
190   %c = icmp eq <8 x i16> %src, zeroinitializer
191   %sh = shufflevector <8 x i1> %c, <8 x i1> undef, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
192   %s = select <8 x i1> %sh, <8 x i16> %a, <8 x i16> %b
193   ret <8 x i16> %s
196 define <16 x i8> @shuffle3_v16i8(<16 x i8> %src, <16 x i8> %a, <16 x i8> %b) {
197 ; CHECK-LABEL: shuffle3_v16i8:
198 ; CHECK:       @ %bb.0: @ %entry
199 ; CHECK-NEXT:    vmov d1, r2, r3
200 ; CHECK-NEXT:    vmov.i8 q1, #0xff
201 ; CHECK-NEXT:    vmov d0, r0, r1
202 ; CHECK-NEXT:    vcmp.i8 eq, q0, zr
203 ; CHECK-NEXT:    vmov.i8 q0, #0x0
204 ; CHECK-NEXT:    vpsel q0, q1, q0
205 ; CHECK-NEXT:    vmov.u8 r0, q0[0]
206 ; CHECK-NEXT:    vdup.8 q0, r0
207 ; CHECK-NEXT:    add r0, sp, #16
208 ; CHECK-NEXT:    vcmp.i8 ne, q0, zr
209 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
210 ; CHECK-NEXT:    mov r0, sp
211 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
212 ; CHECK-NEXT:    vpsel q0, q1, q0
213 ; CHECK-NEXT:    vmov r0, r1, d0
214 ; CHECK-NEXT:    vmov r2, r3, d1
215 ; CHECK-NEXT:    bx lr
216 entry:
217   %c = icmp eq <16 x i8> %src, zeroinitializer
218   %sh = shufflevector <16 x i1> %c, <16 x i1> undef, <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
219   %s = select <16 x i1> %sh, <16 x i8> %a, <16 x i8> %b
220   ret <16 x i8> %s
223 define <4 x i32> @shuffle4_v4i32(<4 x i32> %src, <4 x i32> %a, <4 x i32> %b) {
224 ; CHECK-LABEL: shuffle4_v4i32:
225 ; CHECK:       @ %bb.0: @ %entry
226 ; CHECK-NEXT:    vmov d1, r2, r3
227 ; CHECK-NEXT:    vmov.i8 q1, #0xff
228 ; CHECK-NEXT:    vmov d0, r0, r1
229 ; CHECK-NEXT:    add r0, sp, #16
230 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
231 ; CHECK-NEXT:    vmov.i8 q0, #0x0
232 ; CHECK-NEXT:    vpsel q0, q1, q0
233 ; CHECK-NEXT:    vmov.f32 s4, s0
234 ; CHECK-NEXT:    vmov.f32 s5, s0
235 ; CHECK-NEXT:    vmov.f32 s6, s0
236 ; CHECK-NEXT:    vmov.f32 s7, s1
237 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
238 ; CHECK-NEXT:    mov r0, sp
239 ; CHECK-NEXT:    vcmp.i32 ne, q1, zr
240 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
241 ; CHECK-NEXT:    vpsel q0, q1, q0
242 ; CHECK-NEXT:    vmov r0, r1, d0
243 ; CHECK-NEXT:    vmov r2, r3, d1
244 ; CHECK-NEXT:    bx lr
245 entry:
246   %c = icmp eq <4 x i32> %src, zeroinitializer
247   %sh = shufflevector <4 x i1> %c, <4 x i1> undef, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
248   %s = select <4 x i1> %sh, <4 x i32> %a, <4 x i32> %b
249   ret <4 x i32> %s
252 define <8 x i16> @shuffle4_v8i16(<8 x i16> %src, <8 x i16> %a, <8 x i16> %b) {
253 ; CHECK-LABEL: shuffle4_v8i16:
254 ; CHECK:       @ %bb.0: @ %entry
255 ; CHECK-NEXT:    vmov d1, r2, r3
256 ; CHECK-NEXT:    vmov.i8 q1, #0xff
257 ; CHECK-NEXT:    vmov d0, r0, r1
258 ; CHECK-NEXT:    vcmp.i16 eq, q0, zr
259 ; CHECK-NEXT:    vmov.i8 q0, #0x0
260 ; CHECK-NEXT:    vpsel q0, q1, q0
261 ; CHECK-NEXT:    vmov.u16 r0, q0[0]
262 ; CHECK-NEXT:    vdup.16 q1, r0
263 ; CHECK-NEXT:    vmov.u16 r0, q0[1]
264 ; CHECK-NEXT:    vmov.16 q1[7], r0
265 ; CHECK-NEXT:    add r0, sp, #16
266 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
267 ; CHECK-NEXT:    mov r0, sp
268 ; CHECK-NEXT:    vcmp.i16 ne, q1, zr
269 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
270 ; CHECK-NEXT:    vpsel q0, q1, q0
271 ; CHECK-NEXT:    vmov r0, r1, d0
272 ; CHECK-NEXT:    vmov r2, r3, d1
273 ; CHECK-NEXT:    bx lr
274 entry:
275   %c = icmp eq <8 x i16> %src, zeroinitializer
276   %sh = shufflevector <8 x i1> %c, <8 x i1> undef, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1>
277   %s = select <8 x i1> %sh, <8 x i16> %a, <8 x i16> %b
278   ret <8 x i16> %s
281 define <16 x i8> @shuffle4_v16i8(<16 x i8> %src, <16 x i8> %a, <16 x i8> %b) {
282 ; CHECK-LABEL: shuffle4_v16i8:
283 ; CHECK:       @ %bb.0: @ %entry
284 ; CHECK-NEXT:    vmov d1, r2, r3
285 ; CHECK-NEXT:    vmov.i8 q1, #0xff
286 ; CHECK-NEXT:    vmov d0, r0, r1
287 ; CHECK-NEXT:    vcmp.i8 eq, q0, zr
288 ; CHECK-NEXT:    vmov.i8 q0, #0x0
289 ; CHECK-NEXT:    vpsel q0, q1, q0
290 ; CHECK-NEXT:    vmov.u8 r0, q0[0]
291 ; CHECK-NEXT:    vdup.8 q1, r0
292 ; CHECK-NEXT:    vmov.u8 r0, q0[1]
293 ; CHECK-NEXT:    vmov.8 q1[15], r0
294 ; CHECK-NEXT:    add r0, sp, #16
295 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
296 ; CHECK-NEXT:    mov r0, sp
297 ; CHECK-NEXT:    vcmp.i8 ne, q1, zr
298 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
299 ; CHECK-NEXT:    vpsel q0, q1, q0
300 ; CHECK-NEXT:    vmov r0, r1, d0
301 ; CHECK-NEXT:    vmov r2, r3, d1
302 ; CHECK-NEXT:    bx lr
303 entry:
304   %c = icmp eq <16 x i8> %src, zeroinitializer
305   %sh = shufflevector <16 x i1> %c, <16 x i1> undef, <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 1>
306   %s = select <16 x i1> %sh, <16 x i8> %a, <16 x i8> %b
307   ret <16 x i8> %s
310 define <4 x i32> @shuffle5_b_v4i32(<8 x i16> %src, <4 x i32> %a, <4 x i32> %b) {
311 ; CHECK-LABEL: shuffle5_b_v4i32:
312 ; CHECK:       @ %bb.0: @ %entry
313 ; CHECK-NEXT:    vmov d1, r2, r3
314 ; CHECK-NEXT:    vmov.i8 q1, #0xff
315 ; CHECK-NEXT:    vmov d0, r0, r1
316 ; CHECK-NEXT:    vcmp.i16 eq, q0, zr
317 ; CHECK-NEXT:    vmov.i8 q0, #0x0
318 ; CHECK-NEXT:    vpsel q0, q1, q0
319 ; CHECK-NEXT:    vmov.u16 r0, q0[0]
320 ; CHECK-NEXT:    vmov.32 q1[0], r0
321 ; CHECK-NEXT:    vmov.u16 r0, q0[1]
322 ; CHECK-NEXT:    vmov.32 q1[1], r0
323 ; CHECK-NEXT:    vmov.u16 r0, q0[2]
324 ; CHECK-NEXT:    vmov.32 q1[2], r0
325 ; CHECK-NEXT:    vmov.u16 r0, q0[3]
326 ; CHECK-NEXT:    vmov.32 q1[3], r0
327 ; CHECK-NEXT:    add r0, sp, #16
328 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
329 ; CHECK-NEXT:    mov r0, sp
330 ; CHECK-NEXT:    vcmp.i32 ne, q1, zr
331 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
332 ; CHECK-NEXT:    vpsel q0, q1, q0
333 ; CHECK-NEXT:    vmov r0, r1, d0
334 ; CHECK-NEXT:    vmov r2, r3, d1
335 ; CHECK-NEXT:    bx lr
336 entry:
337   %c = icmp eq <8 x i16> %src, zeroinitializer
338   %sh = shufflevector <8 x i1> %c, <8 x i1> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
339   %s = select <4 x i1> %sh, <4 x i32> %a, <4 x i32> %b
340   ret <4 x i32> %s
343 define <4 x i32> @shuffle5_t_v4i32(<8 x i16> %src, <4 x i32> %a, <4 x i32> %b) {
344 ; CHECK-LABEL: shuffle5_t_v4i32:
345 ; CHECK:       @ %bb.0: @ %entry
346 ; CHECK-NEXT:    vmov d1, r2, r3
347 ; CHECK-NEXT:    vmov.i8 q1, #0xff
348 ; CHECK-NEXT:    vmov d0, r0, r1
349 ; CHECK-NEXT:    vcmp.i16 eq, q0, zr
350 ; CHECK-NEXT:    vmov.i8 q0, #0x0
351 ; CHECK-NEXT:    vpsel q0, q1, q0
352 ; CHECK-NEXT:    vmov.u16 r0, q0[4]
353 ; CHECK-NEXT:    vmov.32 q1[0], r0
354 ; CHECK-NEXT:    vmov.u16 r0, q0[5]
355 ; CHECK-NEXT:    vmov.32 q1[1], r0
356 ; CHECK-NEXT:    vmov.u16 r0, q0[6]
357 ; CHECK-NEXT:    vmov.32 q1[2], r0
358 ; CHECK-NEXT:    vmov.u16 r0, q0[7]
359 ; CHECK-NEXT:    vmov.32 q1[3], r0
360 ; CHECK-NEXT:    add r0, sp, #16
361 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
362 ; CHECK-NEXT:    mov r0, sp
363 ; CHECK-NEXT:    vcmp.i32 ne, q1, zr
364 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
365 ; CHECK-NEXT:    vpsel q0, q1, q0
366 ; CHECK-NEXT:    vmov r0, r1, d0
367 ; CHECK-NEXT:    vmov r2, r3, d1
368 ; CHECK-NEXT:    bx lr
369 entry:
370   %c = icmp eq <8 x i16> %src, zeroinitializer
371   %sh = shufflevector <8 x i1> %c, <8 x i1> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
372   %s = select <4 x i1> %sh, <4 x i32> %a, <4 x i32> %b
373   ret <4 x i32> %s
376 define <8 x i16> @shuffle5_b_v8i16(<16 x i8> %src, <8 x i16> %a, <8 x i16> %b) {
377 ; CHECK-LABEL: shuffle5_b_v8i16:
378 ; CHECK:       @ %bb.0: @ %entry
379 ; CHECK-NEXT:    vmov d1, r2, r3
380 ; CHECK-NEXT:    vmov.i8 q1, #0xff
381 ; CHECK-NEXT:    vmov d0, r0, r1
382 ; CHECK-NEXT:    vcmp.i8 eq, q0, zr
383 ; CHECK-NEXT:    vmov.i8 q0, #0x0
384 ; CHECK-NEXT:    vpsel q1, q1, q0
385 ; CHECK-NEXT:    vmov.u8 r0, q1[0]
386 ; CHECK-NEXT:    vmov.16 q0[0], r0
387 ; CHECK-NEXT:    vmov.u8 r0, q1[1]
388 ; CHECK-NEXT:    vmov.16 q0[1], r0
389 ; CHECK-NEXT:    vmov.u8 r0, q1[2]
390 ; CHECK-NEXT:    vmov.16 q0[2], r0
391 ; CHECK-NEXT:    vmov.u8 r0, q1[3]
392 ; CHECK-NEXT:    vmov.16 q0[3], r0
393 ; CHECK-NEXT:    vmov.u8 r0, q1[4]
394 ; CHECK-NEXT:    vmov.16 q0[4], r0
395 ; CHECK-NEXT:    vmov.u8 r0, q1[5]
396 ; CHECK-NEXT:    vmov.16 q0[5], r0
397 ; CHECK-NEXT:    vmov.u8 r0, q1[6]
398 ; CHECK-NEXT:    vmov.16 q0[6], r0
399 ; CHECK-NEXT:    vmov.u8 r0, q1[7]
400 ; CHECK-NEXT:    vmov.16 q0[7], r0
401 ; CHECK-NEXT:    add r0, sp, #16
402 ; CHECK-NEXT:    vcmp.i16 ne, q0, zr
403 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
404 ; CHECK-NEXT:    mov r0, sp
405 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
406 ; CHECK-NEXT:    vpsel q0, q1, q0
407 ; CHECK-NEXT:    vmov r0, r1, d0
408 ; CHECK-NEXT:    vmov r2, r3, d1
409 ; CHECK-NEXT:    bx lr
410 entry:
411   %c = icmp eq <16 x i8> %src, zeroinitializer
412   %sh = shufflevector <16 x i1> %c, <16 x i1> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
413   %s = select <8 x i1> %sh, <8 x i16> %a, <8 x i16> %b
414   ret <8 x i16> %s
417 define <8 x i16> @shuffle5_t_v8i16(<16 x i8> %src, <8 x i16> %a, <8 x i16> %b) {
418 ; CHECK-LABEL: shuffle5_t_v8i16:
419 ; CHECK:       @ %bb.0: @ %entry
420 ; CHECK-NEXT:    vmov d1, r2, r3
421 ; CHECK-NEXT:    vmov.i8 q1, #0xff
422 ; CHECK-NEXT:    vmov d0, r0, r1
423 ; CHECK-NEXT:    vcmp.i8 eq, q0, zr
424 ; CHECK-NEXT:    vmov.i8 q0, #0x0
425 ; CHECK-NEXT:    vpsel q1, q1, q0
426 ; CHECK-NEXT:    vmov.u8 r0, q1[8]
427 ; CHECK-NEXT:    vmov.16 q0[0], r0
428 ; CHECK-NEXT:    vmov.u8 r0, q1[9]
429 ; CHECK-NEXT:    vmov.16 q0[1], r0
430 ; CHECK-NEXT:    vmov.u8 r0, q1[10]
431 ; CHECK-NEXT:    vmov.16 q0[2], r0
432 ; CHECK-NEXT:    vmov.u8 r0, q1[11]
433 ; CHECK-NEXT:    vmov.16 q0[3], r0
434 ; CHECK-NEXT:    vmov.u8 r0, q1[12]
435 ; CHECK-NEXT:    vmov.16 q0[4], r0
436 ; CHECK-NEXT:    vmov.u8 r0, q1[13]
437 ; CHECK-NEXT:    vmov.16 q0[5], r0
438 ; CHECK-NEXT:    vmov.u8 r0, q1[14]
439 ; CHECK-NEXT:    vmov.16 q0[6], r0
440 ; CHECK-NEXT:    vmov.u8 r0, q1[15]
441 ; CHECK-NEXT:    vmov.16 q0[7], r0
442 ; CHECK-NEXT:    add r0, sp, #16
443 ; CHECK-NEXT:    vcmp.i16 ne, q0, zr
444 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
445 ; CHECK-NEXT:    mov r0, sp
446 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
447 ; CHECK-NEXT:    vpsel q0, q1, q0
448 ; CHECK-NEXT:    vmov r0, r1, d0
449 ; CHECK-NEXT:    vmov r2, r3, d1
450 ; CHECK-NEXT:    bx lr
451 entry:
452   %c = icmp eq <16 x i8> %src, zeroinitializer
453   %sh = shufflevector <16 x i1> %c, <16 x i1> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
454   %s = select <8 x i1> %sh, <8 x i16> %a, <8 x i16> %b
455   ret <8 x i16> %s
458 define <8 x i16> @shuffle6_v4i32(<4 x i32> %src1, <4 x i32> %src2, <8 x i16> %a, <8 x i16> %b) {
459 ; CHECK-LABEL: shuffle6_v4i32:
460 ; CHECK:       @ %bb.0: @ %entry
461 ; CHECK-NEXT:    vmov d1, r2, r3
462 ; CHECK-NEXT:    vmov.i8 q1, #0x0
463 ; CHECK-NEXT:    vmov d0, r0, r1
464 ; CHECK-NEXT:    vmov.i8 q2, #0xff
465 ; CHECK-NEXT:    vcmp.i32 eq, q0, zr
466 ; CHECK-NEXT:    vpsel q3, q2, q1
467 ; CHECK-NEXT:    vmov r0, s12
468 ; CHECK-NEXT:    vmov.16 q0[0], r0
469 ; CHECK-NEXT:    vmov r0, s13
470 ; CHECK-NEXT:    vmov.16 q0[1], r0
471 ; CHECK-NEXT:    vmov r0, s14
472 ; CHECK-NEXT:    vmov.16 q0[2], r0
473 ; CHECK-NEXT:    vmov r0, s15
474 ; CHECK-NEXT:    vmov.16 q0[3], r0
475 ; CHECK-NEXT:    mov r0, sp
476 ; CHECK-NEXT:    vldrw.u32 q3, [r0]
477 ; CHECK-NEXT:    vcmp.i32 eq, q3, zr
478 ; CHECK-NEXT:    vpsel q1, q2, q1
479 ; CHECK-NEXT:    vmov r0, s4
480 ; CHECK-NEXT:    vmov.16 q0[4], r0
481 ; CHECK-NEXT:    vmov r0, s5
482 ; CHECK-NEXT:    vmov.16 q0[5], r0
483 ; CHECK-NEXT:    vmov r0, s6
484 ; CHECK-NEXT:    vmov.16 q0[6], r0
485 ; CHECK-NEXT:    vmov r0, s7
486 ; CHECK-NEXT:    vmov.16 q0[7], r0
487 ; CHECK-NEXT:    add r0, sp, #32
488 ; CHECK-NEXT:    vcmp.i16 ne, q0, zr
489 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
490 ; CHECK-NEXT:    add r0, sp, #16
491 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
492 ; CHECK-NEXT:    vpsel q0, q1, q0
493 ; CHECK-NEXT:    vmov r0, r1, d0
494 ; CHECK-NEXT:    vmov r2, r3, d1
495 ; CHECK-NEXT:    bx lr
496 entry:
497   %c1 = icmp eq <4 x i32> %src1, zeroinitializer
498   %c2 = icmp eq <4 x i32> %src2, zeroinitializer
499   %sh = shufflevector <4 x i1> %c1, <4 x i1> %c2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
500   %s = select <8 x i1> %sh, <8 x i16> %a, <8 x i16> %b
501   ret <8 x i16> %s
504 define <16 x i8> @shuffle6_v8i16(<8 x i16> %src1, <8 x i16> %src2, <16 x i8> %a, <16 x i8> %b) {
505 ; CHECK-LABEL: shuffle6_v8i16:
506 ; CHECK:       @ %bb.0: @ %entry
507 ; CHECK-NEXT:    vmov d1, r2, r3
508 ; CHECK-NEXT:    vmov.i8 q1, #0x0
509 ; CHECK-NEXT:    vmov d0, r0, r1
510 ; CHECK-NEXT:    vmov.i8 q2, #0xff
511 ; CHECK-NEXT:    vcmp.i16 eq, q0, zr
512 ; CHECK-NEXT:    vpsel q3, q2, q1
513 ; CHECK-NEXT:    vmov.u16 r0, q3[0]
514 ; CHECK-NEXT:    vmov.8 q0[0], r0
515 ; CHECK-NEXT:    vmov.u16 r0, q3[1]
516 ; CHECK-NEXT:    vmov.8 q0[1], r0
517 ; CHECK-NEXT:    vmov.u16 r0, q3[2]
518 ; CHECK-NEXT:    vmov.8 q0[2], r0
519 ; CHECK-NEXT:    vmov.u16 r0, q3[3]
520 ; CHECK-NEXT:    vmov.8 q0[3], r0
521 ; CHECK-NEXT:    vmov.u16 r0, q3[4]
522 ; CHECK-NEXT:    vmov.8 q0[4], r0
523 ; CHECK-NEXT:    vmov.u16 r0, q3[5]
524 ; CHECK-NEXT:    vmov.8 q0[5], r0
525 ; CHECK-NEXT:    vmov.u16 r0, q3[6]
526 ; CHECK-NEXT:    vmov.8 q0[6], r0
527 ; CHECK-NEXT:    vmov.u16 r0, q3[7]
528 ; CHECK-NEXT:    vmov.8 q0[7], r0
529 ; CHECK-NEXT:    mov r0, sp
530 ; CHECK-NEXT:    vldrw.u32 q3, [r0]
531 ; CHECK-NEXT:    vcmp.i16 eq, q3, zr
532 ; CHECK-NEXT:    vpsel q1, q2, q1
533 ; CHECK-NEXT:    vmov.u16 r0, q1[0]
534 ; CHECK-NEXT:    vmov.8 q0[8], r0
535 ; CHECK-NEXT:    vmov.u16 r0, q1[1]
536 ; CHECK-NEXT:    vmov.8 q0[9], r0
537 ; CHECK-NEXT:    vmov.u16 r0, q1[2]
538 ; CHECK-NEXT:    vmov.8 q0[10], r0
539 ; CHECK-NEXT:    vmov.u16 r0, q1[3]
540 ; CHECK-NEXT:    vmov.8 q0[11], r0
541 ; CHECK-NEXT:    vmov.u16 r0, q1[4]
542 ; CHECK-NEXT:    vmov.8 q0[12], r0
543 ; CHECK-NEXT:    vmov.u16 r0, q1[5]
544 ; CHECK-NEXT:    vmov.8 q0[13], r0
545 ; CHECK-NEXT:    vmov.u16 r0, q1[6]
546 ; CHECK-NEXT:    vmov.8 q0[14], r0
547 ; CHECK-NEXT:    vmov.u16 r0, q1[7]
548 ; CHECK-NEXT:    vmov.8 q0[15], r0
549 ; CHECK-NEXT:    add r0, sp, #32
550 ; CHECK-NEXT:    vcmp.i8 ne, q0, zr
551 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
552 ; CHECK-NEXT:    add r0, sp, #16
553 ; CHECK-NEXT:    vldrw.u32 q1, [r0]
554 ; CHECK-NEXT:    vpsel q0, q1, q0
555 ; CHECK-NEXT:    vmov r0, r1, d0
556 ; CHECK-NEXT:    vmov r2, r3, d1
557 ; CHECK-NEXT:    bx lr
558 entry:
559   %c1 = icmp eq <8 x i16> %src1, zeroinitializer
560   %c2 = icmp eq <8 x i16> %src2, zeroinitializer
561   %sh = shufflevector <8 x i1> %c1, <8 x i1> %c2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
562   %s = select <16 x i1> %sh, <16 x i8> %a, <16 x i8> %b
563   ret <16 x i8> %s