1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -march=hexagon -mattr=+hvxv69,+hvx-length128b,+hvx-qfloat < %s | FileCheck %s
3; RUN: llc -march=hexagon -mattr=+hvxv69,+hvx-length128b,+hvx-ieee-fp < %s | FileCheck %s
4
5; --- Half
6
7define <64 x half> @test_00(<64 x half> %v0, <64 x half> %v1, <64 x half> %v2) #0 {
8; CHECK-LABEL: test_00:
9; CHECK:       // %bb.0:
10; CHECK-NEXT:    {
11; CHECK-NEXT:     q0 = vcmp.eq(v0.h,v1.h)
12; CHECK-NEXT:    }
13; CHECK-NEXT:    {
14; CHECK-NEXT:     v0 = vmux(q0,v1,v2)
15; CHECK-NEXT:     jumpr r31
16; CHECK-NEXT:    }
17  %t0 = fcmp oeq <64 x half> %v0, %v1
18  %t1 = select <64 x i1> %t0, <64 x half> %v1, <64 x half> %v2
19  ret <64 x half> %t1
20}
21
22define <64 x half> @test_01(<64 x half> %v0, <64 x half> %v1, <64 x half> %v2) #0 {
23; CHECK-LABEL: test_01:
24; CHECK:       // %bb.0:
25; CHECK-NEXT:    {
26; CHECK-NEXT:     q0 = vcmp.eq(v0.h,v1.h)
27; CHECK-NEXT:    }
28; CHECK-NEXT:    {
29; CHECK-NEXT:     v0 = vmux(q0,v2,v1)
30; CHECK-NEXT:     jumpr r31
31; CHECK-NEXT:    }
32  %t0 = fcmp one <64 x half> %v0, %v1
33  %t1 = select <64 x i1> %t0, <64 x half> %v1, <64 x half> %v2
34  ret <64 x half> %t1
35}
36
37define <64 x half> @test_02(<64 x half> %v0, <64 x half> %v1, <64 x half> %v2) #0 {
38; CHECK-LABEL: test_02:
39; CHECK:       // %bb.0:
40; CHECK-NEXT:    {
41; CHECK-NEXT:     q0 = vcmp.gt(v1.hf,v0.hf)
42; CHECK-NEXT:    }
43; CHECK-NEXT:    {
44; CHECK-NEXT:     v0 = vmux(q0,v1,v2)
45; CHECK-NEXT:     jumpr r31
46; CHECK-NEXT:    }
47  %t0 = fcmp olt <64 x half> %v0, %v1
48  %t1 = select <64 x i1> %t0, <64 x half> %v1, <64 x half> %v2
49  ret <64 x half> %t1
50}
51
52define <64 x half> @test_03(<64 x half> %v0, <64 x half> %v1, <64 x half> %v2) #0 {
53; CHECK-LABEL: test_03:
54; CHECK:       // %bb.0:
55; CHECK-NEXT:    {
56; CHECK-NEXT:     q0 = vcmp.gt(v0.hf,v1.hf)
57; CHECK-NEXT:    }
58; CHECK-NEXT:    {
59; CHECK-NEXT:     v0 = vmux(q0,v2,v1)
60; CHECK-NEXT:     jumpr r31
61; CHECK-NEXT:    }
62  %t0 = fcmp ole <64 x half> %v0, %v1
63  %t1 = select <64 x i1> %t0, <64 x half> %v1, <64 x half> %v2
64  ret <64 x half> %t1
65}
66
67define <64 x half> @test_04(<64 x half> %v0, <64 x half> %v1, <64 x half> %v2) #0 {
68; CHECK-LABEL: test_04:
69; CHECK:       // %bb.0:
70; CHECK-NEXT:    {
71; CHECK-NEXT:     q0 = vcmp.gt(v0.hf,v1.hf)
72; CHECK-NEXT:    }
73; CHECK-NEXT:    {
74; CHECK-NEXT:     v0 = vmux(q0,v1,v2)
75; CHECK-NEXT:     jumpr r31
76; CHECK-NEXT:    }
77  %t0 = fcmp ogt <64 x half> %v0, %v1
78  %t1 = select <64 x i1> %t0, <64 x half> %v1, <64 x half> %v2
79  ret <64 x half> %t1
80}
81
82define <64 x half> @test_05(<64 x half> %v0, <64 x half> %v1, <64 x half> %v2) #0 {
83; CHECK-LABEL: test_05:
84; CHECK:       // %bb.0:
85; CHECK-NEXT:    {
86; CHECK-NEXT:     q0 = vcmp.gt(v1.hf,v0.hf)
87; CHECK-NEXT:    }
88; CHECK-NEXT:    {
89; CHECK-NEXT:     v0 = vmux(q0,v2,v1)
90; CHECK-NEXT:     jumpr r31
91; CHECK-NEXT:    }
92  %t0 = fcmp oge <64 x half> %v0, %v1
93  %t1 = select <64 x i1> %t0, <64 x half> %v1, <64 x half> %v2
94  ret <64 x half> %t1
95}
96
97define <64 x half> @test_0a(<64 x half> %v0, <64 x half> %v1, <64 x i16> %v2) #0 {
98; CHECK-LABEL: test_0a:
99; CHECK:       // %bb.0:
100; CHECK-NEXT:    {
101; CHECK-NEXT:     r0 = ##16843009
102; CHECK-NEXT:    }
103; CHECK-NEXT:    {
104; CHECK-NEXT:     q0 = vand(v2,r0)
105; CHECK-NEXT:    }
106; CHECK-NEXT:    {
107; CHECK-NEXT:     q0 &= vcmp.eq(v0.h,v1.h)
108; CHECK-NEXT:    }
109; CHECK-NEXT:    {
110; CHECK-NEXT:     v0 = vmux(q0,v0,v1)
111; CHECK-NEXT:     jumpr r31
112; CHECK-NEXT:    }
113  %q0 = fcmp oeq <64 x half> %v0, %v1
114  %q1 = trunc <64 x i16> %v2 to <64 x i1>
115  %q2 = and <64 x i1> %q0, %q1
116  %t1 = select <64 x i1> %q2, <64 x half> %v0, <64 x half> %v1
117  ret <64 x half> %t1
118}
119
120define <64 x half> @test_0b(<64 x half> %v0, <64 x half> %v1, <64 x i16> %v2) #0 {
121; CHECK-LABEL: test_0b:
122; CHECK:       // %bb.0:
123; CHECK-NEXT:    {
124; CHECK-NEXT:     r0 = ##16843009
125; CHECK-NEXT:    }
126; CHECK-NEXT:    {
127; CHECK-NEXT:     q0 = vand(v2,r0)
128; CHECK-NEXT:    }
129; CHECK-NEXT:    {
130; CHECK-NEXT:     q0 |= vcmp.eq(v0.h,v1.h)
131; CHECK-NEXT:    }
132; CHECK-NEXT:    {
133; CHECK-NEXT:     v0 = vmux(q0,v0,v1)
134; CHECK-NEXT:     jumpr r31
135; CHECK-NEXT:    }
136  %q0 = fcmp oeq <64 x half> %v0, %v1
137  %q1 = trunc <64 x i16> %v2 to <64 x i1>
138  %q2 = or <64 x i1> %q0, %q1
139  %t1 = select <64 x i1> %q2, <64 x half> %v0, <64 x half> %v1
140  ret <64 x half> %t1
141}
142
143define <64 x half> @test_0c(<64 x half> %v0, <64 x half> %v1, <64 x i16> %v2) #0 {
144; CHECK-LABEL: test_0c:
145; CHECK:       // %bb.0:
146; CHECK-NEXT:    {
147; CHECK-NEXT:     r0 = ##16843009
148; CHECK-NEXT:    }
149; CHECK-NEXT:    {
150; CHECK-NEXT:     q0 = vand(v2,r0)
151; CHECK-NEXT:    }
152; CHECK-NEXT:    {
153; CHECK-NEXT:     q0 ^= vcmp.eq(v0.h,v1.h)
154; CHECK-NEXT:    }
155; CHECK-NEXT:    {
156; CHECK-NEXT:     v0 = vmux(q0,v0,v1)
157; CHECK-NEXT:     jumpr r31
158; CHECK-NEXT:    }
159  %q0 = fcmp oeq <64 x half> %v0, %v1
160  %q1 = trunc <64 x i16> %v2 to <64 x i1>
161  %q2 = xor <64 x i1> %q0, %q1
162  %t1 = select <64 x i1> %q2, <64 x half> %v0, <64 x half> %v1
163  ret <64 x half> %t1
164}
165
166define <64 x half> @test_0d(<64 x half> %v0, <64 x half> %v1, <64 x i16> %v2) #0 {
167; CHECK-LABEL: test_0d:
168; CHECK:       // %bb.0:
169; CHECK-NEXT:    {
170; CHECK-NEXT:     r0 = ##16843009
171; CHECK-NEXT:    }
172; CHECK-NEXT:    {
173; CHECK-NEXT:     q0 = vand(v2,r0)
174; CHECK-NEXT:    }
175; CHECK-NEXT:    {
176; CHECK-NEXT:     q0 &= vcmp.gt(v0.hf,v1.hf)
177; CHECK-NEXT:    }
178; CHECK-NEXT:    {
179; CHECK-NEXT:     v0 = vmux(q0,v0,v1)
180; CHECK-NEXT:     jumpr r31
181; CHECK-NEXT:    }
182  %q0 = fcmp ogt <64 x half> %v0, %v1
183  %q1 = trunc <64 x i16> %v2 to <64 x i1>
184  %q2 = and <64 x i1> %q0, %q1
185  %t1 = select <64 x i1> %q2, <64 x half> %v0, <64 x half> %v1
186  ret <64 x half> %t1
187}
188
189define <64 x half> @test_0e(<64 x half> %v0, <64 x half> %v1, <64 x i16> %v2) #0 {
190; CHECK-LABEL: test_0e:
191; CHECK:       // %bb.0:
192; CHECK-NEXT:    {
193; CHECK-NEXT:     r0 = ##16843009
194; CHECK-NEXT:    }
195; CHECK-NEXT:    {
196; CHECK-NEXT:     q0 = vand(v2,r0)
197; CHECK-NEXT:    }
198; CHECK-NEXT:    {
199; CHECK-NEXT:     q0 |= vcmp.gt(v0.hf,v1.hf)
200; CHECK-NEXT:    }
201; CHECK-NEXT:    {
202; CHECK-NEXT:     v0 = vmux(q0,v0,v1)
203; CHECK-NEXT:     jumpr r31
204; CHECK-NEXT:    }
205  %q0 = fcmp ogt <64 x half> %v0, %v1
206  %q1 = trunc <64 x i16> %v2 to <64 x i1>
207  %q2 = or <64 x i1> %q0, %q1
208  %t1 = select <64 x i1> %q2, <64 x half> %v0, <64 x half> %v1
209  ret <64 x half> %t1
210}
211
212define <64 x half> @test_0f(<64 x half> %v0, <64 x half> %v1, <64 x i16> %v2) #0 {
213; CHECK-LABEL: test_0f:
214; CHECK:       // %bb.0:
215; CHECK-NEXT:    {
216; CHECK-NEXT:     r0 = ##16843009
217; CHECK-NEXT:    }
218; CHECK-NEXT:    {
219; CHECK-NEXT:     q0 = vand(v2,r0)
220; CHECK-NEXT:    }
221; CHECK-NEXT:    {
222; CHECK-NEXT:     q0 ^= vcmp.gt(v0.hf,v1.hf)
223; CHECK-NEXT:    }
224; CHECK-NEXT:    {
225; CHECK-NEXT:     v0 = vmux(q0,v0,v1)
226; CHECK-NEXT:     jumpr r31
227; CHECK-NEXT:    }
228  %q0 = fcmp ogt <64 x half> %v0, %v1
229  %q1 = trunc <64 x i16> %v2 to <64 x i1>
230  %q2 = xor <64 x i1> %q0, %q1
231  %t1 = select <64 x i1> %q2, <64 x half> %v0, <64 x half> %v1
232  ret <64 x half> %t1
233}
234
235
236; --- Single
237
238define <32 x float> @test_10(<32 x float> %v0, <32 x float> %v1, <32 x float> %v2) #0 {
239; CHECK-LABEL: test_10:
240; CHECK:       // %bb.0:
241; CHECK-NEXT:    {
242; CHECK-NEXT:     q0 = vcmp.eq(v0.w,v1.w)
243; CHECK-NEXT:    }
244; CHECK-NEXT:    {
245; CHECK-NEXT:     v0 = vmux(q0,v1,v2)
246; CHECK-NEXT:     jumpr r31
247; CHECK-NEXT:    }
248  %t0 = fcmp oeq <32 x float> %v0, %v1
249  %t1 = select <32 x i1> %t0, <32 x float> %v1, <32 x float> %v2
250  ret <32 x float> %t1
251}
252
253define <32 x float> @test_11(<32 x float> %v0, <32 x float> %v1, <32 x float> %v2) #0 {
254; CHECK-LABEL: test_11:
255; CHECK:       // %bb.0:
256; CHECK-NEXT:    {
257; CHECK-NEXT:     q0 = vcmp.eq(v0.w,v1.w)
258; CHECK-NEXT:    }
259; CHECK-NEXT:    {
260; CHECK-NEXT:     v0 = vmux(q0,v2,v1)
261; CHECK-NEXT:     jumpr r31
262; CHECK-NEXT:    }
263  %t0 = fcmp one <32 x float> %v0, %v1
264  %t1 = select <32 x i1> %t0, <32 x float> %v1, <32 x float> %v2
265  ret <32 x float> %t1
266}
267
268define <32 x float> @test_12(<32 x float> %v0, <32 x float> %v1, <32 x float> %v2) #0 {
269; CHECK-LABEL: test_12:
270; CHECK:       // %bb.0:
271; CHECK-NEXT:    {
272; CHECK-NEXT:     q0 = vcmp.gt(v1.sf,v0.sf)
273; CHECK-NEXT:    }
274; CHECK-NEXT:    {
275; CHECK-NEXT:     v0 = vmux(q0,v1,v2)
276; CHECK-NEXT:     jumpr r31
277; CHECK-NEXT:    }
278  %t0 = fcmp olt <32 x float> %v0, %v1
279  %t1 = select <32 x i1> %t0, <32 x float> %v1, <32 x float> %v2
280  ret <32 x float> %t1
281}
282
283define <32 x float> @test_13(<32 x float> %v0, <32 x float> %v1, <32 x float> %v2) #0 {
284; CHECK-LABEL: test_13:
285; CHECK:       // %bb.0:
286; CHECK-NEXT:    {
287; CHECK-NEXT:     q0 = vcmp.gt(v0.sf,v1.sf)
288; CHECK-NEXT:    }
289; CHECK-NEXT:    {
290; CHECK-NEXT:     v0 = vmux(q0,v2,v1)
291; CHECK-NEXT:     jumpr r31
292; CHECK-NEXT:    }
293  %t0 = fcmp ole <32 x float> %v0, %v1
294  %t1 = select <32 x i1> %t0, <32 x float> %v1, <32 x float> %v2
295  ret <32 x float> %t1
296}
297
298define <32 x float> @test_14(<32 x float> %v0, <32 x float> %v1, <32 x float> %v2) #0 {
299; CHECK-LABEL: test_14:
300; CHECK:       // %bb.0:
301; CHECK-NEXT:    {
302; CHECK-NEXT:     q0 = vcmp.gt(v0.sf,v1.sf)
303; CHECK-NEXT:    }
304; CHECK-NEXT:    {
305; CHECK-NEXT:     v0 = vmux(q0,v1,v2)
306; CHECK-NEXT:     jumpr r31
307; CHECK-NEXT:    }
308  %t0 = fcmp ogt <32 x float> %v0, %v1
309  %t1 = select <32 x i1> %t0, <32 x float> %v1, <32 x float> %v2
310  ret <32 x float> %t1
311}
312
313define <32 x float> @test_15(<32 x float> %v0, <32 x float> %v1, <32 x float> %v2) #0 {
314; CHECK-LABEL: test_15:
315; CHECK:       // %bb.0:
316; CHECK-NEXT:    {
317; CHECK-NEXT:     q0 = vcmp.gt(v1.sf,v0.sf)
318; CHECK-NEXT:    }
319; CHECK-NEXT:    {
320; CHECK-NEXT:     v0 = vmux(q0,v2,v1)
321; CHECK-NEXT:     jumpr r31
322; CHECK-NEXT:    }
323  %t0 = fcmp oge <32 x float> %v0, %v1
324  %t1 = select <32 x i1> %t0, <32 x float> %v1, <32 x float> %v2
325  ret <32 x float> %t1
326}
327
328define <32 x float> @test_1a(<32 x float> %v0, <32 x float> %v1, <32 x i32> %v2) #0 {
329; CHECK-LABEL: test_1a:
330; CHECK:       // %bb.0:
331; CHECK-NEXT:    {
332; CHECK-NEXT:     r0 = ##16843009
333; CHECK-NEXT:    }
334; CHECK-NEXT:    {
335; CHECK-NEXT:     q0 = vand(v2,r0)
336; CHECK-NEXT:    }
337; CHECK-NEXT:    {
338; CHECK-NEXT:     q0 &= vcmp.eq(v0.w,v1.w)
339; CHECK-NEXT:    }
340; CHECK-NEXT:    {
341; CHECK-NEXT:     v0 = vmux(q0,v0,v1)
342; CHECK-NEXT:     jumpr r31
343; CHECK-NEXT:    }
344  %q0 = fcmp oeq <32 x float> %v0, %v1
345  %q1 = trunc <32 x i32> %v2 to <32 x i1>
346  %q2 = and <32 x i1> %q0, %q1
347  %t1 = select <32 x i1> %q2, <32 x float> %v0, <32 x float> %v1
348  ret <32 x float> %t1
349}
350
351define <32 x float> @test_1b(<32 x float> %v0, <32 x float> %v1, <32 x i32> %v2) #0 {
352; CHECK-LABEL: test_1b:
353; CHECK:       // %bb.0:
354; CHECK-NEXT:    {
355; CHECK-NEXT:     r0 = ##16843009
356; CHECK-NEXT:    }
357; CHECK-NEXT:    {
358; CHECK-NEXT:     q0 = vand(v2,r0)
359; CHECK-NEXT:    }
360; CHECK-NEXT:    {
361; CHECK-NEXT:     q0 |= vcmp.eq(v0.w,v1.w)
362; CHECK-NEXT:    }
363; CHECK-NEXT:    {
364; CHECK-NEXT:     v0 = vmux(q0,v0,v1)
365; CHECK-NEXT:     jumpr r31
366; CHECK-NEXT:    }
367  %q0 = fcmp oeq <32 x float> %v0, %v1
368  %q1 = trunc <32 x i32> %v2 to <32 x i1>
369  %q2 = or <32 x i1> %q0, %q1
370  %t1 = select <32 x i1> %q2, <32 x float> %v0, <32 x float> %v1
371  ret <32 x float> %t1
372}
373
374define <32 x float> @test_1c(<32 x float> %v0, <32 x float> %v1, <32 x i32> %v2) #0 {
375; CHECK-LABEL: test_1c:
376; CHECK:       // %bb.0:
377; CHECK-NEXT:    {
378; CHECK-NEXT:     r0 = ##16843009
379; CHECK-NEXT:    }
380; CHECK-NEXT:    {
381; CHECK-NEXT:     q0 = vand(v2,r0)
382; CHECK-NEXT:    }
383; CHECK-NEXT:    {
384; CHECK-NEXT:     q0 ^= vcmp.eq(v0.w,v1.w)
385; CHECK-NEXT:    }
386; CHECK-NEXT:    {
387; CHECK-NEXT:     v0 = vmux(q0,v0,v1)
388; CHECK-NEXT:     jumpr r31
389; CHECK-NEXT:    }
390  %q0 = fcmp oeq <32 x float> %v0, %v1
391  %q1 = trunc <32 x i32> %v2 to <32 x i1>
392  %q2 = xor <32 x i1> %q0, %q1
393  %t1 = select <32 x i1> %q2, <32 x float> %v0, <32 x float> %v1
394  ret <32 x float> %t1
395}
396
397define <32 x float> @test_1d(<32 x float> %v0, <32 x float> %v1, <32 x i32> %v2) #0 {
398; CHECK-LABEL: test_1d:
399; CHECK:       // %bb.0:
400; CHECK-NEXT:    {
401; CHECK-NEXT:     r0 = ##16843009
402; CHECK-NEXT:    }
403; CHECK-NEXT:    {
404; CHECK-NEXT:     q0 = vand(v2,r0)
405; CHECK-NEXT:    }
406; CHECK-NEXT:    {
407; CHECK-NEXT:     q0 &= vcmp.gt(v0.sf,v1.sf)
408; CHECK-NEXT:    }
409; CHECK-NEXT:    {
410; CHECK-NEXT:     v0 = vmux(q0,v0,v1)
411; CHECK-NEXT:     jumpr r31
412; CHECK-NEXT:    }
413  %q0 = fcmp ogt <32 x float> %v0, %v1
414  %q1 = trunc <32 x i32> %v2 to <32 x i1>
415  %q2 = and <32 x i1> %q0, %q1
416  %t1 = select <32 x i1> %q2, <32 x float> %v0, <32 x float> %v1
417  ret <32 x float> %t1
418}
419
420define <32 x float> @test_1e(<32 x float> %v0, <32 x float> %v1, <32 x i32> %v2) #0 {
421; CHECK-LABEL: test_1e:
422; CHECK:       // %bb.0:
423; CHECK-NEXT:    {
424; CHECK-NEXT:     r0 = ##16843009
425; CHECK-NEXT:    }
426; CHECK-NEXT:    {
427; CHECK-NEXT:     q0 = vand(v2,r0)
428; CHECK-NEXT:    }
429; CHECK-NEXT:    {
430; CHECK-NEXT:     q0 |= vcmp.gt(v0.sf,v1.sf)
431; CHECK-NEXT:    }
432; CHECK-NEXT:    {
433; CHECK-NEXT:     v0 = vmux(q0,v0,v1)
434; CHECK-NEXT:     jumpr r31
435; CHECK-NEXT:    }
436  %q0 = fcmp ogt <32 x float> %v0, %v1
437  %q1 = trunc <32 x i32> %v2 to <32 x i1>
438  %q2 = or <32 x i1> %q0, %q1
439  %t1 = select <32 x i1> %q2, <32 x float> %v0, <32 x float> %v1
440  ret <32 x float> %t1
441}
442
443define <32 x float> @test_1f(<32 x float> %v0, <32 x float> %v1, <32 x i32> %v2) #0 {
444; CHECK-LABEL: test_1f:
445; CHECK:       // %bb.0:
446; CHECK-NEXT:    {
447; CHECK-NEXT:     r0 = ##16843009
448; CHECK-NEXT:    }
449; CHECK-NEXT:    {
450; CHECK-NEXT:     q0 = vand(v2,r0)
451; CHECK-NEXT:    }
452; CHECK-NEXT:    {
453; CHECK-NEXT:     q0 ^= vcmp.gt(v0.sf,v1.sf)
454; CHECK-NEXT:    }
455; CHECK-NEXT:    {
456; CHECK-NEXT:     v0 = vmux(q0,v0,v1)
457; CHECK-NEXT:     jumpr r31
458; CHECK-NEXT:    }
459  %q0 = fcmp ogt <32 x float> %v0, %v1
460  %q1 = trunc <32 x i32> %v2 to <32 x i1>
461  %q2 = xor <32 x i1> %q0, %q1
462  %t1 = select <32 x i1> %q2, <32 x float> %v0, <32 x float> %v1
463  ret <32 x float> %t1
464}
465
466attributes #0 = { nounwind readnone "target-cpu"="hexagonv69" }
467