blob: 06361d95212053661da7a8daf49ab8ad6ee7aab1 [file] [log] [blame]
David Green93b5f612019-07-24 16:58:41 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
David Greeneecba952020-04-22 16:33:11 +01002; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s
David Green93b5f612019-07-24 16:58:41 +00003
4define arm_aapcs_vfpcc <4 x i32> @vcmp_eq_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
5; CHECK-LABEL: vcmp_eq_v4i32:
6; CHECK: @ %bb.0: @ %entry
7; CHECK-NEXT: vcmp.i32 eq, q0, r0
8; CHECK-NEXT: vpsel q0, q1, q2
9; CHECK-NEXT: bx lr
10entry:
11 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
12 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
13 %c = icmp eq <4 x i32> %src, %sp
14 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
15 ret <4 x i32> %s
16}
17
18define arm_aapcs_vfpcc <4 x i32> @vcmp_ne_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
19; CHECK-LABEL: vcmp_ne_v4i32:
20; CHECK: @ %bb.0: @ %entry
21; CHECK-NEXT: vcmp.i32 ne, q0, r0
22; CHECK-NEXT: vpsel q0, q1, q2
23; CHECK-NEXT: bx lr
24entry:
25 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
26 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
27 %c = icmp ne <4 x i32> %src, %sp
28 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
29 ret <4 x i32> %s
30}
31
32define arm_aapcs_vfpcc <4 x i32> @vcmp_sgt_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
33; CHECK-LABEL: vcmp_sgt_v4i32:
34; CHECK: @ %bb.0: @ %entry
35; CHECK-NEXT: vcmp.s32 gt, q0, r0
36; CHECK-NEXT: vpsel q0, q1, q2
37; CHECK-NEXT: bx lr
38entry:
39 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
40 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
41 %c = icmp sgt <4 x i32> %src, %sp
42 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
43 ret <4 x i32> %s
44}
45
46define arm_aapcs_vfpcc <4 x i32> @vcmp_sge_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
47; CHECK-LABEL: vcmp_sge_v4i32:
48; CHECK: @ %bb.0: @ %entry
49; CHECK-NEXT: vcmp.s32 ge, q0, r0
50; CHECK-NEXT: vpsel q0, q1, q2
51; CHECK-NEXT: bx lr
52entry:
53 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
54 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
55 %c = icmp sge <4 x i32> %src, %sp
56 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
57 ret <4 x i32> %s
58}
59
60define arm_aapcs_vfpcc <4 x i32> @vcmp_slt_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
61; CHECK-LABEL: vcmp_slt_v4i32:
62; CHECK: @ %bb.0: @ %entry
Simon Tathamb0c19002019-11-15 14:05:02 +000063; CHECK-NEXT: vcmp.s32 lt, q0, r0
David Green93b5f612019-07-24 16:58:41 +000064; CHECK-NEXT: vpsel q0, q1, q2
65; CHECK-NEXT: bx lr
66entry:
67 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
68 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
69 %c = icmp slt <4 x i32> %src, %sp
70 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
71 ret <4 x i32> %s
72}
73
74define arm_aapcs_vfpcc <4 x i32> @vcmp_sle_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
75; CHECK-LABEL: vcmp_sle_v4i32:
76; CHECK: @ %bb.0: @ %entry
Simon Tathamb0c19002019-11-15 14:05:02 +000077; CHECK-NEXT: vcmp.s32 le, q0, r0
David Green93b5f612019-07-24 16:58:41 +000078; CHECK-NEXT: vpsel q0, q1, q2
79; CHECK-NEXT: bx lr
80entry:
81 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
82 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
83 %c = icmp sle <4 x i32> %src, %sp
84 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
85 ret <4 x i32> %s
86}
87
88define arm_aapcs_vfpcc <4 x i32> @vcmp_ugt_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
89; CHECK-LABEL: vcmp_ugt_v4i32:
90; CHECK: @ %bb.0: @ %entry
91; CHECK-NEXT: vcmp.u32 hi, q0, r0
92; CHECK-NEXT: vpsel q0, q1, q2
93; CHECK-NEXT: bx lr
94entry:
95 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
96 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
97 %c = icmp ugt <4 x i32> %src, %sp
98 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
99 ret <4 x i32> %s
100}
101
102define arm_aapcs_vfpcc <4 x i32> @vcmp_uge_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
103; CHECK-LABEL: vcmp_uge_v4i32:
104; CHECK: @ %bb.0: @ %entry
105; CHECK-NEXT: vcmp.u32 cs, q0, r0
106; CHECK-NEXT: vpsel q0, q1, q2
107; CHECK-NEXT: bx lr
108entry:
109 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
110 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
111 %c = icmp uge <4 x i32> %src, %sp
112 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
113 ret <4 x i32> %s
114}
115
116define arm_aapcs_vfpcc <4 x i32> @vcmp_ult_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
117; CHECK-LABEL: vcmp_ult_v4i32:
118; CHECK: @ %bb.0: @ %entry
119; CHECK-NEXT: vdup.32 q3, r0
120; CHECK-NEXT: vcmp.u32 hi, q3, q0
121; CHECK-NEXT: vpsel q0, q1, q2
122; CHECK-NEXT: bx lr
123entry:
124 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
125 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
126 %c = icmp ult <4 x i32> %src, %sp
127 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
128 ret <4 x i32> %s
129}
130
131define arm_aapcs_vfpcc <4 x i32> @vcmp_ule_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
132; CHECK-LABEL: vcmp_ule_v4i32:
133; CHECK: @ %bb.0: @ %entry
134; CHECK-NEXT: vdup.32 q3, r0
135; CHECK-NEXT: vcmp.u32 cs, q3, q0
136; CHECK-NEXT: vpsel q0, q1, q2
137; CHECK-NEXT: bx lr
138entry:
139 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
140 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
141 %c = icmp ule <4 x i32> %src, %sp
142 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
143 ret <4 x i32> %s
144}
145
146
147define arm_aapcs_vfpcc <8 x i16> @vcmp_eq_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
148; CHECK-LABEL: vcmp_eq_v8i16:
149; CHECK: @ %bb.0: @ %entry
150; CHECK-NEXT: vcmp.i16 eq, q0, r0
151; CHECK-NEXT: vpsel q0, q1, q2
152; CHECK-NEXT: bx lr
153entry:
154 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
155 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
156 %c = icmp eq <8 x i16> %src, %sp
157 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
158 ret <8 x i16> %s
159}
160
161define arm_aapcs_vfpcc <8 x i16> @vcmp_ne_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
162; CHECK-LABEL: vcmp_ne_v8i16:
163; CHECK: @ %bb.0: @ %entry
164; CHECK-NEXT: vcmp.i16 ne, q0, r0
165; CHECK-NEXT: vpsel q0, q1, q2
166; CHECK-NEXT: bx lr
167entry:
168 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
169 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
170 %c = icmp ne <8 x i16> %src, %sp
171 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
172 ret <8 x i16> %s
173}
174
175define arm_aapcs_vfpcc <8 x i16> @vcmp_sgt_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
176; CHECK-LABEL: vcmp_sgt_v8i16:
177; CHECK: @ %bb.0: @ %entry
178; CHECK-NEXT: vcmp.s16 gt, q0, r0
179; CHECK-NEXT: vpsel q0, q1, q2
180; CHECK-NEXT: bx lr
181entry:
182 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
183 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
184 %c = icmp sgt <8 x i16> %src, %sp
185 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
186 ret <8 x i16> %s
187}
188
189define arm_aapcs_vfpcc <8 x i16> @vcmp_sge_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
190; CHECK-LABEL: vcmp_sge_v8i16:
191; CHECK: @ %bb.0: @ %entry
192; CHECK-NEXT: vcmp.s16 ge, q0, r0
193; CHECK-NEXT: vpsel q0, q1, q2
194; CHECK-NEXT: bx lr
195entry:
196 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
197 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
198 %c = icmp sge <8 x i16> %src, %sp
199 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
200 ret <8 x i16> %s
201}
202
203define arm_aapcs_vfpcc <8 x i16> @vcmp_slt_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
204; CHECK-LABEL: vcmp_slt_v8i16:
205; CHECK: @ %bb.0: @ %entry
Simon Tathamb0c19002019-11-15 14:05:02 +0000206; CHECK-NEXT: vcmp.s16 lt, q0, r0
David Green93b5f612019-07-24 16:58:41 +0000207; CHECK-NEXT: vpsel q0, q1, q2
208; CHECK-NEXT: bx lr
209entry:
210 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
211 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
212 %c = icmp slt <8 x i16> %src, %sp
213 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
214 ret <8 x i16> %s
215}
216
217define arm_aapcs_vfpcc <8 x i16> @vcmp_sle_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
218; CHECK-LABEL: vcmp_sle_v8i16:
219; CHECK: @ %bb.0: @ %entry
Simon Tathamb0c19002019-11-15 14:05:02 +0000220; CHECK-NEXT: vcmp.s16 le, q0, r0
David Green93b5f612019-07-24 16:58:41 +0000221; CHECK-NEXT: vpsel q0, q1, q2
222; CHECK-NEXT: bx lr
223entry:
224 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
225 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
226 %c = icmp sle <8 x i16> %src, %sp
227 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
228 ret <8 x i16> %s
229}
230
231define arm_aapcs_vfpcc <8 x i16> @vcmp_ugt_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
232; CHECK-LABEL: vcmp_ugt_v8i16:
233; CHECK: @ %bb.0: @ %entry
234; CHECK-NEXT: vcmp.u16 hi, q0, r0
235; CHECK-NEXT: vpsel q0, q1, q2
236; CHECK-NEXT: bx lr
237entry:
238 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
239 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
240 %c = icmp ugt <8 x i16> %src, %sp
241 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
242 ret <8 x i16> %s
243}
244
245define arm_aapcs_vfpcc <8 x i16> @vcmp_uge_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
246; CHECK-LABEL: vcmp_uge_v8i16:
247; CHECK: @ %bb.0: @ %entry
248; CHECK-NEXT: vcmp.u16 cs, q0, r0
249; CHECK-NEXT: vpsel q0, q1, q2
250; CHECK-NEXT: bx lr
251entry:
252 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
253 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
254 %c = icmp uge <8 x i16> %src, %sp
255 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
256 ret <8 x i16> %s
257}
258
259define arm_aapcs_vfpcc <8 x i16> @vcmp_ult_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
260; CHECK-LABEL: vcmp_ult_v8i16:
261; CHECK: @ %bb.0: @ %entry
262; CHECK-NEXT: vdup.16 q3, r0
263; CHECK-NEXT: vcmp.u16 hi, q3, q0
264; CHECK-NEXT: vpsel q0, q1, q2
265; CHECK-NEXT: bx lr
266entry:
267 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
268 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
269 %c = icmp ult <8 x i16> %src, %sp
270 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
271 ret <8 x i16> %s
272}
273
274define arm_aapcs_vfpcc <8 x i16> @vcmp_ule_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
275; CHECK-LABEL: vcmp_ule_v8i16:
276; CHECK: @ %bb.0: @ %entry
277; CHECK-NEXT: vdup.16 q3, r0
278; CHECK-NEXT: vcmp.u16 cs, q3, q0
279; CHECK-NEXT: vpsel q0, q1, q2
280; CHECK-NEXT: bx lr
281entry:
282 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
283 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
284 %c = icmp ule <8 x i16> %src, %sp
285 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
286 ret <8 x i16> %s
287}
288
289
290define arm_aapcs_vfpcc <16 x i8> @vcmp_eq_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
291; CHECK-LABEL: vcmp_eq_v16i8:
292; CHECK: @ %bb.0: @ %entry
293; CHECK-NEXT: vcmp.i8 eq, q0, r0
294; CHECK-NEXT: vpsel q0, q1, q2
295; CHECK-NEXT: bx lr
296entry:
297 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
298 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
299 %c = icmp eq <16 x i8> %src, %sp
300 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
301 ret <16 x i8> %s
302}
303
304define arm_aapcs_vfpcc <16 x i8> @vcmp_ne_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
305; CHECK-LABEL: vcmp_ne_v16i8:
306; CHECK: @ %bb.0: @ %entry
307; CHECK-NEXT: vcmp.i8 ne, q0, r0
308; CHECK-NEXT: vpsel q0, q1, q2
309; CHECK-NEXT: bx lr
310entry:
311 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
312 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
313 %c = icmp ne <16 x i8> %src, %sp
314 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
315 ret <16 x i8> %s
316}
317
318define arm_aapcs_vfpcc <16 x i8> @vcmp_sgt_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
319; CHECK-LABEL: vcmp_sgt_v16i8:
320; CHECK: @ %bb.0: @ %entry
321; CHECK-NEXT: vcmp.s8 gt, q0, r0
322; CHECK-NEXT: vpsel q0, q1, q2
323; CHECK-NEXT: bx lr
324entry:
325 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
326 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
327 %c = icmp sgt <16 x i8> %src, %sp
328 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
329 ret <16 x i8> %s
330}
331
332define arm_aapcs_vfpcc <16 x i8> @vcmp_sge_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
333; CHECK-LABEL: vcmp_sge_v16i8:
334; CHECK: @ %bb.0: @ %entry
335; CHECK-NEXT: vcmp.s8 ge, q0, r0
336; CHECK-NEXT: vpsel q0, q1, q2
337; CHECK-NEXT: bx lr
338entry:
339 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
340 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
341 %c = icmp sge <16 x i8> %src, %sp
342 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
343 ret <16 x i8> %s
344}
345
346define arm_aapcs_vfpcc <16 x i8> @vcmp_slt_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
347; CHECK-LABEL: vcmp_slt_v16i8:
348; CHECK: @ %bb.0: @ %entry
Simon Tathamb0c19002019-11-15 14:05:02 +0000349; CHECK-NEXT: vcmp.s8 lt, q0, r0
David Green93b5f612019-07-24 16:58:41 +0000350; CHECK-NEXT: vpsel q0, q1, q2
351; CHECK-NEXT: bx lr
352entry:
353 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
354 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
355 %c = icmp slt <16 x i8> %src, %sp
356 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
357 ret <16 x i8> %s
358}
359
360define arm_aapcs_vfpcc <16 x i8> @vcmp_sle_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
361; CHECK-LABEL: vcmp_sle_v16i8:
362; CHECK: @ %bb.0: @ %entry
Simon Tathamb0c19002019-11-15 14:05:02 +0000363; CHECK-NEXT: vcmp.s8 le, q0, r0
David Green93b5f612019-07-24 16:58:41 +0000364; CHECK-NEXT: vpsel q0, q1, q2
365; CHECK-NEXT: bx lr
366entry:
367 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
368 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
369 %c = icmp sle <16 x i8> %src, %sp
370 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
371 ret <16 x i8> %s
372}
373
374define arm_aapcs_vfpcc <16 x i8> @vcmp_ugt_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
375; CHECK-LABEL: vcmp_ugt_v16i8:
376; CHECK: @ %bb.0: @ %entry
377; CHECK-NEXT: vcmp.u8 hi, q0, r0
378; CHECK-NEXT: vpsel q0, q1, q2
379; CHECK-NEXT: bx lr
380entry:
381 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
382 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
383 %c = icmp ugt <16 x i8> %src, %sp
384 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
385 ret <16 x i8> %s
386}
387
388define arm_aapcs_vfpcc <16 x i8> @vcmp_uge_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
389; CHECK-LABEL: vcmp_uge_v16i8:
390; CHECK: @ %bb.0: @ %entry
391; CHECK-NEXT: vcmp.u8 cs, q0, r0
392; CHECK-NEXT: vpsel q0, q1, q2
393; CHECK-NEXT: bx lr
394entry:
395 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
396 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
397 %c = icmp uge <16 x i8> %src, %sp
398 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
399 ret <16 x i8> %s
400}
401
402define arm_aapcs_vfpcc <16 x i8> @vcmp_ult_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
403; CHECK-LABEL: vcmp_ult_v16i8:
404; CHECK: @ %bb.0: @ %entry
405; CHECK-NEXT: vdup.8 q3, r0
406; CHECK-NEXT: vcmp.u8 hi, q3, q0
407; CHECK-NEXT: vpsel q0, q1, q2
408; CHECK-NEXT: bx lr
409entry:
410 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
411 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
412 %c = icmp ult <16 x i8> %src, %sp
413 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
414 ret <16 x i8> %s
415}
416
417define arm_aapcs_vfpcc <16 x i8> @vcmp_ule_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
418; CHECK-LABEL: vcmp_ule_v16i8:
419; CHECK: @ %bb.0: @ %entry
420; CHECK-NEXT: vdup.8 q3, r0
421; CHECK-NEXT: vcmp.u8 cs, q3, q0
422; CHECK-NEXT: vpsel q0, q1, q2
423; CHECK-NEXT: bx lr
424entry:
425 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
426 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
427 %c = icmp ule <16 x i8> %src, %sp
428 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
429 ret <16 x i8> %s
430}
431
432
433define arm_aapcs_vfpcc <2 x i64> @vcmp_eq_v2i64(<2 x i64> %src, i64 %src2, <2 x i64> %a, <2 x i64> %b) {
434; CHECK-LABEL: vcmp_eq_v2i64:
435; CHECK: @ %bb.0: @ %entry
436; CHECK-NEXT: vmov r2, s1
437; CHECK-NEXT: vmov r3, s0
438; CHECK-NEXT: eors r2, r1
439; CHECK-NEXT: eors r3, r0
440; CHECK-NEXT: orrs r2, r3
David Green2f3574c2019-09-03 11:30:54 +0000441; CHECK-NEXT: cset r2, eq
David Green57cc65ff2019-09-03 10:53:07 +0000442; CHECK-NEXT: tst.w r2, #1
David Green2f3574c2019-09-03 11:30:54 +0000443; CHECK-NEXT: csetm r2, ne
David Green93b5f612019-07-24 16:58:41 +0000444; CHECK-NEXT: vmov.32 q3[0], r2
445; CHECK-NEXT: vmov.32 q3[1], r2
446; CHECK-NEXT: vmov r2, s3
447; CHECK-NEXT: eors r1, r2
448; CHECK-NEXT: vmov r2, s2
449; CHECK-NEXT: eors r0, r2
450; CHECK-NEXT: orrs r0, r1
David Green2f3574c2019-09-03 11:30:54 +0000451; CHECK-NEXT: cset r0, eq
David Green57cc65ff2019-09-03 10:53:07 +0000452; CHECK-NEXT: tst.w r0, #1
David Green2f3574c2019-09-03 11:30:54 +0000453; CHECK-NEXT: csetm r0, ne
David Green93b5f612019-07-24 16:58:41 +0000454; CHECK-NEXT: vmov.32 q3[2], r0
455; CHECK-NEXT: vmov.32 q3[3], r0
456; CHECK-NEXT: vbic q0, q2, q3
457; CHECK-NEXT: vand q1, q1, q3
458; CHECK-NEXT: vorr q0, q1, q0
459; CHECK-NEXT: bx lr
460entry:
461 %i = insertelement <2 x i64> undef, i64 %src2, i32 0
462 %sp = shufflevector <2 x i64> %i, <2 x i64> undef, <2 x i32> zeroinitializer
463 %c = icmp eq <2 x i64> %src, %sp
464 %s = select <2 x i1> %c, <2 x i64> %a, <2 x i64> %b
465 ret <2 x i64> %s
466}
467
468define arm_aapcs_vfpcc <2 x i32> @vcmp_eq_v2i32(<2 x i64> %src, i64 %src2, <2 x i32> %a, <2 x i32> %b) {
469; CHECK-LABEL: vcmp_eq_v2i32:
470; CHECK: @ %bb.0: @ %entry
471; CHECK-NEXT: vmov r2, s1
472; CHECK-NEXT: vmov r3, s0
473; CHECK-NEXT: eors r2, r1
474; CHECK-NEXT: eors r3, r0
475; CHECK-NEXT: orrs r2, r3
David Green2f3574c2019-09-03 11:30:54 +0000476; CHECK-NEXT: cset r2, eq
David Green57cc65ff2019-09-03 10:53:07 +0000477; CHECK-NEXT: tst.w r2, #1
David Green2f3574c2019-09-03 11:30:54 +0000478; CHECK-NEXT: csetm r2, ne
David Green93b5f612019-07-24 16:58:41 +0000479; CHECK-NEXT: vmov.32 q3[0], r2
480; CHECK-NEXT: vmov.32 q3[1], r2
481; CHECK-NEXT: vmov r2, s3
482; CHECK-NEXT: eors r1, r2
483; CHECK-NEXT: vmov r2, s2
484; CHECK-NEXT: eors r0, r2
485; CHECK-NEXT: orrs r0, r1
David Green2f3574c2019-09-03 11:30:54 +0000486; CHECK-NEXT: cset r0, eq
David Green57cc65ff2019-09-03 10:53:07 +0000487; CHECK-NEXT: tst.w r0, #1
David Green2f3574c2019-09-03 11:30:54 +0000488; CHECK-NEXT: csetm r0, ne
David Green93b5f612019-07-24 16:58:41 +0000489; CHECK-NEXT: vmov.32 q3[2], r0
490; CHECK-NEXT: vmov.32 q3[3], r0
491; CHECK-NEXT: vbic q0, q2, q3
492; CHECK-NEXT: vand q1, q1, q3
493; CHECK-NEXT: vorr q0, q1, q0
494; CHECK-NEXT: bx lr
495entry:
496 %i = insertelement <2 x i64> undef, i64 %src2, i32 0
497 %sp = shufflevector <2 x i64> %i, <2 x i64> undef, <2 x i32> zeroinitializer
498 %c = icmp eq <2 x i64> %src, %sp
499 %s = select <2 x i1> %c, <2 x i32> %a, <2 x i32> %b
500 ret <2 x i32> %s
501}
502
503define arm_aapcs_vfpcc <2 x i32> @vcmp_multi_v2i32(<2 x i64> %a, <2 x i32> %b, <2 x i32> %c) {
504; CHECK-LABEL: vcmp_multi_v2i32:
505; CHECK: @ %bb.0:
506; CHECK-NEXT: .save {r7, lr}
507; CHECK-NEXT: push {r7, lr}
508; CHECK-NEXT: .vsave {d8, d9, d10, d11}
509; CHECK-NEXT: vpush {d8, d9, d10, d11}
510; CHECK-NEXT: vmov r0, s1
511; CHECK-NEXT: movs r3, #0
512; CHECK-NEXT: vmov r1, s0
513; CHECK-NEXT: vmov r2, s8
David Green93b5f612019-07-24 16:58:41 +0000514; CHECK-NEXT: orrs r0, r1
515; CHECK-NEXT: vmov r1, s2
David Green2f3574c2019-09-03 11:30:54 +0000516; CHECK-NEXT: cset r0, eq
David Green57cc65ff2019-09-03 10:53:07 +0000517; CHECK-NEXT: tst.w r0, #1
David Green2f3574c2019-09-03 11:30:54 +0000518; CHECK-NEXT: csetm r0, ne
David Green93b5f612019-07-24 16:58:41 +0000519; CHECK-NEXT: vmov.32 q3[0], r0
520; CHECK-NEXT: vmov.32 q3[1], r0
521; CHECK-NEXT: vmov r0, s3
522; CHECK-NEXT: orrs r0, r1
David Green2f3574c2019-09-03 11:30:54 +0000523; CHECK-NEXT: cset r0, eq
David Green57cc65ff2019-09-03 10:53:07 +0000524; CHECK-NEXT: tst.w r0, #1
David Green2f3574c2019-09-03 11:30:54 +0000525; CHECK-NEXT: csetm r0, ne
David Green93b5f612019-07-24 16:58:41 +0000526; CHECK-NEXT: vmov.32 q3[2], r0
527; CHECK-NEXT: vmov.32 q3[3], r0
528; CHECK-NEXT: vbic q0, q2, q3
David Green57cc65ff2019-09-03 10:53:07 +0000529; CHECK-NEXT: vmov lr, s0
530; CHECK-NEXT: subs.w r1, lr, r2
531; CHECK-NEXT: asr.w r12, lr, #31
David Green93b5f612019-07-24 16:58:41 +0000532; CHECK-NEXT: sbcs.w r1, r12, r2, asr #31
533; CHECK-NEXT: mov.w r1, #0
David Green57cc65ff2019-09-03 10:53:07 +0000534; CHECK-NEXT: vmov r2, s10
David Green93b5f612019-07-24 16:58:41 +0000535; CHECK-NEXT: it lt
536; CHECK-NEXT: movlt r1, #1
537; CHECK-NEXT: cmp r1, #0
David Green2f3574c2019-09-03 11:30:54 +0000538; CHECK-NEXT: csetm r1, ne
David Green93b5f612019-07-24 16:58:41 +0000539; CHECK-NEXT: vmov.32 q3[0], r1
540; CHECK-NEXT: vmov.32 q3[1], r1
541; CHECK-NEXT: vmov r1, s2
David Green57cc65ff2019-09-03 10:53:07 +0000542; CHECK-NEXT: subs r0, r1, r2
David Green93b5f612019-07-24 16:58:41 +0000543; CHECK-NEXT: asr.w r12, r1, #31
David Green57cc65ff2019-09-03 10:53:07 +0000544; CHECK-NEXT: sbcs.w r0, r12, r2, asr #31
David Green93b5f612019-07-24 16:58:41 +0000545; CHECK-NEXT: it lt
546; CHECK-NEXT: movlt r3, #1
547; CHECK-NEXT: cmp r3, #0
David Green2f3574c2019-09-03 11:30:54 +0000548; CHECK-NEXT: csetm r0, ne
David Green57cc65ff2019-09-03 10:53:07 +0000549; CHECK-NEXT: cmp.w lr, #0
550; CHECK-NEXT: vmov.32 q3[2], r0
551; CHECK-NEXT: vmov.32 q3[3], r0
David Green2f3574c2019-09-03 11:30:54 +0000552; CHECK-NEXT: cset r0, ne
David Green57cc65ff2019-09-03 10:53:07 +0000553; CHECK-NEXT: tst.w r0, #1
David Green2f3574c2019-09-03 11:30:54 +0000554; CHECK-NEXT: csetm r0, ne
David Green57cc65ff2019-09-03 10:53:07 +0000555; CHECK-NEXT: cmp r1, #0
David Green93b5f612019-07-24 16:58:41 +0000556; CHECK-NEXT: vmov.32 q4[0], r0
557; CHECK-NEXT: vmov.32 q4[1], r0
David Green2f3574c2019-09-03 11:30:54 +0000558; CHECK-NEXT: cset r0, ne
David Green57cc65ff2019-09-03 10:53:07 +0000559; CHECK-NEXT: tst.w r0, #1
David Green2f3574c2019-09-03 11:30:54 +0000560; CHECK-NEXT: csetm r0, ne
David Green57cc65ff2019-09-03 10:53:07 +0000561; CHECK-NEXT: vmov.32 q4[2], r0
562; CHECK-NEXT: vmov.32 q4[3], r0
David Green93b5f612019-07-24 16:58:41 +0000563; CHECK-NEXT: vmov r0, s4
David Green93b5f612019-07-24 16:58:41 +0000564; CHECK-NEXT: cmp r0, #0
David Green2f3574c2019-09-03 11:30:54 +0000565; CHECK-NEXT: cset r0, ne
David Green57cc65ff2019-09-03 10:53:07 +0000566; CHECK-NEXT: tst.w r0, #1
David Green2f3574c2019-09-03 11:30:54 +0000567; CHECK-NEXT: csetm r0, ne
David Green93b5f612019-07-24 16:58:41 +0000568; CHECK-NEXT: vmov.32 q5[0], r0
569; CHECK-NEXT: vmov.32 q5[1], r0
570; CHECK-NEXT: vmov r0, s6
571; CHECK-NEXT: cmp r0, #0
David Green2f3574c2019-09-03 11:30:54 +0000572; CHECK-NEXT: cset r0, ne
David Green57cc65ff2019-09-03 10:53:07 +0000573; CHECK-NEXT: tst.w r0, #1
David Green2f3574c2019-09-03 11:30:54 +0000574; CHECK-NEXT: csetm r0, ne
David Green93b5f612019-07-24 16:58:41 +0000575; CHECK-NEXT: vmov.32 q5[2], r0
576; CHECK-NEXT: vmov.32 q5[3], r0
577; CHECK-NEXT: vand q1, q5, q4
578; CHECK-NEXT: vand q1, q3, q1
579; CHECK-NEXT: vbic q0, q0, q1
580; CHECK-NEXT: vand q1, q2, q1
581; CHECK-NEXT: vorr q0, q1, q0
582; CHECK-NEXT: vpop {d8, d9, d10, d11}
583; CHECK-NEXT: pop {r7, pc}
584 %a4 = icmp eq <2 x i64> %a, zeroinitializer
585 %a5 = select <2 x i1> %a4, <2 x i32> zeroinitializer, <2 x i32> %c
586 %a6 = icmp ne <2 x i32> %b, zeroinitializer
587 %a7 = icmp slt <2 x i32> %a5, %c
588 %a8 = icmp ne <2 x i32> %a5, zeroinitializer
589 %a9 = and <2 x i1> %a6, %a8
590 %a10 = and <2 x i1> %a7, %a9
591 %a11 = select <2 x i1> %a10, <2 x i32> %c, <2 x i32> %a5
592 ret <2 x i32> %a11
593}
David Green63aff5c2019-12-02 14:46:22 +0000594
595; Reversed
596
597define arm_aapcs_vfpcc <4 x i32> @vcmp_r_eq_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
598; CHECK-LABEL: vcmp_r_eq_v4i32:
599; CHECK: @ %bb.0: @ %entry
600; CHECK-NEXT: vcmp.i32 eq, q0, r0
601; CHECK-NEXT: vpsel q0, q1, q2
602; CHECK-NEXT: bx lr
603entry:
604 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
605 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
606 %c = icmp eq <4 x i32> %sp, %src
607 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
608 ret <4 x i32> %s
609}
610
611define arm_aapcs_vfpcc <4 x i32> @vcmp_r_ne_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
612; CHECK-LABEL: vcmp_r_ne_v4i32:
613; CHECK: @ %bb.0: @ %entry
614; CHECK-NEXT: vcmp.i32 ne, q0, r0
615; CHECK-NEXT: vpsel q0, q1, q2
616; CHECK-NEXT: bx lr
617entry:
618 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
619 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
620 %c = icmp ne <4 x i32> %sp, %src
621 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
622 ret <4 x i32> %s
623}
624
625define arm_aapcs_vfpcc <4 x i32> @vcmp_r_sgt_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
626; CHECK-LABEL: vcmp_r_sgt_v4i32:
627; CHECK: @ %bb.0: @ %entry
628; CHECK-NEXT: vcmp.s32 lt, q0, r0
629; CHECK-NEXT: vpsel q0, q1, q2
630; CHECK-NEXT: bx lr
631entry:
632 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
633 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
634 %c = icmp sgt <4 x i32> %sp, %src
635 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
636 ret <4 x i32> %s
637}
638
639define arm_aapcs_vfpcc <4 x i32> @vcmp_r_sge_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
640; CHECK-LABEL: vcmp_r_sge_v4i32:
641; CHECK: @ %bb.0: @ %entry
642; CHECK-NEXT: vcmp.s32 le, q0, r0
643; CHECK-NEXT: vpsel q0, q1, q2
644; CHECK-NEXT: bx lr
645entry:
646 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
647 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
648 %c = icmp sge <4 x i32> %sp, %src
649 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
650 ret <4 x i32> %s
651}
652
653define arm_aapcs_vfpcc <4 x i32> @vcmp_r_slt_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
654; CHECK-LABEL: vcmp_r_slt_v4i32:
655; CHECK: @ %bb.0: @ %entry
656; CHECK-NEXT: vcmp.s32 gt, q0, r0
657; CHECK-NEXT: vpsel q0, q1, q2
658; CHECK-NEXT: bx lr
659entry:
660 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
661 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
662 %c = icmp slt <4 x i32> %sp, %src
663 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
664 ret <4 x i32> %s
665}
666
667define arm_aapcs_vfpcc <4 x i32> @vcmp_r_sle_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
668; CHECK-LABEL: vcmp_r_sle_v4i32:
669; CHECK: @ %bb.0: @ %entry
670; CHECK-NEXT: vcmp.s32 ge, q0, r0
671; CHECK-NEXT: vpsel q0, q1, q2
672; CHECK-NEXT: bx lr
673entry:
674 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
675 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
676 %c = icmp sle <4 x i32> %sp, %src
677 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
678 ret <4 x i32> %s
679}
680
681define arm_aapcs_vfpcc <4 x i32> @vcmp_r_ugt_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
682; CHECK-LABEL: vcmp_r_ugt_v4i32:
683; CHECK: @ %bb.0: @ %entry
684; CHECK-NEXT: vdup.32 q3, r0
685; CHECK-NEXT: vcmp.u32 hi, q3, q0
686; CHECK-NEXT: vpsel q0, q1, q2
687; CHECK-NEXT: bx lr
688entry:
689 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
690 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
691 %c = icmp ugt <4 x i32> %sp, %src
692 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
693 ret <4 x i32> %s
694}
695
696define arm_aapcs_vfpcc <4 x i32> @vcmp_r_uge_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
697; CHECK-LABEL: vcmp_r_uge_v4i32:
698; CHECK: @ %bb.0: @ %entry
699; CHECK-NEXT: vdup.32 q3, r0
700; CHECK-NEXT: vcmp.u32 cs, q3, q0
701; CHECK-NEXT: vpsel q0, q1, q2
702; CHECK-NEXT: bx lr
703entry:
704 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
705 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
706 %c = icmp uge <4 x i32> %sp, %src
707 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
708 ret <4 x i32> %s
709}
710
711define arm_aapcs_vfpcc <4 x i32> @vcmp_r_ult_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
712; CHECK-LABEL: vcmp_r_ult_v4i32:
713; CHECK: @ %bb.0: @ %entry
714; CHECK-NEXT: vcmp.u32 hi, q0, r0
715; CHECK-NEXT: vpsel q0, q1, q2
716; CHECK-NEXT: bx lr
717entry:
718 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
719 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
720 %c = icmp ult <4 x i32> %sp, %src
721 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
722 ret <4 x i32> %s
723}
724
725define arm_aapcs_vfpcc <4 x i32> @vcmp_r_ule_v4i32(<4 x i32> %src, i32 %src2, <4 x i32> %a, <4 x i32> %b) {
726; CHECK-LABEL: vcmp_r_ule_v4i32:
727; CHECK: @ %bb.0: @ %entry
728; CHECK-NEXT: vcmp.u32 cs, q0, r0
729; CHECK-NEXT: vpsel q0, q1, q2
730; CHECK-NEXT: bx lr
731entry:
732 %i = insertelement <4 x i32> undef, i32 %src2, i32 0
733 %sp = shufflevector <4 x i32> %i, <4 x i32> undef, <4 x i32> zeroinitializer
734 %c = icmp ule <4 x i32> %sp, %src
735 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> %b
736 ret <4 x i32> %s
737}
738
739
740define arm_aapcs_vfpcc <8 x i16> @vcmp_r_eq_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
741; CHECK-LABEL: vcmp_r_eq_v8i16:
742; CHECK: @ %bb.0: @ %entry
743; CHECK-NEXT: vcmp.i16 eq, q0, r0
744; CHECK-NEXT: vpsel q0, q1, q2
745; CHECK-NEXT: bx lr
746entry:
747 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
748 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
749 %c = icmp eq <8 x i16> %sp, %src
750 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
751 ret <8 x i16> %s
752}
753
754define arm_aapcs_vfpcc <8 x i16> @vcmp_r_ne_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
755; CHECK-LABEL: vcmp_r_ne_v8i16:
756; CHECK: @ %bb.0: @ %entry
757; CHECK-NEXT: vcmp.i16 ne, q0, r0
758; CHECK-NEXT: vpsel q0, q1, q2
759; CHECK-NEXT: bx lr
760entry:
761 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
762 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
763 %c = icmp ne <8 x i16> %sp, %src
764 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
765 ret <8 x i16> %s
766}
767
768define arm_aapcs_vfpcc <8 x i16> @vcmp_r_sgt_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
769; CHECK-LABEL: vcmp_r_sgt_v8i16:
770; CHECK: @ %bb.0: @ %entry
771; CHECK-NEXT: vcmp.s16 lt, q0, r0
772; CHECK-NEXT: vpsel q0, q1, q2
773; CHECK-NEXT: bx lr
774entry:
775 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
776 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
777 %c = icmp sgt <8 x i16> %sp, %src
778 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
779 ret <8 x i16> %s
780}
781
782define arm_aapcs_vfpcc <8 x i16> @vcmp_r_sge_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
783; CHECK-LABEL: vcmp_r_sge_v8i16:
784; CHECK: @ %bb.0: @ %entry
785; CHECK-NEXT: vcmp.s16 le, q0, r0
786; CHECK-NEXT: vpsel q0, q1, q2
787; CHECK-NEXT: bx lr
788entry:
789 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
790 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
791 %c = icmp sge <8 x i16> %sp, %src
792 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
793 ret <8 x i16> %s
794}
795
796define arm_aapcs_vfpcc <8 x i16> @vcmp_r_slt_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
797; CHECK-LABEL: vcmp_r_slt_v8i16:
798; CHECK: @ %bb.0: @ %entry
799; CHECK-NEXT: vcmp.s16 gt, q0, r0
800; CHECK-NEXT: vpsel q0, q1, q2
801; CHECK-NEXT: bx lr
802entry:
803 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
804 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
805 %c = icmp slt <8 x i16> %sp, %src
806 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
807 ret <8 x i16> %s
808}
809
810define arm_aapcs_vfpcc <8 x i16> @vcmp_r_sle_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
811; CHECK-LABEL: vcmp_r_sle_v8i16:
812; CHECK: @ %bb.0: @ %entry
813; CHECK-NEXT: vcmp.s16 ge, q0, r0
814; CHECK-NEXT: vpsel q0, q1, q2
815; CHECK-NEXT: bx lr
816entry:
817 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
818 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
819 %c = icmp sle <8 x i16> %sp, %src
820 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
821 ret <8 x i16> %s
822}
823
824define arm_aapcs_vfpcc <8 x i16> @vcmp_r_ugt_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
825; CHECK-LABEL: vcmp_r_ugt_v8i16:
826; CHECK: @ %bb.0: @ %entry
827; CHECK-NEXT: vdup.16 q3, r0
828; CHECK-NEXT: vcmp.u16 hi, q3, q0
829; CHECK-NEXT: vpsel q0, q1, q2
830; CHECK-NEXT: bx lr
831entry:
832 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
833 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
834 %c = icmp ugt <8 x i16> %sp, %src
835 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
836 ret <8 x i16> %s
837}
838
839define arm_aapcs_vfpcc <8 x i16> @vcmp_r_uge_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
840; CHECK-LABEL: vcmp_r_uge_v8i16:
841; CHECK: @ %bb.0: @ %entry
842; CHECK-NEXT: vdup.16 q3, r0
843; CHECK-NEXT: vcmp.u16 cs, q3, q0
844; CHECK-NEXT: vpsel q0, q1, q2
845; CHECK-NEXT: bx lr
846entry:
847 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
848 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
849 %c = icmp uge <8 x i16> %sp, %src
850 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
851 ret <8 x i16> %s
852}
853
854define arm_aapcs_vfpcc <8 x i16> @vcmp_r_ult_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
855; CHECK-LABEL: vcmp_r_ult_v8i16:
856; CHECK: @ %bb.0: @ %entry
857; CHECK-NEXT: vcmp.u16 hi, q0, r0
858; CHECK-NEXT: vpsel q0, q1, q2
859; CHECK-NEXT: bx lr
860entry:
861 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
862 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
863 %c = icmp ult <8 x i16> %sp, %src
864 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
865 ret <8 x i16> %s
866}
867
868define arm_aapcs_vfpcc <8 x i16> @vcmp_r_ule_v8i16(<8 x i16> %src, i16 %src2, <8 x i16> %a, <8 x i16> %b) {
869; CHECK-LABEL: vcmp_r_ule_v8i16:
870; CHECK: @ %bb.0: @ %entry
871; CHECK-NEXT: vcmp.u16 cs, q0, r0
872; CHECK-NEXT: vpsel q0, q1, q2
873; CHECK-NEXT: bx lr
874entry:
875 %i = insertelement <8 x i16> undef, i16 %src2, i32 0
876 %sp = shufflevector <8 x i16> %i, <8 x i16> undef, <8 x i32> zeroinitializer
877 %c = icmp ule <8 x i16> %sp, %src
878 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> %b
879 ret <8 x i16> %s
880}
881
882
883define arm_aapcs_vfpcc <16 x i8> @vcmp_r_eq_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
884; CHECK-LABEL: vcmp_r_eq_v16i8:
885; CHECK: @ %bb.0: @ %entry
886; CHECK-NEXT: vcmp.i8 eq, q0, r0
887; CHECK-NEXT: vpsel q0, q1, q2
888; CHECK-NEXT: bx lr
889entry:
890 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
891 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
892 %c = icmp eq <16 x i8> %sp, %src
893 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
894 ret <16 x i8> %s
895}
896
897define arm_aapcs_vfpcc <16 x i8> @vcmp_r_ne_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
898; CHECK-LABEL: vcmp_r_ne_v16i8:
899; CHECK: @ %bb.0: @ %entry
900; CHECK-NEXT: vcmp.i8 ne, q0, r0
901; CHECK-NEXT: vpsel q0, q1, q2
902; CHECK-NEXT: bx lr
903entry:
904 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
905 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
906 %c = icmp ne <16 x i8> %sp, %src
907 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
908 ret <16 x i8> %s
909}
910
911define arm_aapcs_vfpcc <16 x i8> @vcmp_r_sgt_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
912; CHECK-LABEL: vcmp_r_sgt_v16i8:
913; CHECK: @ %bb.0: @ %entry
914; CHECK-NEXT: vcmp.s8 lt, q0, r0
915; CHECK-NEXT: vpsel q0, q1, q2
916; CHECK-NEXT: bx lr
917entry:
918 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
919 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
920 %c = icmp sgt <16 x i8> %sp, %src
921 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
922 ret <16 x i8> %s
923}
924
925define arm_aapcs_vfpcc <16 x i8> @vcmp_r_sge_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
926; CHECK-LABEL: vcmp_r_sge_v16i8:
927; CHECK: @ %bb.0: @ %entry
928; CHECK-NEXT: vcmp.s8 le, q0, r0
929; CHECK-NEXT: vpsel q0, q1, q2
930; CHECK-NEXT: bx lr
931entry:
932 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
933 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
934 %c = icmp sge <16 x i8> %sp, %src
935 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
936 ret <16 x i8> %s
937}
938
939define arm_aapcs_vfpcc <16 x i8> @vcmp_r_slt_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
940; CHECK-LABEL: vcmp_r_slt_v16i8:
941; CHECK: @ %bb.0: @ %entry
942; CHECK-NEXT: vcmp.s8 gt, q0, r0
943; CHECK-NEXT: vpsel q0, q1, q2
944; CHECK-NEXT: bx lr
945entry:
946 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
947 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
948 %c = icmp slt <16 x i8> %sp, %src
949 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
950 ret <16 x i8> %s
951}
952
953define arm_aapcs_vfpcc <16 x i8> @vcmp_r_sle_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
954; CHECK-LABEL: vcmp_r_sle_v16i8:
955; CHECK: @ %bb.0: @ %entry
956; CHECK-NEXT: vcmp.s8 ge, q0, r0
957; CHECK-NEXT: vpsel q0, q1, q2
958; CHECK-NEXT: bx lr
959entry:
960 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
961 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
962 %c = icmp sle <16 x i8> %sp, %src
963 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
964 ret <16 x i8> %s
965}
966
967define arm_aapcs_vfpcc <16 x i8> @vcmp_r_ugt_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
968; CHECK-LABEL: vcmp_r_ugt_v16i8:
969; CHECK: @ %bb.0: @ %entry
970; CHECK-NEXT: vdup.8 q3, r0
971; CHECK-NEXT: vcmp.u8 hi, q3, q0
972; CHECK-NEXT: vpsel q0, q1, q2
973; CHECK-NEXT: bx lr
974entry:
975 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
976 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
977 %c = icmp ugt <16 x i8> %sp, %src
978 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
979 ret <16 x i8> %s
980}
981
982define arm_aapcs_vfpcc <16 x i8> @vcmp_r_uge_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
983; CHECK-LABEL: vcmp_r_uge_v16i8:
984; CHECK: @ %bb.0: @ %entry
985; CHECK-NEXT: vdup.8 q3, r0
986; CHECK-NEXT: vcmp.u8 cs, q3, q0
987; CHECK-NEXT: vpsel q0, q1, q2
988; CHECK-NEXT: bx lr
989entry:
990 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
991 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
992 %c = icmp uge <16 x i8> %sp, %src
993 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
994 ret <16 x i8> %s
995}
996
997define arm_aapcs_vfpcc <16 x i8> @vcmp_r_ult_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
998; CHECK-LABEL: vcmp_r_ult_v16i8:
999; CHECK: @ %bb.0: @ %entry
1000; CHECK-NEXT: vcmp.u8 hi, q0, r0
1001; CHECK-NEXT: vpsel q0, q1, q2
1002; CHECK-NEXT: bx lr
1003entry:
1004 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
1005 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
1006 %c = icmp ult <16 x i8> %sp, %src
1007 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
1008 ret <16 x i8> %s
1009}
1010
1011define arm_aapcs_vfpcc <16 x i8> @vcmp_r_ule_v16i8(<16 x i8> %src, i8 %src2, <16 x i8> %a, <16 x i8> %b) {
1012; CHECK-LABEL: vcmp_r_ule_v16i8:
1013; CHECK: @ %bb.0: @ %entry
1014; CHECK-NEXT: vcmp.u8 cs, q0, r0
1015; CHECK-NEXT: vpsel q0, q1, q2
1016; CHECK-NEXT: bx lr
1017entry:
1018 %i = insertelement <16 x i8> undef, i8 %src2, i32 0
1019 %sp = shufflevector <16 x i8> %i, <16 x i8> undef, <16 x i32> zeroinitializer
1020 %c = icmp ule <16 x i8> %sp, %src
1021 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> %b
1022 ret <16 x i8> %s
1023}
1024
1025
1026define arm_aapcs_vfpcc <2 x i64> @vcmp_r_eq_v2i64(<2 x i64> %src, i64 %src2, <2 x i64> %a, <2 x i64> %b) {
1027; CHECK-LABEL: vcmp_r_eq_v2i64:
1028; CHECK: @ %bb.0: @ %entry
1029; CHECK-NEXT: vmov r2, s1
1030; CHECK-NEXT: vmov r3, s0
1031; CHECK-NEXT: eors r2, r1
1032; CHECK-NEXT: eors r3, r0
1033; CHECK-NEXT: orrs r2, r3
1034; CHECK-NEXT: cset r2, eq
1035; CHECK-NEXT: tst.w r2, #1
1036; CHECK-NEXT: csetm r2, ne
1037; CHECK-NEXT: vmov.32 q3[0], r2
1038; CHECK-NEXT: vmov.32 q3[1], r2
1039; CHECK-NEXT: vmov r2, s3
1040; CHECK-NEXT: eors r1, r2
1041; CHECK-NEXT: vmov r2, s2
1042; CHECK-NEXT: eors r0, r2
1043; CHECK-NEXT: orrs r0, r1
1044; CHECK-NEXT: cset r0, eq
1045; CHECK-NEXT: tst.w r0, #1
1046; CHECK-NEXT: csetm r0, ne
1047; CHECK-NEXT: vmov.32 q3[2], r0
1048; CHECK-NEXT: vmov.32 q3[3], r0
1049; CHECK-NEXT: vbic q0, q2, q3
1050; CHECK-NEXT: vand q1, q1, q3
1051; CHECK-NEXT: vorr q0, q1, q0
1052; CHECK-NEXT: bx lr
1053entry:
1054 %i = insertelement <2 x i64> undef, i64 %src2, i32 0
1055 %sp = shufflevector <2 x i64> %i, <2 x i64> undef, <2 x i32> zeroinitializer
1056 %c = icmp eq <2 x i64> %sp, %src
1057 %s = select <2 x i1> %c, <2 x i64> %a, <2 x i64> %b
1058 ret <2 x i64> %s
1059}
1060
1061define arm_aapcs_vfpcc <2 x i32> @vcmp_r_eq_v2i32(<2 x i64> %src, i64 %src2, <2 x i32> %a, <2 x i32> %b) {
1062; CHECK-LABEL: vcmp_r_eq_v2i32:
1063; CHECK: @ %bb.0: @ %entry
1064; CHECK-NEXT: vmov r2, s1
1065; CHECK-NEXT: vmov r3, s0
1066; CHECK-NEXT: eors r2, r1
1067; CHECK-NEXT: eors r3, r0
1068; CHECK-NEXT: orrs r2, r3
1069; CHECK-NEXT: cset r2, eq
1070; CHECK-NEXT: tst.w r2, #1
1071; CHECK-NEXT: csetm r2, ne
1072; CHECK-NEXT: vmov.32 q3[0], r2
1073; CHECK-NEXT: vmov.32 q3[1], r2
1074; CHECK-NEXT: vmov r2, s3
1075; CHECK-NEXT: eors r1, r2
1076; CHECK-NEXT: vmov r2, s2
1077; CHECK-NEXT: eors r0, r2
1078; CHECK-NEXT: orrs r0, r1
1079; CHECK-NEXT: cset r0, eq
1080; CHECK-NEXT: tst.w r0, #1
1081; CHECK-NEXT: csetm r0, ne
1082; CHECK-NEXT: vmov.32 q3[2], r0
1083; CHECK-NEXT: vmov.32 q3[3], r0
1084; CHECK-NEXT: vbic q0, q2, q3
1085; CHECK-NEXT: vand q1, q1, q3
1086; CHECK-NEXT: vorr q0, q1, q0
1087; CHECK-NEXT: bx lr
1088entry:
1089 %i = insertelement <2 x i64> undef, i64 %src2, i32 0
1090 %sp = shufflevector <2 x i64> %i, <2 x i64> undef, <2 x i32> zeroinitializer
1091 %c = icmp eq <2 x i64> %sp, %src
1092 %s = select <2 x i1> %c, <2 x i32> %a, <2 x i32> %b
1093 ret <2 x i32> %s
1094}
1095
1096define arm_aapcs_vfpcc <2 x i32> @vcmp_r_multi_v2i32(<2 x i64> %a, <2 x i32> %b, <2 x i32> %c) {
1097; CHECK-LABEL: vcmp_r_multi_v2i32:
1098; CHECK: @ %bb.0:
1099; CHECK-NEXT: .save {r7, lr}
1100; CHECK-NEXT: push {r7, lr}
1101; CHECK-NEXT: .vsave {d8, d9, d10, d11}
1102; CHECK-NEXT: vpush {d8, d9, d10, d11}
1103; CHECK-NEXT: vmov r0, s1
1104; CHECK-NEXT: movs r3, #0
1105; CHECK-NEXT: vmov r1, s0
1106; CHECK-NEXT: vmov r2, s8
1107; CHECK-NEXT: orrs r0, r1
1108; CHECK-NEXT: vmov r1, s2
1109; CHECK-NEXT: cset r0, eq
1110; CHECK-NEXT: tst.w r0, #1
1111; CHECK-NEXT: csetm r0, ne
1112; CHECK-NEXT: vmov.32 q3[0], r0
1113; CHECK-NEXT: vmov.32 q3[1], r0
1114; CHECK-NEXT: vmov r0, s3
1115; CHECK-NEXT: orrs r0, r1
1116; CHECK-NEXT: cset r0, eq
1117; CHECK-NEXT: tst.w r0, #1
1118; CHECK-NEXT: csetm r0, ne
1119; CHECK-NEXT: vmov.32 q3[2], r0
1120; CHECK-NEXT: vmov.32 q3[3], r0
1121; CHECK-NEXT: vbic q0, q2, q3
1122; CHECK-NEXT: vmov lr, s0
1123; CHECK-NEXT: subs.w r1, lr, r2
1124; CHECK-NEXT: asr.w r12, lr, #31
1125; CHECK-NEXT: sbcs.w r1, r12, r2, asr #31
1126; CHECK-NEXT: mov.w r1, #0
1127; CHECK-NEXT: vmov r2, s10
1128; CHECK-NEXT: it lt
1129; CHECK-NEXT: movlt r1, #1
1130; CHECK-NEXT: cmp r1, #0
1131; CHECK-NEXT: csetm r1, ne
1132; CHECK-NEXT: vmov.32 q3[0], r1
1133; CHECK-NEXT: vmov.32 q3[1], r1
1134; CHECK-NEXT: vmov r1, s2
1135; CHECK-NEXT: subs r0, r1, r2
1136; CHECK-NEXT: asr.w r12, r1, #31
1137; CHECK-NEXT: sbcs.w r0, r12, r2, asr #31
1138; CHECK-NEXT: it lt
1139; CHECK-NEXT: movlt r3, #1
1140; CHECK-NEXT: cmp r3, #0
1141; CHECK-NEXT: csetm r0, ne
1142; CHECK-NEXT: cmp.w lr, #0
1143; CHECK-NEXT: vmov.32 q3[2], r0
1144; CHECK-NEXT: vmov.32 q3[3], r0
1145; CHECK-NEXT: cset r0, ne
1146; CHECK-NEXT: tst.w r0, #1
1147; CHECK-NEXT: csetm r0, ne
1148; CHECK-NEXT: cmp r1, #0
1149; CHECK-NEXT: vmov.32 q4[0], r0
1150; CHECK-NEXT: vmov.32 q4[1], r0
1151; CHECK-NEXT: cset r0, ne
1152; CHECK-NEXT: tst.w r0, #1
1153; CHECK-NEXT: csetm r0, ne
1154; CHECK-NEXT: vmov.32 q4[2], r0
1155; CHECK-NEXT: vmov.32 q4[3], r0
1156; CHECK-NEXT: vmov r0, s4
1157; CHECK-NEXT: cmp r0, #0
1158; CHECK-NEXT: cset r0, ne
1159; CHECK-NEXT: tst.w r0, #1
1160; CHECK-NEXT: csetm r0, ne
1161; CHECK-NEXT: vmov.32 q5[0], r0
1162; CHECK-NEXT: vmov.32 q5[1], r0
1163; CHECK-NEXT: vmov r0, s6
1164; CHECK-NEXT: cmp r0, #0
1165; CHECK-NEXT: cset r0, ne
1166; CHECK-NEXT: tst.w r0, #1
1167; CHECK-NEXT: csetm r0, ne
1168; CHECK-NEXT: vmov.32 q5[2], r0
1169; CHECK-NEXT: vmov.32 q5[3], r0
1170; CHECK-NEXT: vand q1, q5, q4
1171; CHECK-NEXT: vand q1, q3, q1
1172; CHECK-NEXT: vbic q0, q0, q1
1173; CHECK-NEXT: vand q1, q2, q1
1174; CHECK-NEXT: vorr q0, q1, q0
1175; CHECK-NEXT: vpop {d8, d9, d10, d11}
1176; CHECK-NEXT: pop {r7, pc}
1177 %a4 = icmp eq <2 x i64> %a, zeroinitializer
1178 %a5 = select <2 x i1> %a4, <2 x i32> zeroinitializer, <2 x i32> %c
1179 %a6 = icmp ne <2 x i32> %b, zeroinitializer
1180 %a7 = icmp slt <2 x i32> %a5, %c
1181 %a8 = icmp ne <2 x i32> %a5, zeroinitializer
1182 %a9 = and <2 x i1> %a6, %a8
1183 %a10 = and <2 x i1> %a7, %a9
1184 %a11 = select <2 x i1> %a10, <2 x i32> %c, <2 x i32> %a5
1185 ret <2 x i32> %a11
1186}