1; RUN: llc --mtriple=loongarch32 --mattr=+d < %s | FileCheck %s --check-prefix=LA32
2; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA64
3
4;; Test the 'fcmp' LLVM IR: https://llvm.org/docs/LangRef.html#fcmp-instruction
5;; over double values.
6
7define i1 @fcmp_false(double %a, double %b) {
8; LA32-LABEL: fcmp_false:
9; LA32:       # %bb.0:
10; LA32-NEXT:    move $a0, $zero
11; LA32-NEXT:    jirl $zero, $ra, 0
12;
13; LA64-LABEL: fcmp_false:
14; LA64:       # %bb.0:
15; LA64-NEXT:    move $a0, $zero
16; LA64-NEXT:    jirl $zero, $ra, 0
17  %cmp = fcmp false double %a, %b
18  ret i1 %cmp
19}
20
21define i1 @fcmp_oeq(double %a, double %b) {
22; LA32-LABEL: fcmp_oeq:
23; LA32:       # %bb.0:
24; LA32-NEXT:    fcmp.ceq.d $fcc0, $fa0, $fa1
25; LA32-NEXT:    movcf2gr $a0, $fcc0
26; LA32-NEXT:    jirl $zero, $ra, 0
27;
28; LA64-LABEL: fcmp_oeq:
29; LA64:       # %bb.0:
30; LA64-NEXT:    fcmp.ceq.d $fcc0, $fa0, $fa1
31; LA64-NEXT:    movcf2gr $a0, $fcc0
32; LA64-NEXT:    jirl $zero, $ra, 0
33  %cmp = fcmp oeq double %a, %b
34  ret i1 %cmp
35}
36
37define i1 @fcmp_ogt(double %a, double %b) {
38; LA32-LABEL: fcmp_ogt:
39; LA32:       # %bb.0:
40; LA32-NEXT:    fcmp.clt.d $fcc0, $fa1, $fa0
41; LA32-NEXT:    movcf2gr $a0, $fcc0
42; LA32-NEXT:    jirl $zero, $ra, 0
43;
44; LA64-LABEL: fcmp_ogt:
45; LA64:       # %bb.0:
46; LA64-NEXT:    fcmp.clt.d $fcc0, $fa1, $fa0
47; LA64-NEXT:    movcf2gr $a0, $fcc0
48; LA64-NEXT:    jirl $zero, $ra, 0
49  %cmp = fcmp ogt double %a, %b
50  ret i1 %cmp
51}
52
53define i1 @fcmp_oge(double %a, double %b) {
54; LA32-LABEL: fcmp_oge:
55; LA32:       # %bb.0:
56; LA32-NEXT:    fcmp.cle.d $fcc0, $fa1, $fa0
57; LA32-NEXT:    movcf2gr $a0, $fcc0
58; LA32-NEXT:    jirl $zero, $ra, 0
59;
60; LA64-LABEL: fcmp_oge:
61; LA64:       # %bb.0:
62; LA64-NEXT:    fcmp.cle.d $fcc0, $fa1, $fa0
63; LA64-NEXT:    movcf2gr $a0, $fcc0
64; LA64-NEXT:    jirl $zero, $ra, 0
65  %cmp = fcmp oge double %a, %b
66  ret i1 %cmp
67}
68
69define i1 @fcmp_olt(double %a, double %b) {
70; LA32-LABEL: fcmp_olt:
71; LA32:       # %bb.0:
72; LA32-NEXT:    fcmp.clt.d $fcc0, $fa0, $fa1
73; LA32-NEXT:    movcf2gr $a0, $fcc0
74; LA32-NEXT:    jirl $zero, $ra, 0
75;
76; LA64-LABEL: fcmp_olt:
77; LA64:       # %bb.0:
78; LA64-NEXT:    fcmp.clt.d $fcc0, $fa0, $fa1
79; LA64-NEXT:    movcf2gr $a0, $fcc0
80; LA64-NEXT:    jirl $zero, $ra, 0
81  %cmp = fcmp olt double %a, %b
82  ret i1 %cmp
83}
84
85define i1 @fcmp_ole(double %a, double %b) {
86; LA32-LABEL: fcmp_ole:
87; LA32:       # %bb.0:
88; LA32-NEXT:    fcmp.cle.d $fcc0, $fa0, $fa1
89; LA32-NEXT:    movcf2gr $a0, $fcc0
90; LA32-NEXT:    jirl $zero, $ra, 0
91;
92; LA64-LABEL: fcmp_ole:
93; LA64:       # %bb.0:
94; LA64-NEXT:    fcmp.cle.d $fcc0, $fa0, $fa1
95; LA64-NEXT:    movcf2gr $a0, $fcc0
96; LA64-NEXT:    jirl $zero, $ra, 0
97  %cmp = fcmp ole double %a, %b
98  ret i1 %cmp
99}
100
101define i1 @fcmp_one(double %a, double %b) {
102; LA32-LABEL: fcmp_one:
103; LA32:       # %bb.0:
104; LA32-NEXT:    fcmp.cne.d $fcc0, $fa0, $fa1
105; LA32-NEXT:    movcf2gr $a0, $fcc0
106; LA32-NEXT:    jirl $zero, $ra, 0
107;
108; LA64-LABEL: fcmp_one:
109; LA64:       # %bb.0:
110; LA64-NEXT:    fcmp.cne.d $fcc0, $fa0, $fa1
111; LA64-NEXT:    movcf2gr $a0, $fcc0
112; LA64-NEXT:    jirl $zero, $ra, 0
113  %cmp = fcmp one double %a, %b
114  ret i1 %cmp
115}
116
117define i1 @fcmp_ord(double %a, double %b) {
118; LA32-LABEL: fcmp_ord:
119; LA32:       # %bb.0:
120; LA32-NEXT:    fcmp.cor.d $fcc0, $fa0, $fa1
121; LA32-NEXT:    movcf2gr $a0, $fcc0
122; LA32-NEXT:    jirl $zero, $ra, 0
123;
124; LA64-LABEL: fcmp_ord:
125; LA64:       # %bb.0:
126; LA64-NEXT:    fcmp.cor.d $fcc0, $fa0, $fa1
127; LA64-NEXT:    movcf2gr $a0, $fcc0
128; LA64-NEXT:    jirl $zero, $ra, 0
129  %cmp = fcmp ord double %a, %b
130  ret i1 %cmp
131}
132
133define i1 @fcmp_ueq(double %a, double %b) {
134; LA32-LABEL: fcmp_ueq:
135; LA32:       # %bb.0:
136; LA32-NEXT:    fcmp.cueq.d $fcc0, $fa0, $fa1
137; LA32-NEXT:    movcf2gr $a0, $fcc0
138; LA32-NEXT:    jirl $zero, $ra, 0
139;
140; LA64-LABEL: fcmp_ueq:
141; LA64:       # %bb.0:
142; LA64-NEXT:    fcmp.cueq.d $fcc0, $fa0, $fa1
143; LA64-NEXT:    movcf2gr $a0, $fcc0
144; LA64-NEXT:    jirl $zero, $ra, 0
145  %cmp = fcmp ueq double %a, %b
146  ret i1 %cmp
147}
148
149define i1 @fcmp_ugt(double %a, double %b) {
150; LA32-LABEL: fcmp_ugt:
151; LA32:       # %bb.0:
152; LA32-NEXT:    fcmp.cult.d $fcc0, $fa1, $fa0
153; LA32-NEXT:    movcf2gr $a0, $fcc0
154; LA32-NEXT:    jirl $zero, $ra, 0
155;
156; LA64-LABEL: fcmp_ugt:
157; LA64:       # %bb.0:
158; LA64-NEXT:    fcmp.cult.d $fcc0, $fa1, $fa0
159; LA64-NEXT:    movcf2gr $a0, $fcc0
160; LA64-NEXT:    jirl $zero, $ra, 0
161  %cmp = fcmp ugt double %a, %b
162  ret i1 %cmp
163}
164
165define i1 @fcmp_uge(double %a, double %b) {
166; LA32-LABEL: fcmp_uge:
167; LA32:       # %bb.0:
168; LA32-NEXT:    fcmp.cule.d $fcc0, $fa1, $fa0
169; LA32-NEXT:    movcf2gr $a0, $fcc0
170; LA32-NEXT:    jirl $zero, $ra, 0
171;
172; LA64-LABEL: fcmp_uge:
173; LA64:       # %bb.0:
174; LA64-NEXT:    fcmp.cule.d $fcc0, $fa1, $fa0
175; LA64-NEXT:    movcf2gr $a0, $fcc0
176; LA64-NEXT:    jirl $zero, $ra, 0
177  %cmp = fcmp uge double %a, %b
178  ret i1 %cmp
179}
180
181define i1 @fcmp_ult(double %a, double %b) {
182; LA32-LABEL: fcmp_ult:
183; LA32:       # %bb.0:
184; LA32-NEXT:    fcmp.cult.d $fcc0, $fa0, $fa1
185; LA32-NEXT:    movcf2gr $a0, $fcc0
186; LA32-NEXT:    jirl $zero, $ra, 0
187;
188; LA64-LABEL: fcmp_ult:
189; LA64:       # %bb.0:
190; LA64-NEXT:    fcmp.cult.d $fcc0, $fa0, $fa1
191; LA64-NEXT:    movcf2gr $a0, $fcc0
192; LA64-NEXT:    jirl $zero, $ra, 0
193  %cmp = fcmp ult double %a, %b
194  ret i1 %cmp
195}
196
197define i1 @fcmp_ule(double %a, double %b) {
198; LA32-LABEL: fcmp_ule:
199; LA32:       # %bb.0:
200; LA32-NEXT:    fcmp.cule.d $fcc0, $fa0, $fa1
201; LA32-NEXT:    movcf2gr $a0, $fcc0
202; LA32-NEXT:    jirl $zero, $ra, 0
203;
204; LA64-LABEL: fcmp_ule:
205; LA64:       # %bb.0:
206; LA64-NEXT:    fcmp.cule.d $fcc0, $fa0, $fa1
207; LA64-NEXT:    movcf2gr $a0, $fcc0
208; LA64-NEXT:    jirl $zero, $ra, 0
209  %cmp = fcmp ule double %a, %b
210  ret i1 %cmp
211}
212
213define i1 @fcmp_une(double %a, double %b) {
214; LA32-LABEL: fcmp_une:
215; LA32:       # %bb.0:
216; LA32-NEXT:    fcmp.cune.d $fcc0, $fa0, $fa1
217; LA32-NEXT:    movcf2gr $a0, $fcc0
218; LA32-NEXT:    jirl $zero, $ra, 0
219;
220; LA64-LABEL: fcmp_une:
221; LA64:       # %bb.0:
222; LA64-NEXT:    fcmp.cune.d $fcc0, $fa0, $fa1
223; LA64-NEXT:    movcf2gr $a0, $fcc0
224; LA64-NEXT:    jirl $zero, $ra, 0
225  %cmp = fcmp une double %a, %b
226  ret i1 %cmp
227}
228
229define i1 @fcmp_uno(double %a, double %b) {
230; LA32-LABEL: fcmp_uno:
231; LA32:       # %bb.0:
232; LA32-NEXT:    fcmp.cun.d $fcc0, $fa0, $fa1
233; LA32-NEXT:    movcf2gr $a0, $fcc0
234; LA32-NEXT:    jirl $zero, $ra, 0
235;
236; LA64-LABEL: fcmp_uno:
237; LA64:       # %bb.0:
238; LA64-NEXT:    fcmp.cun.d $fcc0, $fa0, $fa1
239; LA64-NEXT:    movcf2gr $a0, $fcc0
240; LA64-NEXT:    jirl $zero, $ra, 0
241  %cmp = fcmp uno double %a, %b
242  ret i1 %cmp
243}
244
245define i1 @fcmp_true(double %a, double %b) {
246; LA32-LABEL: fcmp_true:
247; LA32:       # %bb.0:
248; LA32-NEXT:    ori $a0, $zero, 1
249; LA32-NEXT:    jirl $zero, $ra, 0
250;
251; LA64-LABEL: fcmp_true:
252; LA64:       # %bb.0:
253; LA64-NEXT:    ori $a0, $zero, 1
254; LA64-NEXT:    jirl $zero, $ra, 0
255  %cmp = fcmp true double %a, %b
256  ret i1 %cmp
257}
258