Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / LoongArch / ir-instruction / fcmp-dbl.ll
blob3db98d20fbf11d52572b62fae02f5cc030c17801
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
5 ;; Test the 'fcmp' LLVM IR: https://llvm.org/docs/LangRef.html#fcmp-instruction
6 ;; over double values.
8 define 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
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
22 define 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
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
38 define 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
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
54 define 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
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
70 define 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
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
86 define 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
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
102 define 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
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
118 define 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
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
134 define 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
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
150 define 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
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
166 define 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
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
182 define 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
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
198 define 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
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
214 define 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
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
230 define 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
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
246 define 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
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
260 define 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
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
290 if.then:
291   ret i1 %c
293 if.else:
294   ret i1 %cmp
297 define 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
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
327 if.then:
328   ret i1 %c
330 if.else:
331   ret i1 %cmp
334 define 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
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
362 if.then:
363   ret i1 %c
365 if.else:
366   ret i1 %cmp