xref: /llvm-project/llvm/test/CodeGen/LoongArch/is_fpclass_f32.ll (revision 0a692b6b9632e1460f9e0e983196f2be5879acd1)
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
4
5define 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
13entry:
14  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 3)  ; "nan"
15  ret i1 %0
16}
17
18define 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
26entry:
27  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1020)  ; 0x3fc = "zero|subnormal|normal|inf"
28  ret i1 %0
29}
30
31define 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
39entry:
40  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1)  ; "snan"
41  ret i1 %0
42}
43
44define 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
52entry:
53  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1022)  ; ~"snan"
54  ret i1 %0
55}
56
57define 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
65entry:
66  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 2)  ; "qnan"
67  ret i1 %0
68}
69
70define 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
78entry:
79  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1021)  ; ~"qnan"
80  ret i1 %0
81}
82
83define 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
91entry:
92  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 516)  ; 0x204 = "inf"
93  ret i1 %0
94}
95
96define 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
104entry:
105  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 507)  ; ~0x204 = "~inf"
106  ret i1 %0
107}
108
109define 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
117entry:
118  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 512)  ; 0x200 = "+inf"
119  ret i1 %0
120}
121
122define 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
130entry:
131  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 4)  ; "-inf"
132  ret i1 %0
133}
134
135define 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
143entry:
144  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1019)  ; ~"-inf"
145  ret i1 %0
146}
147
148define 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
156entry:
157  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 504)  ; 0x1f8 = "finite"
158  ret i1 %0
159}
160
161define 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
169entry:
170  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 519)  ; ~0x1f8 = "~finite"
171  ret i1 %0
172}
173
174define 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
182entry:
183  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 448)  ; 0x1c0 = "+finite"
184  ret i1 %0
185}
186
187define 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
195entry:
196  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 575)  ; ~0x1c0 = ~"+finite"
197  ret i1 %0
198}
199
200define 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
208entry:
209  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 56)  ; 0x38 = "-finite"
210  ret i1 %0
211}
212
213define 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
221entry:
222  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 967)  ; ~0x38 = ~"-finite"
223  ret i1 %0
224}
225
226define 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
234entry:
235  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 264)  ; 0x108 = "normal"
236  ret i1 %0
237}
238
239define 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
247entry:
248  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 759)  ; ~0x108 = "~normal"
249  ret i1 %0
250}
251
252define 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
260entry:
261  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 256)  ; 0x100 = "+normal"
262  ret i1 %0
263}
264
265define 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
273entry:
274  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 144)  ; 0x90 = "subnormal"
275  ret i1 %0
276}
277
278define 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
286entry:
287  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 879)  ; ~0x90 = "~subnormal"
288  ret i1 %0
289}
290
291define 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
299entry:
300  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 128)  ; 0x80 = "+subnormal"
301  ret i1 %0
302}
303
304define 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
312entry:
313  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 895)  ; ~0x80 = ~"+subnormal"
314  ret i1 %0
315}
316
317define 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
325entry:
326  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 16)  ; 0x10 = "-subnormal"
327  ret i1 %0
328}
329
330define 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
338entry:
339  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1007)  ; ~0x10 = ~"-subnormal"
340  ret i1 %0
341}
342
343define 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
351entry:
352  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 96)  ; 0x60 = "zero"
353  ret i1 %0
354}
355
356define 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
364entry:
365  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 927)  ; ~0x60 = "~zero"
366  ret i1 %0
367}
368
369define 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
377entry:
378  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 240)  ; 0xf0 = "subnormal|zero"
379  ret i1 %0
380}
381
382define 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
390entry:
391  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 783)  ; ~0xf0 = "~(subnormal|zero)"
392  ret i1 %0
393}
394
395define 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
403entry:
404  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 64)  ; 0x40 = "+zero"
405  ret i1 %0
406}
407
408define 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
416entry:
417  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 959)  ; ~0x40 = ~"+zero"
418  ret i1 %0
419}
420
421define 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
429entry:
430  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 32)  ; 0x20 = "-zero"
431  ret i1 %0
432}
433
434define 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
442entry:
443  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 991)  ; ~0x20 = ~"-zero"
444  ret i1 %0
445}
446
447define 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
455entry:
456  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 0)
457  ret i1 %0
458}
459
460define 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
468entry:
469  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1023)
470  ret i1 %0
471}
472
473define 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
481entry:
482  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 99)  ; 0x60|0x3 = "zero|nan"
483  ret i1 %0
484}
485
486define 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
494entry:
495  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 924)  ; ~0x60 = "~(zero|nan)"
496  ret i1 %0
497}
498
499define 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
507entry:
508  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 98)  ; 0x60|0x2 = "zero|qnan"
509  ret i1 %0
510}
511
512define 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
520entry:
521  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 97)  ; 0x60|0x1 = "zero|snan"
522  ret i1 %0
523}
524
525define 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
533entry:
534  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 925)  ; ~(0x60|0x2) = "~(zero|qnan)"
535  ret i1 %0
536}
537
538define 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
546entry:
547  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 926)  ; ~(0x60|0x1) = "~(zero|snan)"
548  ret i1 %0
549}
550
551define 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
559entry:
560  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 519)  ; 0x204|0x3 = "inf|nan"
561  ret i1 %0
562}
563
564define 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
572entry:
573  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 504)  ; ~(0x204|0x3) = "~(inf|nan)"
574  ret i1 %0
575}
576
577define 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
585entry:
586  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 507)  ; 0x1f8|0x3 = "finite|nan"
587  ret i1 %0
588}
589
590define 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
598entry:
599  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 516)  ; ~(0x1f8|0x3) = "~(finite|nan)"
600  ret i1 %0
601}
602
603define 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
613}
614
615define 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
625}
626
627define 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
637}
638
639define 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
649}
650
651define 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
661}
662
663define 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
673}
674
675define 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
685}
686
687define 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
697}
698
699define 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
709}
710
711define 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
721}
722
723define 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
733}
734
735define 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
745}
746
747define 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
757}
758
759define 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
769}
770
771define 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
781}
782
783define 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
793}
794
795define 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
805}
806
807define 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
817}
818
819define 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
829}
830
831define 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
841}
842
843declare i1 @llvm.is.fpclass.f32(float, i32)
844