xref: /llvm-project/llvm/test/CodeGen/LoongArch/ir-instruction/fcmp-dbl.ll (revision f9e0845ef2f64f656e40fe84ee372590d0b8cb3b)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 --mattr=+d < %s | FileCheck %s --check-prefix=LA32
3; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA64
4
5;; Test the 'fcmp' LLVM IR: https://llvm.org/docs/LangRef.html#fcmp-instruction
6;; over double values.
7
8define i1 @fcmp_false(double %a, double %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 double %a, %b
19  ret i1 %cmp
20}
21
22define i1 @fcmp_oeq(double %a, double %b) {
23; LA32-LABEL: fcmp_oeq:
24; LA32:       # %bb.0:
25; LA32-NEXT:    fcmp.ceq.d $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.d $fcc0, $fa0, $fa1
32; LA64-NEXT:    movcf2gr $a0, $fcc0
33; LA64-NEXT:    ret
34  %cmp = fcmp oeq double %a, %b
35  ret i1 %cmp
36}
37
38define i1 @fcmp_ogt(double %a, double %b) {
39; LA32-LABEL: fcmp_ogt:
40; LA32:       # %bb.0:
41; LA32-NEXT:    fcmp.clt.d $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.d $fcc0, $fa1, $fa0
48; LA64-NEXT:    movcf2gr $a0, $fcc0
49; LA64-NEXT:    ret
50  %cmp = fcmp ogt double %a, %b
51  ret i1 %cmp
52}
53
54define i1 @fcmp_oge(double %a, double %b) {
55; LA32-LABEL: fcmp_oge:
56; LA32:       # %bb.0:
57; LA32-NEXT:    fcmp.cle.d $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.d $fcc0, $fa1, $fa0
64; LA64-NEXT:    movcf2gr $a0, $fcc0
65; LA64-NEXT:    ret
66  %cmp = fcmp oge double %a, %b
67  ret i1 %cmp
68}
69
70define i1 @fcmp_olt(double %a, double %b) {
71; LA32-LABEL: fcmp_olt:
72; LA32:       # %bb.0:
73; LA32-NEXT:    fcmp.clt.d $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.d $fcc0, $fa0, $fa1
80; LA64-NEXT:    movcf2gr $a0, $fcc0
81; LA64-NEXT:    ret
82  %cmp = fcmp olt double %a, %b
83  ret i1 %cmp
84}
85
86define i1 @fcmp_ole(double %a, double %b) {
87; LA32-LABEL: fcmp_ole:
88; LA32:       # %bb.0:
89; LA32-NEXT:    fcmp.cle.d $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.d $fcc0, $fa0, $fa1
96; LA64-NEXT:    movcf2gr $a0, $fcc0
97; LA64-NEXT:    ret
98  %cmp = fcmp ole double %a, %b
99  ret i1 %cmp
100}
101
102define i1 @fcmp_one(double %a, double %b) {
103; LA32-LABEL: fcmp_one:
104; LA32:       # %bb.0:
105; LA32-NEXT:    fcmp.cne.d $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.d $fcc0, $fa0, $fa1
112; LA64-NEXT:    movcf2gr $a0, $fcc0
113; LA64-NEXT:    ret
114  %cmp = fcmp one double %a, %b
115  ret i1 %cmp
116}
117
118define i1 @fcmp_ord(double %a, double %b) {
119; LA32-LABEL: fcmp_ord:
120; LA32:       # %bb.0:
121; LA32-NEXT:    fcmp.cor.d $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.d $fcc0, $fa0, $fa1
128; LA64-NEXT:    movcf2gr $a0, $fcc0
129; LA64-NEXT:    ret
130  %cmp = fcmp ord double %a, %b
131  ret i1 %cmp
132}
133
134define i1 @fcmp_ueq(double %a, double %b) {
135; LA32-LABEL: fcmp_ueq:
136; LA32:       # %bb.0:
137; LA32-NEXT:    fcmp.cueq.d $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.d $fcc0, $fa0, $fa1
144; LA64-NEXT:    movcf2gr $a0, $fcc0
145; LA64-NEXT:    ret
146  %cmp = fcmp ueq double %a, %b
147  ret i1 %cmp
148}
149
150define i1 @fcmp_ugt(double %a, double %b) {
151; LA32-LABEL: fcmp_ugt:
152; LA32:       # %bb.0:
153; LA32-NEXT:    fcmp.cult.d $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.d $fcc0, $fa1, $fa0
160; LA64-NEXT:    movcf2gr $a0, $fcc0
161; LA64-NEXT:    ret
162  %cmp = fcmp ugt double %a, %b
163  ret i1 %cmp
164}
165
166define i1 @fcmp_uge(double %a, double %b) {
167; LA32-LABEL: fcmp_uge:
168; LA32:       # %bb.0:
169; LA32-NEXT:    fcmp.cule.d $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.d $fcc0, $fa1, $fa0
176; LA64-NEXT:    movcf2gr $a0, $fcc0
177; LA64-NEXT:    ret
178  %cmp = fcmp uge double %a, %b
179  ret i1 %cmp
180}
181
182define i1 @fcmp_ult(double %a, double %b) {
183; LA32-LABEL: fcmp_ult:
184; LA32:       # %bb.0:
185; LA32-NEXT:    fcmp.cult.d $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.d $fcc0, $fa0, $fa1
192; LA64-NEXT:    movcf2gr $a0, $fcc0
193; LA64-NEXT:    ret
194  %cmp = fcmp ult double %a, %b
195  ret i1 %cmp
196}
197
198define i1 @fcmp_ule(double %a, double %b) {
199; LA32-LABEL: fcmp_ule:
200; LA32:       # %bb.0:
201; LA32-NEXT:    fcmp.cule.d $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.d $fcc0, $fa0, $fa1
208; LA64-NEXT:    movcf2gr $a0, $fcc0
209; LA64-NEXT:    ret
210  %cmp = fcmp ule double %a, %b
211  ret i1 %cmp
212}
213
214define i1 @fcmp_une(double %a, double %b) {
215; LA32-LABEL: fcmp_une:
216; LA32:       # %bb.0:
217; LA32-NEXT:    fcmp.cune.d $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.d $fcc0, $fa0, $fa1
224; LA64-NEXT:    movcf2gr $a0, $fcc0
225; LA64-NEXT:    ret
226  %cmp = fcmp une double %a, %b
227  ret i1 %cmp
228}
229
230define i1 @fcmp_uno(double %a, double %b) {
231; LA32-LABEL: fcmp_uno:
232; LA32:       # %bb.0:
233; LA32-NEXT:    fcmp.cun.d $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.d $fcc0, $fa0, $fa1
240; LA64-NEXT:    movcf2gr $a0, $fcc0
241; LA64-NEXT:    ret
242  %cmp = fcmp uno double %a, %b
243  ret i1 %cmp
244}
245
246define i1 @fcmp_true(double %a, double %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 double %a, %b
257  ret i1 %cmp
258}
259
260define i1 @fcmp_fast_olt(double %a, double %b, i1 %c) nounwind {
261; LA32-LABEL: fcmp_fast_olt:
262; LA32:       # %bb.0:
263; LA32-NEXT:    movgr2fr.w $fa1, $zero
264; LA32-NEXT:    movgr2frh.w $fa1, $zero
265; LA32-NEXT:    fcmp.cle.d $fcc0, $fa1, $fa0
266; LA32-NEXT:    movcf2gr $a1, $fcc0
267; LA32-NEXT:    bnez $a1, .LBB16_2
268; LA32-NEXT:  # %bb.1: # %if.then
269; LA32-NEXT:    ret
270; LA32-NEXT:  .LBB16_2: # %if.else
271; LA32-NEXT:    fcmp.clt.d $fcc0, $fa0, $fa1
272; LA32-NEXT:    movcf2gr $a0, $fcc0
273; LA32-NEXT:    ret
274;
275; LA64-LABEL: fcmp_fast_olt:
276; LA64:       # %bb.0:
277; LA64-NEXT:    movgr2fr.d $fa1, $zero
278; LA64-NEXT:    fcmp.cle.d $fcc0, $fa1, $fa0
279; LA64-NEXT:    movcf2gr $a1, $fcc0
280; LA64-NEXT:    bnez $a1, .LBB16_2
281; LA64-NEXT:  # %bb.1: # %if.then
282; LA64-NEXT:    ret
283; LA64-NEXT:  .LBB16_2: # %if.else
284; LA64-NEXT:    fcmp.clt.d $fcc0, $fa0, $fa1
285; LA64-NEXT:    movcf2gr $a0, $fcc0
286; LA64-NEXT:    ret
287  %cmp = fcmp fast olt double %a, 0.000000e+00
288  br i1 %cmp, label %if.then, label %if.else
289
290if.then:
291  ret i1 %c
292
293if.else:
294  ret i1 %cmp
295}
296
297define i1 @fcmp_fast_oeq(double %a, double %b, i1 %c) nounwind {
298; LA32-LABEL: fcmp_fast_oeq:
299; LA32:       # %bb.0:
300; LA32-NEXT:    movgr2fr.w $fa1, $zero
301; LA32-NEXT:    movgr2frh.w $fa1, $zero
302; LA32-NEXT:    fcmp.ceq.d $fcc0, $fa0, $fa1
303; LA32-NEXT:    movcf2gr $a1, $fcc0
304; LA32-NEXT:    xori $a1, $a1, 1
305; LA32-NEXT:    bnez $a1, .LBB17_2
306; LA32-NEXT:  # %bb.1: # %if.then
307; LA32-NEXT:    ret
308; LA32-NEXT:  .LBB17_2: # %if.else
309; LA32-NEXT:    movcf2gr $a0, $fcc0
310; LA32-NEXT:    ret
311;
312; LA64-LABEL: fcmp_fast_oeq:
313; LA64:       # %bb.0:
314; LA64-NEXT:    movgr2fr.d $fa1, $zero
315; LA64-NEXT:    fcmp.ceq.d $fcc0, $fa0, $fa1
316; LA64-NEXT:    movcf2gr $a1, $fcc0
317; LA64-NEXT:    xori $a1, $a1, 1
318; LA64-NEXT:    bnez $a1, .LBB17_2
319; LA64-NEXT:  # %bb.1: # %if.then
320; LA64-NEXT:    ret
321; LA64-NEXT:  .LBB17_2: # %if.else
322; LA64-NEXT:    movcf2gr $a0, $fcc0
323; LA64-NEXT:    ret
324  %cmp = fcmp fast oeq double %a, 0.000000e+00
325  br i1 %cmp, label %if.then, label %if.else
326
327if.then:
328  ret i1 %c
329
330if.else:
331  ret i1 %cmp
332}
333
334define i1 @fcmp_fast_ole(double %a, double %b, i1 %c) nounwind {
335; LA32-LABEL: fcmp_fast_ole:
336; LA32:       # %bb.0:
337; LA32-NEXT:    movgr2fr.w $fa1, $zero
338; LA32-NEXT:    movgr2frh.w $fa1, $zero
339; LA32-NEXT:    fcmp.clt.d $fcc0, $fa1, $fa0
340; LA32-NEXT:    bcnez $fcc0, .LBB18_2
341; LA32-NEXT:  # %bb.1: # %if.then
342; LA32-NEXT:    ret
343; LA32-NEXT:  .LBB18_2: # %if.else
344; LA32-NEXT:    fcmp.cle.d $fcc0, $fa0, $fa1
345; LA32-NEXT:    movcf2gr $a0, $fcc0
346; LA32-NEXT:    ret
347;
348; LA64-LABEL: fcmp_fast_ole:
349; LA64:       # %bb.0:
350; LA64-NEXT:    movgr2fr.d $fa1, $zero
351; LA64-NEXT:    fcmp.clt.d $fcc0, $fa1, $fa0
352; LA64-NEXT:    bcnez $fcc0, .LBB18_2
353; LA64-NEXT:  # %bb.1: # %if.then
354; LA64-NEXT:    ret
355; LA64-NEXT:  .LBB18_2: # %if.else
356; LA64-NEXT:    fcmp.cle.d $fcc0, $fa0, $fa1
357; LA64-NEXT:    movcf2gr $a0, $fcc0
358; LA64-NEXT:    ret
359  %cmp = fcmp fast ole double %a, 0.000000e+00
360  br i1 %cmp, label %if.then, label %if.else
361
362if.then:
363  ret i1 %c
364
365if.else:
366  ret i1 %cmp
367}
368