xref: /llvm-project/llvm/test/CodeGen/X86/vec-strict-cmp-256-fp16.ll (revision f1de9d6dae174feb5000ad6a1b492b8cb717f5b6)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512fp16 -mattr=+avx512vl -O3 | FileCheck %s --check-prefixes=AVX512-32
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512fp16 -mattr=+avx512vl -O3 | FileCheck %s --check-prefixes=AVX512-64
4
5define <16 x i16> @test_v16f16_oeq_q(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
6; AVX512-32-LABEL: test_v16f16_oeq_q:
7; AVX512-32:       # %bb.0:
8; AVX512-32-NEXT:    pushl %ebp
9; AVX512-32-NEXT:    movl %esp, %ebp
10; AVX512-32-NEXT:    andl $-32, %esp
11; AVX512-32-NEXT:    subl $32, %esp
12; AVX512-32-NEXT:    vcmpeqph 8(%ebp), %ymm2, %k1
13; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
14; AVX512-32-NEXT:    movl %ebp, %esp
15; AVX512-32-NEXT:    popl %ebp
16; AVX512-32-NEXT:    retl
17;
18; AVX512-64-LABEL: test_v16f16_oeq_q:
19; AVX512-64:       # %bb.0:
20; AVX512-64-NEXT:    vcmpeqph %ymm3, %ymm2, %k1
21; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
22; AVX512-64-NEXT:    retq
23  %cond = call <16 x i1> @llvm.experimental.constrained.fcmp.v16f16(
24                                               <16 x half> %f1, <16 x half> %f2, metadata !"oeq",
25                                               metadata !"fpexcept.strict") #0
26  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
27  ret <16 x i16> %res
28}
29
30define <16 x i16> @test_v16f16_ogt_q(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
31; AVX512-32-LABEL: test_v16f16_ogt_q:
32; AVX512-32:       # %bb.0:
33; AVX512-32-NEXT:    pushl %ebp
34; AVX512-32-NEXT:    movl %esp, %ebp
35; AVX512-32-NEXT:    andl $-32, %esp
36; AVX512-32-NEXT:    subl $32, %esp
37; AVX512-32-NEXT:    vcmpgt_oqph 8(%ebp), %ymm2, %k1
38; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
39; AVX512-32-NEXT:    movl %ebp, %esp
40; AVX512-32-NEXT:    popl %ebp
41; AVX512-32-NEXT:    retl
42;
43; AVX512-64-LABEL: test_v16f16_ogt_q:
44; AVX512-64:       # %bb.0:
45; AVX512-64-NEXT:    vcmplt_oqph %ymm2, %ymm3, %k1
46; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
47; AVX512-64-NEXT:    retq
48  %cond = call <16 x i1> @llvm.experimental.constrained.fcmp.v16f16(
49                                               <16 x half> %f1, <16 x half> %f2, metadata !"ogt",
50                                               metadata !"fpexcept.strict") #0
51  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
52  ret <16 x i16> %res
53}
54
55define <16 x i16> @test_v16f16_oge_q(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
56; AVX512-32-LABEL: test_v16f16_oge_q:
57; AVX512-32:       # %bb.0:
58; AVX512-32-NEXT:    pushl %ebp
59; AVX512-32-NEXT:    movl %esp, %ebp
60; AVX512-32-NEXT:    andl $-32, %esp
61; AVX512-32-NEXT:    subl $32, %esp
62; AVX512-32-NEXT:    vcmpge_oqph 8(%ebp), %ymm2, %k1
63; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
64; AVX512-32-NEXT:    movl %ebp, %esp
65; AVX512-32-NEXT:    popl %ebp
66; AVX512-32-NEXT:    retl
67;
68; AVX512-64-LABEL: test_v16f16_oge_q:
69; AVX512-64:       # %bb.0:
70; AVX512-64-NEXT:    vcmple_oqph %ymm2, %ymm3, %k1
71; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
72; AVX512-64-NEXT:    retq
73  %cond = call <16 x i1> @llvm.experimental.constrained.fcmp.v16f16(
74                                               <16 x half> %f1, <16 x half> %f2, metadata !"oge",
75                                               metadata !"fpexcept.strict") #0
76  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
77  ret <16 x i16> %res
78}
79
80define <16 x i16> @test_v16f16_olt_q(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
81; AVX512-32-LABEL: test_v16f16_olt_q:
82; AVX512-32:       # %bb.0:
83; AVX512-32-NEXT:    pushl %ebp
84; AVX512-32-NEXT:    movl %esp, %ebp
85; AVX512-32-NEXT:    andl $-32, %esp
86; AVX512-32-NEXT:    subl $32, %esp
87; AVX512-32-NEXT:    vcmplt_oqph 8(%ebp), %ymm2, %k1
88; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
89; AVX512-32-NEXT:    movl %ebp, %esp
90; AVX512-32-NEXT:    popl %ebp
91; AVX512-32-NEXT:    retl
92;
93; AVX512-64-LABEL: test_v16f16_olt_q:
94; AVX512-64:       # %bb.0:
95; AVX512-64-NEXT:    vcmplt_oqph %ymm3, %ymm2, %k1
96; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
97; AVX512-64-NEXT:    retq
98  %cond = call <16 x i1> @llvm.experimental.constrained.fcmp.v16f16(
99                                               <16 x half> %f1, <16 x half> %f2, metadata !"olt",
100                                               metadata !"fpexcept.strict") #0
101  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
102  ret <16 x i16> %res
103}
104
105define <16 x i16> @test_v16f16_ole_q(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
106; AVX512-32-LABEL: test_v16f16_ole_q:
107; AVX512-32:       # %bb.0:
108; AVX512-32-NEXT:    pushl %ebp
109; AVX512-32-NEXT:    movl %esp, %ebp
110; AVX512-32-NEXT:    andl $-32, %esp
111; AVX512-32-NEXT:    subl $32, %esp
112; AVX512-32-NEXT:    vcmple_oqph 8(%ebp), %ymm2, %k1
113; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
114; AVX512-32-NEXT:    movl %ebp, %esp
115; AVX512-32-NEXT:    popl %ebp
116; AVX512-32-NEXT:    retl
117;
118; AVX512-64-LABEL: test_v16f16_ole_q:
119; AVX512-64:       # %bb.0:
120; AVX512-64-NEXT:    vcmple_oqph %ymm3, %ymm2, %k1
121; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
122; AVX512-64-NEXT:    retq
123  %cond = call <16 x i1> @llvm.experimental.constrained.fcmp.v16f16(
124                                               <16 x half> %f1, <16 x half> %f2, metadata !"ole",
125                                               metadata !"fpexcept.strict") #0
126  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
127  ret <16 x i16> %res
128}
129
130define <16 x i16> @test_v16f16_one_q(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
131; AVX512-32-LABEL: test_v16f16_one_q:
132; AVX512-32:       # %bb.0:
133; AVX512-32-NEXT:    pushl %ebp
134; AVX512-32-NEXT:    movl %esp, %ebp
135; AVX512-32-NEXT:    andl $-32, %esp
136; AVX512-32-NEXT:    subl $32, %esp
137; AVX512-32-NEXT:    vcmpneq_oqph 8(%ebp), %ymm2, %k1
138; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
139; AVX512-32-NEXT:    movl %ebp, %esp
140; AVX512-32-NEXT:    popl %ebp
141; AVX512-32-NEXT:    retl
142;
143; AVX512-64-LABEL: test_v16f16_one_q:
144; AVX512-64:       # %bb.0:
145; AVX512-64-NEXT:    vcmpneq_oqph %ymm3, %ymm2, %k1
146; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
147; AVX512-64-NEXT:    retq
148  %cond = call <16 x i1> @llvm.experimental.constrained.fcmp.v16f16(
149                                               <16 x half> %f1, <16 x half> %f2, metadata !"one",
150                                               metadata !"fpexcept.strict") #0
151  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
152  ret <16 x i16> %res
153}
154
155define <16 x i16> @test_v16f16_ord_q(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
156; AVX512-32-LABEL: test_v16f16_ord_q:
157; AVX512-32:       # %bb.0:
158; AVX512-32-NEXT:    pushl %ebp
159; AVX512-32-NEXT:    movl %esp, %ebp
160; AVX512-32-NEXT:    andl $-32, %esp
161; AVX512-32-NEXT:    subl $32, %esp
162; AVX512-32-NEXT:    vcmpordph 8(%ebp), %ymm2, %k1
163; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
164; AVX512-32-NEXT:    movl %ebp, %esp
165; AVX512-32-NEXT:    popl %ebp
166; AVX512-32-NEXT:    retl
167;
168; AVX512-64-LABEL: test_v16f16_ord_q:
169; AVX512-64:       # %bb.0:
170; AVX512-64-NEXT:    vcmpordph %ymm3, %ymm2, %k1
171; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
172; AVX512-64-NEXT:    retq
173  %cond = call <16 x i1> @llvm.experimental.constrained.fcmp.v16f16(
174                                               <16 x half> %f1, <16 x half> %f2, metadata !"ord",
175                                               metadata !"fpexcept.strict") #0
176  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
177  ret <16 x i16> %res
178}
179
180define <16 x i16> @test_v16f16_ueq_q(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
181; AVX512-32-LABEL: test_v16f16_ueq_q:
182; AVX512-32:       # %bb.0:
183; AVX512-32-NEXT:    pushl %ebp
184; AVX512-32-NEXT:    movl %esp, %ebp
185; AVX512-32-NEXT:    andl $-32, %esp
186; AVX512-32-NEXT:    subl $32, %esp
187; AVX512-32-NEXT:    vcmpeq_uqph 8(%ebp), %ymm2, %k1
188; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
189; AVX512-32-NEXT:    movl %ebp, %esp
190; AVX512-32-NEXT:    popl %ebp
191; AVX512-32-NEXT:    retl
192;
193; AVX512-64-LABEL: test_v16f16_ueq_q:
194; AVX512-64:       # %bb.0:
195; AVX512-64-NEXT:    vcmpeq_uqph %ymm3, %ymm2, %k1
196; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
197; AVX512-64-NEXT:    retq
198  %cond = call <16 x i1> @llvm.experimental.constrained.fcmp.v16f16(
199                                               <16 x half> %f1, <16 x half> %f2, metadata !"ueq",
200                                               metadata !"fpexcept.strict") #0
201  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
202  ret <16 x i16> %res
203}
204
205define <16 x i16> @test_v16f16_ugt_q(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
206; AVX512-32-LABEL: test_v16f16_ugt_q:
207; AVX512-32:       # %bb.0:
208; AVX512-32-NEXT:    pushl %ebp
209; AVX512-32-NEXT:    movl %esp, %ebp
210; AVX512-32-NEXT:    andl $-32, %esp
211; AVX512-32-NEXT:    subl $32, %esp
212; AVX512-32-NEXT:    vcmpnle_uqph 8(%ebp), %ymm2, %k1
213; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
214; AVX512-32-NEXT:    movl %ebp, %esp
215; AVX512-32-NEXT:    popl %ebp
216; AVX512-32-NEXT:    retl
217;
218; AVX512-64-LABEL: test_v16f16_ugt_q:
219; AVX512-64:       # %bb.0:
220; AVX512-64-NEXT:    vcmpnle_uqph %ymm3, %ymm2, %k1
221; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
222; AVX512-64-NEXT:    retq
223  %cond = call <16 x i1> @llvm.experimental.constrained.fcmp.v16f16(
224                                               <16 x half> %f1, <16 x half> %f2, metadata !"ugt",
225                                               metadata !"fpexcept.strict") #0
226  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
227  ret <16 x i16> %res
228}
229
230define <16 x i16> @test_v16f16_uge_q(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
231; AVX512-32-LABEL: test_v16f16_uge_q:
232; AVX512-32:       # %bb.0:
233; AVX512-32-NEXT:    pushl %ebp
234; AVX512-32-NEXT:    movl %esp, %ebp
235; AVX512-32-NEXT:    andl $-32, %esp
236; AVX512-32-NEXT:    subl $32, %esp
237; AVX512-32-NEXT:    vcmpnlt_uqph 8(%ebp), %ymm2, %k1
238; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
239; AVX512-32-NEXT:    movl %ebp, %esp
240; AVX512-32-NEXT:    popl %ebp
241; AVX512-32-NEXT:    retl
242;
243; AVX512-64-LABEL: test_v16f16_uge_q:
244; AVX512-64:       # %bb.0:
245; AVX512-64-NEXT:    vcmpnlt_uqph %ymm3, %ymm2, %k1
246; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
247; AVX512-64-NEXT:    retq
248  %cond = call <16 x i1> @llvm.experimental.constrained.fcmp.v16f16(
249                                               <16 x half> %f1, <16 x half> %f2, metadata !"uge",
250                                               metadata !"fpexcept.strict") #0
251  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
252  ret <16 x i16> %res
253}
254
255define <16 x i16> @test_v16f16_ult_q(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
256; AVX512-32-LABEL: test_v16f16_ult_q:
257; AVX512-32:       # %bb.0:
258; AVX512-32-NEXT:    pushl %ebp
259; AVX512-32-NEXT:    movl %esp, %ebp
260; AVX512-32-NEXT:    andl $-32, %esp
261; AVX512-32-NEXT:    subl $32, %esp
262; AVX512-32-NEXT:    vcmpnge_uqph 8(%ebp), %ymm2, %k1
263; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
264; AVX512-32-NEXT:    movl %ebp, %esp
265; AVX512-32-NEXT:    popl %ebp
266; AVX512-32-NEXT:    retl
267;
268; AVX512-64-LABEL: test_v16f16_ult_q:
269; AVX512-64:       # %bb.0:
270; AVX512-64-NEXT:    vcmpnle_uqph %ymm2, %ymm3, %k1
271; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
272; AVX512-64-NEXT:    retq
273  %cond = call <16 x i1> @llvm.experimental.constrained.fcmp.v16f16(
274                                               <16 x half> %f1, <16 x half> %f2, metadata !"ult",
275                                               metadata !"fpexcept.strict") #0
276  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
277  ret <16 x i16> %res
278}
279
280define <16 x i16> @test_v16f16_ule_q(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
281; AVX512-32-LABEL: test_v16f16_ule_q:
282; AVX512-32:       # %bb.0:
283; AVX512-32-NEXT:    pushl %ebp
284; AVX512-32-NEXT:    movl %esp, %ebp
285; AVX512-32-NEXT:    andl $-32, %esp
286; AVX512-32-NEXT:    subl $32, %esp
287; AVX512-32-NEXT:    vcmpngt_uqph 8(%ebp), %ymm2, %k1
288; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
289; AVX512-32-NEXT:    movl %ebp, %esp
290; AVX512-32-NEXT:    popl %ebp
291; AVX512-32-NEXT:    retl
292;
293; AVX512-64-LABEL: test_v16f16_ule_q:
294; AVX512-64:       # %bb.0:
295; AVX512-64-NEXT:    vcmpnlt_uqph %ymm2, %ymm3, %k1
296; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
297; AVX512-64-NEXT:    retq
298  %cond = call <16 x i1> @llvm.experimental.constrained.fcmp.v16f16(
299                                               <16 x half> %f1, <16 x half> %f2, metadata !"ule",
300                                               metadata !"fpexcept.strict") #0
301  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
302  ret <16 x i16> %res
303}
304
305define <16 x i16> @test_v16f16_une_q(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
306; AVX512-32-LABEL: test_v16f16_une_q:
307; AVX512-32:       # %bb.0:
308; AVX512-32-NEXT:    pushl %ebp
309; AVX512-32-NEXT:    movl %esp, %ebp
310; AVX512-32-NEXT:    andl $-32, %esp
311; AVX512-32-NEXT:    subl $32, %esp
312; AVX512-32-NEXT:    vcmpneqph 8(%ebp), %ymm2, %k1
313; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
314; AVX512-32-NEXT:    movl %ebp, %esp
315; AVX512-32-NEXT:    popl %ebp
316; AVX512-32-NEXT:    retl
317;
318; AVX512-64-LABEL: test_v16f16_une_q:
319; AVX512-64:       # %bb.0:
320; AVX512-64-NEXT:    vcmpneqph %ymm3, %ymm2, %k1
321; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
322; AVX512-64-NEXT:    retq
323  %cond = call <16 x i1> @llvm.experimental.constrained.fcmp.v16f16(
324                                               <16 x half> %f1, <16 x half> %f2, metadata !"une",
325                                               metadata !"fpexcept.strict") #0
326  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
327  ret <16 x i16> %res
328}
329
330define <16 x i16> @test_v16f16_uno_q(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
331; AVX512-32-LABEL: test_v16f16_uno_q:
332; AVX512-32:       # %bb.0:
333; AVX512-32-NEXT:    pushl %ebp
334; AVX512-32-NEXT:    movl %esp, %ebp
335; AVX512-32-NEXT:    andl $-32, %esp
336; AVX512-32-NEXT:    subl $32, %esp
337; AVX512-32-NEXT:    vcmpunordph 8(%ebp), %ymm2, %k1
338; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
339; AVX512-32-NEXT:    movl %ebp, %esp
340; AVX512-32-NEXT:    popl %ebp
341; AVX512-32-NEXT:    retl
342;
343; AVX512-64-LABEL: test_v16f16_uno_q:
344; AVX512-64:       # %bb.0:
345; AVX512-64-NEXT:    vcmpunordph %ymm3, %ymm2, %k1
346; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
347; AVX512-64-NEXT:    retq
348  %cond = call <16 x i1> @llvm.experimental.constrained.fcmp.v16f16(
349                                               <16 x half> %f1, <16 x half> %f2, metadata !"uno",
350                                               metadata !"fpexcept.strict") #0
351  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
352  ret <16 x i16> %res
353}
354
355define <16 x i16> @test_v16f16_oeq_s(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
356; AVX512-32-LABEL: test_v16f16_oeq_s:
357; AVX512-32:       # %bb.0:
358; AVX512-32-NEXT:    pushl %ebp
359; AVX512-32-NEXT:    movl %esp, %ebp
360; AVX512-32-NEXT:    andl $-32, %esp
361; AVX512-32-NEXT:    subl $32, %esp
362; AVX512-32-NEXT:    vcmpeq_osph 8(%ebp), %ymm2, %k1
363; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
364; AVX512-32-NEXT:    movl %ebp, %esp
365; AVX512-32-NEXT:    popl %ebp
366; AVX512-32-NEXT:    retl
367;
368; AVX512-64-LABEL: test_v16f16_oeq_s:
369; AVX512-64:       # %bb.0:
370; AVX512-64-NEXT:    vcmpeq_osph %ymm3, %ymm2, %k1
371; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
372; AVX512-64-NEXT:    retq
373  %cond = call <16 x i1> @llvm.experimental.constrained.fcmps.v16f16(
374                                               <16 x half> %f1, <16 x half> %f2, metadata !"oeq",
375                                               metadata !"fpexcept.strict") #0
376  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
377  ret <16 x i16> %res
378}
379
380define <16 x i16> @test_v16f16_ogt_s(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
381; AVX512-32-LABEL: test_v16f16_ogt_s:
382; AVX512-32:       # %bb.0:
383; AVX512-32-NEXT:    pushl %ebp
384; AVX512-32-NEXT:    movl %esp, %ebp
385; AVX512-32-NEXT:    andl $-32, %esp
386; AVX512-32-NEXT:    subl $32, %esp
387; AVX512-32-NEXT:    vcmpgtph 8(%ebp), %ymm2, %k1
388; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
389; AVX512-32-NEXT:    movl %ebp, %esp
390; AVX512-32-NEXT:    popl %ebp
391; AVX512-32-NEXT:    retl
392;
393; AVX512-64-LABEL: test_v16f16_ogt_s:
394; AVX512-64:       # %bb.0:
395; AVX512-64-NEXT:    vcmpltph %ymm2, %ymm3, %k1
396; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
397; AVX512-64-NEXT:    retq
398  %cond = call <16 x i1> @llvm.experimental.constrained.fcmps.v16f16(
399                                               <16 x half> %f1, <16 x half> %f2, metadata !"ogt",
400                                               metadata !"fpexcept.strict") #0
401  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
402  ret <16 x i16> %res
403}
404
405define <16 x i16> @test_v16f16_oge_s(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
406; AVX512-32-LABEL: test_v16f16_oge_s:
407; AVX512-32:       # %bb.0:
408; AVX512-32-NEXT:    pushl %ebp
409; AVX512-32-NEXT:    movl %esp, %ebp
410; AVX512-32-NEXT:    andl $-32, %esp
411; AVX512-32-NEXT:    subl $32, %esp
412; AVX512-32-NEXT:    vcmpgeph 8(%ebp), %ymm2, %k1
413; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
414; AVX512-32-NEXT:    movl %ebp, %esp
415; AVX512-32-NEXT:    popl %ebp
416; AVX512-32-NEXT:    retl
417;
418; AVX512-64-LABEL: test_v16f16_oge_s:
419; AVX512-64:       # %bb.0:
420; AVX512-64-NEXT:    vcmpleph %ymm2, %ymm3, %k1
421; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
422; AVX512-64-NEXT:    retq
423  %cond = call <16 x i1> @llvm.experimental.constrained.fcmps.v16f16(
424                                               <16 x half> %f1, <16 x half> %f2, metadata !"oge",
425                                               metadata !"fpexcept.strict") #0
426  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
427  ret <16 x i16> %res
428}
429
430define <16 x i16> @test_v16f16_olt_s(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
431; AVX512-32-LABEL: test_v16f16_olt_s:
432; AVX512-32:       # %bb.0:
433; AVX512-32-NEXT:    pushl %ebp
434; AVX512-32-NEXT:    movl %esp, %ebp
435; AVX512-32-NEXT:    andl $-32, %esp
436; AVX512-32-NEXT:    subl $32, %esp
437; AVX512-32-NEXT:    vcmpltph 8(%ebp), %ymm2, %k1
438; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
439; AVX512-32-NEXT:    movl %ebp, %esp
440; AVX512-32-NEXT:    popl %ebp
441; AVX512-32-NEXT:    retl
442;
443; AVX512-64-LABEL: test_v16f16_olt_s:
444; AVX512-64:       # %bb.0:
445; AVX512-64-NEXT:    vcmpltph %ymm3, %ymm2, %k1
446; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
447; AVX512-64-NEXT:    retq
448  %cond = call <16 x i1> @llvm.experimental.constrained.fcmps.v16f16(
449                                               <16 x half> %f1, <16 x half> %f2, metadata !"olt",
450                                               metadata !"fpexcept.strict") #0
451  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
452  ret <16 x i16> %res
453}
454
455define <16 x i16> @test_v16f16_ole_s(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
456; AVX512-32-LABEL: test_v16f16_ole_s:
457; AVX512-32:       # %bb.0:
458; AVX512-32-NEXT:    pushl %ebp
459; AVX512-32-NEXT:    movl %esp, %ebp
460; AVX512-32-NEXT:    andl $-32, %esp
461; AVX512-32-NEXT:    subl $32, %esp
462; AVX512-32-NEXT:    vcmpleph 8(%ebp), %ymm2, %k1
463; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
464; AVX512-32-NEXT:    movl %ebp, %esp
465; AVX512-32-NEXT:    popl %ebp
466; AVX512-32-NEXT:    retl
467;
468; AVX512-64-LABEL: test_v16f16_ole_s:
469; AVX512-64:       # %bb.0:
470; AVX512-64-NEXT:    vcmpleph %ymm3, %ymm2, %k1
471; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
472; AVX512-64-NEXT:    retq
473  %cond = call <16 x i1> @llvm.experimental.constrained.fcmps.v16f16(
474                                               <16 x half> %f1, <16 x half> %f2, metadata !"ole",
475                                               metadata !"fpexcept.strict") #0
476  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
477  ret <16 x i16> %res
478}
479
480define <16 x i16> @test_v16f16_one_s(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
481; AVX512-32-LABEL: test_v16f16_one_s:
482; AVX512-32:       # %bb.0:
483; AVX512-32-NEXT:    pushl %ebp
484; AVX512-32-NEXT:    movl %esp, %ebp
485; AVX512-32-NEXT:    andl $-32, %esp
486; AVX512-32-NEXT:    subl $32, %esp
487; AVX512-32-NEXT:    vcmpneq_osph 8(%ebp), %ymm2, %k1
488; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
489; AVX512-32-NEXT:    movl %ebp, %esp
490; AVX512-32-NEXT:    popl %ebp
491; AVX512-32-NEXT:    retl
492;
493; AVX512-64-LABEL: test_v16f16_one_s:
494; AVX512-64:       # %bb.0:
495; AVX512-64-NEXT:    vcmpneq_osph %ymm3, %ymm2, %k1
496; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
497; AVX512-64-NEXT:    retq
498  %cond = call <16 x i1> @llvm.experimental.constrained.fcmps.v16f16(
499                                               <16 x half> %f1, <16 x half> %f2, metadata !"one",
500                                               metadata !"fpexcept.strict") #0
501  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
502  ret <16 x i16> %res
503}
504
505define <16 x i16> @test_v16f16_ord_s(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
506; AVX512-32-LABEL: test_v16f16_ord_s:
507; AVX512-32:       # %bb.0:
508; AVX512-32-NEXT:    pushl %ebp
509; AVX512-32-NEXT:    movl %esp, %ebp
510; AVX512-32-NEXT:    andl $-32, %esp
511; AVX512-32-NEXT:    subl $32, %esp
512; AVX512-32-NEXT:    vcmpord_sph 8(%ebp), %ymm2, %k1
513; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
514; AVX512-32-NEXT:    movl %ebp, %esp
515; AVX512-32-NEXT:    popl %ebp
516; AVX512-32-NEXT:    retl
517;
518; AVX512-64-LABEL: test_v16f16_ord_s:
519; AVX512-64:       # %bb.0:
520; AVX512-64-NEXT:    vcmpord_sph %ymm3, %ymm2, %k1
521; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
522; AVX512-64-NEXT:    retq
523  %cond = call <16 x i1> @llvm.experimental.constrained.fcmps.v16f16(
524                                               <16 x half> %f1, <16 x half> %f2, metadata !"ord",
525                                               metadata !"fpexcept.strict") #0
526  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
527  ret <16 x i16> %res
528}
529
530define <16 x i16> @test_v16f16_ueq_s(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
531; AVX512-32-LABEL: test_v16f16_ueq_s:
532; AVX512-32:       # %bb.0:
533; AVX512-32-NEXT:    pushl %ebp
534; AVX512-32-NEXT:    movl %esp, %ebp
535; AVX512-32-NEXT:    andl $-32, %esp
536; AVX512-32-NEXT:    subl $32, %esp
537; AVX512-32-NEXT:    vcmpeq_usph 8(%ebp), %ymm2, %k1
538; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
539; AVX512-32-NEXT:    movl %ebp, %esp
540; AVX512-32-NEXT:    popl %ebp
541; AVX512-32-NEXT:    retl
542;
543; AVX512-64-LABEL: test_v16f16_ueq_s:
544; AVX512-64:       # %bb.0:
545; AVX512-64-NEXT:    vcmpeq_usph %ymm3, %ymm2, %k1
546; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
547; AVX512-64-NEXT:    retq
548  %cond = call <16 x i1> @llvm.experimental.constrained.fcmps.v16f16(
549                                               <16 x half> %f1, <16 x half> %f2, metadata !"ueq",
550                                               metadata !"fpexcept.strict") #0
551  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
552  ret <16 x i16> %res
553}
554
555define <16 x i16> @test_v16f16_ugt_s(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
556; AVX512-32-LABEL: test_v16f16_ugt_s:
557; AVX512-32:       # %bb.0:
558; AVX512-32-NEXT:    pushl %ebp
559; AVX512-32-NEXT:    movl %esp, %ebp
560; AVX512-32-NEXT:    andl $-32, %esp
561; AVX512-32-NEXT:    subl $32, %esp
562; AVX512-32-NEXT:    vcmpnleph 8(%ebp), %ymm2, %k1
563; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
564; AVX512-32-NEXT:    movl %ebp, %esp
565; AVX512-32-NEXT:    popl %ebp
566; AVX512-32-NEXT:    retl
567;
568; AVX512-64-LABEL: test_v16f16_ugt_s:
569; AVX512-64:       # %bb.0:
570; AVX512-64-NEXT:    vcmpnleph %ymm3, %ymm2, %k1
571; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
572; AVX512-64-NEXT:    retq
573  %cond = call <16 x i1> @llvm.experimental.constrained.fcmps.v16f16(
574                                               <16 x half> %f1, <16 x half> %f2, metadata !"ugt",
575                                               metadata !"fpexcept.strict") #0
576  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
577  ret <16 x i16> %res
578}
579
580define <16 x i16> @test_v16f16_uge_s(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
581; AVX512-32-LABEL: test_v16f16_uge_s:
582; AVX512-32:       # %bb.0:
583; AVX512-32-NEXT:    pushl %ebp
584; AVX512-32-NEXT:    movl %esp, %ebp
585; AVX512-32-NEXT:    andl $-32, %esp
586; AVX512-32-NEXT:    subl $32, %esp
587; AVX512-32-NEXT:    vcmpnltph 8(%ebp), %ymm2, %k1
588; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
589; AVX512-32-NEXT:    movl %ebp, %esp
590; AVX512-32-NEXT:    popl %ebp
591; AVX512-32-NEXT:    retl
592;
593; AVX512-64-LABEL: test_v16f16_uge_s:
594; AVX512-64:       # %bb.0:
595; AVX512-64-NEXT:    vcmpnltph %ymm3, %ymm2, %k1
596; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
597; AVX512-64-NEXT:    retq
598  %cond = call <16 x i1> @llvm.experimental.constrained.fcmps.v16f16(
599                                               <16 x half> %f1, <16 x half> %f2, metadata !"uge",
600                                               metadata !"fpexcept.strict") #0
601  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
602  ret <16 x i16> %res
603}
604
605define <16 x i16> @test_v16f16_ult_s(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
606; AVX512-32-LABEL: test_v16f16_ult_s:
607; AVX512-32:       # %bb.0:
608; AVX512-32-NEXT:    pushl %ebp
609; AVX512-32-NEXT:    movl %esp, %ebp
610; AVX512-32-NEXT:    andl $-32, %esp
611; AVX512-32-NEXT:    subl $32, %esp
612; AVX512-32-NEXT:    vcmpngeph 8(%ebp), %ymm2, %k1
613; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
614; AVX512-32-NEXT:    movl %ebp, %esp
615; AVX512-32-NEXT:    popl %ebp
616; AVX512-32-NEXT:    retl
617;
618; AVX512-64-LABEL: test_v16f16_ult_s:
619; AVX512-64:       # %bb.0:
620; AVX512-64-NEXT:    vcmpnleph %ymm2, %ymm3, %k1
621; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
622; AVX512-64-NEXT:    retq
623  %cond = call <16 x i1> @llvm.experimental.constrained.fcmps.v16f16(
624                                               <16 x half> %f1, <16 x half> %f2, metadata !"ult",
625                                               metadata !"fpexcept.strict") #0
626  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
627  ret <16 x i16> %res
628}
629
630define <16 x i16> @test_v16f16_ule_s(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
631; AVX512-32-LABEL: test_v16f16_ule_s:
632; AVX512-32:       # %bb.0:
633; AVX512-32-NEXT:    pushl %ebp
634; AVX512-32-NEXT:    movl %esp, %ebp
635; AVX512-32-NEXT:    andl $-32, %esp
636; AVX512-32-NEXT:    subl $32, %esp
637; AVX512-32-NEXT:    vcmpngtph 8(%ebp), %ymm2, %k1
638; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
639; AVX512-32-NEXT:    movl %ebp, %esp
640; AVX512-32-NEXT:    popl %ebp
641; AVX512-32-NEXT:    retl
642;
643; AVX512-64-LABEL: test_v16f16_ule_s:
644; AVX512-64:       # %bb.0:
645; AVX512-64-NEXT:    vcmpnltph %ymm2, %ymm3, %k1
646; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
647; AVX512-64-NEXT:    retq
648  %cond = call <16 x i1> @llvm.experimental.constrained.fcmps.v16f16(
649                                               <16 x half> %f1, <16 x half> %f2, metadata !"ule",
650                                               metadata !"fpexcept.strict") #0
651  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
652  ret <16 x i16> %res
653}
654
655define <16 x i16> @test_v16f16_une_s(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
656; AVX512-32-LABEL: test_v16f16_une_s:
657; AVX512-32:       # %bb.0:
658; AVX512-32-NEXT:    pushl %ebp
659; AVX512-32-NEXT:    movl %esp, %ebp
660; AVX512-32-NEXT:    andl $-32, %esp
661; AVX512-32-NEXT:    subl $32, %esp
662; AVX512-32-NEXT:    vcmpneq_usph 8(%ebp), %ymm2, %k1
663; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
664; AVX512-32-NEXT:    movl %ebp, %esp
665; AVX512-32-NEXT:    popl %ebp
666; AVX512-32-NEXT:    retl
667;
668; AVX512-64-LABEL: test_v16f16_une_s:
669; AVX512-64:       # %bb.0:
670; AVX512-64-NEXT:    vcmpneq_usph %ymm3, %ymm2, %k1
671; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
672; AVX512-64-NEXT:    retq
673  %cond = call <16 x i1> @llvm.experimental.constrained.fcmps.v16f16(
674                                               <16 x half> %f1, <16 x half> %f2, metadata !"une",
675                                               metadata !"fpexcept.strict") #0
676  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
677  ret <16 x i16> %res
678}
679
680define <16 x i16> @test_v16f16_uno_s(<16 x i16> %a, <16 x i16> %b, <16 x half> %f1, <16 x half> %f2) #0 {
681; AVX512-32-LABEL: test_v16f16_uno_s:
682; AVX512-32:       # %bb.0:
683; AVX512-32-NEXT:    pushl %ebp
684; AVX512-32-NEXT:    movl %esp, %ebp
685; AVX512-32-NEXT:    andl $-32, %esp
686; AVX512-32-NEXT:    subl $32, %esp
687; AVX512-32-NEXT:    vcmpunord_sph 8(%ebp), %ymm2, %k1
688; AVX512-32-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
689; AVX512-32-NEXT:    movl %ebp, %esp
690; AVX512-32-NEXT:    popl %ebp
691; AVX512-32-NEXT:    retl
692;
693; AVX512-64-LABEL: test_v16f16_uno_s:
694; AVX512-64:       # %bb.0:
695; AVX512-64-NEXT:    vcmpunord_sph %ymm3, %ymm2, %k1
696; AVX512-64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
697; AVX512-64-NEXT:    retq
698  %cond = call <16 x i1> @llvm.experimental.constrained.fcmps.v16f16(
699                                               <16 x half> %f1, <16 x half> %f2, metadata !"uno",
700                                               metadata !"fpexcept.strict") #0
701  %res = select <16 x i1> %cond, <16 x i16> %a, <16 x i16> %b
702  ret <16 x i16> %res
703}
704
705attributes #0 = { strictfp nounwind }
706
707declare <16 x i1> @llvm.experimental.constrained.fcmp.v16f16(<16 x half>, <16 x half>, metadata, metadata)
708declare <16 x i1> @llvm.experimental.constrained.fcmps.v16f16(<16 x half>, <16 x half>, metadata, metadata)
709