blob: a6fc2dbe4a4c8e87be4600a70fab00d294ef2906 [file] [log] [blame]
David Green93b5f612019-07-24 16:58:41 +00001; 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
3
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}