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