Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / LoongArch / is_fpclass_f32.ll
blobaf128fa52e1d2e2acf1fd309d81585b79dda0438
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2 ; RUN: llc --mtriple=loongarch32 --mattr=+f --verify-machineinstrs < %s | FileCheck %s
3 ; RUN: llc --mtriple=loongarch64 --mattr=+f --verify-machineinstrs < %s | FileCheck %s
5 define i1 @isnan_f(float %x) {
6 ; CHECK-LABEL: isnan_f:
7 ; CHECK:       # %bb.0: # %entry
8 ; CHECK-NEXT:    fclass.s $fa0, $fa0
9 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
10 ; CHECK-NEXT:    andi $a0, $a0, 3
11 ; CHECK-NEXT:    sltu $a0, $zero, $a0
12 ; CHECK-NEXT:    ret
13 entry:
14   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 3)  ; "nan"
15   ret i1 %0
18 define i1 @isnot_nan_f(float %x) {
19 ; CHECK-LABEL: isnot_nan_f:
20 ; CHECK:       # %bb.0: # %entry
21 ; CHECK-NEXT:    fclass.s $fa0, $fa0
22 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
23 ; CHECK-NEXT:    andi $a0, $a0, 1020
24 ; CHECK-NEXT:    sltu $a0, $zero, $a0
25 ; CHECK-NEXT:    ret
26 entry:
27   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1020)  ; 0x3fc = "zero|subnormal|normal|inf"
28   ret i1 %0
31 define i1 @issignaling_f(float %x) {
32 ; CHECK-LABEL: issignaling_f:
33 ; CHECK:       # %bb.0: # %entry
34 ; CHECK-NEXT:    fclass.s $fa0, $fa0
35 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
36 ; CHECK-NEXT:    andi $a0, $a0, 1
37 ; CHECK-NEXT:    sltu $a0, $zero, $a0
38 ; CHECK-NEXT:    ret
39 entry:
40   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1)  ; "snan"
41   ret i1 %0
44 define i1 @not_issignaling_f(float %x) {
45 ; CHECK-LABEL: not_issignaling_f:
46 ; CHECK:       # %bb.0: # %entry
47 ; CHECK-NEXT:    fclass.s $fa0, $fa0
48 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
49 ; CHECK-NEXT:    andi $a0, $a0, 1022
50 ; CHECK-NEXT:    sltu $a0, $zero, $a0
51 ; CHECK-NEXT:    ret
52 entry:
53   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1022)  ; ~"snan"
54   ret i1 %0
57 define i1 @isquiet_f(float %x) {
58 ; CHECK-LABEL: isquiet_f:
59 ; CHECK:       # %bb.0: # %entry
60 ; CHECK-NEXT:    fclass.s $fa0, $fa0
61 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
62 ; CHECK-NEXT:    andi $a0, $a0, 2
63 ; CHECK-NEXT:    sltu $a0, $zero, $a0
64 ; CHECK-NEXT:    ret
65 entry:
66   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 2)  ; "qnan"
67   ret i1 %0
70 define i1 @not_isquiet_f(float %x) {
71 ; CHECK-LABEL: not_isquiet_f:
72 ; CHECK:       # %bb.0: # %entry
73 ; CHECK-NEXT:    fclass.s $fa0, $fa0
74 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
75 ; CHECK-NEXT:    andi $a0, $a0, 1021
76 ; CHECK-NEXT:    sltu $a0, $zero, $a0
77 ; CHECK-NEXT:    ret
78 entry:
79   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1021)  ; ~"qnan"
80   ret i1 %0
83 define i1 @isinf_f(float %x) {
84 ; CHECK-LABEL: isinf_f:
85 ; CHECK:       # %bb.0: # %entry
86 ; CHECK-NEXT:    fclass.s $fa0, $fa0
87 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
88 ; CHECK-NEXT:    andi $a0, $a0, 68
89 ; CHECK-NEXT:    sltu $a0, $zero, $a0
90 ; CHECK-NEXT:    ret
91 entry:
92   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 516)  ; 0x204 = "inf"
93   ret i1 %0
96 define i1 @not_isinf_f(float %x) {
97 ; CHECK-LABEL: not_isinf_f:
98 ; CHECK:       # %bb.0: # %entry
99 ; CHECK-NEXT:    fclass.s $fa0, $fa0
100 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
101 ; CHECK-NEXT:    andi $a0, $a0, 955
102 ; CHECK-NEXT:    sltu $a0, $zero, $a0
103 ; CHECK-NEXT:    ret
104 entry:
105   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 507)  ; ~0x204 = "~inf"
106   ret i1 %0
109 define i1 @is_plus_inf_f(float %x) {
110 ; CHECK-LABEL: is_plus_inf_f:
111 ; CHECK:       # %bb.0: # %entry
112 ; CHECK-NEXT:    fclass.s $fa0, $fa0
113 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
114 ; CHECK-NEXT:    andi $a0, $a0, 64
115 ; CHECK-NEXT:    sltu $a0, $zero, $a0
116 ; CHECK-NEXT:    ret
117 entry:
118   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 512)  ; 0x200 = "+inf"
119   ret i1 %0
122 define i1 @is_minus_inf_f(float %x) {
123 ; CHECK-LABEL: is_minus_inf_f:
124 ; CHECK:       # %bb.0: # %entry
125 ; CHECK-NEXT:    fclass.s $fa0, $fa0
126 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
127 ; CHECK-NEXT:    andi $a0, $a0, 4
128 ; CHECK-NEXT:    sltu $a0, $zero, $a0
129 ; CHECK-NEXT:    ret
130 entry:
131   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 4)  ; "-inf"
132   ret i1 %0
135 define i1 @not_is_minus_inf_f(float %x) {
136 ; CHECK-LABEL: not_is_minus_inf_f:
137 ; CHECK:       # %bb.0: # %entry
138 ; CHECK-NEXT:    fclass.s $fa0, $fa0
139 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
140 ; CHECK-NEXT:    andi $a0, $a0, 1019
141 ; CHECK-NEXT:    sltu $a0, $zero, $a0
142 ; CHECK-NEXT:    ret
143 entry:
144   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1019)  ; ~"-inf"
145   ret i1 %0
148 define i1 @isfinite_f(float %x) {
149 ; CHECK-LABEL: isfinite_f:
150 ; CHECK:       # %bb.0: # %entry
151 ; CHECK-NEXT:    fclass.s $fa0, $fa0
152 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
153 ; CHECK-NEXT:    andi $a0, $a0, 952
154 ; CHECK-NEXT:    sltu $a0, $zero, $a0
155 ; CHECK-NEXT:    ret
156 entry:
157   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 504)  ; 0x1f8 = "finite"
158   ret i1 %0
161 define i1 @not_isfinite_f(float %x) {
162 ; CHECK-LABEL: not_isfinite_f:
163 ; CHECK:       # %bb.0: # %entry
164 ; CHECK-NEXT:    fclass.s $fa0, $fa0
165 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
166 ; CHECK-NEXT:    andi $a0, $a0, 71
167 ; CHECK-NEXT:    sltu $a0, $zero, $a0
168 ; CHECK-NEXT:    ret
169 entry:
170   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 519)  ; ~0x1f8 = "~finite"
171   ret i1 %0
174 define i1 @is_plus_finite_f(float %x) {
175 ; CHECK-LABEL: is_plus_finite_f:
176 ; CHECK:       # %bb.0: # %entry
177 ; CHECK-NEXT:    fclass.s $fa0, $fa0
178 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
179 ; CHECK-NEXT:    andi $a0, $a0, 896
180 ; CHECK-NEXT:    sltu $a0, $zero, $a0
181 ; CHECK-NEXT:    ret
182 entry:
183   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 448)  ; 0x1c0 = "+finite"
184   ret i1 %0
187 define i1 @not_is_plus_finite_f(float %x) {
188 ; CHECK-LABEL: not_is_plus_finite_f:
189 ; CHECK:       # %bb.0: # %entry
190 ; CHECK-NEXT:    fclass.s $fa0, $fa0
191 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
192 ; CHECK-NEXT:    andi $a0, $a0, 127
193 ; CHECK-NEXT:    sltu $a0, $zero, $a0
194 ; CHECK-NEXT:    ret
195 entry:
196   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 575)  ; ~0x1c0 = ~"+finite"
197   ret i1 %0
200 define i1 @is_minus_finite_f(float %x) {
201 ; CHECK-LABEL: is_minus_finite_f:
202 ; CHECK:       # %bb.0: # %entry
203 ; CHECK-NEXT:    fclass.s $fa0, $fa0
204 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
205 ; CHECK-NEXT:    andi $a0, $a0, 56
206 ; CHECK-NEXT:    sltu $a0, $zero, $a0
207 ; CHECK-NEXT:    ret
208 entry:
209   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 56)  ; 0x38 = "-finite"
210   ret i1 %0
213 define i1 @not_is_minus_finite_f(float %x) {
214 ; CHECK-LABEL: not_is_minus_finite_f:
215 ; CHECK:       # %bb.0: # %entry
216 ; CHECK-NEXT:    fclass.s $fa0, $fa0
217 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
218 ; CHECK-NEXT:    andi $a0, $a0, 967
219 ; CHECK-NEXT:    sltu $a0, $zero, $a0
220 ; CHECK-NEXT:    ret
221 entry:
222   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 967)  ; ~0x38 = ~"-finite"
223   ret i1 %0
226 define i1 @isnormal_f(float %x) {
227 ; CHECK-LABEL: isnormal_f:
228 ; CHECK:       # %bb.0: # %entry
229 ; CHECK-NEXT:    fclass.s $fa0, $fa0
230 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
231 ; CHECK-NEXT:    andi $a0, $a0, 136
232 ; CHECK-NEXT:    sltu $a0, $zero, $a0
233 ; CHECK-NEXT:    ret
234 entry:
235   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 264)  ; 0x108 = "normal"
236   ret i1 %0
239 define i1 @not_isnormal_f(float %x) {
240 ; CHECK-LABEL: not_isnormal_f:
241 ; CHECK:       # %bb.0: # %entry
242 ; CHECK-NEXT:    fclass.s $fa0, $fa0
243 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
244 ; CHECK-NEXT:    andi $a0, $a0, 887
245 ; CHECK-NEXT:    sltu $a0, $zero, $a0
246 ; CHECK-NEXT:    ret
247 entry:
248   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 759)  ; ~0x108 = "~normal"
249   ret i1 %0
252 define i1 @is_plus_normal_f(float %x) {
253 ; CHECK-LABEL: is_plus_normal_f:
254 ; CHECK:       # %bb.0: # %entry
255 ; CHECK-NEXT:    fclass.s $fa0, $fa0
256 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
257 ; CHECK-NEXT:    andi $a0, $a0, 128
258 ; CHECK-NEXT:    sltu $a0, $zero, $a0
259 ; CHECK-NEXT:    ret
260 entry:
261   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 256)  ; 0x100 = "+normal"
262   ret i1 %0
265 define i1 @issubnormal_f(float %x) {
266 ; CHECK-LABEL: issubnormal_f:
267 ; CHECK:       # %bb.0: # %entry
268 ; CHECK-NEXT:    fclass.s $fa0, $fa0
269 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
270 ; CHECK-NEXT:    andi $a0, $a0, 272
271 ; CHECK-NEXT:    sltu $a0, $zero, $a0
272 ; CHECK-NEXT:    ret
273 entry:
274   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 144)  ; 0x90 = "subnormal"
275   ret i1 %0
278 define i1 @not_issubnormal_f(float %x) {
279 ; CHECK-LABEL: not_issubnormal_f:
280 ; CHECK:       # %bb.0: # %entry
281 ; CHECK-NEXT:    fclass.s $fa0, $fa0
282 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
283 ; CHECK-NEXT:    andi $a0, $a0, 751
284 ; CHECK-NEXT:    sltu $a0, $zero, $a0
285 ; CHECK-NEXT:    ret
286 entry:
287   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 879)  ; ~0x90 = "~subnormal"
288   ret i1 %0
291 define i1 @is_plus_subnormal_f(float %x) {
292 ; CHECK-LABEL: is_plus_subnormal_f:
293 ; CHECK:       # %bb.0: # %entry
294 ; CHECK-NEXT:    fclass.s $fa0, $fa0
295 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
296 ; CHECK-NEXT:    andi $a0, $a0, 256
297 ; CHECK-NEXT:    sltu $a0, $zero, $a0
298 ; CHECK-NEXT:    ret
299 entry:
300   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 128)  ; 0x80 = "+subnormal"
301   ret i1 %0
304 define i1 @not_is_plus_subnormal_f(float %x) {
305 ; CHECK-LABEL: not_is_plus_subnormal_f:
306 ; CHECK:       # %bb.0: # %entry
307 ; CHECK-NEXT:    fclass.s $fa0, $fa0
308 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
309 ; CHECK-NEXT:    andi $a0, $a0, 767
310 ; CHECK-NEXT:    sltu $a0, $zero, $a0
311 ; CHECK-NEXT:    ret
312 entry:
313   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 895)  ; ~0x80 = ~"+subnormal"
314   ret i1 %0
317 define i1 @is_minus_subnormal_f(float %x) {
318 ; CHECK-LABEL: is_minus_subnormal_f:
319 ; CHECK:       # %bb.0: # %entry
320 ; CHECK-NEXT:    fclass.s $fa0, $fa0
321 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
322 ; CHECK-NEXT:    andi $a0, $a0, 16
323 ; CHECK-NEXT:    sltu $a0, $zero, $a0
324 ; CHECK-NEXT:    ret
325 entry:
326   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 16)  ; 0x10 = "-subnormal"
327   ret i1 %0
330 define i1 @not_is_minus_subnormal_f(float %x) {
331 ; CHECK-LABEL: not_is_minus_subnormal_f:
332 ; CHECK:       # %bb.0: # %entry
333 ; CHECK-NEXT:    fclass.s $fa0, $fa0
334 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
335 ; CHECK-NEXT:    andi $a0, $a0, 1007
336 ; CHECK-NEXT:    sltu $a0, $zero, $a0
337 ; CHECK-NEXT:    ret
338 entry:
339   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1007)  ; ~0x10 = ~"-subnormal"
340   ret i1 %0
343 define i1 @iszero_f(float %x) {
344 ; CHECK-LABEL: iszero_f:
345 ; CHECK:       # %bb.0: # %entry
346 ; CHECK-NEXT:    fclass.s $fa0, $fa0
347 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
348 ; CHECK-NEXT:    andi $a0, $a0, 544
349 ; CHECK-NEXT:    sltu $a0, $zero, $a0
350 ; CHECK-NEXT:    ret
351 entry:
352   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 96)  ; 0x60 = "zero"
353   ret i1 %0
356 define i1 @not_iszero_f(float %x) {
357 ; CHECK-LABEL: not_iszero_f:
358 ; CHECK:       # %bb.0: # %entry
359 ; CHECK-NEXT:    fclass.s $fa0, $fa0
360 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
361 ; CHECK-NEXT:    andi $a0, $a0, 479
362 ; CHECK-NEXT:    sltu $a0, $zero, $a0
363 ; CHECK-NEXT:    ret
364 entry:
365   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 927)  ; ~0x60 = "~zero"
366   ret i1 %0
369 define i1 @issubnormal_or_zero_f(float %x) {
370 ; CHECK-LABEL: issubnormal_or_zero_f:
371 ; CHECK:       # %bb.0: # %entry
372 ; CHECK-NEXT:    fclass.s $fa0, $fa0
373 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
374 ; CHECK-NEXT:    andi $a0, $a0, 816
375 ; CHECK-NEXT:    sltu $a0, $zero, $a0
376 ; CHECK-NEXT:    ret
377 entry:
378   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 240)  ; 0xf0 = "subnormal|zero"
379   ret i1 %0
382 define i1 @not_issubnormal_or_zero_f(float %x) {
383 ; CHECK-LABEL: not_issubnormal_or_zero_f:
384 ; CHECK:       # %bb.0: # %entry
385 ; CHECK-NEXT:    fclass.s $fa0, $fa0
386 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
387 ; CHECK-NEXT:    andi $a0, $a0, 207
388 ; CHECK-NEXT:    sltu $a0, $zero, $a0
389 ; CHECK-NEXT:    ret
390 entry:
391   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 783)  ; ~0xf0 = "~(subnormal|zero)"
392   ret i1 %0
395 define i1 @is_plus_zero_f(float %x) {
396 ; CHECK-LABEL: is_plus_zero_f:
397 ; CHECK:       # %bb.0: # %entry
398 ; CHECK-NEXT:    fclass.s $fa0, $fa0
399 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
400 ; CHECK-NEXT:    andi $a0, $a0, 512
401 ; CHECK-NEXT:    sltu $a0, $zero, $a0
402 ; CHECK-NEXT:    ret
403 entry:
404   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 64)  ; 0x40 = "+zero"
405   ret i1 %0
408 define i1 @not_is_plus_zero_f(float %x) {
409 ; CHECK-LABEL: not_is_plus_zero_f:
410 ; CHECK:       # %bb.0: # %entry
411 ; CHECK-NEXT:    fclass.s $fa0, $fa0
412 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
413 ; CHECK-NEXT:    andi $a0, $a0, 511
414 ; CHECK-NEXT:    sltu $a0, $zero, $a0
415 ; CHECK-NEXT:    ret
416 entry:
417   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 959)  ; ~0x40 = ~"+zero"
418   ret i1 %0
421 define i1 @is_minus_zero_f(float %x) {
422 ; CHECK-LABEL: is_minus_zero_f:
423 ; CHECK:       # %bb.0: # %entry
424 ; CHECK-NEXT:    fclass.s $fa0, $fa0
425 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
426 ; CHECK-NEXT:    andi $a0, $a0, 32
427 ; CHECK-NEXT:    sltu $a0, $zero, $a0
428 ; CHECK-NEXT:    ret
429 entry:
430   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 32)  ; 0x20 = "-zero"
431   ret i1 %0
434 define i1 @not_is_minus_zero_f(float %x) {
435 ; CHECK-LABEL: not_is_minus_zero_f:
436 ; CHECK:       # %bb.0: # %entry
437 ; CHECK-NEXT:    fclass.s $fa0, $fa0
438 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
439 ; CHECK-NEXT:    andi $a0, $a0, 991
440 ; CHECK-NEXT:    sltu $a0, $zero, $a0
441 ; CHECK-NEXT:    ret
442 entry:
443   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 991)  ; ~0x20 = ~"-zero"
444   ret i1 %0
447 define i1 @isnone_f(float %x) {
448 ; CHECK-LABEL: isnone_f:
449 ; CHECK:       # %bb.0: # %entry
450 ; CHECK-NEXT:    fclass.s $fa0, $fa0
451 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
452 ; CHECK-NEXT:    andi $a0, $a0, 0
453 ; CHECK-NEXT:    sltu $a0, $zero, $a0
454 ; CHECK-NEXT:    ret
455 entry:
456   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 0)
457   ret i1 %0
460 define i1 @isany_f(float %x) {
461 ; CHECK-LABEL: isany_f:
462 ; CHECK:       # %bb.0: # %entry
463 ; CHECK-NEXT:    fclass.s $fa0, $fa0
464 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
465 ; CHECK-NEXT:    andi $a0, $a0, 1023
466 ; CHECK-NEXT:    sltu $a0, $zero, $a0
467 ; CHECK-NEXT:    ret
468 entry:
469   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1023)
470   ret i1 %0
473 define i1 @iszero_or_nan_f(float %x) {
474 ; CHECK-LABEL: iszero_or_nan_f:
475 ; CHECK:       # %bb.0: # %entry
476 ; CHECK-NEXT:    fclass.s $fa0, $fa0
477 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
478 ; CHECK-NEXT:    andi $a0, $a0, 547
479 ; CHECK-NEXT:    sltu $a0, $zero, $a0
480 ; CHECK-NEXT:    ret
481 entry:
482   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 99)  ; 0x60|0x3 = "zero|nan"
483   ret i1 %0
486 define i1 @not_iszero_or_nan_f(float %x) {
487 ; CHECK-LABEL: not_iszero_or_nan_f:
488 ; CHECK:       # %bb.0: # %entry
489 ; CHECK-NEXT:    fclass.s $fa0, $fa0
490 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
491 ; CHECK-NEXT:    andi $a0, $a0, 476
492 ; CHECK-NEXT:    sltu $a0, $zero, $a0
493 ; CHECK-NEXT:    ret
494 entry:
495   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 924)  ; ~0x60 = "~(zero|nan)"
496   ret i1 %0
499 define i1 @iszero_or_qnan_f(float %x) {
500 ; CHECK-LABEL: iszero_or_qnan_f:
501 ; CHECK:       # %bb.0: # %entry
502 ; CHECK-NEXT:    fclass.s $fa0, $fa0
503 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
504 ; CHECK-NEXT:    andi $a0, $a0, 546
505 ; CHECK-NEXT:    sltu $a0, $zero, $a0
506 ; CHECK-NEXT:    ret
507 entry:
508   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 98)  ; 0x60|0x2 = "zero|qnan"
509   ret i1 %0
512 define i1 @iszero_or_snan_f(float %x) {
513 ; CHECK-LABEL: iszero_or_snan_f:
514 ; CHECK:       # %bb.0: # %entry
515 ; CHECK-NEXT:    fclass.s $fa0, $fa0
516 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
517 ; CHECK-NEXT:    andi $a0, $a0, 545
518 ; CHECK-NEXT:    sltu $a0, $zero, $a0
519 ; CHECK-NEXT:    ret
520 entry:
521   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 97)  ; 0x60|0x1 = "zero|snan"
522   ret i1 %0
525 define i1 @not_iszero_or_qnan_f(float %x) {
526 ; CHECK-LABEL: not_iszero_or_qnan_f:
527 ; CHECK:       # %bb.0: # %entry
528 ; CHECK-NEXT:    fclass.s $fa0, $fa0
529 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
530 ; CHECK-NEXT:    andi $a0, $a0, 477
531 ; CHECK-NEXT:    sltu $a0, $zero, $a0
532 ; CHECK-NEXT:    ret
533 entry:
534   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 925)  ; ~(0x60|0x2) = "~(zero|qnan)"
535   ret i1 %0
538 define i1 @not_iszero_or_snan_f(float %x) {
539 ; CHECK-LABEL: not_iszero_or_snan_f:
540 ; CHECK:       # %bb.0: # %entry
541 ; CHECK-NEXT:    fclass.s $fa0, $fa0
542 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
543 ; CHECK-NEXT:    andi $a0, $a0, 478
544 ; CHECK-NEXT:    sltu $a0, $zero, $a0
545 ; CHECK-NEXT:    ret
546 entry:
547   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 926)  ; ~(0x60|0x1) = "~(zero|snan)"
548   ret i1 %0
551 define i1 @isinf_or_nan_f(float %x) {
552 ; CHECK-LABEL: isinf_or_nan_f:
553 ; CHECK:       # %bb.0: # %entry
554 ; CHECK-NEXT:    fclass.s $fa0, $fa0
555 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
556 ; CHECK-NEXT:    andi $a0, $a0, 71
557 ; CHECK-NEXT:    sltu $a0, $zero, $a0
558 ; CHECK-NEXT:    ret
559 entry:
560   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 519)  ; 0x204|0x3 = "inf|nan"
561   ret i1 %0
564 define i1 @not_isinf_or_nan_f(float %x) {
565 ; CHECK-LABEL: not_isinf_or_nan_f:
566 ; CHECK:       # %bb.0: # %entry
567 ; CHECK-NEXT:    fclass.s $fa0, $fa0
568 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
569 ; CHECK-NEXT:    andi $a0, $a0, 952
570 ; CHECK-NEXT:    sltu $a0, $zero, $a0
571 ; CHECK-NEXT:    ret
572 entry:
573   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 504)  ; ~(0x204|0x3) = "~(inf|nan)"
574   ret i1 %0
577 define i1 @isfinite_or_nan_f(float %x) {
578 ; CHECK-LABEL: isfinite_or_nan_f:
579 ; CHECK:       # %bb.0: # %entry
580 ; CHECK-NEXT:    fclass.s $fa0, $fa0
581 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
582 ; CHECK-NEXT:    andi $a0, $a0, 955
583 ; CHECK-NEXT:    sltu $a0, $zero, $a0
584 ; CHECK-NEXT:    ret
585 entry:
586   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 507)  ; 0x1f8|0x3 = "finite|nan"
587   ret i1 %0
590 define i1 @not_isfinite_or_nan_f(float %x) {
591 ; CHECK-LABEL: not_isfinite_or_nan_f:
592 ; CHECK:       # %bb.0: # %entry
593 ; CHECK-NEXT:    fclass.s $fa0, $fa0
594 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
595 ; CHECK-NEXT:    andi $a0, $a0, 68
596 ; CHECK-NEXT:    sltu $a0, $zero, $a0
597 ; CHECK-NEXT:    ret
598 entry:
599   %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 516)  ; ~(0x1f8|0x3) = "~(finite|nan)"
600   ret i1 %0
603 define i1 @is_plus_inf_or_nan_f(float %x) {
604 ; CHECK-LABEL: is_plus_inf_or_nan_f:
605 ; CHECK:       # %bb.0:
606 ; CHECK-NEXT:    fclass.s $fa0, $fa0
607 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
608 ; CHECK-NEXT:    andi $a0, $a0, 67
609 ; CHECK-NEXT:    sltu $a0, $zero, $a0
610 ; CHECK-NEXT:    ret
611   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 515)  ; 0x200|0x3 = "+inf|nan"
612   ret i1 %class
615 define i1 @is_minus_inf_or_nan_f(float %x) {
616 ; CHECK-LABEL: is_minus_inf_or_nan_f:
617 ; CHECK:       # %bb.0:
618 ; CHECK-NEXT:    fclass.s $fa0, $fa0
619 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
620 ; CHECK-NEXT:    andi $a0, $a0, 7
621 ; CHECK-NEXT:    sltu $a0, $zero, $a0
622 ; CHECK-NEXT:    ret
623   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 7)  ; "-inf|nan"
624   ret i1 %class
627 define i1 @not_is_plus_inf_or_nan_f(float %x) {
628 ; CHECK-LABEL: not_is_plus_inf_or_nan_f:
629 ; CHECK:       # %bb.0:
630 ; CHECK-NEXT:    fclass.s $fa0, $fa0
631 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
632 ; CHECK-NEXT:    andi $a0, $a0, 956
633 ; CHECK-NEXT:    sltu $a0, $zero, $a0
634 ; CHECK-NEXT:    ret
635   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 508)  ; ~(0x200|0x3) = "~(+inf|nan)"
636   ret i1 %class
639 define i1 @not_is_minus_inf_or_nan_f(float %x) {
640 ; CHECK-LABEL: not_is_minus_inf_or_nan_f:
641 ; CHECK:       # %bb.0:
642 ; CHECK-NEXT:    fclass.s $fa0, $fa0
643 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
644 ; CHECK-NEXT:    andi $a0, $a0, 1016
645 ; CHECK-NEXT:    sltu $a0, $zero, $a0
646 ; CHECK-NEXT:    ret
647   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1016)  ; "~(-inf|nan)"
648   ret i1 %class
651 define i1 @is_plus_inf_or_snan_f(float %x) {
652 ; CHECK-LABEL: is_plus_inf_or_snan_f:
653 ; CHECK:       # %bb.0:
654 ; CHECK-NEXT:    fclass.s $fa0, $fa0
655 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
656 ; CHECK-NEXT:    andi $a0, $a0, 65
657 ; CHECK-NEXT:    sltu $a0, $zero, $a0
658 ; CHECK-NEXT:    ret
659   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 513)  ; 0x200|0x1 = "+inf|snan"
660   ret i1 %class
663 define i1 @is_plus_inf_or_qnan_f(float %x) {
664 ; CHECK-LABEL: is_plus_inf_or_qnan_f:
665 ; CHECK:       # %bb.0:
666 ; CHECK-NEXT:    fclass.s $fa0, $fa0
667 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
668 ; CHECK-NEXT:    andi $a0, $a0, 66
669 ; CHECK-NEXT:    sltu $a0, $zero, $a0
670 ; CHECK-NEXT:    ret
671   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 514)  ; 0x200|0x1 = "+inf|qnan"
672   ret i1 %class
675 define i1 @not_is_plus_inf_or_snan_f(float %x) {
676 ; CHECK-LABEL: not_is_plus_inf_or_snan_f:
677 ; CHECK:       # %bb.0:
678 ; CHECK-NEXT:    fclass.s $fa0, $fa0
679 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
680 ; CHECK-NEXT:    andi $a0, $a0, 958
681 ; CHECK-NEXT:    sltu $a0, $zero, $a0
682 ; CHECK-NEXT:    ret
683   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 510) ; ~(+inf|snan)
684   ret i1 %class
687 define i1 @not_is_plus_inf_or_qnan_f(float %x) {
688 ; CHECK-LABEL: not_is_plus_inf_or_qnan_f:
689 ; CHECK:       # %bb.0:
690 ; CHECK-NEXT:    fclass.s $fa0, $fa0
691 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
692 ; CHECK-NEXT:    andi $a0, $a0, 957
693 ; CHECK-NEXT:    sltu $a0, $zero, $a0
694 ; CHECK-NEXT:    ret
695   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 509) ; ~(+inf|qnan)
696   ret i1 %class
699 define i1 @is_minus_inf_or_snan_f(float %x) {
700 ; CHECK-LABEL: is_minus_inf_or_snan_f:
701 ; CHECK:       # %bb.0:
702 ; CHECK-NEXT:    fclass.s $fa0, $fa0
703 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
704 ; CHECK-NEXT:    andi $a0, $a0, 5
705 ; CHECK-NEXT:    sltu $a0, $zero, $a0
706 ; CHECK-NEXT:    ret
707   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 5)  ; "-inf|snan"
708   ret i1 %class
711 define i1 @is_minus_inf_or_qnan_f(float %x) {
712 ; CHECK-LABEL: is_minus_inf_or_qnan_f:
713 ; CHECK:       # %bb.0:
714 ; CHECK-NEXT:    fclass.s $fa0, $fa0
715 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
716 ; CHECK-NEXT:    andi $a0, $a0, 6
717 ; CHECK-NEXT:    sltu $a0, $zero, $a0
718 ; CHECK-NEXT:    ret
719   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 6)  ; "-inf|qnan"
720   ret i1 %class
723 define i1 @not_is_minus_inf_or_snan_f(float %x) {
724 ; CHECK-LABEL: not_is_minus_inf_or_snan_f:
725 ; CHECK:       # %bb.0:
726 ; CHECK-NEXT:    fclass.s $fa0, $fa0
727 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
728 ; CHECK-NEXT:    andi $a0, $a0, 1018
729 ; CHECK-NEXT:    sltu $a0, $zero, $a0
730 ; CHECK-NEXT:    ret
731   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1018)  ; "~(-inf|snan)"
732   ret i1 %class
735 define i1 @not_is_minus_inf_or_qnan_f(float %x) {
736 ; CHECK-LABEL: not_is_minus_inf_or_qnan_f:
737 ; CHECK:       # %bb.0:
738 ; CHECK-NEXT:    fclass.s $fa0, $fa0
739 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
740 ; CHECK-NEXT:    andi $a0, $a0, 1017
741 ; CHECK-NEXT:    sltu $a0, $zero, $a0
742 ; CHECK-NEXT:    ret
743   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1017)  ; "-inf|qnan"
744   ret i1 %class
747 define i1 @issubnormal_or_nan_f(float %x) {
748 ; CHECK-LABEL: issubnormal_or_nan_f:
749 ; CHECK:       # %bb.0:
750 ; CHECK-NEXT:    fclass.s $fa0, $fa0
751 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
752 ; CHECK-NEXT:    andi $a0, $a0, 275
753 ; CHECK-NEXT:    sltu $a0, $zero, $a0
754 ; CHECK-NEXT:    ret
755   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 147)  ; 0x90|0x3 = "subnormal|nan"
756   ret i1 %class
759 define i1 @issubnormal_or_zero_or_nan_f(float %x) {
760 ; CHECK-LABEL: issubnormal_or_zero_or_nan_f:
761 ; CHECK:       # %bb.0:
762 ; CHECK-NEXT:    fclass.s $fa0, $fa0
763 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
764 ; CHECK-NEXT:    andi $a0, $a0, 819
765 ; CHECK-NEXT:    sltu $a0, $zero, $a0
766 ; CHECK-NEXT:    ret
767   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 243)  ; 0xf0|0x3 = "subnormal|zero|nan"
768   ret i1 %class
771 define i1 @issubnormal_or_zero_or_snan_f(float %x) {
772 ; CHECK-LABEL: issubnormal_or_zero_or_snan_f:
773 ; CHECK:       # %bb.0:
774 ; CHECK-NEXT:    fclass.s $fa0, $fa0
775 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
776 ; CHECK-NEXT:    andi $a0, $a0, 817
777 ; CHECK-NEXT:    sltu $a0, $zero, $a0
778 ; CHECK-NEXT:    ret
779   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 241)  ; 0x90|0x1 = "subnormal|snan"
780   ret i1 %class
783 define i1 @issubnormal_or_zero_or_qnan_f(float %x) {
784 ; CHECK-LABEL: issubnormal_or_zero_or_qnan_f:
785 ; CHECK:       # %bb.0:
786 ; CHECK-NEXT:    fclass.s $fa0, $fa0
787 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
788 ; CHECK-NEXT:    andi $a0, $a0, 818
789 ; CHECK-NEXT:    sltu $a0, $zero, $a0
790 ; CHECK-NEXT:    ret
791   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 242)  ; 0x90|0x2 = "subnormal|qnan"
792   ret i1 %class
795 define i1 @not_issubnormal_or_nan_f(float %x) {
796 ; CHECK-LABEL: not_issubnormal_or_nan_f:
797 ; CHECK:       # %bb.0:
798 ; CHECK-NEXT:    fclass.s $fa0, $fa0
799 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
800 ; CHECK-NEXT:    andi $a0, $a0, 748
801 ; CHECK-NEXT:    sltu $a0, $zero, $a0
802 ; CHECK-NEXT:    ret
803   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 876)  ; ~(0x90|0x3) = ~"subnormal|nan"
804   ret i1 %class
807 define i1 @not_issubnormal_or_zero_or_nan_f(float %x) {
808 ; CHECK-LABEL: not_issubnormal_or_zero_or_nan_f:
809 ; CHECK:       # %bb.0:
810 ; CHECK-NEXT:    fclass.s $fa0, $fa0
811 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
812 ; CHECK-NEXT:    andi $a0, $a0, 204
813 ; CHECK-NEXT:    sltu $a0, $zero, $a0
814 ; CHECK-NEXT:    ret
815   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 780)  ; ~(0xf0|0x3) = ~"subnormal|zero|nan"
816   ret i1 %class
819 define i1 @not_issubnormal_or_zero_or_snan_f(float %x) {
820 ; CHECK-LABEL: not_issubnormal_or_zero_or_snan_f:
821 ; CHECK:       # %bb.0:
822 ; CHECK-NEXT:    fclass.s $fa0, $fa0
823 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
824 ; CHECK-NEXT:    andi $a0, $a0, 206
825 ; CHECK-NEXT:    sltu $a0, $zero, $a0
826 ; CHECK-NEXT:    ret
827   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 782)  ; ~(0x90|0x1) = ~"subnormal|snan"
828   ret i1 %class
831 define i1 @not_issubnormal_or_zero_or_qnan_f(float %x) {
832 ; CHECK-LABEL: not_issubnormal_or_zero_or_qnan_f:
833 ; CHECK:       # %bb.0:
834 ; CHECK-NEXT:    fclass.s $fa0, $fa0
835 ; CHECK-NEXT:    movfr2gr.s $a0, $fa0
836 ; CHECK-NEXT:    andi $a0, $a0, 205
837 ; CHECK-NEXT:    sltu $a0, $zero, $a0
838 ; CHECK-NEXT:    ret
839   %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 781)  ; ~(0x90|0x2) = ~"subnormal|qnan"
840   ret i1 %class
843 declare i1 @llvm.is.fpclass.f32(float, i32)