xref: /llvm-project/llvm/test/CodeGen/LoongArch/ir-instruction/fcmp-flt.ll (revision 7d5c8cb023515efd1d80a9120f27ed5cdb1d1404)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA32
3; RUN: llc --mtriple=loongarch64 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA64
4
5;; Test the 'fcmp' LLVM IR: https://llvm.org/docs/LangRef.html#fcmp-instruction
6;; over float values.
7
8define i1 @fcmp_false(float %a, float %b) {
9; LA32-LABEL: fcmp_false:
10; LA32:       # %bb.0:
11; LA32-NEXT:    move $a0, $zero
12; LA32-NEXT:    ret
13;
14; LA64-LABEL: fcmp_false:
15; LA64:       # %bb.0:
16; LA64-NEXT:    move $a0, $zero
17; LA64-NEXT:    ret
18  %cmp = fcmp false float %a, %b
19  ret i1 %cmp
20}
21
22define i1 @fcmp_oeq(float %a, float %b) {
23; LA32-LABEL: fcmp_oeq:
24; LA32:       # %bb.0:
25; LA32-NEXT:    fcmp.ceq.s $fcc0, $fa0, $fa1
26; LA32-NEXT:    movcf2gr $a0, $fcc0
27; LA32-NEXT:    ret
28;
29; LA64-LABEL: fcmp_oeq:
30; LA64:       # %bb.0:
31; LA64-NEXT:    fcmp.ceq.s $fcc0, $fa0, $fa1
32; LA64-NEXT:    movcf2gr $a0, $fcc0
33; LA64-NEXT:    ret
34  %cmp = fcmp oeq float %a, %b
35  ret i1 %cmp
36}
37
38define i1 @fcmp_ogt(float %a, float %b) {
39; LA32-LABEL: fcmp_ogt:
40; LA32:       # %bb.0:
41; LA32-NEXT:    fcmp.clt.s $fcc0, $fa1, $fa0
42; LA32-NEXT:    movcf2gr $a0, $fcc0
43; LA32-NEXT:    ret
44;
45; LA64-LABEL: fcmp_ogt:
46; LA64:       # %bb.0:
47; LA64-NEXT:    fcmp.clt.s $fcc0, $fa1, $fa0
48; LA64-NEXT:    movcf2gr $a0, $fcc0
49; LA64-NEXT:    ret
50  %cmp = fcmp ogt float %a, %b
51  ret i1 %cmp
52}
53
54define i1 @fcmp_oge(float %a, float %b) {
55; LA32-LABEL: fcmp_oge:
56; LA32:       # %bb.0:
57; LA32-NEXT:    fcmp.cle.s $fcc0, $fa1, $fa0
58; LA32-NEXT:    movcf2gr $a0, $fcc0
59; LA32-NEXT:    ret
60;
61; LA64-LABEL: fcmp_oge:
62; LA64:       # %bb.0:
63; LA64-NEXT:    fcmp.cle.s $fcc0, $fa1, $fa0
64; LA64-NEXT:    movcf2gr $a0, $fcc0
65; LA64-NEXT:    ret
66  %cmp = fcmp oge float %a, %b
67  ret i1 %cmp
68}
69
70define i1 @fcmp_olt(float %a, float %b) {
71; LA32-LABEL: fcmp_olt:
72; LA32:       # %bb.0:
73; LA32-NEXT:    fcmp.clt.s $fcc0, $fa0, $fa1
74; LA32-NEXT:    movcf2gr $a0, $fcc0
75; LA32-NEXT:    ret
76;
77; LA64-LABEL: fcmp_olt:
78; LA64:       # %bb.0:
79; LA64-NEXT:    fcmp.clt.s $fcc0, $fa0, $fa1
80; LA64-NEXT:    movcf2gr $a0, $fcc0
81; LA64-NEXT:    ret
82  %cmp = fcmp olt float %a, %b
83  ret i1 %cmp
84}
85
86define i1 @fcmp_ole(float %a, float %b) {
87; LA32-LABEL: fcmp_ole:
88; LA32:       # %bb.0:
89; LA32-NEXT:    fcmp.cle.s $fcc0, $fa0, $fa1
90; LA32-NEXT:    movcf2gr $a0, $fcc0
91; LA32-NEXT:    ret
92;
93; LA64-LABEL: fcmp_ole:
94; LA64:       # %bb.0:
95; LA64-NEXT:    fcmp.cle.s $fcc0, $fa0, $fa1
96; LA64-NEXT:    movcf2gr $a0, $fcc0
97; LA64-NEXT:    ret
98  %cmp = fcmp ole float %a, %b
99  ret i1 %cmp
100}
101
102define i1 @fcmp_one(float %a, float %b) {
103; LA32-LABEL: fcmp_one:
104; LA32:       # %bb.0:
105; LA32-NEXT:    fcmp.cne.s $fcc0, $fa0, $fa1
106; LA32-NEXT:    movcf2gr $a0, $fcc0
107; LA32-NEXT:    ret
108;
109; LA64-LABEL: fcmp_one:
110; LA64:       # %bb.0:
111; LA64-NEXT:    fcmp.cne.s $fcc0, $fa0, $fa1
112; LA64-NEXT:    movcf2gr $a0, $fcc0
113; LA64-NEXT:    ret
114  %cmp = fcmp one float %a, %b
115  ret i1 %cmp
116}
117
118define i1 @fcmp_ord(float %a, float %b) {
119; LA32-LABEL: fcmp_ord:
120; LA32:       # %bb.0:
121; LA32-NEXT:    fcmp.cor.s $fcc0, $fa0, $fa1
122; LA32-NEXT:    movcf2gr $a0, $fcc0
123; LA32-NEXT:    ret
124;
125; LA64-LABEL: fcmp_ord:
126; LA64:       # %bb.0:
127; LA64-NEXT:    fcmp.cor.s $fcc0, $fa0, $fa1
128; LA64-NEXT:    movcf2gr $a0, $fcc0
129; LA64-NEXT:    ret
130  %cmp = fcmp ord float %a, %b
131  ret i1 %cmp
132}
133
134define i1 @fcmp_ueq(float %a, float %b) {
135; LA32-LABEL: fcmp_ueq:
136; LA32:       # %bb.0:
137; LA32-NEXT:    fcmp.cueq.s $fcc0, $fa0, $fa1
138; LA32-NEXT:    movcf2gr $a0, $fcc0
139; LA32-NEXT:    ret
140;
141; LA64-LABEL: fcmp_ueq:
142; LA64:       # %bb.0:
143; LA64-NEXT:    fcmp.cueq.s $fcc0, $fa0, $fa1
144; LA64-NEXT:    movcf2gr $a0, $fcc0
145; LA64-NEXT:    ret
146  %cmp = fcmp ueq float %a, %b
147  ret i1 %cmp
148}
149
150define i1 @fcmp_ugt(float %a, float %b) {
151; LA32-LABEL: fcmp_ugt:
152; LA32:       # %bb.0:
153; LA32-NEXT:    fcmp.cult.s $fcc0, $fa1, $fa0
154; LA32-NEXT:    movcf2gr $a0, $fcc0
155; LA32-NEXT:    ret
156;
157; LA64-LABEL: fcmp_ugt:
158; LA64:       # %bb.0:
159; LA64-NEXT:    fcmp.cult.s $fcc0, $fa1, $fa0
160; LA64-NEXT:    movcf2gr $a0, $fcc0
161; LA64-NEXT:    ret
162  %cmp = fcmp ugt float %a, %b
163  ret i1 %cmp
164}
165
166define i1 @fcmp_uge(float %a, float %b) {
167; LA32-LABEL: fcmp_uge:
168; LA32:       # %bb.0:
169; LA32-NEXT:    fcmp.cule.s $fcc0, $fa1, $fa0
170; LA32-NEXT:    movcf2gr $a0, $fcc0
171; LA32-NEXT:    ret
172;
173; LA64-LABEL: fcmp_uge:
174; LA64:       # %bb.0:
175; LA64-NEXT:    fcmp.cule.s $fcc0, $fa1, $fa0
176; LA64-NEXT:    movcf2gr $a0, $fcc0
177; LA64-NEXT:    ret
178  %cmp = fcmp uge float %a, %b
179  ret i1 %cmp
180}
181
182define i1 @fcmp_ult(float %a, float %b) {
183; LA32-LABEL: fcmp_ult:
184; LA32:       # %bb.0:
185; LA32-NEXT:    fcmp.cult.s $fcc0, $fa0, $fa1
186; LA32-NEXT:    movcf2gr $a0, $fcc0
187; LA32-NEXT:    ret
188;
189; LA64-LABEL: fcmp_ult:
190; LA64:       # %bb.0:
191; LA64-NEXT:    fcmp.cult.s $fcc0, $fa0, $fa1
192; LA64-NEXT:    movcf2gr $a0, $fcc0
193; LA64-NEXT:    ret
194  %cmp = fcmp ult float %a, %b
195  ret i1 %cmp
196}
197
198define i1 @fcmp_ule(float %a, float %b) {
199; LA32-LABEL: fcmp_ule:
200; LA32:       # %bb.0:
201; LA32-NEXT:    fcmp.cule.s $fcc0, $fa0, $fa1
202; LA32-NEXT:    movcf2gr $a0, $fcc0
203; LA32-NEXT:    ret
204;
205; LA64-LABEL: fcmp_ule:
206; LA64:       # %bb.0:
207; LA64-NEXT:    fcmp.cule.s $fcc0, $fa0, $fa1
208; LA64-NEXT:    movcf2gr $a0, $fcc0
209; LA64-NEXT:    ret
210  %cmp = fcmp ule float %a, %b
211  ret i1 %cmp
212}
213
214define i1 @fcmp_une(float %a, float %b) {
215; LA32-LABEL: fcmp_une:
216; LA32:       # %bb.0:
217; LA32-NEXT:    fcmp.cune.s $fcc0, $fa0, $fa1
218; LA32-NEXT:    movcf2gr $a0, $fcc0
219; LA32-NEXT:    ret
220;
221; LA64-LABEL: fcmp_une:
222; LA64:       # %bb.0:
223; LA64-NEXT:    fcmp.cune.s $fcc0, $fa0, $fa1
224; LA64-NEXT:    movcf2gr $a0, $fcc0
225; LA64-NEXT:    ret
226  %cmp = fcmp une float %a, %b
227  ret i1 %cmp
228}
229
230define i1 @fcmp_uno(float %a, float %b) {
231; LA32-LABEL: fcmp_uno:
232; LA32:       # %bb.0:
233; LA32-NEXT:    fcmp.cun.s $fcc0, $fa0, $fa1
234; LA32-NEXT:    movcf2gr $a0, $fcc0
235; LA32-NEXT:    ret
236;
237; LA64-LABEL: fcmp_uno:
238; LA64:       # %bb.0:
239; LA64-NEXT:    fcmp.cun.s $fcc0, $fa0, $fa1
240; LA64-NEXT:    movcf2gr $a0, $fcc0
241; LA64-NEXT:    ret
242  %cmp = fcmp uno float %a, %b
243  ret i1 %cmp
244}
245
246define i1 @fcmp_true(float %a, float %b) {
247; LA32-LABEL: fcmp_true:
248; LA32:       # %bb.0:
249; LA32-NEXT:    ori $a0, $zero, 1
250; LA32-NEXT:    ret
251;
252; LA64-LABEL: fcmp_true:
253; LA64:       # %bb.0:
254; LA64-NEXT:    ori $a0, $zero, 1
255; LA64-NEXT:    ret
256  %cmp = fcmp true float %a, %b
257  ret i1 %cmp
258}
259
260define i1 @fcmp_fast_olt(float %a, float %b, i1 %c) nounwind {
261; LA32-LABEL: fcmp_fast_olt:
262; LA32:       # %bb.0:
263; LA32-NEXT:    movgr2fr.w $fa1, $zero
264; LA32-NEXT:    fcmp.cle.s $fcc0, $fa1, $fa0
265; LA32-NEXT:    movcf2gr $a1, $fcc0
266; LA32-NEXT:    bnez $a1, .LBB16_2
267; LA32-NEXT:  # %bb.1: # %if.then
268; LA32-NEXT:    ret
269; LA32-NEXT:  .LBB16_2: # %if.else
270; LA32-NEXT:    fcmp.clt.s $fcc0, $fa0, $fa1
271; LA32-NEXT:    movcf2gr $a0, $fcc0
272; LA32-NEXT:    ret
273;
274; LA64-LABEL: fcmp_fast_olt:
275; LA64:       # %bb.0:
276; LA64-NEXT:    movgr2fr.w $fa1, $zero
277; LA64-NEXT:    fcmp.cle.s $fcc0, $fa1, $fa0
278; LA64-NEXT:    movcf2gr $a1, $fcc0
279; LA64-NEXT:    bnez $a1, .LBB16_2
280; LA64-NEXT:  # %bb.1: # %if.then
281; LA64-NEXT:    ret
282; LA64-NEXT:  .LBB16_2: # %if.else
283; LA64-NEXT:    fcmp.clt.s $fcc0, $fa0, $fa1
284; LA64-NEXT:    movcf2gr $a0, $fcc0
285; LA64-NEXT:    ret
286  %cmp = fcmp fast olt float %a, 0.000000e+00
287  br i1 %cmp, label %if.then, label %if.else
288
289if.then:
290  ret i1 %c
291
292if.else:
293  ret i1 %cmp
294}
295
296define i1 @fcmp_fast_oeq(float %a, float %b, i1 %c) nounwind {
297; LA32-LABEL: fcmp_fast_oeq:
298; LA32:       # %bb.0:
299; LA32-NEXT:    movgr2fr.w $fa1, $zero
300; LA32-NEXT:    fcmp.ceq.s $fcc0, $fa0, $fa1
301; LA32-NEXT:    movcf2gr $a1, $fcc0
302; LA32-NEXT:    xori $a1, $a1, 1
303; LA32-NEXT:    bnez $a1, .LBB17_2
304; LA32-NEXT:  # %bb.1: # %if.then
305; LA32-NEXT:    ret
306; LA32-NEXT:  .LBB17_2: # %if.else
307; LA32-NEXT:    movcf2gr $a0, $fcc0
308; LA32-NEXT:    ret
309;
310; LA64-LABEL: fcmp_fast_oeq:
311; LA64:       # %bb.0:
312; LA64-NEXT:    movgr2fr.w $fa1, $zero
313; LA64-NEXT:    fcmp.ceq.s $fcc0, $fa0, $fa1
314; LA64-NEXT:    movcf2gr $a1, $fcc0
315; LA64-NEXT:    xori $a1, $a1, 1
316; LA64-NEXT:    bnez $a1, .LBB17_2
317; LA64-NEXT:  # %bb.1: # %if.then
318; LA64-NEXT:    ret
319; LA64-NEXT:  .LBB17_2: # %if.else
320; LA64-NEXT:    movcf2gr $a0, $fcc0
321; LA64-NEXT:    ret
322  %cmp = fcmp fast oeq float %a, 0.000000e+00
323  br i1 %cmp, label %if.then, label %if.else
324
325if.then:
326  ret i1 %c
327
328if.else:
329  ret i1 %cmp
330}
331
332define i1 @fcmp_fast_ole(float %a, float %b, i1 %c) nounwind {
333; LA32-LABEL: fcmp_fast_ole:
334; LA32:       # %bb.0:
335; LA32-NEXT:    movgr2fr.w $fa1, $zero
336; LA32-NEXT:    fcmp.clt.s $fcc0, $fa1, $fa0
337; LA32-NEXT:    bcnez $fcc0, .LBB18_2
338; LA32-NEXT:  # %bb.1: # %if.then
339; LA32-NEXT:    ret
340; LA32-NEXT:  .LBB18_2: # %if.else
341; LA32-NEXT:    fcmp.cle.s $fcc0, $fa0, $fa1
342; LA32-NEXT:    movcf2gr $a0, $fcc0
343; LA32-NEXT:    ret
344;
345; LA64-LABEL: fcmp_fast_ole:
346; LA64:       # %bb.0:
347; LA64-NEXT:    movgr2fr.w $fa1, $zero
348; LA64-NEXT:    fcmp.clt.s $fcc0, $fa1, $fa0
349; LA64-NEXT:    bcnez $fcc0, .LBB18_2
350; LA64-NEXT:  # %bb.1: # %if.then
351; LA64-NEXT:    ret
352; LA64-NEXT:  .LBB18_2: # %if.else
353; LA64-NEXT:    fcmp.cle.s $fcc0, $fa0, $fa1
354; LA64-NEXT:    movcf2gr $a0, $fcc0
355; LA64-NEXT:    ret
356  %cmp = fcmp fast ole float %a, 0.000000e+00
357  br i1 %cmp, label %if.then, label %if.else
358
359if.then:
360  ret i1 %c
361
362if.else:
363  ret i1 %cmp
364}
365