xref: /llvm-project/llvm/test/CodeGen/RISCV/half-fcmp-strict.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+zfh -verify-machineinstrs \
3; RUN:   -target-abi ilp32f -disable-strictnode-mutation < %s | FileCheck %s
4; RUN: llc -mtriple=riscv64 -mattr=+zfh -verify-machineinstrs \
5; RUN:   -target-abi lp64f -disable-strictnode-mutation < %s | FileCheck %s
6; RUN: llc -mtriple=riscv32 -mattr=+zhinx -verify-machineinstrs \
7; RUN:   -target-abi ilp32 -disable-strictnode-mutation < %s \
8; RUN:   | FileCheck -check-prefix=CHECKIZHINX %s
9; RUN: llc -mtriple=riscv64 -mattr=+zhinx -verify-machineinstrs \
10; RUN:   -target-abi lp64 -disable-strictnode-mutation < %s  \
11; RUN:   | FileCheck -check-prefix=CHECKIZHINX %s
12; RUN: llc -mtriple=riscv32 -mattr=+zfh -verify-machineinstrs \
13; RUN:   -target-abi ilp32f -disable-strictnode-mutation < %s \
14; RUN:   | FileCheck -check-prefix=CHECKIZFHMIN %s
15; RUN: llc -mtriple=riscv64 -mattr=+zfh -verify-machineinstrs \
16; RUN:   -target-abi lp64f -disable-strictnode-mutation < %s  \
17; RUN:   | FileCheck -check-prefix=CHECKIZFHMIN %s
18; RUN: llc -mtriple=riscv32 -mattr=+zhinxmin -verify-machineinstrs \
19; RUN:   -target-abi ilp32 -disable-strictnode-mutation < %s \
20; RUN:   | FileCheck -check-prefix=CHECKIZHINXMIN %s
21; RUN: llc -mtriple=riscv64 -mattr=+zhinxmin -verify-machineinstrs \
22; RUN:   -target-abi lp64 -disable-strictnode-mutation < %s  \
23; RUN:   | FileCheck -check-prefix=CHECKIZHINXMIN %s
24
25define i32 @fcmp_oeq(half %a, half %b) nounwind strictfp {
26; CHECK-LABEL: fcmp_oeq:
27; CHECK:       # %bb.0:
28; CHECK-NEXT:    feq.h a0, fa0, fa1
29; CHECK-NEXT:    ret
30;
31; CHECKIZHINX-LABEL: fcmp_oeq:
32; CHECKIZHINX:       # %bb.0:
33; CHECKIZHINX-NEXT:    feq.h a0, a0, a1
34; CHECKIZHINX-NEXT:    ret
35;
36; CHECKIZFHMIN-LABEL: fcmp_oeq:
37; CHECKIZFHMIN:       # %bb.0:
38; CHECKIZFHMIN-NEXT:    feq.h a0, fa0, fa1
39; CHECKIZFHMIN-NEXT:    ret
40;
41; CHECKIZHINXMIN-LABEL: fcmp_oeq:
42; CHECKIZHINXMIN:       # %bb.0:
43; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
44; CHECKIZHINXMIN-NEXT:    fcvt.s.h a0, a0
45; CHECKIZHINXMIN-NEXT:    feq.s a0, a0, a1
46; CHECKIZHINXMIN-NEXT:    ret
47  %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"oeq", metadata !"fpexcept.strict") strictfp
48  %2 = zext i1 %1 to i32
49  ret i32 %2
50}
51declare i1 @llvm.experimental.constrained.fcmp.f16(half, half, metadata, metadata)
52
53define i32 @fcmp_ogt(half %a, half %b) nounwind strictfp {
54; CHECK-LABEL: fcmp_ogt:
55; CHECK:       # %bb.0:
56; CHECK-NEXT:    frflags a1
57; CHECK-NEXT:    flt.h a0, fa1, fa0
58; CHECK-NEXT:    fsflags a1
59; CHECK-NEXT:    feq.h zero, fa1, fa0
60; CHECK-NEXT:    ret
61;
62; CHECKIZHINX-LABEL: fcmp_ogt:
63; CHECKIZHINX:       # %bb.0:
64; CHECKIZHINX-NEXT:    frflags a3
65; CHECKIZHINX-NEXT:    flt.h a2, a1, a0
66; CHECKIZHINX-NEXT:    fsflags a3
67; CHECKIZHINX-NEXT:    feq.h zero, a1, a0
68; CHECKIZHINX-NEXT:    mv a0, a2
69; CHECKIZHINX-NEXT:    ret
70;
71; CHECKIZFHMIN-LABEL: fcmp_ogt:
72; CHECKIZFHMIN:       # %bb.0:
73; CHECKIZFHMIN-NEXT:    frflags a1
74; CHECKIZFHMIN-NEXT:    flt.h a0, fa1, fa0
75; CHECKIZFHMIN-NEXT:    fsflags a1
76; CHECKIZFHMIN-NEXT:    feq.h zero, fa1, fa0
77; CHECKIZFHMIN-NEXT:    ret
78;
79; CHECKIZHINXMIN-LABEL: fcmp_ogt:
80; CHECKIZHINXMIN:       # %bb.0:
81; CHECKIZHINXMIN-NEXT:    fcvt.s.h a2, a0
82; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
83; CHECKIZHINXMIN-NEXT:    frflags a3
84; CHECKIZHINXMIN-NEXT:    flt.s a0, a1, a2
85; CHECKIZHINXMIN-NEXT:    fsflags a3
86; CHECKIZHINXMIN-NEXT:    feq.s zero, a1, a2
87; CHECKIZHINXMIN-NEXT:    ret
88  %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ogt", metadata !"fpexcept.strict") strictfp
89  %2 = zext i1 %1 to i32
90  ret i32 %2
91}
92
93define i32 @fcmp_oge(half %a, half %b) nounwind strictfp {
94; CHECK-LABEL: fcmp_oge:
95; CHECK:       # %bb.0:
96; CHECK-NEXT:    frflags a1
97; CHECK-NEXT:    fle.h a0, fa1, fa0
98; CHECK-NEXT:    fsflags a1
99; CHECK-NEXT:    feq.h zero, fa1, fa0
100; CHECK-NEXT:    ret
101;
102; CHECKIZHINX-LABEL: fcmp_oge:
103; CHECKIZHINX:       # %bb.0:
104; CHECKIZHINX-NEXT:    frflags a3
105; CHECKIZHINX-NEXT:    fle.h a2, a1, a0
106; CHECKIZHINX-NEXT:    fsflags a3
107; CHECKIZHINX-NEXT:    feq.h zero, a1, a0
108; CHECKIZHINX-NEXT:    mv a0, a2
109; CHECKIZHINX-NEXT:    ret
110;
111; CHECKIZFHMIN-LABEL: fcmp_oge:
112; CHECKIZFHMIN:       # %bb.0:
113; CHECKIZFHMIN-NEXT:    frflags a1
114; CHECKIZFHMIN-NEXT:    fle.h a0, fa1, fa0
115; CHECKIZFHMIN-NEXT:    fsflags a1
116; CHECKIZFHMIN-NEXT:    feq.h zero, fa1, fa0
117; CHECKIZFHMIN-NEXT:    ret
118;
119; CHECKIZHINXMIN-LABEL: fcmp_oge:
120; CHECKIZHINXMIN:       # %bb.0:
121; CHECKIZHINXMIN-NEXT:    fcvt.s.h a2, a0
122; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
123; CHECKIZHINXMIN-NEXT:    frflags a3
124; CHECKIZHINXMIN-NEXT:    fle.s a0, a1, a2
125; CHECKIZHINXMIN-NEXT:    fsflags a3
126; CHECKIZHINXMIN-NEXT:    feq.s zero, a1, a2
127; CHECKIZHINXMIN-NEXT:    ret
128  %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"oge", metadata !"fpexcept.strict") strictfp
129  %2 = zext i1 %1 to i32
130  ret i32 %2
131}
132
133define i32 @fcmp_olt(half %a, half %b) nounwind strictfp {
134; CHECK-LABEL: fcmp_olt:
135; CHECK:       # %bb.0:
136; CHECK-NEXT:    frflags a1
137; CHECK-NEXT:    flt.h a0, fa0, fa1
138; CHECK-NEXT:    fsflags a1
139; CHECK-NEXT:    feq.h zero, fa0, fa1
140; CHECK-NEXT:    ret
141;
142; CHECKIZHINX-LABEL: fcmp_olt:
143; CHECKIZHINX:       # %bb.0:
144; CHECKIZHINX-NEXT:    frflags a3
145; CHECKIZHINX-NEXT:    flt.h a2, a0, a1
146; CHECKIZHINX-NEXT:    fsflags a3
147; CHECKIZHINX-NEXT:    feq.h zero, a0, a1
148; CHECKIZHINX-NEXT:    mv a0, a2
149; CHECKIZHINX-NEXT:    ret
150;
151; CHECKIZFHMIN-LABEL: fcmp_olt:
152; CHECKIZFHMIN:       # %bb.0:
153; CHECKIZFHMIN-NEXT:    frflags a1
154; CHECKIZFHMIN-NEXT:    flt.h a0, fa0, fa1
155; CHECKIZFHMIN-NEXT:    fsflags a1
156; CHECKIZFHMIN-NEXT:    feq.h zero, fa0, fa1
157; CHECKIZFHMIN-NEXT:    ret
158;
159; CHECKIZHINXMIN-LABEL: fcmp_olt:
160; CHECKIZHINXMIN:       # %bb.0:
161; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
162; CHECKIZHINXMIN-NEXT:    fcvt.s.h a2, a0
163; CHECKIZHINXMIN-NEXT:    frflags a3
164; CHECKIZHINXMIN-NEXT:    flt.s a0, a2, a1
165; CHECKIZHINXMIN-NEXT:    fsflags a3
166; CHECKIZHINXMIN-NEXT:    feq.s zero, a2, a1
167; CHECKIZHINXMIN-NEXT:    ret
168  %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"olt", metadata !"fpexcept.strict") strictfp
169  %2 = zext i1 %1 to i32
170  ret i32 %2
171}
172
173define i32 @fcmp_ole(half %a, half %b) nounwind strictfp {
174; CHECK-LABEL: fcmp_ole:
175; CHECK:       # %bb.0:
176; CHECK-NEXT:    frflags a1
177; CHECK-NEXT:    fle.h a0, fa0, fa1
178; CHECK-NEXT:    fsflags a1
179; CHECK-NEXT:    feq.h zero, fa0, fa1
180; CHECK-NEXT:    ret
181;
182; CHECKIZHINX-LABEL: fcmp_ole:
183; CHECKIZHINX:       # %bb.0:
184; CHECKIZHINX-NEXT:    frflags a3
185; CHECKIZHINX-NEXT:    fle.h a2, a0, a1
186; CHECKIZHINX-NEXT:    fsflags a3
187; CHECKIZHINX-NEXT:    feq.h zero, a0, a1
188; CHECKIZHINX-NEXT:    mv a0, a2
189; CHECKIZHINX-NEXT:    ret
190;
191; CHECKIZFHMIN-LABEL: fcmp_ole:
192; CHECKIZFHMIN:       # %bb.0:
193; CHECKIZFHMIN-NEXT:    frflags a1
194; CHECKIZFHMIN-NEXT:    fle.h a0, fa0, fa1
195; CHECKIZFHMIN-NEXT:    fsflags a1
196; CHECKIZFHMIN-NEXT:    feq.h zero, fa0, fa1
197; CHECKIZFHMIN-NEXT:    ret
198;
199; CHECKIZHINXMIN-LABEL: fcmp_ole:
200; CHECKIZHINXMIN:       # %bb.0:
201; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
202; CHECKIZHINXMIN-NEXT:    fcvt.s.h a2, a0
203; CHECKIZHINXMIN-NEXT:    frflags a3
204; CHECKIZHINXMIN-NEXT:    fle.s a0, a2, a1
205; CHECKIZHINXMIN-NEXT:    fsflags a3
206; CHECKIZHINXMIN-NEXT:    feq.s zero, a2, a1
207; CHECKIZHINXMIN-NEXT:    ret
208  %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ole", metadata !"fpexcept.strict") strictfp
209  %2 = zext i1 %1 to i32
210  ret i32 %2
211}
212
213; FIXME: We only need one frflags before the two flts and one fsflags after the
214; two flts.
215define i32 @fcmp_one(half %a, half %b) nounwind strictfp {
216; CHECK-LABEL: fcmp_one:
217; CHECK:       # %bb.0:
218; CHECK-NEXT:    frflags a0
219; CHECK-NEXT:    flt.h a1, fa0, fa1
220; CHECK-NEXT:    fsflags a0
221; CHECK-NEXT:    feq.h zero, fa0, fa1
222; CHECK-NEXT:    frflags a0
223; CHECK-NEXT:    flt.h a2, fa1, fa0
224; CHECK-NEXT:    fsflags a0
225; CHECK-NEXT:    or a0, a2, a1
226; CHECK-NEXT:    feq.h zero, fa1, fa0
227; CHECK-NEXT:    ret
228;
229; CHECKIZHINX-LABEL: fcmp_one:
230; CHECKIZHINX:       # %bb.0:
231; CHECKIZHINX-NEXT:    frflags a2
232; CHECKIZHINX-NEXT:    flt.h a3, a0, a1
233; CHECKIZHINX-NEXT:    fsflags a2
234; CHECKIZHINX-NEXT:    feq.h zero, a0, a1
235; CHECKIZHINX-NEXT:    frflags a2
236; CHECKIZHINX-NEXT:    flt.h a4, a1, a0
237; CHECKIZHINX-NEXT:    fsflags a2
238; CHECKIZHINX-NEXT:    or a2, a4, a3
239; CHECKIZHINX-NEXT:    feq.h zero, a1, a0
240; CHECKIZHINX-NEXT:    mv a0, a2
241; CHECKIZHINX-NEXT:    ret
242;
243; CHECKIZFHMIN-LABEL: fcmp_one:
244; CHECKIZFHMIN:       # %bb.0:
245; CHECKIZFHMIN-NEXT:    frflags a0
246; CHECKIZFHMIN-NEXT:    flt.h a1, fa0, fa1
247; CHECKIZFHMIN-NEXT:    fsflags a0
248; CHECKIZFHMIN-NEXT:    feq.h zero, fa0, fa1
249; CHECKIZFHMIN-NEXT:    frflags a0
250; CHECKIZFHMIN-NEXT:    flt.h a2, fa1, fa0
251; CHECKIZFHMIN-NEXT:    fsflags a0
252; CHECKIZFHMIN-NEXT:    or a0, a2, a1
253; CHECKIZFHMIN-NEXT:    feq.h zero, fa1, fa0
254; CHECKIZFHMIN-NEXT:    ret
255;
256; CHECKIZHINXMIN-LABEL: fcmp_one:
257; CHECKIZHINXMIN:       # %bb.0:
258; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
259; CHECKIZHINXMIN-NEXT:    fcvt.s.h a2, a0
260; CHECKIZHINXMIN-NEXT:    frflags a0
261; CHECKIZHINXMIN-NEXT:    flt.s a3, a2, a1
262; CHECKIZHINXMIN-NEXT:    fsflags a0
263; CHECKIZHINXMIN-NEXT:    feq.s zero, a2, a1
264; CHECKIZHINXMIN-NEXT:    frflags a0
265; CHECKIZHINXMIN-NEXT:    flt.s a4, a1, a2
266; CHECKIZHINXMIN-NEXT:    fsflags a0
267; CHECKIZHINXMIN-NEXT:    or a0, a4, a3
268; CHECKIZHINXMIN-NEXT:    feq.s zero, a1, a2
269; CHECKIZHINXMIN-NEXT:    ret
270  %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"one", metadata !"fpexcept.strict") strictfp
271  %2 = zext i1 %1 to i32
272  ret i32 %2
273}
274
275define i32 @fcmp_ord(half %a, half %b) nounwind strictfp {
276; CHECK-LABEL: fcmp_ord:
277; CHECK:       # %bb.0:
278; CHECK-NEXT:    feq.h a0, fa1, fa1
279; CHECK-NEXT:    feq.h a1, fa0, fa0
280; CHECK-NEXT:    and a0, a1, a0
281; CHECK-NEXT:    ret
282;
283; CHECKIZHINX-LABEL: fcmp_ord:
284; CHECKIZHINX:       # %bb.0:
285; CHECKIZHINX-NEXT:    feq.h a1, a1, a1
286; CHECKIZHINX-NEXT:    feq.h a0, a0, a0
287; CHECKIZHINX-NEXT:    and a0, a0, a1
288; CHECKIZHINX-NEXT:    ret
289;
290; CHECKIZFHMIN-LABEL: fcmp_ord:
291; CHECKIZFHMIN:       # %bb.0:
292; CHECKIZFHMIN-NEXT:    feq.h a0, fa1, fa1
293; CHECKIZFHMIN-NEXT:    feq.h a1, fa0, fa0
294; CHECKIZFHMIN-NEXT:    and a0, a1, a0
295; CHECKIZFHMIN-NEXT:    ret
296;
297; CHECKIZHINXMIN-LABEL: fcmp_ord:
298; CHECKIZHINXMIN:       # %bb.0:
299; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
300; CHECKIZHINXMIN-NEXT:    fcvt.s.h a0, a0
301; CHECKIZHINXMIN-NEXT:    feq.s a1, a1, a1
302; CHECKIZHINXMIN-NEXT:    feq.s a0, a0, a0
303; CHECKIZHINXMIN-NEXT:    and a0, a0, a1
304; CHECKIZHINXMIN-NEXT:    ret
305  %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ord", metadata !"fpexcept.strict") strictfp
306  %2 = zext i1 %1 to i32
307  ret i32 %2
308}
309
310; FIXME: We only need one frflags before the two flts and one fsflags after the
311; two flts.
312define i32 @fcmp_ueq(half %a, half %b) nounwind strictfp {
313; CHECK-LABEL: fcmp_ueq:
314; CHECK:       # %bb.0:
315; CHECK-NEXT:    frflags a0
316; CHECK-NEXT:    flt.h a1, fa0, fa1
317; CHECK-NEXT:    fsflags a0
318; CHECK-NEXT:    feq.h zero, fa0, fa1
319; CHECK-NEXT:    frflags a0
320; CHECK-NEXT:    flt.h a2, fa1, fa0
321; CHECK-NEXT:    fsflags a0
322; CHECK-NEXT:    or a1, a2, a1
323; CHECK-NEXT:    xori a0, a1, 1
324; CHECK-NEXT:    feq.h zero, fa1, fa0
325; CHECK-NEXT:    ret
326;
327; CHECKIZHINX-LABEL: fcmp_ueq:
328; CHECKIZHINX:       # %bb.0:
329; CHECKIZHINX-NEXT:    frflags a2
330; CHECKIZHINX-NEXT:    flt.h a3, a0, a1
331; CHECKIZHINX-NEXT:    fsflags a2
332; CHECKIZHINX-NEXT:    feq.h zero, a0, a1
333; CHECKIZHINX-NEXT:    frflags a2
334; CHECKIZHINX-NEXT:    flt.h a4, a1, a0
335; CHECKIZHINX-NEXT:    fsflags a2
336; CHECKIZHINX-NEXT:    or a3, a4, a3
337; CHECKIZHINX-NEXT:    xori a2, a3, 1
338; CHECKIZHINX-NEXT:    feq.h zero, a1, a0
339; CHECKIZHINX-NEXT:    mv a0, a2
340; CHECKIZHINX-NEXT:    ret
341;
342; CHECKIZFHMIN-LABEL: fcmp_ueq:
343; CHECKIZFHMIN:       # %bb.0:
344; CHECKIZFHMIN-NEXT:    frflags a0
345; CHECKIZFHMIN-NEXT:    flt.h a1, fa0, fa1
346; CHECKIZFHMIN-NEXT:    fsflags a0
347; CHECKIZFHMIN-NEXT:    feq.h zero, fa0, fa1
348; CHECKIZFHMIN-NEXT:    frflags a0
349; CHECKIZFHMIN-NEXT:    flt.h a2, fa1, fa0
350; CHECKIZFHMIN-NEXT:    fsflags a0
351; CHECKIZFHMIN-NEXT:    or a1, a2, a1
352; CHECKIZFHMIN-NEXT:    xori a0, a1, 1
353; CHECKIZFHMIN-NEXT:    feq.h zero, fa1, fa0
354; CHECKIZFHMIN-NEXT:    ret
355;
356; CHECKIZHINXMIN-LABEL: fcmp_ueq:
357; CHECKIZHINXMIN:       # %bb.0:
358; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
359; CHECKIZHINXMIN-NEXT:    fcvt.s.h a2, a0
360; CHECKIZHINXMIN-NEXT:    frflags a0
361; CHECKIZHINXMIN-NEXT:    flt.s a3, a2, a1
362; CHECKIZHINXMIN-NEXT:    fsflags a0
363; CHECKIZHINXMIN-NEXT:    feq.s zero, a2, a1
364; CHECKIZHINXMIN-NEXT:    frflags a0
365; CHECKIZHINXMIN-NEXT:    flt.s a4, a1, a2
366; CHECKIZHINXMIN-NEXT:    fsflags a0
367; CHECKIZHINXMIN-NEXT:    or a3, a4, a3
368; CHECKIZHINXMIN-NEXT:    xori a0, a3, 1
369; CHECKIZHINXMIN-NEXT:    feq.s zero, a1, a2
370; CHECKIZHINXMIN-NEXT:    ret
371  %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ueq", metadata !"fpexcept.strict") strictfp
372  %2 = zext i1 %1 to i32
373  ret i32 %2
374}
375
376define i32 @fcmp_ugt(half %a, half %b) nounwind strictfp {
377; CHECK-LABEL: fcmp_ugt:
378; CHECK:       # %bb.0:
379; CHECK-NEXT:    frflags a0
380; CHECK-NEXT:    fle.h a1, fa0, fa1
381; CHECK-NEXT:    fsflags a0
382; CHECK-NEXT:    xori a0, a1, 1
383; CHECK-NEXT:    feq.h zero, fa0, fa1
384; CHECK-NEXT:    ret
385;
386; CHECKIZHINX-LABEL: fcmp_ugt:
387; CHECKIZHINX:       # %bb.0:
388; CHECKIZHINX-NEXT:    frflags a2
389; CHECKIZHINX-NEXT:    fle.h a3, a0, a1
390; CHECKIZHINX-NEXT:    fsflags a2
391; CHECKIZHINX-NEXT:    xori a2, a3, 1
392; CHECKIZHINX-NEXT:    feq.h zero, a0, a1
393; CHECKIZHINX-NEXT:    mv a0, a2
394; CHECKIZHINX-NEXT:    ret
395;
396; CHECKIZFHMIN-LABEL: fcmp_ugt:
397; CHECKIZFHMIN:       # %bb.0:
398; CHECKIZFHMIN-NEXT:    frflags a0
399; CHECKIZFHMIN-NEXT:    fle.h a1, fa0, fa1
400; CHECKIZFHMIN-NEXT:    fsflags a0
401; CHECKIZFHMIN-NEXT:    xori a0, a1, 1
402; CHECKIZFHMIN-NEXT:    feq.h zero, fa0, fa1
403; CHECKIZFHMIN-NEXT:    ret
404;
405; CHECKIZHINXMIN-LABEL: fcmp_ugt:
406; CHECKIZHINXMIN:       # %bb.0:
407; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
408; CHECKIZHINXMIN-NEXT:    fcvt.s.h a2, a0
409; CHECKIZHINXMIN-NEXT:    frflags a0
410; CHECKIZHINXMIN-NEXT:    fle.s a3, a2, a1
411; CHECKIZHINXMIN-NEXT:    fsflags a0
412; CHECKIZHINXMIN-NEXT:    xori a0, a3, 1
413; CHECKIZHINXMIN-NEXT:    feq.s zero, a2, a1
414; CHECKIZHINXMIN-NEXT:    ret
415  %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ugt", metadata !"fpexcept.strict") strictfp
416  %2 = zext i1 %1 to i32
417  ret i32 %2
418}
419
420define i32 @fcmp_uge(half %a, half %b) nounwind strictfp {
421; CHECK-LABEL: fcmp_uge:
422; CHECK:       # %bb.0:
423; CHECK-NEXT:    frflags a0
424; CHECK-NEXT:    flt.h a1, fa0, fa1
425; CHECK-NEXT:    fsflags a0
426; CHECK-NEXT:    xori a0, a1, 1
427; CHECK-NEXT:    feq.h zero, fa0, fa1
428; CHECK-NEXT:    ret
429;
430; CHECKIZHINX-LABEL: fcmp_uge:
431; CHECKIZHINX:       # %bb.0:
432; CHECKIZHINX-NEXT:    frflags a2
433; CHECKIZHINX-NEXT:    flt.h a3, a0, a1
434; CHECKIZHINX-NEXT:    fsflags a2
435; CHECKIZHINX-NEXT:    xori a2, a3, 1
436; CHECKIZHINX-NEXT:    feq.h zero, a0, a1
437; CHECKIZHINX-NEXT:    mv a0, a2
438; CHECKIZHINX-NEXT:    ret
439;
440; CHECKIZFHMIN-LABEL: fcmp_uge:
441; CHECKIZFHMIN:       # %bb.0:
442; CHECKIZFHMIN-NEXT:    frflags a0
443; CHECKIZFHMIN-NEXT:    flt.h a1, fa0, fa1
444; CHECKIZFHMIN-NEXT:    fsflags a0
445; CHECKIZFHMIN-NEXT:    xori a0, a1, 1
446; CHECKIZFHMIN-NEXT:    feq.h zero, fa0, fa1
447; CHECKIZFHMIN-NEXT:    ret
448;
449; CHECKIZHINXMIN-LABEL: fcmp_uge:
450; CHECKIZHINXMIN:       # %bb.0:
451; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
452; CHECKIZHINXMIN-NEXT:    fcvt.s.h a2, a0
453; CHECKIZHINXMIN-NEXT:    frflags a0
454; CHECKIZHINXMIN-NEXT:    flt.s a3, a2, a1
455; CHECKIZHINXMIN-NEXT:    fsflags a0
456; CHECKIZHINXMIN-NEXT:    xori a0, a3, 1
457; CHECKIZHINXMIN-NEXT:    feq.s zero, a2, a1
458; CHECKIZHINXMIN-NEXT:    ret
459  %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"uge", metadata !"fpexcept.strict") strictfp
460  %2 = zext i1 %1 to i32
461  ret i32 %2
462}
463
464define i32 @fcmp_ult(half %a, half %b) nounwind strictfp {
465; CHECK-LABEL: fcmp_ult:
466; CHECK:       # %bb.0:
467; CHECK-NEXT:    frflags a0
468; CHECK-NEXT:    fle.h a1, fa1, fa0
469; CHECK-NEXT:    fsflags a0
470; CHECK-NEXT:    xori a0, a1, 1
471; CHECK-NEXT:    feq.h zero, fa1, fa0
472; CHECK-NEXT:    ret
473;
474; CHECKIZHINX-LABEL: fcmp_ult:
475; CHECKIZHINX:       # %bb.0:
476; CHECKIZHINX-NEXT:    frflags a2
477; CHECKIZHINX-NEXT:    fle.h a3, a1, a0
478; CHECKIZHINX-NEXT:    fsflags a2
479; CHECKIZHINX-NEXT:    xori a2, a3, 1
480; CHECKIZHINX-NEXT:    feq.h zero, a1, a0
481; CHECKIZHINX-NEXT:    mv a0, a2
482; CHECKIZHINX-NEXT:    ret
483;
484; CHECKIZFHMIN-LABEL: fcmp_ult:
485; CHECKIZFHMIN:       # %bb.0:
486; CHECKIZFHMIN-NEXT:    frflags a0
487; CHECKIZFHMIN-NEXT:    fle.h a1, fa1, fa0
488; CHECKIZFHMIN-NEXT:    fsflags a0
489; CHECKIZFHMIN-NEXT:    xori a0, a1, 1
490; CHECKIZFHMIN-NEXT:    feq.h zero, fa1, fa0
491; CHECKIZFHMIN-NEXT:    ret
492;
493; CHECKIZHINXMIN-LABEL: fcmp_ult:
494; CHECKIZHINXMIN:       # %bb.0:
495; CHECKIZHINXMIN-NEXT:    fcvt.s.h a2, a0
496; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
497; CHECKIZHINXMIN-NEXT:    frflags a0
498; CHECKIZHINXMIN-NEXT:    fle.s a3, a1, a2
499; CHECKIZHINXMIN-NEXT:    fsflags a0
500; CHECKIZHINXMIN-NEXT:    xori a0, a3, 1
501; CHECKIZHINXMIN-NEXT:    feq.s zero, a1, a2
502; CHECKIZHINXMIN-NEXT:    ret
503  %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ult", metadata !"fpexcept.strict") strictfp
504  %2 = zext i1 %1 to i32
505  ret i32 %2
506}
507
508define i32 @fcmp_ule(half %a, half %b) nounwind strictfp {
509; CHECK-LABEL: fcmp_ule:
510; CHECK:       # %bb.0:
511; CHECK-NEXT:    frflags a0
512; CHECK-NEXT:    flt.h a1, fa1, fa0
513; CHECK-NEXT:    fsflags a0
514; CHECK-NEXT:    xori a0, a1, 1
515; CHECK-NEXT:    feq.h zero, fa1, fa0
516; CHECK-NEXT:    ret
517;
518; CHECKIZHINX-LABEL: fcmp_ule:
519; CHECKIZHINX:       # %bb.0:
520; CHECKIZHINX-NEXT:    frflags a2
521; CHECKIZHINX-NEXT:    flt.h a3, a1, a0
522; CHECKIZHINX-NEXT:    fsflags a2
523; CHECKIZHINX-NEXT:    xori a2, a3, 1
524; CHECKIZHINX-NEXT:    feq.h zero, a1, a0
525; CHECKIZHINX-NEXT:    mv a0, a2
526; CHECKIZHINX-NEXT:    ret
527;
528; CHECKIZFHMIN-LABEL: fcmp_ule:
529; CHECKIZFHMIN:       # %bb.0:
530; CHECKIZFHMIN-NEXT:    frflags a0
531; CHECKIZFHMIN-NEXT:    flt.h a1, fa1, fa0
532; CHECKIZFHMIN-NEXT:    fsflags a0
533; CHECKIZFHMIN-NEXT:    xori a0, a1, 1
534; CHECKIZFHMIN-NEXT:    feq.h zero, fa1, fa0
535; CHECKIZFHMIN-NEXT:    ret
536;
537; CHECKIZHINXMIN-LABEL: fcmp_ule:
538; CHECKIZHINXMIN:       # %bb.0:
539; CHECKIZHINXMIN-NEXT:    fcvt.s.h a2, a0
540; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
541; CHECKIZHINXMIN-NEXT:    frflags a0
542; CHECKIZHINXMIN-NEXT:    flt.s a3, a1, a2
543; CHECKIZHINXMIN-NEXT:    fsflags a0
544; CHECKIZHINXMIN-NEXT:    xori a0, a3, 1
545; CHECKIZHINXMIN-NEXT:    feq.s zero, a1, a2
546; CHECKIZHINXMIN-NEXT:    ret
547  %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"ule", metadata !"fpexcept.strict") strictfp
548  %2 = zext i1 %1 to i32
549  ret i32 %2
550}
551
552define i32 @fcmp_une(half %a, half %b) nounwind strictfp {
553; CHECK-LABEL: fcmp_une:
554; CHECK:       # %bb.0:
555; CHECK-NEXT:    feq.h a0, fa0, fa1
556; CHECK-NEXT:    xori a0, a0, 1
557; CHECK-NEXT:    ret
558;
559; CHECKIZHINX-LABEL: fcmp_une:
560; CHECKIZHINX:       # %bb.0:
561; CHECKIZHINX-NEXT:    feq.h a0, a0, a1
562; CHECKIZHINX-NEXT:    xori a0, a0, 1
563; CHECKIZHINX-NEXT:    ret
564;
565; CHECKIZFHMIN-LABEL: fcmp_une:
566; CHECKIZFHMIN:       # %bb.0:
567; CHECKIZFHMIN-NEXT:    feq.h a0, fa0, fa1
568; CHECKIZFHMIN-NEXT:    xori a0, a0, 1
569; CHECKIZFHMIN-NEXT:    ret
570;
571; CHECKIZHINXMIN-LABEL: fcmp_une:
572; CHECKIZHINXMIN:       # %bb.0:
573; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
574; CHECKIZHINXMIN-NEXT:    fcvt.s.h a0, a0
575; CHECKIZHINXMIN-NEXT:    feq.s a0, a0, a1
576; CHECKIZHINXMIN-NEXT:    xori a0, a0, 1
577; CHECKIZHINXMIN-NEXT:    ret
578  %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"une", metadata !"fpexcept.strict") strictfp
579  %2 = zext i1 %1 to i32
580  ret i32 %2
581}
582
583define i32 @fcmp_uno(half %a, half %b) nounwind strictfp {
584; CHECK-LABEL: fcmp_uno:
585; CHECK:       # %bb.0:
586; CHECK-NEXT:    feq.h a0, fa1, fa1
587; CHECK-NEXT:    feq.h a1, fa0, fa0
588; CHECK-NEXT:    and a0, a1, a0
589; CHECK-NEXT:    xori a0, a0, 1
590; CHECK-NEXT:    ret
591;
592; CHECKIZHINX-LABEL: fcmp_uno:
593; CHECKIZHINX:       # %bb.0:
594; CHECKIZHINX-NEXT:    feq.h a1, a1, a1
595; CHECKIZHINX-NEXT:    feq.h a0, a0, a0
596; CHECKIZHINX-NEXT:    and a0, a0, a1
597; CHECKIZHINX-NEXT:    xori a0, a0, 1
598; CHECKIZHINX-NEXT:    ret
599;
600; CHECKIZFHMIN-LABEL: fcmp_uno:
601; CHECKIZFHMIN:       # %bb.0:
602; CHECKIZFHMIN-NEXT:    feq.h a0, fa1, fa1
603; CHECKIZFHMIN-NEXT:    feq.h a1, fa0, fa0
604; CHECKIZFHMIN-NEXT:    and a0, a1, a0
605; CHECKIZFHMIN-NEXT:    xori a0, a0, 1
606; CHECKIZFHMIN-NEXT:    ret
607;
608; CHECKIZHINXMIN-LABEL: fcmp_uno:
609; CHECKIZHINXMIN:       # %bb.0:
610; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
611; CHECKIZHINXMIN-NEXT:    fcvt.s.h a0, a0
612; CHECKIZHINXMIN-NEXT:    feq.s a1, a1, a1
613; CHECKIZHINXMIN-NEXT:    feq.s a0, a0, a0
614; CHECKIZHINXMIN-NEXT:    and a0, a0, a1
615; CHECKIZHINXMIN-NEXT:    xori a0, a0, 1
616; CHECKIZHINXMIN-NEXT:    ret
617  %1 = call i1 @llvm.experimental.constrained.fcmp.f16(half %a, half %b, metadata !"uno", metadata !"fpexcept.strict") strictfp
618  %2 = zext i1 %1 to i32
619  ret i32 %2
620}
621
622define i32 @fcmps_oeq(half %a, half %b) nounwind strictfp {
623; CHECK-LABEL: fcmps_oeq:
624; CHECK:       # %bb.0:
625; CHECK-NEXT:    fle.h a0, fa1, fa0
626; CHECK-NEXT:    fle.h a1, fa0, fa1
627; CHECK-NEXT:    and a0, a1, a0
628; CHECK-NEXT:    ret
629;
630; CHECKIZHINX-LABEL: fcmps_oeq:
631; CHECKIZHINX:       # %bb.0:
632; CHECKIZHINX-NEXT:    fle.h a2, a1, a0
633; CHECKIZHINX-NEXT:    fle.h a0, a0, a1
634; CHECKIZHINX-NEXT:    and a0, a0, a2
635; CHECKIZHINX-NEXT:    ret
636;
637; CHECKIZFHMIN-LABEL: fcmps_oeq:
638; CHECKIZFHMIN:       # %bb.0:
639; CHECKIZFHMIN-NEXT:    fle.h a0, fa1, fa0
640; CHECKIZFHMIN-NEXT:    fle.h a1, fa0, fa1
641; CHECKIZFHMIN-NEXT:    and a0, a1, a0
642; CHECKIZFHMIN-NEXT:    ret
643;
644; CHECKIZHINXMIN-LABEL: fcmps_oeq:
645; CHECKIZHINXMIN:       # %bb.0:
646; CHECKIZHINXMIN-NEXT:    fcvt.s.h a0, a0
647; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
648; CHECKIZHINXMIN-NEXT:    fle.s a2, a1, a0
649; CHECKIZHINXMIN-NEXT:    fle.s a0, a0, a1
650; CHECKIZHINXMIN-NEXT:    and a0, a0, a2
651; CHECKIZHINXMIN-NEXT:    ret
652  %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"oeq", metadata !"fpexcept.strict") strictfp
653  %2 = zext i1 %1 to i32
654  ret i32 %2
655}
656declare i1 @llvm.experimental.constrained.fcmps.f16(half, half, metadata, metadata)
657
658define i32 @fcmps_ogt(half %a, half %b) nounwind strictfp {
659; CHECK-LABEL: fcmps_ogt:
660; CHECK:       # %bb.0:
661; CHECK-NEXT:    flt.h a0, fa1, fa0
662; CHECK-NEXT:    ret
663;
664; CHECKIZHINX-LABEL: fcmps_ogt:
665; CHECKIZHINX:       # %bb.0:
666; CHECKIZHINX-NEXT:    flt.h a0, a1, a0
667; CHECKIZHINX-NEXT:    ret
668;
669; CHECKIZFHMIN-LABEL: fcmps_ogt:
670; CHECKIZFHMIN:       # %bb.0:
671; CHECKIZFHMIN-NEXT:    flt.h a0, fa1, fa0
672; CHECKIZFHMIN-NEXT:    ret
673;
674; CHECKIZHINXMIN-LABEL: fcmps_ogt:
675; CHECKIZHINXMIN:       # %bb.0:
676; CHECKIZHINXMIN-NEXT:    fcvt.s.h a0, a0
677; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
678; CHECKIZHINXMIN-NEXT:    flt.s a0, a1, a0
679; CHECKIZHINXMIN-NEXT:    ret
680  %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ogt", metadata !"fpexcept.strict") strictfp
681  %2 = zext i1 %1 to i32
682  ret i32 %2
683}
684
685define i32 @fcmps_oge(half %a, half %b) nounwind strictfp {
686; CHECK-LABEL: fcmps_oge:
687; CHECK:       # %bb.0:
688; CHECK-NEXT:    fle.h a0, fa1, fa0
689; CHECK-NEXT:    ret
690;
691; CHECKIZHINX-LABEL: fcmps_oge:
692; CHECKIZHINX:       # %bb.0:
693; CHECKIZHINX-NEXT:    fle.h a0, a1, a0
694; CHECKIZHINX-NEXT:    ret
695;
696; CHECKIZFHMIN-LABEL: fcmps_oge:
697; CHECKIZFHMIN:       # %bb.0:
698; CHECKIZFHMIN-NEXT:    fle.h a0, fa1, fa0
699; CHECKIZFHMIN-NEXT:    ret
700;
701; CHECKIZHINXMIN-LABEL: fcmps_oge:
702; CHECKIZHINXMIN:       # %bb.0:
703; CHECKIZHINXMIN-NEXT:    fcvt.s.h a0, a0
704; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
705; CHECKIZHINXMIN-NEXT:    fle.s a0, a1, a0
706; CHECKIZHINXMIN-NEXT:    ret
707  %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"oge", metadata !"fpexcept.strict") strictfp
708  %2 = zext i1 %1 to i32
709  ret i32 %2
710}
711
712define i32 @fcmps_olt(half %a, half %b) nounwind strictfp {
713; CHECK-LABEL: fcmps_olt:
714; CHECK:       # %bb.0:
715; CHECK-NEXT:    flt.h a0, fa0, fa1
716; CHECK-NEXT:    ret
717;
718; CHECKIZHINX-LABEL: fcmps_olt:
719; CHECKIZHINX:       # %bb.0:
720; CHECKIZHINX-NEXT:    flt.h a0, a0, a1
721; CHECKIZHINX-NEXT:    ret
722;
723; CHECKIZFHMIN-LABEL: fcmps_olt:
724; CHECKIZFHMIN:       # %bb.0:
725; CHECKIZFHMIN-NEXT:    flt.h a0, fa0, fa1
726; CHECKIZFHMIN-NEXT:    ret
727;
728; CHECKIZHINXMIN-LABEL: fcmps_olt:
729; CHECKIZHINXMIN:       # %bb.0:
730; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
731; CHECKIZHINXMIN-NEXT:    fcvt.s.h a0, a0
732; CHECKIZHINXMIN-NEXT:    flt.s a0, a0, a1
733; CHECKIZHINXMIN-NEXT:    ret
734  %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"olt", metadata !"fpexcept.strict") strictfp
735  %2 = zext i1 %1 to i32
736  ret i32 %2
737}
738
739define i32 @fcmps_ole(half %a, half %b) nounwind strictfp {
740; CHECK-LABEL: fcmps_ole:
741; CHECK:       # %bb.0:
742; CHECK-NEXT:    fle.h a0, fa0, fa1
743; CHECK-NEXT:    ret
744;
745; CHECKIZHINX-LABEL: fcmps_ole:
746; CHECKIZHINX:       # %bb.0:
747; CHECKIZHINX-NEXT:    fle.h a0, a0, a1
748; CHECKIZHINX-NEXT:    ret
749;
750; CHECKIZFHMIN-LABEL: fcmps_ole:
751; CHECKIZFHMIN:       # %bb.0:
752; CHECKIZFHMIN-NEXT:    fle.h a0, fa0, fa1
753; CHECKIZFHMIN-NEXT:    ret
754;
755; CHECKIZHINXMIN-LABEL: fcmps_ole:
756; CHECKIZHINXMIN:       # %bb.0:
757; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
758; CHECKIZHINXMIN-NEXT:    fcvt.s.h a0, a0
759; CHECKIZHINXMIN-NEXT:    fle.s a0, a0, a1
760; CHECKIZHINXMIN-NEXT:    ret
761  %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ole", metadata !"fpexcept.strict") strictfp
762  %2 = zext i1 %1 to i32
763  ret i32 %2
764}
765
766define i32 @fcmps_one(half %a, half %b) nounwind strictfp {
767; CHECK-LABEL: fcmps_one:
768; CHECK:       # %bb.0:
769; CHECK-NEXT:    flt.h a0, fa0, fa1
770; CHECK-NEXT:    flt.h a1, fa1, fa0
771; CHECK-NEXT:    or a0, a1, a0
772; CHECK-NEXT:    ret
773;
774; CHECKIZHINX-LABEL: fcmps_one:
775; CHECKIZHINX:       # %bb.0:
776; CHECKIZHINX-NEXT:    flt.h a2, a0, a1
777; CHECKIZHINX-NEXT:    flt.h a0, a1, a0
778; CHECKIZHINX-NEXT:    or a0, a0, a2
779; CHECKIZHINX-NEXT:    ret
780;
781; CHECKIZFHMIN-LABEL: fcmps_one:
782; CHECKIZFHMIN:       # %bb.0:
783; CHECKIZFHMIN-NEXT:    flt.h a0, fa0, fa1
784; CHECKIZFHMIN-NEXT:    flt.h a1, fa1, fa0
785; CHECKIZFHMIN-NEXT:    or a0, a1, a0
786; CHECKIZFHMIN-NEXT:    ret
787;
788; CHECKIZHINXMIN-LABEL: fcmps_one:
789; CHECKIZHINXMIN:       # %bb.0:
790; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
791; CHECKIZHINXMIN-NEXT:    fcvt.s.h a0, a0
792; CHECKIZHINXMIN-NEXT:    flt.s a2, a0, a1
793; CHECKIZHINXMIN-NEXT:    flt.s a0, a1, a0
794; CHECKIZHINXMIN-NEXT:    or a0, a0, a2
795; CHECKIZHINXMIN-NEXT:    ret
796  %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"one", metadata !"fpexcept.strict") strictfp
797  %2 = zext i1 %1 to i32
798  ret i32 %2
799}
800
801define i32 @fcmps_ord(half %a, half %b) nounwind strictfp {
802; CHECK-LABEL: fcmps_ord:
803; CHECK:       # %bb.0:
804; CHECK-NEXT:    fle.h a0, fa1, fa1
805; CHECK-NEXT:    fle.h a1, fa0, fa0
806; CHECK-NEXT:    and a0, a1, a0
807; CHECK-NEXT:    ret
808;
809; CHECKIZHINX-LABEL: fcmps_ord:
810; CHECKIZHINX:       # %bb.0:
811; CHECKIZHINX-NEXT:    fle.h a1, a1, a1
812; CHECKIZHINX-NEXT:    fle.h a0, a0, a0
813; CHECKIZHINX-NEXT:    and a0, a0, a1
814; CHECKIZHINX-NEXT:    ret
815;
816; CHECKIZFHMIN-LABEL: fcmps_ord:
817; CHECKIZFHMIN:       # %bb.0:
818; CHECKIZFHMIN-NEXT:    fle.h a0, fa1, fa1
819; CHECKIZFHMIN-NEXT:    fle.h a1, fa0, fa0
820; CHECKIZFHMIN-NEXT:    and a0, a1, a0
821; CHECKIZFHMIN-NEXT:    ret
822;
823; CHECKIZHINXMIN-LABEL: fcmps_ord:
824; CHECKIZHINXMIN:       # %bb.0:
825; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
826; CHECKIZHINXMIN-NEXT:    fcvt.s.h a0, a0
827; CHECKIZHINXMIN-NEXT:    fle.s a1, a1, a1
828; CHECKIZHINXMIN-NEXT:    fle.s a0, a0, a0
829; CHECKIZHINXMIN-NEXT:    and a0, a0, a1
830; CHECKIZHINXMIN-NEXT:    ret
831  %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ord", metadata !"fpexcept.strict") strictfp
832  %2 = zext i1 %1 to i32
833  ret i32 %2
834}
835
836define i32 @fcmps_ueq(half %a, half %b) nounwind strictfp {
837; CHECK-LABEL: fcmps_ueq:
838; CHECK:       # %bb.0:
839; CHECK-NEXT:    flt.h a0, fa0, fa1
840; CHECK-NEXT:    flt.h a1, fa1, fa0
841; CHECK-NEXT:    or a0, a1, a0
842; CHECK-NEXT:    xori a0, a0, 1
843; CHECK-NEXT:    ret
844;
845; CHECKIZHINX-LABEL: fcmps_ueq:
846; CHECKIZHINX:       # %bb.0:
847; CHECKIZHINX-NEXT:    flt.h a2, a0, a1
848; CHECKIZHINX-NEXT:    flt.h a0, a1, a0
849; CHECKIZHINX-NEXT:    or a0, a0, a2
850; CHECKIZHINX-NEXT:    xori a0, a0, 1
851; CHECKIZHINX-NEXT:    ret
852;
853; CHECKIZFHMIN-LABEL: fcmps_ueq:
854; CHECKIZFHMIN:       # %bb.0:
855; CHECKIZFHMIN-NEXT:    flt.h a0, fa0, fa1
856; CHECKIZFHMIN-NEXT:    flt.h a1, fa1, fa0
857; CHECKIZFHMIN-NEXT:    or a0, a1, a0
858; CHECKIZFHMIN-NEXT:    xori a0, a0, 1
859; CHECKIZFHMIN-NEXT:    ret
860;
861; CHECKIZHINXMIN-LABEL: fcmps_ueq:
862; CHECKIZHINXMIN:       # %bb.0:
863; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
864; CHECKIZHINXMIN-NEXT:    fcvt.s.h a0, a0
865; CHECKIZHINXMIN-NEXT:    flt.s a2, a0, a1
866; CHECKIZHINXMIN-NEXT:    flt.s a0, a1, a0
867; CHECKIZHINXMIN-NEXT:    or a0, a0, a2
868; CHECKIZHINXMIN-NEXT:    xori a0, a0, 1
869; CHECKIZHINXMIN-NEXT:    ret
870  %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ueq", metadata !"fpexcept.strict") strictfp
871  %2 = zext i1 %1 to i32
872  ret i32 %2
873}
874
875define i32 @fcmps_ugt(half %a, half %b) nounwind strictfp {
876; CHECK-LABEL: fcmps_ugt:
877; CHECK:       # %bb.0:
878; CHECK-NEXT:    fle.h a0, fa0, fa1
879; CHECK-NEXT:    xori a0, a0, 1
880; CHECK-NEXT:    ret
881;
882; CHECKIZHINX-LABEL: fcmps_ugt:
883; CHECKIZHINX:       # %bb.0:
884; CHECKIZHINX-NEXT:    fle.h a0, a0, a1
885; CHECKIZHINX-NEXT:    xori a0, a0, 1
886; CHECKIZHINX-NEXT:    ret
887;
888; CHECKIZFHMIN-LABEL: fcmps_ugt:
889; CHECKIZFHMIN:       # %bb.0:
890; CHECKIZFHMIN-NEXT:    fle.h a0, fa0, fa1
891; CHECKIZFHMIN-NEXT:    xori a0, a0, 1
892; CHECKIZFHMIN-NEXT:    ret
893;
894; CHECKIZHINXMIN-LABEL: fcmps_ugt:
895; CHECKIZHINXMIN:       # %bb.0:
896; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
897; CHECKIZHINXMIN-NEXT:    fcvt.s.h a0, a0
898; CHECKIZHINXMIN-NEXT:    fle.s a0, a0, a1
899; CHECKIZHINXMIN-NEXT:    xori a0, a0, 1
900; CHECKIZHINXMIN-NEXT:    ret
901  %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ugt", metadata !"fpexcept.strict") strictfp
902  %2 = zext i1 %1 to i32
903  ret i32 %2
904}
905
906define i32 @fcmps_uge(half %a, half %b) nounwind strictfp {
907; CHECK-LABEL: fcmps_uge:
908; CHECK:       # %bb.0:
909; CHECK-NEXT:    flt.h a0, fa0, fa1
910; CHECK-NEXT:    xori a0, a0, 1
911; CHECK-NEXT:    ret
912;
913; CHECKIZHINX-LABEL: fcmps_uge:
914; CHECKIZHINX:       # %bb.0:
915; CHECKIZHINX-NEXT:    flt.h a0, a0, a1
916; CHECKIZHINX-NEXT:    xori a0, a0, 1
917; CHECKIZHINX-NEXT:    ret
918;
919; CHECKIZFHMIN-LABEL: fcmps_uge:
920; CHECKIZFHMIN:       # %bb.0:
921; CHECKIZFHMIN-NEXT:    flt.h a0, fa0, fa1
922; CHECKIZFHMIN-NEXT:    xori a0, a0, 1
923; CHECKIZFHMIN-NEXT:    ret
924;
925; CHECKIZHINXMIN-LABEL: fcmps_uge:
926; CHECKIZHINXMIN:       # %bb.0:
927; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
928; CHECKIZHINXMIN-NEXT:    fcvt.s.h a0, a0
929; CHECKIZHINXMIN-NEXT:    flt.s a0, a0, a1
930; CHECKIZHINXMIN-NEXT:    xori a0, a0, 1
931; CHECKIZHINXMIN-NEXT:    ret
932  %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"uge", metadata !"fpexcept.strict") strictfp
933  %2 = zext i1 %1 to i32
934  ret i32 %2
935}
936
937define i32 @fcmps_ult(half %a, half %b) nounwind strictfp {
938; CHECK-LABEL: fcmps_ult:
939; CHECK:       # %bb.0:
940; CHECK-NEXT:    fle.h a0, fa1, fa0
941; CHECK-NEXT:    xori a0, a0, 1
942; CHECK-NEXT:    ret
943;
944; CHECKIZHINX-LABEL: fcmps_ult:
945; CHECKIZHINX:       # %bb.0:
946; CHECKIZHINX-NEXT:    fle.h a0, a1, a0
947; CHECKIZHINX-NEXT:    xori a0, a0, 1
948; CHECKIZHINX-NEXT:    ret
949;
950; CHECKIZFHMIN-LABEL: fcmps_ult:
951; CHECKIZFHMIN:       # %bb.0:
952; CHECKIZFHMIN-NEXT:    fle.h a0, fa1, fa0
953; CHECKIZFHMIN-NEXT:    xori a0, a0, 1
954; CHECKIZFHMIN-NEXT:    ret
955;
956; CHECKIZHINXMIN-LABEL: fcmps_ult:
957; CHECKIZHINXMIN:       # %bb.0:
958; CHECKIZHINXMIN-NEXT:    fcvt.s.h a0, a0
959; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
960; CHECKIZHINXMIN-NEXT:    fle.s a0, a1, a0
961; CHECKIZHINXMIN-NEXT:    xori a0, a0, 1
962; CHECKIZHINXMIN-NEXT:    ret
963  %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ult", metadata !"fpexcept.strict") strictfp
964  %2 = zext i1 %1 to i32
965  ret i32 %2
966}
967
968define i32 @fcmps_ule(half %a, half %b) nounwind strictfp {
969; CHECK-LABEL: fcmps_ule:
970; CHECK:       # %bb.0:
971; CHECK-NEXT:    flt.h a0, fa1, fa0
972; CHECK-NEXT:    xori a0, a0, 1
973; CHECK-NEXT:    ret
974;
975; CHECKIZHINX-LABEL: fcmps_ule:
976; CHECKIZHINX:       # %bb.0:
977; CHECKIZHINX-NEXT:    flt.h a0, a1, a0
978; CHECKIZHINX-NEXT:    xori a0, a0, 1
979; CHECKIZHINX-NEXT:    ret
980;
981; CHECKIZFHMIN-LABEL: fcmps_ule:
982; CHECKIZFHMIN:       # %bb.0:
983; CHECKIZFHMIN-NEXT:    flt.h a0, fa1, fa0
984; CHECKIZFHMIN-NEXT:    xori a0, a0, 1
985; CHECKIZFHMIN-NEXT:    ret
986;
987; CHECKIZHINXMIN-LABEL: fcmps_ule:
988; CHECKIZHINXMIN:       # %bb.0:
989; CHECKIZHINXMIN-NEXT:    fcvt.s.h a0, a0
990; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
991; CHECKIZHINXMIN-NEXT:    flt.s a0, a1, a0
992; CHECKIZHINXMIN-NEXT:    xori a0, a0, 1
993; CHECKIZHINXMIN-NEXT:    ret
994  %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"ule", metadata !"fpexcept.strict") strictfp
995  %2 = zext i1 %1 to i32
996  ret i32 %2
997}
998
999define i32 @fcmps_une(half %a, half %b) nounwind strictfp {
1000; CHECK-LABEL: fcmps_une:
1001; CHECK:       # %bb.0:
1002; CHECK-NEXT:    fle.h a0, fa1, fa0
1003; CHECK-NEXT:    fle.h a1, fa0, fa1
1004; CHECK-NEXT:    and a0, a1, a0
1005; CHECK-NEXT:    xori a0, a0, 1
1006; CHECK-NEXT:    ret
1007;
1008; CHECKIZHINX-LABEL: fcmps_une:
1009; CHECKIZHINX:       # %bb.0:
1010; CHECKIZHINX-NEXT:    fle.h a2, a1, a0
1011; CHECKIZHINX-NEXT:    fle.h a0, a0, a1
1012; CHECKIZHINX-NEXT:    and a0, a0, a2
1013; CHECKIZHINX-NEXT:    xori a0, a0, 1
1014; CHECKIZHINX-NEXT:    ret
1015;
1016; CHECKIZFHMIN-LABEL: fcmps_une:
1017; CHECKIZFHMIN:       # %bb.0:
1018; CHECKIZFHMIN-NEXT:    fle.h a0, fa1, fa0
1019; CHECKIZFHMIN-NEXT:    fle.h a1, fa0, fa1
1020; CHECKIZFHMIN-NEXT:    and a0, a1, a0
1021; CHECKIZFHMIN-NEXT:    xori a0, a0, 1
1022; CHECKIZFHMIN-NEXT:    ret
1023;
1024; CHECKIZHINXMIN-LABEL: fcmps_une:
1025; CHECKIZHINXMIN:       # %bb.0:
1026; CHECKIZHINXMIN-NEXT:    fcvt.s.h a0, a0
1027; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
1028; CHECKIZHINXMIN-NEXT:    fle.s a2, a1, a0
1029; CHECKIZHINXMIN-NEXT:    fle.s a0, a0, a1
1030; CHECKIZHINXMIN-NEXT:    and a0, a0, a2
1031; CHECKIZHINXMIN-NEXT:    xori a0, a0, 1
1032; CHECKIZHINXMIN-NEXT:    ret
1033  %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"une", metadata !"fpexcept.strict") strictfp
1034  %2 = zext i1 %1 to i32
1035  ret i32 %2
1036}
1037
1038define i32 @fcmps_uno(half %a, half %b) nounwind strictfp {
1039; CHECK-LABEL: fcmps_uno:
1040; CHECK:       # %bb.0:
1041; CHECK-NEXT:    fle.h a0, fa1, fa1
1042; CHECK-NEXT:    fle.h a1, fa0, fa0
1043; CHECK-NEXT:    and a0, a1, a0
1044; CHECK-NEXT:    xori a0, a0, 1
1045; CHECK-NEXT:    ret
1046;
1047; CHECKIZHINX-LABEL: fcmps_uno:
1048; CHECKIZHINX:       # %bb.0:
1049; CHECKIZHINX-NEXT:    fle.h a1, a1, a1
1050; CHECKIZHINX-NEXT:    fle.h a0, a0, a0
1051; CHECKIZHINX-NEXT:    and a0, a0, a1
1052; CHECKIZHINX-NEXT:    xori a0, a0, 1
1053; CHECKIZHINX-NEXT:    ret
1054;
1055; CHECKIZFHMIN-LABEL: fcmps_uno:
1056; CHECKIZFHMIN:       # %bb.0:
1057; CHECKIZFHMIN-NEXT:    fle.h a0, fa1, fa1
1058; CHECKIZFHMIN-NEXT:    fle.h a1, fa0, fa0
1059; CHECKIZFHMIN-NEXT:    and a0, a1, a0
1060; CHECKIZFHMIN-NEXT:    xori a0, a0, 1
1061; CHECKIZFHMIN-NEXT:    ret
1062;
1063; CHECKIZHINXMIN-LABEL: fcmps_uno:
1064; CHECKIZHINXMIN:       # %bb.0:
1065; CHECKIZHINXMIN-NEXT:    fcvt.s.h a1, a1
1066; CHECKIZHINXMIN-NEXT:    fcvt.s.h a0, a0
1067; CHECKIZHINXMIN-NEXT:    fle.s a1, a1, a1
1068; CHECKIZHINXMIN-NEXT:    fle.s a0, a0, a0
1069; CHECKIZHINXMIN-NEXT:    and a0, a0, a1
1070; CHECKIZHINXMIN-NEXT:    xori a0, a0, 1
1071; CHECKIZHINXMIN-NEXT:    ret
1072  %1 = call i1 @llvm.experimental.constrained.fcmps.f16(half %a, half %b, metadata !"uno", metadata !"fpexcept.strict") strictfp
1073  %2 = zext i1 %1 to i32
1074  ret i32 %2
1075}
1076