xref: /llvm-project/llvm/test/CodeGen/X86/is_fpclass.ll (revision 77f1b481b884621c12cde5f2ce6f080f11dbbbcc)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i686-linux | FileCheck %s -check-prefixes=X86
3; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s -check-prefixes=X64,X64-GENERIC
4; RUN: llc < %s -mtriple=x86_64-linux -mattr=+ndd | FileCheck %s -check-prefixes=X64,X64-NDD
5
6define i1 @isnan_f(float %x) {
7; X86-LABEL: isnan_f:
8; X86:       # %bb.0: # %entry
9; X86-NEXT:    flds {{[0-9]+}}(%esp)
10; X86-NEXT:    fucomp %st(0)
11; X86-NEXT:    fnstsw %ax
12; X86-NEXT:    # kill: def $ah killed $ah killed $ax
13; X86-NEXT:    sahf
14; X86-NEXT:    setp %al
15; X86-NEXT:    retl
16;
17; X64-LABEL: isnan_f:
18; X64:       # %bb.0: # %entry
19; X64-NEXT:    ucomiss %xmm0, %xmm0
20; X64-NEXT:    setp %al
21; X64-NEXT:    retq
22entry:
23  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 3)  ; "nan"
24  ret i1 %0
25}
26
27define i1 @isnot_nan_f(float %x) {
28; X86-LABEL: isnot_nan_f:
29; X86:       # %bb.0: # %entry
30; X86-NEXT:    flds {{[0-9]+}}(%esp)
31; X86-NEXT:    fucomp %st(0)
32; X86-NEXT:    fnstsw %ax
33; X86-NEXT:    # kill: def $ah killed $ah killed $ax
34; X86-NEXT:    sahf
35; X86-NEXT:    setnp %al
36; X86-NEXT:    retl
37;
38; X64-LABEL: isnot_nan_f:
39; X64:       # %bb.0: # %entry
40; X64-NEXT:    ucomiss %xmm0, %xmm0
41; X64-NEXT:    setnp %al
42; X64-NEXT:    retq
43entry:
44  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1020)  ; 0x3fc = "zero|subnormal|normal|inf"
45  ret i1 %0
46}
47
48define i1 @issignaling_f(float %x) {
49; X86-LABEL: issignaling_f:
50; X86:       # %bb.0: # %entry
51; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
52; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
53; X86-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
54; X86-NEXT:    setl %cl
55; X86-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
56; X86-NEXT:    setge %al
57; X86-NEXT:    andb %cl, %al
58; X86-NEXT:    retl
59;
60; X64-LABEL: issignaling_f:
61; X64:       # %bb.0: # %entry
62; X64-NEXT:    movd %xmm0, %eax
63; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
64; X64-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
65; X64-NEXT:    setl %cl
66; X64-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
67; X64-NEXT:    setge %al
68; X64-NEXT:    andb %cl, %al
69; X64-NEXT:    retq
70entry:
71  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1)  ; "snan"
72  ret i1 %0
73}
74
75define i1 @not_issignaling_f(float %x) {
76; X86-LABEL: not_issignaling_f:
77; X86:       # %bb.0: # %entry
78; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
79; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
80; X86-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
81; X86-NEXT:    setge %cl
82; X86-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
83; X86-NEXT:    setl %al
84; X86-NEXT:    orb %cl, %al
85; X86-NEXT:    retl
86;
87; X64-LABEL: not_issignaling_f:
88; X64:       # %bb.0: # %entry
89; X64-NEXT:    movd %xmm0, %eax
90; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
91; X64-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
92; X64-NEXT:    setge %cl
93; X64-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
94; X64-NEXT:    setl %al
95; X64-NEXT:    orb %cl, %al
96; X64-NEXT:    retq
97entry:
98  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1022)  ; ~"snan"
99  ret i1 %0
100}
101
102define i1 @isquiet_f(float %x) {
103; X86-LABEL: isquiet_f:
104; X86:       # %bb.0: # %entry
105; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
106; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
107; X86-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
108; X86-NEXT:    setge %al
109; X86-NEXT:    retl
110;
111; X64-LABEL: isquiet_f:
112; X64:       # %bb.0: # %entry
113; X64-NEXT:    movd %xmm0, %eax
114; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
115; X64-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
116; X64-NEXT:    setge %al
117; X64-NEXT:    retq
118entry:
119  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 2)  ; "qnan"
120  ret i1 %0
121}
122
123define i1 @not_isquiet_f(float %x) {
124; X86-LABEL: not_isquiet_f:
125; X86:       # %bb.0: # %entry
126; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
127; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
128; X86-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
129; X86-NEXT:    setl %al
130; X86-NEXT:    retl
131;
132; X64-LABEL: not_isquiet_f:
133; X64:       # %bb.0: # %entry
134; X64-NEXT:    movd %xmm0, %eax
135; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
136; X64-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
137; X64-NEXT:    setl %al
138; X64-NEXT:    retq
139entry:
140  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1021)  ; ~"qnan"
141  ret i1 %0
142}
143
144define i1 @isinf_f(float %x) {
145; X86-LABEL: isinf_f:
146; X86:       # %bb.0: # %entry
147; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
148; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
149; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
150; X86-NEXT:    sete %al
151; X86-NEXT:    retl
152;
153; X64-LABEL: isinf_f:
154; X64:       # %bb.0: # %entry
155; X64-NEXT:    movd %xmm0, %eax
156; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
157; X64-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
158; X64-NEXT:    sete %al
159; X64-NEXT:    retq
160entry:
161  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 516)  ; 0x204 = "inf"
162  ret i1 %0
163}
164
165define i1 @not_isinf_f(float %x) {
166; X86-LABEL: not_isinf_f:
167; X86:       # %bb.0: # %entry
168; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
169; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
170; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
171; X86-NEXT:    setne %al
172; X86-NEXT:    retl
173;
174; X64-LABEL: not_isinf_f:
175; X64:       # %bb.0: # %entry
176; X64-NEXT:    movd %xmm0, %eax
177; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
178; X64-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
179; X64-NEXT:    setne %al
180; X64-NEXT:    retq
181entry:
182  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 507)  ; ~0x204 = "~inf"
183  ret i1 %0
184}
185
186define i1 @is_plus_inf_f(float %x) {
187; X86-LABEL: is_plus_inf_f:
188; X86:       # %bb.0: # %entry
189; X86-NEXT:    cmpl $2139095040, {{[0-9]+}}(%esp) # imm = 0x7F800000
190; X86-NEXT:    sete %al
191; X86-NEXT:    retl
192;
193; X64-LABEL: is_plus_inf_f:
194; X64:       # %bb.0: # %entry
195; X64-NEXT:    movd %xmm0, %eax
196; X64-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
197; X64-NEXT:    sete %al
198; X64-NEXT:    retq
199entry:
200  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 512)  ; 0x200 = "+inf"
201  ret i1 %0
202}
203
204define i1 @is_minus_inf_f(float %x) {
205; X86-LABEL: is_minus_inf_f:
206; X86:       # %bb.0: # %entry
207; X86-NEXT:    cmpl $-8388608, {{[0-9]+}}(%esp) # imm = 0xFF800000
208; X86-NEXT:    sete %al
209; X86-NEXT:    retl
210;
211; X64-LABEL: is_minus_inf_f:
212; X64:       # %bb.0: # %entry
213; X64-NEXT:    movd %xmm0, %eax
214; X64-NEXT:    cmpl $-8388608, %eax # imm = 0xFF800000
215; X64-NEXT:    sete %al
216; X64-NEXT:    retq
217entry:
218  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 4)  ; "-inf"
219  ret i1 %0
220}
221
222define i1 @not_is_minus_inf_f(float %x) {
223; X86-LABEL: not_is_minus_inf_f:
224; X86:       # %bb.0: # %entry
225; X86-NEXT:    cmpl $-8388608, {{[0-9]+}}(%esp) # imm = 0xFF800000
226; X86-NEXT:    setne %al
227; X86-NEXT:    retl
228;
229; X64-LABEL: not_is_minus_inf_f:
230; X64:       # %bb.0: # %entry
231; X64-NEXT:    movd %xmm0, %eax
232; X64-NEXT:    cmpl $-8388608, %eax # imm = 0xFF800000
233; X64-NEXT:    setne %al
234; X64-NEXT:    retq
235entry:
236  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1019)  ; ~"-inf"
237  ret i1 %0
238}
239
240define i1 @isfinite_f(float %x) {
241; X86-LABEL: isfinite_f:
242; X86:       # %bb.0: # %entry
243; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
244; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
245; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
246; X86-NEXT:    setl %al
247; X86-NEXT:    retl
248;
249; X64-LABEL: isfinite_f:
250; X64:       # %bb.0: # %entry
251; X64-NEXT:    movd %xmm0, %eax
252; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
253; X64-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
254; X64-NEXT:    setl %al
255; X64-NEXT:    retq
256entry:
257  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 504)  ; 0x1f8 = "finite"
258  ret i1 %0
259}
260
261define i1 @not_isfinite_f(float %x) {
262; X86-LABEL: not_isfinite_f:
263; X86:       # %bb.0: # %entry
264; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
265; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
266; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
267; X86-NEXT:    setge %al
268; X86-NEXT:    retl
269;
270; X64-LABEL: not_isfinite_f:
271; X64:       # %bb.0: # %entry
272; X64-NEXT:    movd %xmm0, %eax
273; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
274; X64-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
275; X64-NEXT:    setge %al
276; X64-NEXT:    retq
277entry:
278  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 519)  ; ~0x1f8 = "~finite"
279  ret i1 %0
280}
281
282define i1 @is_plus_finite_f(float %x) {
283; X86-LABEL: is_plus_finite_f:
284; X86:       # %bb.0: # %entry
285; X86-NEXT:    cmpl $2139095040, {{[0-9]+}}(%esp) # imm = 0x7F800000
286; X86-NEXT:    setb %al
287; X86-NEXT:    retl
288;
289; X64-LABEL: is_plus_finite_f:
290; X64:       # %bb.0: # %entry
291; X64-NEXT:    movd %xmm0, %eax
292; X64-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
293; X64-NEXT:    setb %al
294; X64-NEXT:    retq
295entry:
296  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 448)  ; 0x1c0 = "+finite"
297  ret i1 %0
298}
299
300define i1 @not_is_plus_finite_f(float %x) {
301; X86-LABEL: not_is_plus_finite_f:
302; X86:       # %bb.0: # %entry
303; X86-NEXT:    cmpl $2139095040, {{[0-9]+}}(%esp) # imm = 0x7F800000
304; X86-NEXT:    setae %al
305; X86-NEXT:    retl
306;
307; X64-LABEL: not_is_plus_finite_f:
308; X64:       # %bb.0: # %entry
309; X64-NEXT:    movd %xmm0, %eax
310; X64-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
311; X64-NEXT:    setae %al
312; X64-NEXT:    retq
313entry:
314  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 575)  ; ~0x1c0 = ~"+finite"
315  ret i1 %0
316}
317
318define i1 @is_minus_finite_f(float %x) {
319; X86-LABEL: is_minus_finite_f:
320; X86:       # %bb.0: # %entry
321; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
322; X86-NEXT:    testl %eax, %eax
323; X86-NEXT:    sets %cl
324; X86-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
325; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
326; X86-NEXT:    setl %al
327; X86-NEXT:    andb %cl, %al
328; X86-NEXT:    retl
329;
330; X64-LABEL: is_minus_finite_f:
331; X64:       # %bb.0: # %entry
332; X64-NEXT:    movd %xmm0, %eax
333; X64-NEXT:    testl %eax, %eax
334; X64-NEXT:    sets %cl
335; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
336; X64-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
337; X64-NEXT:    setl %al
338; X64-NEXT:    andb %cl, %al
339; X64-NEXT:    retq
340entry:
341  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 56)  ; 0x38 = "-finite"
342  ret i1 %0
343}
344
345define i1 @not_is_minus_finite_f(float %x) {
346; X86-LABEL: not_is_minus_finite_f:
347; X86:       # %bb.0: # %entry
348; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
349; X86-NEXT:    testl %eax, %eax
350; X86-NEXT:    setns %cl
351; X86-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
352; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
353; X86-NEXT:    setge %al
354; X86-NEXT:    orb %cl, %al
355; X86-NEXT:    retl
356;
357; X64-LABEL: not_is_minus_finite_f:
358; X64:       # %bb.0: # %entry
359; X64-NEXT:    movd %xmm0, %eax
360; X64-NEXT:    testl %eax, %eax
361; X64-NEXT:    setns %cl
362; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
363; X64-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
364; X64-NEXT:    setge %al
365; X64-NEXT:    orb %cl, %al
366; X64-NEXT:    retq
367entry:
368  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 967)  ; ~0x38 = ~"-finite"
369  ret i1 %0
370}
371
372define i1 @isnormal_f(float %x) #1 {
373; X86-LABEL: isnormal_f:
374; X86:       # %bb.0: # %entry
375; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
376; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
377; X86-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
378; X86-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
379; X86-NEXT:    setb %al
380; X86-NEXT:    retl
381;
382; X64-LABEL: isnormal_f:
383; X64:       # %bb.0: # %entry
384; X64-NEXT:    movd %xmm0, %eax
385; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
386; X64-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
387; X64-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
388; X64-NEXT:    setb %al
389; X64-NEXT:    retq
390entry:
391  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 264)  ; 0x108 = "normal"
392  ret i1 %0
393}
394
395define i1 @not_isnormal_f(float %x) #1 {
396; X86-LABEL: not_isnormal_f:
397; X86:       # %bb.0: # %entry
398; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
399; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
400; X86-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
401; X86-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
402; X86-NEXT:    setae %al
403; X86-NEXT:    retl
404;
405; X64-LABEL: not_isnormal_f:
406; X64:       # %bb.0: # %entry
407; X64-NEXT:    movd %xmm0, %eax
408; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
409; X64-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
410; X64-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
411; X64-NEXT:    setae %al
412; X64-NEXT:    retq
413entry:
414  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 759)  ; ~0x108 = "~normal"
415  ret i1 %0
416}
417
418define i1 @is_plus_normal_f(float %x) {
419; X86-LABEL: is_plus_normal_f:
420; X86:       # %bb.0: # %entry
421; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
422; X86-NEXT:    testl %eax, %eax
423; X86-NEXT:    setns %cl
424; X86-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
425; X86-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
426; X86-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
427; X86-NEXT:    setb %al
428; X86-NEXT:    andb %cl, %al
429; X86-NEXT:    retl
430;
431; X64-LABEL: is_plus_normal_f:
432; X64:       # %bb.0: # %entry
433; X64-NEXT:    movd %xmm0, %eax
434; X64-NEXT:    testl %eax, %eax
435; X64-NEXT:    setns %cl
436; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
437; X64-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
438; X64-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
439; X64-NEXT:    setb %al
440; X64-NEXT:    andb %cl, %al
441; X64-NEXT:    retq
442entry:
443  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 256)  ; 0x100 = "+normal"
444  ret i1 %0
445}
446
447define i1 @issubnormal_f(float %x) {
448; X86-LABEL: issubnormal_f:
449; X86:       # %bb.0: # %entry
450; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
451; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
452; X86-NEXT:    decl %eax
453; X86-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
454; X86-NEXT:    setb %al
455; X86-NEXT:    retl
456;
457; X64-LABEL: issubnormal_f:
458; X64:       # %bb.0: # %entry
459; X64-NEXT:    movd %xmm0, %eax
460; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
461; X64-NEXT:    decl %eax
462; X64-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
463; X64-NEXT:    setb %al
464; X64-NEXT:    retq
465entry:
466  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 144)  ; 0x90 = "subnormal"
467  ret i1 %0
468}
469
470define i1 @issubnormal_f_daz(float %x) #0 {
471; X86-LABEL: issubnormal_f_daz:
472; X86:       # %bb.0: # %entry
473; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
474; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
475; X86-NEXT:    decl %eax
476; X86-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
477; X86-NEXT:    setb %al
478; X86-NEXT:    retl
479;
480; X64-LABEL: issubnormal_f_daz:
481; X64:       # %bb.0: # %entry
482; X64-NEXT:    movd %xmm0, %eax
483; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
484; X64-NEXT:    decl %eax
485; X64-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
486; X64-NEXT:    setb %al
487; X64-NEXT:    retq
488entry:
489  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 144)  ; 0x90 = "subnormal"
490  ret i1 %0
491}
492
493define i1 @issubnormal_f_maybe_daz(float %x) #1 {
494; X86-LABEL: issubnormal_f_maybe_daz:
495; X86:       # %bb.0: # %entry
496; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
497; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
498; X86-NEXT:    decl %eax
499; X86-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
500; X86-NEXT:    setb %al
501; X86-NEXT:    retl
502;
503; X64-LABEL: issubnormal_f_maybe_daz:
504; X64:       # %bb.0: # %entry
505; X64-NEXT:    movd %xmm0, %eax
506; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
507; X64-NEXT:    decl %eax
508; X64-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
509; X64-NEXT:    setb %al
510; X64-NEXT:    retq
511entry:
512  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 144)  ; 0x90 = "subnormal"
513  ret i1 %0
514}
515
516define i1 @not_issubnormal_f(float %x) {
517; X86-LABEL: not_issubnormal_f:
518; X86:       # %bb.0: # %entry
519; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
520; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
521; X86-NEXT:    decl %eax
522; X86-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
523; X86-NEXT:    setae %al
524; X86-NEXT:    retl
525;
526; X64-LABEL: not_issubnormal_f:
527; X64:       # %bb.0: # %entry
528; X64-NEXT:    movd %xmm0, %eax
529; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
530; X64-NEXT:    decl %eax
531; X64-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
532; X64-NEXT:    setae %al
533; X64-NEXT:    retq
534entry:
535  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 879)  ; ~0x90 = "~subnormal"
536  ret i1 %0
537}
538
539define i1 @not_issubnormal_f_daz(float %x) #0 {
540; X86-LABEL: not_issubnormal_f_daz:
541; X86:       # %bb.0: # %entry
542; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
543; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
544; X86-NEXT:    decl %eax
545; X86-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
546; X86-NEXT:    setae %al
547; X86-NEXT:    retl
548;
549; X64-LABEL: not_issubnormal_f_daz:
550; X64:       # %bb.0: # %entry
551; X64-NEXT:    movd %xmm0, %eax
552; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
553; X64-NEXT:    decl %eax
554; X64-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
555; X64-NEXT:    setae %al
556; X64-NEXT:    retq
557entry:
558  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 879)  ; ~0x90 = "~subnormal"
559  ret i1 %0
560}
561
562define i1 @not_issubnormal_f_maybe_daz(float %x) #1 {
563; X86-LABEL: not_issubnormal_f_maybe_daz:
564; X86:       # %bb.0: # %entry
565; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
566; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
567; X86-NEXT:    decl %eax
568; X86-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
569; X86-NEXT:    setae %al
570; X86-NEXT:    retl
571;
572; X64-LABEL: not_issubnormal_f_maybe_daz:
573; X64:       # %bb.0: # %entry
574; X64-NEXT:    movd %xmm0, %eax
575; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
576; X64-NEXT:    decl %eax
577; X64-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
578; X64-NEXT:    setae %al
579; X64-NEXT:    retq
580entry:
581  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 879)  ; ~0x90 = "~subnormal"
582  ret i1 %0
583}
584
585define i1 @is_plus_subnormal_f(float %x) {
586; X86-LABEL: is_plus_subnormal_f:
587; X86:       # %bb.0: # %entry
588; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
589; X86-NEXT:    decl %eax
590; X86-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
591; X86-NEXT:    setb %al
592; X86-NEXT:    retl
593;
594; X64-LABEL: is_plus_subnormal_f:
595; X64:       # %bb.0: # %entry
596; X64-NEXT:    movd %xmm0, %eax
597; X64-NEXT:    decl %eax
598; X64-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
599; X64-NEXT:    setb %al
600; X64-NEXT:    retq
601entry:
602  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 128)  ; 0x80 = "+subnormal"
603  ret i1 %0
604}
605
606define i1 @not_is_plus_subnormal_f(float %x) {
607; X86-LABEL: not_is_plus_subnormal_f:
608; X86:       # %bb.0: # %entry
609; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
610; X86-NEXT:    decl %eax
611; X86-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
612; X86-NEXT:    setae %al
613; X86-NEXT:    retl
614;
615; X64-LABEL: not_is_plus_subnormal_f:
616; X64:       # %bb.0: # %entry
617; X64-NEXT:    movd %xmm0, %eax
618; X64-NEXT:    decl %eax
619; X64-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
620; X64-NEXT:    setae %al
621; X64-NEXT:    retq
622entry:
623  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 895)  ; ~0x80 = ~"+subnormal"
624  ret i1 %0
625}
626
627define i1 @is_minus_subnormal_f(float %x) {
628; X86-LABEL: is_minus_subnormal_f:
629; X86:       # %bb.0: # %entry
630; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
631; X86-NEXT:    testl %eax, %eax
632; X86-NEXT:    sets %cl
633; X86-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
634; X86-NEXT:    decl %eax
635; X86-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
636; X86-NEXT:    setb %al
637; X86-NEXT:    andb %cl, %al
638; X86-NEXT:    retl
639;
640; X64-LABEL: is_minus_subnormal_f:
641; X64:       # %bb.0: # %entry
642; X64-NEXT:    movd %xmm0, %eax
643; X64-NEXT:    testl %eax, %eax
644; X64-NEXT:    sets %cl
645; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
646; X64-NEXT:    decl %eax
647; X64-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
648; X64-NEXT:    setb %al
649; X64-NEXT:    andb %cl, %al
650; X64-NEXT:    retq
651entry:
652  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 16)  ; 0x10 = "-subnormal"
653  ret i1 %0
654}
655
656define i1 @not_is_minus_subnormal_f(float %x) {
657; X86-LABEL: not_is_minus_subnormal_f:
658; X86:       # %bb.0: # %entry
659; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
660; X86-NEXT:    testl %eax, %eax
661; X86-NEXT:    setns %cl
662; X86-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
663; X86-NEXT:    decl %eax
664; X86-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
665; X86-NEXT:    setae %al
666; X86-NEXT:    orb %cl, %al
667; X86-NEXT:    retl
668;
669; X64-LABEL: not_is_minus_subnormal_f:
670; X64:       # %bb.0: # %entry
671; X64-NEXT:    movd %xmm0, %eax
672; X64-NEXT:    testl %eax, %eax
673; X64-NEXT:    setns %cl
674; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
675; X64-NEXT:    decl %eax
676; X64-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
677; X64-NEXT:    setae %al
678; X64-NEXT:    orb %cl, %al
679; X64-NEXT:    retq
680entry:
681  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1007)  ; ~0x10 = ~"-subnormal"
682  ret i1 %0
683}
684
685define i1 @iszero_f(float %x) {
686; X86-LABEL: iszero_f:
687; X86:       # %bb.0: # %entry
688; X86-NEXT:    testl $2147483647, {{[0-9]+}}(%esp) # imm = 0x7FFFFFFF
689; X86-NEXT:    sete %al
690; X86-NEXT:    retl
691;
692; X64-LABEL: iszero_f:
693; X64:       # %bb.0: # %entry
694; X64-NEXT:    movd %xmm0, %eax
695; X64-NEXT:    testl $2147483647, %eax # imm = 0x7FFFFFFF
696; X64-NEXT:    sete %al
697; X64-NEXT:    retq
698entry:
699  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 96)  ; 0x60 = "zero"
700  ret i1 %0
701}
702
703define i1 @iszero_f_daz(float %x) #0 {
704; X86-LABEL: iszero_f_daz:
705; X86:       # %bb.0: # %entry
706; X86-NEXT:    testl $2147483647, {{[0-9]+}}(%esp) # imm = 0x7FFFFFFF
707; X86-NEXT:    sete %al
708; X86-NEXT:    retl
709;
710; X64-LABEL: iszero_f_daz:
711; X64:       # %bb.0: # %entry
712; X64-NEXT:    movd %xmm0, %eax
713; X64-NEXT:    testl $2147483647, %eax # imm = 0x7FFFFFFF
714; X64-NEXT:    sete %al
715; X64-NEXT:    retq
716entry:
717  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 96)  ; 0x60 = "zero"
718  ret i1 %0
719}
720
721define i1 @iszero_f_maybe_daz(float %x) #1 {
722; X86-LABEL: iszero_f_maybe_daz:
723; X86:       # %bb.0: # %entry
724; X86-NEXT:    testl $2147483647, {{[0-9]+}}(%esp) # imm = 0x7FFFFFFF
725; X86-NEXT:    sete %al
726; X86-NEXT:    retl
727;
728; X64-LABEL: iszero_f_maybe_daz:
729; X64:       # %bb.0: # %entry
730; X64-NEXT:    movd %xmm0, %eax
731; X64-NEXT:    testl $2147483647, %eax # imm = 0x7FFFFFFF
732; X64-NEXT:    sete %al
733; X64-NEXT:    retq
734entry:
735  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 96)  ; 0x60 = "zero"
736  ret i1 %0
737}
738
739define i1 @not_iszero_f(float %x) {
740; X86-LABEL: not_iszero_f:
741; X86:       # %bb.0: # %entry
742; X86-NEXT:    testl $2147483647, {{[0-9]+}}(%esp) # imm = 0x7FFFFFFF
743; X86-NEXT:    setne %al
744; X86-NEXT:    retl
745;
746; X64-LABEL: not_iszero_f:
747; X64:       # %bb.0: # %entry
748; X64-NEXT:    movd %xmm0, %eax
749; X64-NEXT:    testl $2147483647, %eax # imm = 0x7FFFFFFF
750; X64-NEXT:    setne %al
751; X64-NEXT:    retq
752entry:
753  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 927)  ; ~0x60 = "~zero"
754  ret i1 %0
755}
756
757define i1 @not_iszero_f_daz(float %x) #0 {
758; X86-LABEL: not_iszero_f_daz:
759; X86:       # %bb.0: # %entry
760; X86-NEXT:    testl $2147483647, {{[0-9]+}}(%esp) # imm = 0x7FFFFFFF
761; X86-NEXT:    setne %al
762; X86-NEXT:    retl
763;
764; X64-LABEL: not_iszero_f_daz:
765; X64:       # %bb.0: # %entry
766; X64-NEXT:    movd %xmm0, %eax
767; X64-NEXT:    testl $2147483647, %eax # imm = 0x7FFFFFFF
768; X64-NEXT:    setne %al
769; X64-NEXT:    retq
770entry:
771  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 927)  ; ~0x60 = "~zero"
772  ret i1 %0
773}
774
775define i1 @not_iszero_f_maybe_daz(float %x) #1 {
776; X86-LABEL: not_iszero_f_maybe_daz:
777; X86:       # %bb.0: # %entry
778; X86-NEXT:    testl $2147483647, {{[0-9]+}}(%esp) # imm = 0x7FFFFFFF
779; X86-NEXT:    setne %al
780; X86-NEXT:    retl
781;
782; X64-LABEL: not_iszero_f_maybe_daz:
783; X64:       # %bb.0: # %entry
784; X64-NEXT:    movd %xmm0, %eax
785; X64-NEXT:    testl $2147483647, %eax # imm = 0x7FFFFFFF
786; X64-NEXT:    setne %al
787; X64-NEXT:    retq
788entry:
789  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 927)  ; ~0x60 = "~zero"
790  ret i1 %0
791}
792
793define i1 @issubnormal_or_zero_f(float %x) {
794; X86-LABEL: issubnormal_or_zero_f:
795; X86:       # %bb.0: # %entry
796; X86-NEXT:    testl $2139095040, {{[0-9]+}}(%esp) # imm = 0x7F800000
797; X86-NEXT:    sete %al
798; X86-NEXT:    retl
799;
800; X64-LABEL: issubnormal_or_zero_f:
801; X64:       # %bb.0: # %entry
802; X64-NEXT:    movd %xmm0, %eax
803; X64-NEXT:    testl $2139095040, %eax # imm = 0x7F800000
804; X64-NEXT:    sete %al
805; X64-NEXT:    retq
806entry:
807  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 240)  ; 0xf0 = "subnormal|zero"
808  ret i1 %0
809}
810
811define i1 @issubnormal_or_zero_f_daz(float %x) #0 {
812; X86-LABEL: issubnormal_or_zero_f_daz:
813; X86:       # %bb.0: # %entry
814; X86-NEXT:    testl $2139095040, {{[0-9]+}}(%esp) # imm = 0x7F800000
815; X86-NEXT:    sete %al
816; X86-NEXT:    retl
817;
818; X64-LABEL: issubnormal_or_zero_f_daz:
819; X64:       # %bb.0: # %entry
820; X64-NEXT:    movd %xmm0, %eax
821; X64-NEXT:    testl $2139095040, %eax # imm = 0x7F800000
822; X64-NEXT:    sete %al
823; X64-NEXT:    retq
824entry:
825  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 240)  ; 0xf0 = "subnormal|zero"
826  ret i1 %0
827}
828
829define i1 @issubnormal_or_zero_f_maybe_daz(float %x) #1 {
830; X86-LABEL: issubnormal_or_zero_f_maybe_daz:
831; X86:       # %bb.0: # %entry
832; X86-NEXT:    testl $2139095040, {{[0-9]+}}(%esp) # imm = 0x7F800000
833; X86-NEXT:    sete %al
834; X86-NEXT:    retl
835;
836; X64-LABEL: issubnormal_or_zero_f_maybe_daz:
837; X64:       # %bb.0: # %entry
838; X64-NEXT:    movd %xmm0, %eax
839; X64-NEXT:    testl $2139095040, %eax # imm = 0x7F800000
840; X64-NEXT:    sete %al
841; X64-NEXT:    retq
842entry:
843  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 240)  ; 0xf0 = "subnormal|zero"
844  ret i1 %0
845}
846
847define i1 @not_issubnormal_or_zero_f(float %x) {
848; X86-LABEL: not_issubnormal_or_zero_f:
849; X86:       # %bb.0: # %entry
850; X86-NEXT:    testl $2139095040, {{[0-9]+}}(%esp) # imm = 0x7F800000
851; X86-NEXT:    setne %al
852; X86-NEXT:    retl
853;
854; X64-LABEL: not_issubnormal_or_zero_f:
855; X64:       # %bb.0: # %entry
856; X64-NEXT:    movd %xmm0, %eax
857; X64-NEXT:    testl $2139095040, %eax # imm = 0x7F800000
858; X64-NEXT:    setne %al
859; X64-NEXT:    retq
860entry:
861  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 783)  ; ~0xf0 = "~(subnormal|zero)"
862  ret i1 %0
863}
864
865define i1 @not_issubnormal_or_zero_f_daz(float %x) #0 {
866; X86-LABEL: not_issubnormal_or_zero_f_daz:
867; X86:       # %bb.0: # %entry
868; X86-NEXT:    testl $2139095040, {{[0-9]+}}(%esp) # imm = 0x7F800000
869; X86-NEXT:    setne %al
870; X86-NEXT:    retl
871;
872; X64-LABEL: not_issubnormal_or_zero_f_daz:
873; X64:       # %bb.0: # %entry
874; X64-NEXT:    movd %xmm0, %eax
875; X64-NEXT:    testl $2139095040, %eax # imm = 0x7F800000
876; X64-NEXT:    setne %al
877; X64-NEXT:    retq
878entry:
879  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 783)  ; ~0xf0 = "~(subnormal|zero)"
880  ret i1 %0
881}
882
883define i1 @not_issubnormal_or_zero_f_maybe_daz(float %x) #1 {
884; X86-LABEL: not_issubnormal_or_zero_f_maybe_daz:
885; X86:       # %bb.0: # %entry
886; X86-NEXT:    testl $2139095040, {{[0-9]+}}(%esp) # imm = 0x7F800000
887; X86-NEXT:    setne %al
888; X86-NEXT:    retl
889;
890; X64-LABEL: not_issubnormal_or_zero_f_maybe_daz:
891; X64:       # %bb.0: # %entry
892; X64-NEXT:    movd %xmm0, %eax
893; X64-NEXT:    testl $2139095040, %eax # imm = 0x7F800000
894; X64-NEXT:    setne %al
895; X64-NEXT:    retq
896entry:
897  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 783)  ; ~0xf0 = "~(subnormal|zero)"
898  ret i1 %0
899}
900
901define i1 @is_plus_zero_f(float %x) {
902; X86-LABEL: is_plus_zero_f:
903; X86:       # %bb.0: # %entry
904; X86-NEXT:    cmpl $0, {{[0-9]+}}(%esp)
905; X86-NEXT:    sete %al
906; X86-NEXT:    retl
907;
908; X64-LABEL: is_plus_zero_f:
909; X64:       # %bb.0: # %entry
910; X64-NEXT:    movd %xmm0, %eax
911; X64-NEXT:    testl %eax, %eax
912; X64-NEXT:    sete %al
913; X64-NEXT:    retq
914entry:
915  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 64)  ; 0x40 = "+zero"
916  ret i1 %0
917}
918
919define i1 @not_is_plus_zero_f(float %x) {
920; X86-LABEL: not_is_plus_zero_f:
921; X86:       # %bb.0: # %entry
922; X86-NEXT:    cmpl $0, {{[0-9]+}}(%esp)
923; X86-NEXT:    setne %al
924; X86-NEXT:    retl
925;
926; X64-LABEL: not_is_plus_zero_f:
927; X64:       # %bb.0: # %entry
928; X64-NEXT:    movd %xmm0, %eax
929; X64-NEXT:    testl %eax, %eax
930; X64-NEXT:    setne %al
931; X64-NEXT:    retq
932entry:
933  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 959)  ; ~0x40 = ~"+zero"
934  ret i1 %0
935}
936
937define i1 @is_minus_zero_f(float %x) {
938; X86-LABEL: is_minus_zero_f:
939; X86:       # %bb.0: # %entry
940; X86-NEXT:    xorl %eax, %eax
941; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %eax
942; X86-NEXT:    seto %al
943; X86-NEXT:    retl
944;
945; X64-LABEL: is_minus_zero_f:
946; X64:       # %bb.0: # %entry
947; X64-NEXT:    movd %xmm0, %eax
948; X64-NEXT:    negl %eax
949; X64-NEXT:    seto %al
950; X64-NEXT:    retq
951entry:
952  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 32)  ; 0x20 = "-zero"
953  ret i1 %0
954}
955
956define i1 @not_is_minus_zero_f(float %x) {
957; X86-LABEL: not_is_minus_zero_f:
958; X86:       # %bb.0: # %entry
959; X86-NEXT:    xorl %eax, %eax
960; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %eax
961; X86-NEXT:    setno %al
962; X86-NEXT:    retl
963;
964; X64-LABEL: not_is_minus_zero_f:
965; X64:       # %bb.0: # %entry
966; X64-NEXT:    movd %xmm0, %eax
967; X64-NEXT:    negl %eax
968; X64-NEXT:    setno %al
969; X64-NEXT:    retq
970entry:
971  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 991)  ; ~0x20 = ~"-zero"
972  ret i1 %0
973}
974
975define i1 @isnan_f_strictfp(float %x) strictfp {
976; X86-LABEL: isnan_f_strictfp:
977; X86:       # %bb.0: # %entry
978; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
979; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
980; X86-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
981; X86-NEXT:    setge %al
982; X86-NEXT:    retl
983;
984; X64-LABEL: isnan_f_strictfp:
985; X64:       # %bb.0: # %entry
986; X64-NEXT:    movd %xmm0, %eax
987; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
988; X64-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
989; X64-NEXT:    setge %al
990; X64-NEXT:    retq
991entry:
992  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 3) strictfp ; "nan"
993  ret i1 %0
994}
995
996define i1 @not_isnan_f_strictfp(float %x) strictfp {
997; X86-LABEL: not_isnan_f_strictfp:
998; X86:       # %bb.0: # %entry
999; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1000; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1001; X86-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
1002; X86-NEXT:    setl %al
1003; X86-NEXT:    retl
1004;
1005; X64-LABEL: not_isnan_f_strictfp:
1006; X64:       # %bb.0: # %entry
1007; X64-NEXT:    movd %xmm0, %eax
1008; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
1009; X64-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
1010; X64-NEXT:    setl %al
1011; X64-NEXT:    retq
1012entry:
1013  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1020) strictfp ; ~"nan"
1014  ret i1 %0
1015}
1016
1017define i1 @isfinite_f_strictfp(float %x) strictfp {
1018; X86-LABEL: isfinite_f_strictfp:
1019; X86:       # %bb.0: # %entry
1020; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1021; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1022; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
1023; X86-NEXT:    setl %al
1024; X86-NEXT:    retl
1025;
1026; X64-LABEL: isfinite_f_strictfp:
1027; X64:       # %bb.0: # %entry
1028; X64-NEXT:    movd %xmm0, %eax
1029; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
1030; X64-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
1031; X64-NEXT:    setl %al
1032; X64-NEXT:    retq
1033entry:
1034  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 504) strictfp ; 0x1f8 = "finite"
1035  ret i1 %0
1036}
1037
1038define i1 @not_isfinite_f_strictfp(float %x) strictfp {
1039; X86-LABEL: not_isfinite_f_strictfp:
1040; X86:       # %bb.0: # %entry
1041; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1042; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1043; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
1044; X86-NEXT:    setge %al
1045; X86-NEXT:    retl
1046;
1047; X64-LABEL: not_isfinite_f_strictfp:
1048; X64:       # %bb.0: # %entry
1049; X64-NEXT:    movd %xmm0, %eax
1050; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
1051; X64-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
1052; X64-NEXT:    setge %al
1053; X64-NEXT:    retq
1054entry:
1055  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 519) strictfp ; ~0x1f8 = ~"finite"
1056  ret i1 %0
1057}
1058
1059define i1 @iszero_f_strictfp(float %x) strictfp {
1060; X86-LABEL: iszero_f_strictfp:
1061; X86:       # %bb.0: # %entry
1062; X86-NEXT:    testl $2147483647, {{[0-9]+}}(%esp) # imm = 0x7FFFFFFF
1063; X86-NEXT:    sete %al
1064; X86-NEXT:    retl
1065;
1066; X64-LABEL: iszero_f_strictfp:
1067; X64:       # %bb.0: # %entry
1068; X64-NEXT:    movd %xmm0, %eax
1069; X64-NEXT:    testl $2147483647, %eax # imm = 0x7FFFFFFF
1070; X64-NEXT:    sete %al
1071; X64-NEXT:    retq
1072entry:
1073  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 96) strictfp ; 0x60 = "zero"
1074  ret i1 %0
1075}
1076
1077define i1 @not_iszero_f_strictfp(float %x) strictfp {
1078; X86-LABEL: not_iszero_f_strictfp:
1079; X86:       # %bb.0: # %entry
1080; X86-NEXT:    testl $2147483647, {{[0-9]+}}(%esp) # imm = 0x7FFFFFFF
1081; X86-NEXT:    setne %al
1082; X86-NEXT:    retl
1083;
1084; X64-LABEL: not_iszero_f_strictfp:
1085; X64:       # %bb.0: # %entry
1086; X64-NEXT:    movd %xmm0, %eax
1087; X64-NEXT:    testl $2147483647, %eax # imm = 0x7FFFFFFF
1088; X64-NEXT:    setne %al
1089; X64-NEXT:    retq
1090entry:
1091  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 927) strictfp ; ~0x60 = ~"zero"
1092  ret i1 %0
1093}
1094
1095define i1 @isnan_d(double %x) {
1096; X86-LABEL: isnan_d:
1097; X86:       # %bb.0: # %entry
1098; X86-NEXT:    fldl {{[0-9]+}}(%esp)
1099; X86-NEXT:    fucomp %st(0)
1100; X86-NEXT:    fnstsw %ax
1101; X86-NEXT:    # kill: def $ah killed $ah killed $ax
1102; X86-NEXT:    sahf
1103; X86-NEXT:    setp %al
1104; X86-NEXT:    retl
1105;
1106; X64-LABEL: isnan_d:
1107; X64:       # %bb.0: # %entry
1108; X64-NEXT:    ucomisd %xmm0, %xmm0
1109; X64-NEXT:    setp %al
1110; X64-NEXT:    retq
1111entry:
1112  %0 = tail call i1 @llvm.is.fpclass.f64(double %x, i32 3)  ; "nan"
1113  ret i1 %0
1114}
1115
1116define i1 @isinf_d(double %x) {
1117; X86-LABEL: isinf_d:
1118; X86:       # %bb.0: # %entry
1119; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1120; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1121; X86-NEXT:    xorl $2146435072, %eax # imm = 0x7FF00000
1122; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax
1123; X86-NEXT:    sete %al
1124; X86-NEXT:    retl
1125;
1126; X64-GENERIC-LABEL: isinf_d:
1127; X64-GENERIC:       # %bb.0: # %entry
1128; X64-GENERIC-NEXT:    movq %xmm0, %rax
1129; X64-GENERIC-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
1130; X64-GENERIC-NEXT:    andq %rax, %rcx
1131; X64-GENERIC-NEXT:    movabsq $9218868437227405312, %rax # imm = 0x7FF0000000000000
1132; X64-GENERIC-NEXT:    cmpq %rax, %rcx
1133; X64-GENERIC-NEXT:    sete %al
1134; X64-GENERIC-NEXT:    retq
1135;
1136; X64-NDD-LABEL: isinf_d:
1137; X64-NDD:       # %bb.0: # %entry
1138; X64-NDD-NEXT:    movq %xmm0, %rax
1139; X64-NDD-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
1140; X64-NDD-NEXT:    andq %rcx, %rax
1141; X64-NDD-NEXT:    movabsq $9218868437227405312, %rcx # imm = 0x7FF0000000000000
1142; X64-NDD-NEXT:    cmpq %rcx, %rax
1143; X64-NDD-NEXT:    sete %al
1144; X64-NDD-NEXT:    retq
1145entry:
1146  %0 = tail call i1 @llvm.is.fpclass.f64(double %x, i32 516)  ; 0x204 = "inf"
1147  ret i1 %0
1148}
1149
1150define i1 @isfinite_d(double %x) {
1151; X86-LABEL: isfinite_d:
1152; X86:       # %bb.0: # %entry
1153; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1154; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1155; X86-NEXT:    cmpl $2146435072, %eax # imm = 0x7FF00000
1156; X86-NEXT:    setl %al
1157; X86-NEXT:    retl
1158;
1159; X64-GENERIC-LABEL: isfinite_d:
1160; X64-GENERIC:       # %bb.0: # %entry
1161; X64-GENERIC-NEXT:    movq %xmm0, %rax
1162; X64-GENERIC-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
1163; X64-GENERIC-NEXT:    andq %rax, %rcx
1164; X64-GENERIC-NEXT:    movabsq $9218868437227405312, %rax # imm = 0x7FF0000000000000
1165; X64-GENERIC-NEXT:    cmpq %rax, %rcx
1166; X64-GENERIC-NEXT:    setl %al
1167; X64-GENERIC-NEXT:    retq
1168;
1169; X64-NDD-LABEL: isfinite_d:
1170; X64-NDD:       # %bb.0: # %entry
1171; X64-NDD-NEXT:    movq %xmm0, %rax
1172; X64-NDD-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
1173; X64-NDD-NEXT:    andq %rcx, %rax
1174; X64-NDD-NEXT:    movabsq $9218868437227405312, %rcx # imm = 0x7FF0000000000000
1175; X64-NDD-NEXT:    cmpq %rcx, %rax
1176; X64-NDD-NEXT:    setl %al
1177; X64-NDD-NEXT:    retq
1178entry:
1179  %0 = tail call i1 @llvm.is.fpclass.f64(double %x, i32 504)  ; 0x1f8 = "finite"
1180  ret i1 %0
1181}
1182
1183define i1 @isnormal_d(double %x) {
1184; X86-LABEL: isnormal_d:
1185; X86:       # %bb.0: # %entry
1186; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1187; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1188; X86-NEXT:    addl $-1048576, %eax # imm = 0xFFF00000
1189; X86-NEXT:    shrl $21, %eax
1190; X86-NEXT:    cmpl $1023, %eax # imm = 0x3FF
1191; X86-NEXT:    setb %al
1192; X86-NEXT:    retl
1193;
1194; X64-GENERIC-LABEL: isnormal_d:
1195; X64-GENERIC:       # %bb.0: # %entry
1196; X64-GENERIC-NEXT:    movq %xmm0, %rax
1197; X64-GENERIC-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
1198; X64-GENERIC-NEXT:    andq %rax, %rcx
1199; X64-GENERIC-NEXT:    movabsq $-4503599627370496, %rax # imm = 0xFFF0000000000000
1200; X64-GENERIC-NEXT:    addq %rcx, %rax
1201; X64-GENERIC-NEXT:    shrq $53, %rax
1202; X64-GENERIC-NEXT:    cmpl $1023, %eax # imm = 0x3FF
1203; X64-GENERIC-NEXT:    setb %al
1204; X64-GENERIC-NEXT:    retq
1205;
1206; X64-NDD-LABEL: isnormal_d:
1207; X64-NDD:       # %bb.0: # %entry
1208; X64-NDD-NEXT:    movq %xmm0, %rax
1209; X64-NDD-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
1210; X64-NDD-NEXT:    andq %rcx, %rax
1211; X64-NDD-NEXT:    movabsq $-4503599627370496, %rcx # imm = 0xFFF0000000000000
1212; X64-NDD-NEXT:    addq %rcx, %rax
1213; X64-NDD-NEXT:    shrq $53, %rax
1214; X64-NDD-NEXT:    cmpl $1023, %eax # imm = 0x3FF
1215; X64-NDD-NEXT:    setb %al
1216; X64-NDD-NEXT:    retq
1217entry:
1218  %0 = tail call i1 @llvm.is.fpclass.f64(double %x, i32 264)  ; 0x108 = "normal"
1219  ret i1 %0
1220}
1221
1222define i1 @issubnormal_d(double %x) {
1223; X86-LABEL: issubnormal_d:
1224; X86:       # %bb.0: # %entry
1225; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1226; X86-NEXT:    movl $2147483647, %ecx # imm = 0x7FFFFFFF
1227; X86-NEXT:    andl {{[0-9]+}}(%esp), %ecx
1228; X86-NEXT:    addl $-1, %eax
1229; X86-NEXT:    adcl $-1, %ecx
1230; X86-NEXT:    cmpl $-1, %eax
1231; X86-NEXT:    sbbl $1048575, %ecx # imm = 0xFFFFF
1232; X86-NEXT:    setb %al
1233; X86-NEXT:    retl
1234;
1235; X64-GENERIC-LABEL: issubnormal_d:
1236; X64-GENERIC:       # %bb.0: # %entry
1237; X64-GENERIC-NEXT:    movq %xmm0, %rax
1238; X64-GENERIC-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
1239; X64-GENERIC-NEXT:    andq %rax, %rcx
1240; X64-GENERIC-NEXT:    decq %rcx
1241; X64-GENERIC-NEXT:    movabsq $4503599627370495, %rax # imm = 0xFFFFFFFFFFFFF
1242; X64-GENERIC-NEXT:    cmpq %rax, %rcx
1243; X64-GENERIC-NEXT:    setb %al
1244; X64-GENERIC-NEXT:    retq
1245;
1246; X64-NDD-LABEL: issubnormal_d:
1247; X64-NDD:       # %bb.0: # %entry
1248; X64-NDD-NEXT:    movq %xmm0, %rax
1249; X64-NDD-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
1250; X64-NDD-NEXT:    andq %rcx, %rax
1251; X64-NDD-NEXT:    decq %rax
1252; X64-NDD-NEXT:    movabsq $4503599627370495, %rcx # imm = 0xFFFFFFFFFFFFF
1253; X64-NDD-NEXT:    cmpq %rcx, %rax
1254; X64-NDD-NEXT:    setb %al
1255; X64-NDD-NEXT:    retq
1256entry:
1257  %0 = tail call i1 @llvm.is.fpclass.f64(double %x, i32 144)  ; 0x90 = "subnormal"
1258  ret i1 %0
1259}
1260
1261define i1 @iszero_d(double %x) {
1262; X86-LABEL: iszero_d:
1263; X86:       # %bb.0: # %entry
1264; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1265; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1266; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax
1267; X86-NEXT:    sete %al
1268; X86-NEXT:    retl
1269;
1270; X64-LABEL: iszero_d:
1271; X64:       # %bb.0: # %entry
1272; X64-NEXT:    movq %xmm0, %rax
1273; X64-NEXT:    shlq %rax
1274; X64-NEXT:    testq %rax, %rax
1275; X64-NEXT:    sete %al
1276; X64-NEXT:    retq
1277entry:
1278  %0 = tail call i1 @llvm.is.fpclass.f64(double %x, i32 96)  ; 0x60 = "zero"
1279  ret i1 %0
1280}
1281
1282define i1 @issignaling_d(double %x) {
1283; X86-LABEL: issignaling_d:
1284; X86:       # %bb.0: # %entry
1285; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1286; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1287; X86-NEXT:    xorl %ecx, %ecx
1288; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %ecx
1289; X86-NEXT:    movl $2146435072, %ecx # imm = 0x7FF00000
1290; X86-NEXT:    sbbl %eax, %ecx
1291; X86-NEXT:    setl %cl
1292; X86-NEXT:    cmpl $2146959360, %eax # imm = 0x7FF80000
1293; X86-NEXT:    setl %al
1294; X86-NEXT:    andb %cl, %al
1295; X86-NEXT:    retl
1296;
1297; X64-GENERIC-LABEL: issignaling_d:
1298; X64-GENERIC:       # %bb.0: # %entry
1299; X64-GENERIC-NEXT:    movq %xmm0, %rax
1300; X64-GENERIC-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
1301; X64-GENERIC-NEXT:    andq %rax, %rcx
1302; X64-GENERIC-NEXT:    movabsq $9221120237041090560, %rax # imm = 0x7FF8000000000000
1303; X64-GENERIC-NEXT:    cmpq %rax, %rcx
1304; X64-GENERIC-NEXT:    setl %dl
1305; X64-GENERIC-NEXT:    movabsq $9218868437227405312, %rax # imm = 0x7FF0000000000000
1306; X64-GENERIC-NEXT:    cmpq %rax, %rcx
1307; X64-GENERIC-NEXT:    setg %al
1308; X64-GENERIC-NEXT:    andb %dl, %al
1309; X64-GENERIC-NEXT:    retq
1310;
1311; X64-NDD-LABEL: issignaling_d:
1312; X64-NDD:       # %bb.0: # %entry
1313; X64-NDD-NEXT:    movq %xmm0, %rax
1314; X64-NDD-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
1315; X64-NDD-NEXT:    andq %rcx, %rax
1316; X64-NDD-NEXT:    movabsq $9221120237041090560, %rcx # imm = 0x7FF8000000000000
1317; X64-NDD-NEXT:    cmpq %rcx, %rax
1318; X64-NDD-NEXT:    setl %cl
1319; X64-NDD-NEXT:    movabsq $9218868437227405312, %rdx # imm = 0x7FF0000000000000
1320; X64-NDD-NEXT:    cmpq %rdx, %rax
1321; X64-NDD-NEXT:    setg %al
1322; X64-NDD-NEXT:    andb %cl, %al
1323; X64-NDD-NEXT:    retq
1324entry:
1325  %0 = tail call i1 @llvm.is.fpclass.f64(double %x, i32 1)  ; "snan"
1326  ret i1 %0
1327}
1328
1329define i1 @isquiet_d(double %x) {
1330; X86-LABEL: isquiet_d:
1331; X86:       # %bb.0: # %entry
1332; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1333; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1334; X86-NEXT:    cmpl $2146959360, %eax # imm = 0x7FF80000
1335; X86-NEXT:    setge %al
1336; X86-NEXT:    retl
1337;
1338; X64-GENERIC-LABEL: isquiet_d:
1339; X64-GENERIC:       # %bb.0: # %entry
1340; X64-GENERIC-NEXT:    movq %xmm0, %rax
1341; X64-GENERIC-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
1342; X64-GENERIC-NEXT:    andq %rax, %rcx
1343; X64-GENERIC-NEXT:    movabsq $9221120237041090559, %rax # imm = 0x7FF7FFFFFFFFFFFF
1344; X64-GENERIC-NEXT:    cmpq %rax, %rcx
1345; X64-GENERIC-NEXT:    setg %al
1346; X64-GENERIC-NEXT:    retq
1347;
1348; X64-NDD-LABEL: isquiet_d:
1349; X64-NDD:       # %bb.0: # %entry
1350; X64-NDD-NEXT:    movq %xmm0, %rax
1351; X64-NDD-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
1352; X64-NDD-NEXT:    andq %rcx, %rax
1353; X64-NDD-NEXT:    movabsq $9221120237041090559, %rcx # imm = 0x7FF7FFFFFFFFFFFF
1354; X64-NDD-NEXT:    cmpq %rcx, %rax
1355; X64-NDD-NEXT:    setg %al
1356; X64-NDD-NEXT:    retq
1357entry:
1358  %0 = tail call i1 @llvm.is.fpclass.f64(double %x, i32 2)  ; "qnan"
1359  ret i1 %0
1360}
1361
1362define i1 @isnan_d_strictfp(double %x) strictfp {
1363; X86-LABEL: isnan_d_strictfp:
1364; X86:       # %bb.0: # %entry
1365; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1366; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1367; X86-NEXT:    xorl %ecx, %ecx
1368; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %ecx
1369; X86-NEXT:    movl $2146435072, %ecx # imm = 0x7FF00000
1370; X86-NEXT:    sbbl %eax, %ecx
1371; X86-NEXT:    setl %al
1372; X86-NEXT:    retl
1373;
1374; X64-GENERIC-LABEL: isnan_d_strictfp:
1375; X64-GENERIC:       # %bb.0: # %entry
1376; X64-GENERIC-NEXT:    movq %xmm0, %rax
1377; X64-GENERIC-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
1378; X64-GENERIC-NEXT:    andq %rax, %rcx
1379; X64-GENERIC-NEXT:    movabsq $9218868437227405312, %rax # imm = 0x7FF0000000000000
1380; X64-GENERIC-NEXT:    cmpq %rax, %rcx
1381; X64-GENERIC-NEXT:    setg %al
1382; X64-GENERIC-NEXT:    retq
1383;
1384; X64-NDD-LABEL: isnan_d_strictfp:
1385; X64-NDD:       # %bb.0: # %entry
1386; X64-NDD-NEXT:    movq %xmm0, %rax
1387; X64-NDD-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
1388; X64-NDD-NEXT:    andq %rcx, %rax
1389; X64-NDD-NEXT:    movabsq $9218868437227405312, %rcx # imm = 0x7FF0000000000000
1390; X64-NDD-NEXT:    cmpq %rcx, %rax
1391; X64-NDD-NEXT:    setg %al
1392; X64-NDD-NEXT:    retq
1393entry:
1394  %0 = tail call i1 @llvm.is.fpclass.f64(double %x, i32 3) strictfp ; "nan"
1395  ret i1 %0
1396}
1397
1398define i1 @iszero_d_strictfp(double %x) strictfp {
1399; X86-LABEL: iszero_d_strictfp:
1400; X86:       # %bb.0: # %entry
1401; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1402; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1403; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax
1404; X86-NEXT:    sete %al
1405; X86-NEXT:    retl
1406;
1407; X64-LABEL: iszero_d_strictfp:
1408; X64:       # %bb.0: # %entry
1409; X64-NEXT:    movq %xmm0, %rax
1410; X64-NEXT:    shlq %rax
1411; X64-NEXT:    testq %rax, %rax
1412; X64-NEXT:    sete %al
1413; X64-NEXT:    retq
1414entry:
1415  %0 = tail call i1 @llvm.is.fpclass.f64(double %x, i32 96) strictfp ; 0x60 = "zero"
1416  ret i1 %0
1417}
1418
1419
1420
1421define <1 x i1> @isnan_v1f(<1 x float> %x) {
1422; X86-LABEL: isnan_v1f:
1423; X86:       # %bb.0: # %entry
1424; X86-NEXT:    flds {{[0-9]+}}(%esp)
1425; X86-NEXT:    fucomp %st(0)
1426; X86-NEXT:    fnstsw %ax
1427; X86-NEXT:    # kill: def $ah killed $ah killed $ax
1428; X86-NEXT:    sahf
1429; X86-NEXT:    setp %al
1430; X86-NEXT:    retl
1431;
1432; X64-LABEL: isnan_v1f:
1433; X64:       # %bb.0: # %entry
1434; X64-NEXT:    ucomiss %xmm0, %xmm0
1435; X64-NEXT:    setp %al
1436; X64-NEXT:    retq
1437entry:
1438  %0 = tail call <1 x i1> @llvm.is.fpclass.v1f32(<1 x float> %x, i32 3)  ; "nan"
1439  ret <1 x i1> %0
1440}
1441
1442define <1 x i1> @isnan_v1f_strictfp(<1 x float> %x) strictfp {
1443; X86-LABEL: isnan_v1f_strictfp:
1444; X86:       # %bb.0: # %entry
1445; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1446; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1447; X86-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
1448; X86-NEXT:    setge %al
1449; X86-NEXT:    retl
1450;
1451; X64-LABEL: isnan_v1f_strictfp:
1452; X64:       # %bb.0: # %entry
1453; X64-NEXT:    movd %xmm0, %eax
1454; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
1455; X64-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
1456; X64-NEXT:    setge %al
1457; X64-NEXT:    retq
1458entry:
1459  %0 = tail call <1 x i1> @llvm.is.fpclass.v1f32(<1 x float> %x, i32 3) strictfp ; "nan"
1460  ret <1 x i1> %0
1461}
1462
1463define <2 x i1> @isnan_v2f(<2 x float> %x) {
1464; X86-LABEL: isnan_v2f:
1465; X86:       # %bb.0: # %entry
1466; X86-NEXT:    flds {{[0-9]+}}(%esp)
1467; X86-NEXT:    flds {{[0-9]+}}(%esp)
1468; X86-NEXT:    fucomp %st(0)
1469; X86-NEXT:    fnstsw %ax
1470; X86-NEXT:    # kill: def $ah killed $ah killed $ax
1471; X86-NEXT:    sahf
1472; X86-NEXT:    setp %cl
1473; X86-NEXT:    fucomp %st(0)
1474; X86-NEXT:    fnstsw %ax
1475; X86-NEXT:    # kill: def $ah killed $ah killed $ax
1476; X86-NEXT:    sahf
1477; X86-NEXT:    setp %dl
1478; X86-NEXT:    movl %ecx, %eax
1479; X86-NEXT:    retl
1480;
1481; X64-LABEL: isnan_v2f:
1482; X64:       # %bb.0: # %entry
1483; X64-NEXT:    cmpunordps %xmm0, %xmm0
1484; X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1,1,3]
1485; X64-NEXT:    retq
1486entry:
1487  %0 = tail call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> %x, i32 3)  ; "nan"
1488  ret <2 x i1> %0
1489}
1490
1491
1492define <2 x i1> @isnot_nan_v2f(<2 x float> %x) {
1493; X86-LABEL: isnot_nan_v2f:
1494; X86:       # %bb.0: # %entry
1495; X86-NEXT:    flds {{[0-9]+}}(%esp)
1496; X86-NEXT:    flds {{[0-9]+}}(%esp)
1497; X86-NEXT:    fucomp %st(0)
1498; X86-NEXT:    fnstsw %ax
1499; X86-NEXT:    # kill: def $ah killed $ah killed $ax
1500; X86-NEXT:    sahf
1501; X86-NEXT:    setnp %cl
1502; X86-NEXT:    fucomp %st(0)
1503; X86-NEXT:    fnstsw %ax
1504; X86-NEXT:    # kill: def $ah killed $ah killed $ax
1505; X86-NEXT:    sahf
1506; X86-NEXT:    setnp %dl
1507; X86-NEXT:    movl %ecx, %eax
1508; X86-NEXT:    retl
1509;
1510; X64-LABEL: isnot_nan_v2f:
1511; X64:       # %bb.0: # %entry
1512; X64-NEXT:    cmpordps %xmm0, %xmm0
1513; X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1,1,3]
1514; X64-NEXT:    retq
1515entry:
1516  %0 = tail call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> %x, i32 1020)  ; 0x3fc = "zero|subnormal|normal|inf"
1517  ret <2 x i1> %0
1518}
1519
1520define <2 x i1> @isnan_v2f_strictfp(<2 x float> %x) strictfp {
1521; X86-LABEL: isnan_v2f_strictfp:
1522; X86:       # %bb.0: # %entry
1523; X86-NEXT:    movl $2147483647, %ecx # imm = 0x7FFFFFFF
1524; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1525; X86-NEXT:    andl %ecx, %eax
1526; X86-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
1527; X86-NEXT:    setge %al
1528; X86-NEXT:    andl {{[0-9]+}}(%esp), %ecx
1529; X86-NEXT:    cmpl $2139095041, %ecx # imm = 0x7F800001
1530; X86-NEXT:    setge %dl
1531; X86-NEXT:    retl
1532;
1533; X64-LABEL: isnan_v2f_strictfp:
1534; X64:       # %bb.0: # %entry
1535; X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1,1,3]
1536; X64-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1537; X64-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1538; X64-NEXT:    retq
1539entry:
1540  %0 = tail call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> %x, i32 3) strictfp ; "nan"
1541  ret <2 x i1> %0
1542}
1543
1544define <4 x i1> @isnan_v4f(<4 x float> %x) {
1545; X86-LABEL: isnan_v4f:
1546; X86:       # %bb.0: # %entry
1547; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1548; X86-NEXT:    flds {{[0-9]+}}(%esp)
1549; X86-NEXT:    flds {{[0-9]+}}(%esp)
1550; X86-NEXT:    flds {{[0-9]+}}(%esp)
1551; X86-NEXT:    flds {{[0-9]+}}(%esp)
1552; X86-NEXT:    fucomp %st(0)
1553; X86-NEXT:    fnstsw %ax
1554; X86-NEXT:    # kill: def $ah killed $ah killed $ax
1555; X86-NEXT:    sahf
1556; X86-NEXT:    setp %dh
1557; X86-NEXT:    shlb $2, %dh
1558; X86-NEXT:    fucomp %st(0)
1559; X86-NEXT:    fnstsw %ax
1560; X86-NEXT:    # kill: def $ah killed $ah killed $ax
1561; X86-NEXT:    sahf
1562; X86-NEXT:    setp %dl
1563; X86-NEXT:    shlb $3, %dl
1564; X86-NEXT:    orb %dh, %dl
1565; X86-NEXT:    fucomp %st(0)
1566; X86-NEXT:    fnstsw %ax
1567; X86-NEXT:    # kill: def $ah killed $ah killed $ax
1568; X86-NEXT:    sahf
1569; X86-NEXT:    setp %dh
1570; X86-NEXT:    fucomp %st(0)
1571; X86-NEXT:    fnstsw %ax
1572; X86-NEXT:    # kill: def $ah killed $ah killed $ax
1573; X86-NEXT:    sahf
1574; X86-NEXT:    setp %al
1575; X86-NEXT:    addb %al, %al
1576; X86-NEXT:    orb %dh, %al
1577; X86-NEXT:    orb %dl, %al
1578; X86-NEXT:    movb %al, (%ecx)
1579; X86-NEXT:    movl %ecx, %eax
1580; X86-NEXT:    retl $4
1581;
1582; X64-LABEL: isnan_v4f:
1583; X64:       # %bb.0: # %entry
1584; X64-NEXT:    cmpunordps %xmm0, %xmm0
1585; X64-NEXT:    retq
1586entry:
1587  %0 = tail call <4 x i1> @llvm.is.fpclass.v4f32(<4 x float> %x, i32 3)  ; "nan"
1588  ret <4 x i1> %0
1589}
1590
1591define <4 x i1> @isnan_v4f_strictfp(<4 x float> %x) strictfp {
1592; X86-LABEL: isnan_v4f_strictfp:
1593; X86:       # %bb.0: # %entry
1594; X86-NEXT:    pushl %esi
1595; X86-NEXT:    .cfi_def_cfa_offset 8
1596; X86-NEXT:    .cfi_offset %esi, -8
1597; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1598; X86-NEXT:    movl $2147483647, %ecx # imm = 0x7FFFFFFF
1599; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
1600; X86-NEXT:    andl %ecx, %edx
1601; X86-NEXT:    cmpl $2139095041, %edx # imm = 0x7F800001
1602; X86-NEXT:    setge %dh
1603; X86-NEXT:    shlb $2, %dh
1604; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
1605; X86-NEXT:    andl %ecx, %esi
1606; X86-NEXT:    cmpl $2139095041, %esi # imm = 0x7F800001
1607; X86-NEXT:    setge %dl
1608; X86-NEXT:    shlb $3, %dl
1609; X86-NEXT:    orb %dh, %dl
1610; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
1611; X86-NEXT:    andl %ecx, %esi
1612; X86-NEXT:    cmpl $2139095041, %esi # imm = 0x7F800001
1613; X86-NEXT:    setge %dh
1614; X86-NEXT:    andl {{[0-9]+}}(%esp), %ecx
1615; X86-NEXT:    cmpl $2139095041, %ecx # imm = 0x7F800001
1616; X86-NEXT:    setge %cl
1617; X86-NEXT:    addb %cl, %cl
1618; X86-NEXT:    orb %dh, %cl
1619; X86-NEXT:    orb %dl, %cl
1620; X86-NEXT:    movb %cl, (%eax)
1621; X86-NEXT:    popl %esi
1622; X86-NEXT:    .cfi_def_cfa_offset 4
1623; X86-NEXT:    retl $4
1624;
1625; X64-LABEL: isnan_v4f_strictfp:
1626; X64:       # %bb.0: # %entry
1627; X64-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1628; X64-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1629; X64-NEXT:    retq
1630entry:
1631  %0 = tail call <4 x i1> @llvm.is.fpclass.v4f32(<4 x float> %x, i32 3) strictfp ; "nan"
1632  ret <4 x i1> %0
1633}
1634
1635define i1 @isnone_f(float %x) {
1636; X86-LABEL: isnone_f:
1637; X86:       # %bb.0: # %entry
1638; X86-NEXT:    xorl %eax, %eax
1639; X86-NEXT:    retl
1640;
1641; X64-LABEL: isnone_f:
1642; X64:       # %bb.0: # %entry
1643; X64-NEXT:    xorl %eax, %eax
1644; X64-NEXT:    retq
1645entry:
1646  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 0)
1647  ret i1 %0
1648}
1649
1650define i1 @isany_f(float %x) {
1651; X86-LABEL: isany_f:
1652; X86:       # %bb.0: # %entry
1653; X86-NEXT:    movb $1, %al
1654; X86-NEXT:    retl
1655;
1656; X64-LABEL: isany_f:
1657; X64:       # %bb.0: # %entry
1658; X64-NEXT:    movb $1, %al
1659; X64-NEXT:    retq
1660entry:
1661  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1023)
1662  ret i1 %0
1663}
1664
1665
1666define i1 @iszero_or_nan_f(float %x) {
1667; X86-LABEL: iszero_or_nan_f:
1668; X86:       # %bb.0: # %entry
1669; X86-NEXT:    flds {{[0-9]+}}(%esp)
1670; X86-NEXT:    fldz
1671; X86-NEXT:    fucompp
1672; X86-NEXT:    fnstsw %ax
1673; X86-NEXT:    # kill: def $ah killed $ah killed $ax
1674; X86-NEXT:    sahf
1675; X86-NEXT:    sete %al
1676; X86-NEXT:    retl
1677;
1678; X64-LABEL: iszero_or_nan_f:
1679; X64:       # %bb.0: # %entry
1680; X64-NEXT:    xorps %xmm1, %xmm1
1681; X64-NEXT:    ucomiss %xmm1, %xmm0
1682; X64-NEXT:    sete %al
1683; X64-NEXT:    retq
1684entry:
1685  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 99)  ; 0x60|0x3 = "zero|nan"
1686  ret i1 %0
1687}
1688
1689define i1 @iszero_or_nan_f_daz(float %x) #0 {
1690; X86-LABEL: iszero_or_nan_f_daz:
1691; X86:       # %bb.0: # %entry
1692; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1693; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1694; X86-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
1695; X86-NEXT:    setge %cl
1696; X86-NEXT:    testl %eax, %eax
1697; X86-NEXT:    sete %al
1698; X86-NEXT:    orb %cl, %al
1699; X86-NEXT:    retl
1700;
1701; X64-LABEL: iszero_or_nan_f_daz:
1702; X64:       # %bb.0: # %entry
1703; X64-NEXT:    movd %xmm0, %eax
1704; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
1705; X64-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
1706; X64-NEXT:    setge %cl
1707; X64-NEXT:    testl %eax, %eax
1708; X64-NEXT:    sete %al
1709; X64-NEXT:    orb %cl, %al
1710; X64-NEXT:    retq
1711entry:
1712  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 99)  ; 0x60|0x3 = "zero|nan"
1713  ret i1 %0
1714}
1715
1716define i1 @iszero_or_nan_f_maybe_daz(float %x) #1 {
1717; X86-LABEL: iszero_or_nan_f_maybe_daz:
1718; X86:       # %bb.0: # %entry
1719; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1720; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1721; X86-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
1722; X86-NEXT:    setge %cl
1723; X86-NEXT:    testl %eax, %eax
1724; X86-NEXT:    sete %al
1725; X86-NEXT:    orb %cl, %al
1726; X86-NEXT:    retl
1727;
1728; X64-LABEL: iszero_or_nan_f_maybe_daz:
1729; X64:       # %bb.0: # %entry
1730; X64-NEXT:    movd %xmm0, %eax
1731; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
1732; X64-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
1733; X64-NEXT:    setge %cl
1734; X64-NEXT:    testl %eax, %eax
1735; X64-NEXT:    sete %al
1736; X64-NEXT:    orb %cl, %al
1737; X64-NEXT:    retq
1738entry:
1739  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 99)  ; 0x60|0x3 = "zero|nan"
1740  ret i1 %0
1741}
1742
1743define i1 @not_iszero_or_nan_f(float %x) {
1744; X86-LABEL: not_iszero_or_nan_f:
1745; X86:       # %bb.0: # %entry
1746; X86-NEXT:    flds {{[0-9]+}}(%esp)
1747; X86-NEXT:    fldz
1748; X86-NEXT:    fucompp
1749; X86-NEXT:    fnstsw %ax
1750; X86-NEXT:    # kill: def $ah killed $ah killed $ax
1751; X86-NEXT:    sahf
1752; X86-NEXT:    setne %al
1753; X86-NEXT:    retl
1754;
1755; X64-LABEL: not_iszero_or_nan_f:
1756; X64:       # %bb.0: # %entry
1757; X64-NEXT:    xorps %xmm1, %xmm1
1758; X64-NEXT:    ucomiss %xmm1, %xmm0
1759; X64-NEXT:    setne %al
1760; X64-NEXT:    retq
1761entry:
1762  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 924)  ; ~0x60 = "~(zero|nan)"
1763  ret i1 %0
1764}
1765
1766define i1 @not_iszero_or_nan_f_daz(float %x) #0 {
1767; X86-LABEL: not_iszero_or_nan_f_daz:
1768; X86:       # %bb.0: # %entry
1769; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1770; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1771; X86-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
1772; X86-NEXT:    setl %cl
1773; X86-NEXT:    testl %eax, %eax
1774; X86-NEXT:    setne %al
1775; X86-NEXT:    andb %cl, %al
1776; X86-NEXT:    retl
1777;
1778; X64-LABEL: not_iszero_or_nan_f_daz:
1779; X64:       # %bb.0: # %entry
1780; X64-NEXT:    movd %xmm0, %eax
1781; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
1782; X64-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
1783; X64-NEXT:    setl %cl
1784; X64-NEXT:    testl %eax, %eax
1785; X64-NEXT:    setne %al
1786; X64-NEXT:    andb %cl, %al
1787; X64-NEXT:    retq
1788entry:
1789  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 924)  ; ~(0x60|0x3) = "~(zero|nan)"
1790  ret i1 %0
1791}
1792
1793define i1 @not_iszero_or_nan_f_maybe_daz(float %x) #1 {
1794; X86-LABEL: not_iszero_or_nan_f_maybe_daz:
1795; X86:       # %bb.0: # %entry
1796; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1797; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1798; X86-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
1799; X86-NEXT:    setl %cl
1800; X86-NEXT:    testl %eax, %eax
1801; X86-NEXT:    setne %al
1802; X86-NEXT:    andb %cl, %al
1803; X86-NEXT:    retl
1804;
1805; X64-LABEL: not_iszero_or_nan_f_maybe_daz:
1806; X64:       # %bb.0: # %entry
1807; X64-NEXT:    movd %xmm0, %eax
1808; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
1809; X64-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
1810; X64-NEXT:    setl %cl
1811; X64-NEXT:    testl %eax, %eax
1812; X64-NEXT:    setne %al
1813; X64-NEXT:    andb %cl, %al
1814; X64-NEXT:    retq
1815entry:
1816  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 924)  ; ~(0x60|0x3) = "~(zero|nan)"
1817  ret i1 %0
1818}
1819
1820define i1 @iszero_or_qnan_f(float %x) {
1821; X86-LABEL: iszero_or_qnan_f:
1822; X86:       # %bb.0: # %entry
1823; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1824; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1825; X86-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
1826; X86-NEXT:    setge %cl
1827; X86-NEXT:    testl %eax, %eax
1828; X86-NEXT:    sete %al
1829; X86-NEXT:    orb %cl, %al
1830; X86-NEXT:    retl
1831;
1832; X64-LABEL: iszero_or_qnan_f:
1833; X64:       # %bb.0: # %entry
1834; X64-NEXT:    movd %xmm0, %eax
1835; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
1836; X64-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
1837; X64-NEXT:    setge %cl
1838; X64-NEXT:    testl %eax, %eax
1839; X64-NEXT:    sete %al
1840; X64-NEXT:    orb %cl, %al
1841; X64-NEXT:    retq
1842entry:
1843  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 98)  ; 0x60|0x2 = "zero|qnan"
1844  ret i1 %0
1845}
1846
1847define i1 @iszero_or_snan_f(float %x) {
1848; X86-LABEL: iszero_or_snan_f:
1849; X86:       # %bb.0: # %entry
1850; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1851; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1852; X86-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
1853; X86-NEXT:    setl %cl
1854; X86-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
1855; X86-NEXT:    setge %dl
1856; X86-NEXT:    andb %cl, %dl
1857; X86-NEXT:    testl %eax, %eax
1858; X86-NEXT:    sete %al
1859; X86-NEXT:    orb %dl, %al
1860; X86-NEXT:    retl
1861;
1862; X64-GENERIC-LABEL: iszero_or_snan_f:
1863; X64-GENERIC:       # %bb.0: # %entry
1864; X64-GENERIC-NEXT:    movd %xmm0, %eax
1865; X64-GENERIC-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
1866; X64-GENERIC-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
1867; X64-GENERIC-NEXT:    setl %cl
1868; X64-GENERIC-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
1869; X64-GENERIC-NEXT:    setge %dl
1870; X64-GENERIC-NEXT:    andb %cl, %dl
1871; X64-GENERIC-NEXT:    testl %eax, %eax
1872; X64-GENERIC-NEXT:    sete %al
1873; X64-GENERIC-NEXT:    orb %dl, %al
1874; X64-GENERIC-NEXT:    retq
1875;
1876; X64-NDD-LABEL: iszero_or_snan_f:
1877; X64-NDD:       # %bb.0: # %entry
1878; X64-NDD-NEXT:    movd %xmm0, %eax
1879; X64-NDD-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
1880; X64-NDD-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
1881; X64-NDD-NEXT:    setl %cl
1882; X64-NDD-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
1883; X64-NDD-NEXT:    setge %dl
1884; X64-NDD-NEXT:    andb %dl, %cl
1885; X64-NDD-NEXT:    testl %eax, %eax
1886; X64-NDD-NEXT:    sete %al
1887; X64-NDD-NEXT:    orb %cl, %al
1888; X64-NDD-NEXT:    retq
1889entry:
1890  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 97)  ; 0x60|0x1 = "zero|snan"
1891  ret i1 %0
1892}
1893
1894define i1 @not_iszero_or_qnan_f(float %x) {
1895; X86-LABEL: not_iszero_or_qnan_f:
1896; X86:       # %bb.0: # %entry
1897; X86-NEXT:    pushl %esi
1898; X86-NEXT:    .cfi_def_cfa_offset 8
1899; X86-NEXT:    .cfi_offset %esi, -8
1900; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1901; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1902; X86-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
1903; X86-NEXT:    setl %cl
1904; X86-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
1905; X86-NEXT:    setge %dl
1906; X86-NEXT:    andb %cl, %dl
1907; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
1908; X86-NEXT:    sete %cl
1909; X86-NEXT:    leal -1(%eax), %esi
1910; X86-NEXT:    cmpl $8388607, %esi # imm = 0x7FFFFF
1911; X86-NEXT:    setb %ch
1912; X86-NEXT:    orb %cl, %ch
1913; X86-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
1914; X86-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
1915; X86-NEXT:    setb %al
1916; X86-NEXT:    orb %dl, %al
1917; X86-NEXT:    orb %ch, %al
1918; X86-NEXT:    popl %esi
1919; X86-NEXT:    .cfi_def_cfa_offset 4
1920; X86-NEXT:    retl
1921;
1922; X64-GENERIC-LABEL: not_iszero_or_qnan_f:
1923; X64-GENERIC:       # %bb.0: # %entry
1924; X64-GENERIC-NEXT:    movd %xmm0, %eax
1925; X64-GENERIC-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
1926; X64-GENERIC-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
1927; X64-GENERIC-NEXT:    setl %cl
1928; X64-GENERIC-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
1929; X64-GENERIC-NEXT:    setge %dl
1930; X64-GENERIC-NEXT:    andb %cl, %dl
1931; X64-GENERIC-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
1932; X64-GENERIC-NEXT:    sete %cl
1933; X64-GENERIC-NEXT:    leal -1(%rax), %esi
1934; X64-GENERIC-NEXT:    cmpl $8388607, %esi # imm = 0x7FFFFF
1935; X64-GENERIC-NEXT:    setb %sil
1936; X64-GENERIC-NEXT:    orb %cl, %sil
1937; X64-GENERIC-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
1938; X64-GENERIC-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
1939; X64-GENERIC-NEXT:    setb %al
1940; X64-GENERIC-NEXT:    orb %dl, %al
1941; X64-GENERIC-NEXT:    orb %sil, %al
1942; X64-GENERIC-NEXT:    retq
1943;
1944; X64-NDD-LABEL: not_iszero_or_qnan_f:
1945; X64-NDD:       # %bb.0: # %entry
1946; X64-NDD-NEXT:    movd %xmm0, %eax
1947; X64-NDD-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
1948; X64-NDD-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
1949; X64-NDD-NEXT:    setl %cl
1950; X64-NDD-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
1951; X64-NDD-NEXT:    setge %dl
1952; X64-NDD-NEXT:    andb %dl, %cl
1953; X64-NDD-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
1954; X64-NDD-NEXT:    sete %dl
1955; X64-NDD-NEXT:    decl %eax, %esi
1956; X64-NDD-NEXT:    cmpl $8388607, %esi # imm = 0x7FFFFF
1957; X64-NDD-NEXT:    setb %sil
1958; X64-NDD-NEXT:    orb %sil, %dl
1959; X64-NDD-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
1960; X64-NDD-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
1961; X64-NDD-NEXT:    setb %al
1962; X64-NDD-NEXT:    orb %cl, %al
1963; X64-NDD-NEXT:    orb %dl, %al
1964; X64-NDD-NEXT:    retq
1965entry:
1966  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 925)  ; ~(0x60|0x2) = "~(zero|qnan)"
1967  ret i1 %0
1968}
1969
1970define i1 @not_iszero_or_snan_f(float %x) {
1971; X86-LABEL: not_iszero_or_snan_f:
1972; X86:       # %bb.0: # %entry
1973; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1974; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
1975; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
1976; X86-NEXT:    sete %cl
1977; X86-NEXT:    leal -1(%eax), %edx
1978; X86-NEXT:    cmpl $8388607, %edx # imm = 0x7FFFFF
1979; X86-NEXT:    setb %dl
1980; X86-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
1981; X86-NEXT:    setge %ch
1982; X86-NEXT:    orb %cl, %ch
1983; X86-NEXT:    orb %dl, %ch
1984; X86-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
1985; X86-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
1986; X86-NEXT:    setb %al
1987; X86-NEXT:    orb %ch, %al
1988; X86-NEXT:    retl
1989;
1990; X64-GENERIC-LABEL: not_iszero_or_snan_f:
1991; X64-GENERIC:       # %bb.0: # %entry
1992; X64-GENERIC-NEXT:    movd %xmm0, %eax
1993; X64-GENERIC-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
1994; X64-GENERIC-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
1995; X64-GENERIC-NEXT:    sete %cl
1996; X64-GENERIC-NEXT:    leal -1(%rax), %edx
1997; X64-GENERIC-NEXT:    cmpl $8388607, %edx # imm = 0x7FFFFF
1998; X64-GENERIC-NEXT:    setb %dl
1999; X64-GENERIC-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2000; X64-GENERIC-NEXT:    setge %sil
2001; X64-GENERIC-NEXT:    orb %cl, %sil
2002; X64-GENERIC-NEXT:    orb %dl, %sil
2003; X64-GENERIC-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
2004; X64-GENERIC-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
2005; X64-GENERIC-NEXT:    setb %al
2006; X64-GENERIC-NEXT:    orb %sil, %al
2007; X64-GENERIC-NEXT:    retq
2008;
2009; X64-NDD-LABEL: not_iszero_or_snan_f:
2010; X64-NDD:       # %bb.0: # %entry
2011; X64-NDD-NEXT:    movd %xmm0, %eax
2012; X64-NDD-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2013; X64-NDD-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2014; X64-NDD-NEXT:    sete %cl
2015; X64-NDD-NEXT:    decl %eax, %edx
2016; X64-NDD-NEXT:    cmpl $8388607, %edx # imm = 0x7FFFFF
2017; X64-NDD-NEXT:    setb %dl
2018; X64-NDD-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2019; X64-NDD-NEXT:    setge %sil
2020; X64-NDD-NEXT:    orb %sil, %cl
2021; X64-NDD-NEXT:    orb %dl, %cl
2022; X64-NDD-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
2023; X64-NDD-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
2024; X64-NDD-NEXT:    setb %al
2025; X64-NDD-NEXT:    orb %cl, %al
2026; X64-NDD-NEXT:    retq
2027entry:
2028  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 926)  ; ~(0x60|0x1) = "~(zero|snan)"
2029  ret i1 %0
2030}
2031
2032define i1 @isinf_or_nan_f(float %x) {
2033; X86-LABEL: isinf_or_nan_f:
2034; X86:       # %bb.0: # %entry
2035; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
2036; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
2037; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2038; X86-NEXT:    setge %al
2039; X86-NEXT:    retl
2040;
2041; X64-LABEL: isinf_or_nan_f:
2042; X64:       # %bb.0: # %entry
2043; X64-NEXT:    movd %xmm0, %eax
2044; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2045; X64-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2046; X64-NEXT:    setge %al
2047; X64-NEXT:    retq
2048entry:
2049  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 519)  ; 0x204|0x3 = "inf|nan"
2050  ret i1 %0
2051}
2052
2053define i1 @not_isinf_or_nan_f(float %x) {
2054; X86-LABEL: not_isinf_or_nan_f:
2055; X86:       # %bb.0: # %entry
2056; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
2057; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
2058; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2059; X86-NEXT:    setl %al
2060; X86-NEXT:    retl
2061;
2062; X64-LABEL: not_isinf_or_nan_f:
2063; X64:       # %bb.0: # %entry
2064; X64-NEXT:    movd %xmm0, %eax
2065; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2066; X64-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2067; X64-NEXT:    setl %al
2068; X64-NEXT:    retq
2069entry:
2070  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 504)  ; ~(0x204|0x3) = "~(inf|nan)"
2071  ret i1 %0
2072}
2073
2074define i1 @isfinite_or_nan_f(float %x) {
2075; X86-LABEL: isfinite_or_nan_f:
2076; X86:       # %bb.0: # %entry
2077; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
2078; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
2079; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2080; X86-NEXT:    setne %al
2081; X86-NEXT:    retl
2082;
2083; X64-LABEL: isfinite_or_nan_f:
2084; X64:       # %bb.0: # %entry
2085; X64-NEXT:    movd %xmm0, %eax
2086; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2087; X64-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2088; X64-NEXT:    setne %al
2089; X64-NEXT:    retq
2090entry:
2091  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 507)  ; 0x1f8|0x3 = "finite|nan"
2092  ret i1 %0
2093}
2094
2095define i1 @not_isfinite_or_nan_f(float %x) {
2096; X86-LABEL: not_isfinite_or_nan_f:
2097; X86:       # %bb.0: # %entry
2098; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
2099; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
2100; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2101; X86-NEXT:    sete %al
2102; X86-NEXT:    retl
2103;
2104; X64-LABEL: not_isfinite_or_nan_f:
2105; X64:       # %bb.0: # %entry
2106; X64-NEXT:    movd %xmm0, %eax
2107; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2108; X64-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2109; X64-NEXT:    sete %al
2110; X64-NEXT:    retq
2111entry:
2112  %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 516)  ; ~(0x1f8|0x3) = "~(finite|nan)"
2113  ret i1 %0
2114}
2115
2116define i1 @is_plus_inf_or_nan_f(float %x) {
2117; X86-LABEL: is_plus_inf_or_nan_f:
2118; X86:       # %bb.0:
2119; X86-NEXT:    flds {{[0-9]+}}(%esp)
2120; X86-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2121; X86-NEXT:    fucompp
2122; X86-NEXT:    fnstsw %ax
2123; X86-NEXT:    # kill: def $ah killed $ah killed $ax
2124; X86-NEXT:    sahf
2125; X86-NEXT:    sete %al
2126; X86-NEXT:    retl
2127;
2128; X64-LABEL: is_plus_inf_or_nan_f:
2129; X64:       # %bb.0:
2130; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2131; X64-NEXT:    sete %al
2132; X64-NEXT:    retq
2133  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 515)  ; 0x200|0x3 = "+inf|nan"
2134  ret i1 %class
2135}
2136
2137define i1 @is_minus_inf_or_nan_f(float %x) {
2138; X86-LABEL: is_minus_inf_or_nan_f:
2139; X86:       # %bb.0:
2140; X86-NEXT:    flds {{[0-9]+}}(%esp)
2141; X86-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2142; X86-NEXT:    fucompp
2143; X86-NEXT:    fnstsw %ax
2144; X86-NEXT:    # kill: def $ah killed $ah killed $ax
2145; X86-NEXT:    sahf
2146; X86-NEXT:    sete %al
2147; X86-NEXT:    retl
2148;
2149; X64-LABEL: is_minus_inf_or_nan_f:
2150; X64:       # %bb.0:
2151; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2152; X64-NEXT:    sete %al
2153; X64-NEXT:    retq
2154  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 7)  ; "-inf|nan"
2155  ret i1 %class
2156}
2157
2158define i1 @not_is_plus_inf_or_nan_f(float %x) {
2159; X86-LABEL: not_is_plus_inf_or_nan_f:
2160; X86:       # %bb.0:
2161; X86-NEXT:    flds {{[0-9]+}}(%esp)
2162; X86-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2163; X86-NEXT:    fucompp
2164; X86-NEXT:    fnstsw %ax
2165; X86-NEXT:    # kill: def $ah killed $ah killed $ax
2166; X86-NEXT:    sahf
2167; X86-NEXT:    setne %al
2168; X86-NEXT:    retl
2169;
2170; X64-LABEL: not_is_plus_inf_or_nan_f:
2171; X64:       # %bb.0:
2172; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2173; X64-NEXT:    setne %al
2174; X64-NEXT:    retq
2175  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 508)  ; ~(0x200|0x3) = "~(+inf|nan)"
2176  ret i1 %class
2177}
2178
2179define i1 @not_is_minus_inf_or_nan_f(float %x) {
2180; X86-LABEL: not_is_minus_inf_or_nan_f:
2181; X86:       # %bb.0:
2182; X86-NEXT:    flds {{[0-9]+}}(%esp)
2183; X86-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2184; X86-NEXT:    fucompp
2185; X86-NEXT:    fnstsw %ax
2186; X86-NEXT:    # kill: def $ah killed $ah killed $ax
2187; X86-NEXT:    sahf
2188; X86-NEXT:    setne %al
2189; X86-NEXT:    retl
2190;
2191; X64-LABEL: not_is_minus_inf_or_nan_f:
2192; X64:       # %bb.0:
2193; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2194; X64-NEXT:    setne %al
2195; X64-NEXT:    retq
2196  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1016)  ; "~(-inf|nan)"
2197  ret i1 %class
2198}
2199
2200define i1 @is_plus_inf_or_snan_f(float %x) {
2201; X86-LABEL: is_plus_inf_or_snan_f:
2202; X86:       # %bb.0:
2203; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2204; X86-NEXT:    movl %eax, %ecx
2205; X86-NEXT:    andl $2147483647, %ecx # imm = 0x7FFFFFFF
2206; X86-NEXT:    cmpl $2143289344, %ecx # imm = 0x7FC00000
2207; X86-NEXT:    setl %dl
2208; X86-NEXT:    cmpl $2139095041, %ecx # imm = 0x7F800001
2209; X86-NEXT:    setge %cl
2210; X86-NEXT:    andb %dl, %cl
2211; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2212; X86-NEXT:    sete %al
2213; X86-NEXT:    orb %cl, %al
2214; X86-NEXT:    retl
2215;
2216; X64-GENERIC-LABEL: is_plus_inf_or_snan_f:
2217; X64-GENERIC:       # %bb.0:
2218; X64-GENERIC-NEXT:    movd %xmm0, %eax
2219; X64-GENERIC-NEXT:    movl %eax, %ecx
2220; X64-GENERIC-NEXT:    andl $2147483647, %ecx # imm = 0x7FFFFFFF
2221; X64-GENERIC-NEXT:    cmpl $2143289344, %ecx # imm = 0x7FC00000
2222; X64-GENERIC-NEXT:    setl %dl
2223; X64-GENERIC-NEXT:    cmpl $2139095041, %ecx # imm = 0x7F800001
2224; X64-GENERIC-NEXT:    setge %cl
2225; X64-GENERIC-NEXT:    andb %dl, %cl
2226; X64-GENERIC-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2227; X64-GENERIC-NEXT:    sete %al
2228; X64-GENERIC-NEXT:    orb %cl, %al
2229; X64-GENERIC-NEXT:    retq
2230;
2231; X64-NDD-LABEL: is_plus_inf_or_snan_f:
2232; X64-NDD:       # %bb.0:
2233; X64-NDD-NEXT:    movd %xmm0, %eax
2234; X64-NDD-NEXT:    andl $2147483647, %eax, %ecx # imm = 0x7FFFFFFF
2235; X64-NDD-NEXT:    cmpl $2143289344, %ecx # imm = 0x7FC00000
2236; X64-NDD-NEXT:    setl %dl
2237; X64-NDD-NEXT:    cmpl $2139095041, %ecx # imm = 0x7F800001
2238; X64-NDD-NEXT:    setge %cl
2239; X64-NDD-NEXT:    andb %dl, %cl
2240; X64-NDD-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2241; X64-NDD-NEXT:    sete %al
2242; X64-NDD-NEXT:    orb %cl, %al
2243; X64-NDD-NEXT:    retq
2244  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 513)  ; 0x200|0x1 = "+inf|snan"
2245  ret i1 %class
2246}
2247
2248define i1 @is_plus_inf_or_qnan_f(float %x) {
2249; X86-LABEL: is_plus_inf_or_qnan_f:
2250; X86:       # %bb.0:
2251; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2252; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2253; X86-NEXT:    sete %cl
2254; X86-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2255; X86-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2256; X86-NEXT:    setge %al
2257; X86-NEXT:    orb %cl, %al
2258; X86-NEXT:    retl
2259;
2260; X64-LABEL: is_plus_inf_or_qnan_f:
2261; X64:       # %bb.0:
2262; X64-NEXT:    movd %xmm0, %eax
2263; X64-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2264; X64-NEXT:    sete %cl
2265; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2266; X64-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2267; X64-NEXT:    setge %al
2268; X64-NEXT:    orb %cl, %al
2269; X64-NEXT:    retq
2270  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 514)  ; 0x200|0x1 = "+inf|qnan"
2271  ret i1 %class
2272}
2273
2274define i1 @not_is_plus_inf_or_snan_f(float %x) {
2275; X86-LABEL: not_is_plus_inf_or_snan_f:
2276; X86:       # %bb.0:
2277; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2278; X86-NEXT:    cmpl $-8388608, %eax # imm = 0xFF800000
2279; X86-NEXT:    sete %cl
2280; X86-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2281; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2282; X86-NEXT:    setl %dl
2283; X86-NEXT:    orb %cl, %dl
2284; X86-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2285; X86-NEXT:    setge %al
2286; X86-NEXT:    orb %dl, %al
2287; X86-NEXT:    retl
2288;
2289; X64-GENERIC-LABEL: not_is_plus_inf_or_snan_f:
2290; X64-GENERIC:       # %bb.0:
2291; X64-GENERIC-NEXT:    movd %xmm0, %eax
2292; X64-GENERIC-NEXT:    cmpl $-8388608, %eax # imm = 0xFF800000
2293; X64-GENERIC-NEXT:    sete %cl
2294; X64-GENERIC-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2295; X64-GENERIC-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2296; X64-GENERIC-NEXT:    setl %dl
2297; X64-GENERIC-NEXT:    orb %cl, %dl
2298; X64-GENERIC-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2299; X64-GENERIC-NEXT:    setge %al
2300; X64-GENERIC-NEXT:    orb %dl, %al
2301; X64-GENERIC-NEXT:    retq
2302;
2303; X64-NDD-LABEL: not_is_plus_inf_or_snan_f:
2304; X64-NDD:       # %bb.0:
2305; X64-NDD-NEXT:    movd %xmm0, %eax
2306; X64-NDD-NEXT:    cmpl $-8388608, %eax # imm = 0xFF800000
2307; X64-NDD-NEXT:    sete %cl
2308; X64-NDD-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2309; X64-NDD-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2310; X64-NDD-NEXT:    setl %dl
2311; X64-NDD-NEXT:    orb %dl, %cl
2312; X64-NDD-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2313; X64-NDD-NEXT:    setge %al
2314; X64-NDD-NEXT:    orb %cl, %al
2315; X64-NDD-NEXT:    retq
2316  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 510) ; ~(+inf|snan)
2317  ret i1 %class
2318}
2319
2320define i1 @not_is_plus_inf_or_qnan_f(float %x) {
2321; X86-LABEL: not_is_plus_inf_or_qnan_f:
2322; X86:       # %bb.0:
2323; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2324; X86-NEXT:    movl %eax, %ecx
2325; X86-NEXT:    andl $2147483647, %ecx # imm = 0x7FFFFFFF
2326; X86-NEXT:    cmpl $2143289344, %ecx # imm = 0x7FC00000
2327; X86-NEXT:    setl %dl
2328; X86-NEXT:    cmpl $2139095041, %ecx # imm = 0x7F800001
2329; X86-NEXT:    setge %dh
2330; X86-NEXT:    andb %dl, %dh
2331; X86-NEXT:    cmpl $-8388608, %eax # imm = 0xFF800000
2332; X86-NEXT:    sete %dl
2333; X86-NEXT:    cmpl $2139095040, %ecx # imm = 0x7F800000
2334; X86-NEXT:    setl %al
2335; X86-NEXT:    orb %dl, %al
2336; X86-NEXT:    orb %dh, %al
2337; X86-NEXT:    retl
2338;
2339; X64-GENERIC-LABEL: not_is_plus_inf_or_qnan_f:
2340; X64-GENERIC:       # %bb.0:
2341; X64-GENERIC-NEXT:    movd %xmm0, %eax
2342; X64-GENERIC-NEXT:    movl %eax, %ecx
2343; X64-GENERIC-NEXT:    andl $2147483647, %ecx # imm = 0x7FFFFFFF
2344; X64-GENERIC-NEXT:    cmpl $2143289344, %ecx # imm = 0x7FC00000
2345; X64-GENERIC-NEXT:    setl %dl
2346; X64-GENERIC-NEXT:    cmpl $2139095041, %ecx # imm = 0x7F800001
2347; X64-GENERIC-NEXT:    setge %sil
2348; X64-GENERIC-NEXT:    andb %dl, %sil
2349; X64-GENERIC-NEXT:    cmpl $-8388608, %eax # imm = 0xFF800000
2350; X64-GENERIC-NEXT:    sete %dl
2351; X64-GENERIC-NEXT:    cmpl $2139095040, %ecx # imm = 0x7F800000
2352; X64-GENERIC-NEXT:    setl %al
2353; X64-GENERIC-NEXT:    orb %dl, %al
2354; X64-GENERIC-NEXT:    orb %sil, %al
2355; X64-GENERIC-NEXT:    retq
2356;
2357; X64-NDD-LABEL: not_is_plus_inf_or_qnan_f:
2358; X64-NDD:       # %bb.0:
2359; X64-NDD-NEXT:    movd %xmm0, %eax
2360; X64-NDD-NEXT:    andl $2147483647, %eax, %ecx # imm = 0x7FFFFFFF
2361; X64-NDD-NEXT:    cmpl $2143289344, %ecx # imm = 0x7FC00000
2362; X64-NDD-NEXT:    setl %dl
2363; X64-NDD-NEXT:    cmpl $2139095041, %ecx # imm = 0x7F800001
2364; X64-NDD-NEXT:    setge %sil
2365; X64-NDD-NEXT:    andb %sil, %dl
2366; X64-NDD-NEXT:    cmpl $-8388608, %eax # imm = 0xFF800000
2367; X64-NDD-NEXT:    sete %al
2368; X64-NDD-NEXT:    cmpl $2139095040, %ecx # imm = 0x7F800000
2369; X64-NDD-NEXT:    setl %cl
2370; X64-NDD-NEXT:    orb %cl, %al
2371; X64-NDD-NEXT:    orb %dl, %al
2372; X64-NDD-NEXT:    retq
2373  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 509) ; ~(+inf|qnan)
2374  ret i1 %class
2375}
2376
2377define i1 @is_minus_inf_or_snan_f(float %x) {
2378; X86-LABEL: is_minus_inf_or_snan_f:
2379; X86:       # %bb.0:
2380; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2381; X86-NEXT:    movl %eax, %ecx
2382; X86-NEXT:    andl $2147483647, %ecx # imm = 0x7FFFFFFF
2383; X86-NEXT:    cmpl $2143289344, %ecx # imm = 0x7FC00000
2384; X86-NEXT:    setl %dl
2385; X86-NEXT:    cmpl $2139095041, %ecx # imm = 0x7F800001
2386; X86-NEXT:    setge %cl
2387; X86-NEXT:    andb %dl, %cl
2388; X86-NEXT:    cmpl $-8388608, %eax # imm = 0xFF800000
2389; X86-NEXT:    sete %al
2390; X86-NEXT:    orb %cl, %al
2391; X86-NEXT:    retl
2392;
2393; X64-GENERIC-LABEL: is_minus_inf_or_snan_f:
2394; X64-GENERIC:       # %bb.0:
2395; X64-GENERIC-NEXT:    movd %xmm0, %eax
2396; X64-GENERIC-NEXT:    movl %eax, %ecx
2397; X64-GENERIC-NEXT:    andl $2147483647, %ecx # imm = 0x7FFFFFFF
2398; X64-GENERIC-NEXT:    cmpl $2143289344, %ecx # imm = 0x7FC00000
2399; X64-GENERIC-NEXT:    setl %dl
2400; X64-GENERIC-NEXT:    cmpl $2139095041, %ecx # imm = 0x7F800001
2401; X64-GENERIC-NEXT:    setge %cl
2402; X64-GENERIC-NEXT:    andb %dl, %cl
2403; X64-GENERIC-NEXT:    cmpl $-8388608, %eax # imm = 0xFF800000
2404; X64-GENERIC-NEXT:    sete %al
2405; X64-GENERIC-NEXT:    orb %cl, %al
2406; X64-GENERIC-NEXT:    retq
2407;
2408; X64-NDD-LABEL: is_minus_inf_or_snan_f:
2409; X64-NDD:       # %bb.0:
2410; X64-NDD-NEXT:    movd %xmm0, %eax
2411; X64-NDD-NEXT:    andl $2147483647, %eax, %ecx # imm = 0x7FFFFFFF
2412; X64-NDD-NEXT:    cmpl $2143289344, %ecx # imm = 0x7FC00000
2413; X64-NDD-NEXT:    setl %dl
2414; X64-NDD-NEXT:    cmpl $2139095041, %ecx # imm = 0x7F800001
2415; X64-NDD-NEXT:    setge %cl
2416; X64-NDD-NEXT:    andb %dl, %cl
2417; X64-NDD-NEXT:    cmpl $-8388608, %eax # imm = 0xFF800000
2418; X64-NDD-NEXT:    sete %al
2419; X64-NDD-NEXT:    orb %cl, %al
2420; X64-NDD-NEXT:    retq
2421  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 5)  ; "-inf|snan"
2422  ret i1 %class
2423}
2424
2425define i1 @is_minus_inf_or_qnan_f(float %x) {
2426; X86-LABEL: is_minus_inf_or_qnan_f:
2427; X86:       # %bb.0:
2428; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2429; X86-NEXT:    cmpl $-8388608, %eax # imm = 0xFF800000
2430; X86-NEXT:    sete %cl
2431; X86-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2432; X86-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2433; X86-NEXT:    setge %al
2434; X86-NEXT:    orb %cl, %al
2435; X86-NEXT:    retl
2436;
2437; X64-LABEL: is_minus_inf_or_qnan_f:
2438; X64:       # %bb.0:
2439; X64-NEXT:    movd %xmm0, %eax
2440; X64-NEXT:    cmpl $-8388608, %eax # imm = 0xFF800000
2441; X64-NEXT:    sete %cl
2442; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2443; X64-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2444; X64-NEXT:    setge %al
2445; X64-NEXT:    orb %cl, %al
2446; X64-NEXT:    retq
2447  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 6)  ; "-inf|qnan"
2448  ret i1 %class
2449}
2450
2451define i1 @not_is_minus_inf_or_snan_f(float %x) {
2452; X86-LABEL: not_is_minus_inf_or_snan_f:
2453; X86:       # %bb.0:
2454; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2455; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2456; X86-NEXT:    sete %cl
2457; X86-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2458; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2459; X86-NEXT:    setl %dl
2460; X86-NEXT:    orb %cl, %dl
2461; X86-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2462; X86-NEXT:    setge %al
2463; X86-NEXT:    orb %dl, %al
2464; X86-NEXT:    retl
2465;
2466; X64-GENERIC-LABEL: not_is_minus_inf_or_snan_f:
2467; X64-GENERIC:       # %bb.0:
2468; X64-GENERIC-NEXT:    movd %xmm0, %eax
2469; X64-GENERIC-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2470; X64-GENERIC-NEXT:    sete %cl
2471; X64-GENERIC-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2472; X64-GENERIC-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2473; X64-GENERIC-NEXT:    setl %dl
2474; X64-GENERIC-NEXT:    orb %cl, %dl
2475; X64-GENERIC-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2476; X64-GENERIC-NEXT:    setge %al
2477; X64-GENERIC-NEXT:    orb %dl, %al
2478; X64-GENERIC-NEXT:    retq
2479;
2480; X64-NDD-LABEL: not_is_minus_inf_or_snan_f:
2481; X64-NDD:       # %bb.0:
2482; X64-NDD-NEXT:    movd %xmm0, %eax
2483; X64-NDD-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2484; X64-NDD-NEXT:    sete %cl
2485; X64-NDD-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2486; X64-NDD-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2487; X64-NDD-NEXT:    setl %dl
2488; X64-NDD-NEXT:    orb %dl, %cl
2489; X64-NDD-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2490; X64-NDD-NEXT:    setge %al
2491; X64-NDD-NEXT:    orb %cl, %al
2492; X64-NDD-NEXT:    retq
2493  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1018)  ; "~(-inf|snan)"
2494  ret i1 %class
2495}
2496
2497define i1 @not_is_minus_inf_or_qnan_f(float %x) {
2498; X86-LABEL: not_is_minus_inf_or_qnan_f:
2499; X86:       # %bb.0:
2500; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2501; X86-NEXT:    movl %eax, %ecx
2502; X86-NEXT:    andl $2147483647, %ecx # imm = 0x7FFFFFFF
2503; X86-NEXT:    cmpl $2143289344, %ecx # imm = 0x7FC00000
2504; X86-NEXT:    setl %dl
2505; X86-NEXT:    cmpl $2139095041, %ecx # imm = 0x7F800001
2506; X86-NEXT:    setge %dh
2507; X86-NEXT:    andb %dl, %dh
2508; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2509; X86-NEXT:    sete %dl
2510; X86-NEXT:    cmpl $2139095040, %ecx # imm = 0x7F800000
2511; X86-NEXT:    setl %al
2512; X86-NEXT:    orb %dl, %al
2513; X86-NEXT:    orb %dh, %al
2514; X86-NEXT:    retl
2515;
2516; X64-GENERIC-LABEL: not_is_minus_inf_or_qnan_f:
2517; X64-GENERIC:       # %bb.0:
2518; X64-GENERIC-NEXT:    movd %xmm0, %eax
2519; X64-GENERIC-NEXT:    movl %eax, %ecx
2520; X64-GENERIC-NEXT:    andl $2147483647, %ecx # imm = 0x7FFFFFFF
2521; X64-GENERIC-NEXT:    cmpl $2143289344, %ecx # imm = 0x7FC00000
2522; X64-GENERIC-NEXT:    setl %dl
2523; X64-GENERIC-NEXT:    cmpl $2139095041, %ecx # imm = 0x7F800001
2524; X64-GENERIC-NEXT:    setge %sil
2525; X64-GENERIC-NEXT:    andb %dl, %sil
2526; X64-GENERIC-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2527; X64-GENERIC-NEXT:    sete %dl
2528; X64-GENERIC-NEXT:    cmpl $2139095040, %ecx # imm = 0x7F800000
2529; X64-GENERIC-NEXT:    setl %al
2530; X64-GENERIC-NEXT:    orb %dl, %al
2531; X64-GENERIC-NEXT:    orb %sil, %al
2532; X64-GENERIC-NEXT:    retq
2533;
2534; X64-NDD-LABEL: not_is_minus_inf_or_qnan_f:
2535; X64-NDD:       # %bb.0:
2536; X64-NDD-NEXT:    movd %xmm0, %eax
2537; X64-NDD-NEXT:    andl $2147483647, %eax, %ecx # imm = 0x7FFFFFFF
2538; X64-NDD-NEXT:    cmpl $2143289344, %ecx # imm = 0x7FC00000
2539; X64-NDD-NEXT:    setl %dl
2540; X64-NDD-NEXT:    cmpl $2139095041, %ecx # imm = 0x7F800001
2541; X64-NDD-NEXT:    setge %sil
2542; X64-NDD-NEXT:    andb %sil, %dl
2543; X64-NDD-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2544; X64-NDD-NEXT:    sete %al
2545; X64-NDD-NEXT:    cmpl $2139095040, %ecx # imm = 0x7F800000
2546; X64-NDD-NEXT:    setl %cl
2547; X64-NDD-NEXT:    orb %cl, %al
2548; X64-NDD-NEXT:    orb %dl, %al
2549; X64-NDD-NEXT:    retq
2550  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1017)  ; "-inf|qnan"
2551  ret i1 %class
2552}
2553
2554define i1 @issubnormal_or_nan_f(float %x) {
2555; X86-LABEL: issubnormal_or_nan_f:
2556; X86:       # %bb.0:
2557; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
2558; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
2559; X86-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
2560; X86-NEXT:    setge %cl
2561; X86-NEXT:    decl %eax
2562; X86-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
2563; X86-NEXT:    setb %al
2564; X86-NEXT:    orb %cl, %al
2565; X86-NEXT:    retl
2566;
2567; X64-LABEL: issubnormal_or_nan_f:
2568; X64:       # %bb.0:
2569; X64-NEXT:    movd %xmm0, %eax
2570; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2571; X64-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
2572; X64-NEXT:    setge %cl
2573; X64-NEXT:    decl %eax
2574; X64-NEXT:    cmpl $8388607, %eax # imm = 0x7FFFFF
2575; X64-NEXT:    setb %al
2576; X64-NEXT:    orb %cl, %al
2577; X64-NEXT:    retq
2578  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 147)  ; 0x90|0x3 = "subnormal|nan"
2579  ret i1 %class
2580}
2581
2582define i1 @issubnormal_or_zero_or_nan_f(float %x) {
2583; X86-LABEL: issubnormal_or_zero_or_nan_f:
2584; X86:       # %bb.0:
2585; X86-NEXT:    flds {{[0-9]+}}(%esp)
2586; X86-NEXT:    fabs
2587; X86-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2588; X86-NEXT:    fxch %st(1)
2589; X86-NEXT:    fucompp
2590; X86-NEXT:    fnstsw %ax
2591; X86-NEXT:    # kill: def $ah killed $ah killed $ax
2592; X86-NEXT:    sahf
2593; X86-NEXT:    setb %al
2594; X86-NEXT:    retl
2595;
2596; X64-LABEL: issubnormal_or_zero_or_nan_f:
2597; X64:       # %bb.0:
2598; X64-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2599; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2600; X64-NEXT:    setb %al
2601; X64-NEXT:    retq
2602  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 243)  ; 0xf0|0x3 = "subnormal|zero|nan"
2603  ret i1 %class
2604}
2605
2606define i1 @issubnormal_or_zero_or_nan_f_daz(float %x) #0 {
2607; X86-LABEL: issubnormal_or_zero_or_nan_f_daz:
2608; X86:       # %bb.0:
2609; X86-NEXT:    flds {{[0-9]+}}(%esp)
2610; X86-NEXT:    fldz
2611; X86-NEXT:    fucompp
2612; X86-NEXT:    fnstsw %ax
2613; X86-NEXT:    # kill: def $ah killed $ah killed $ax
2614; X86-NEXT:    sahf
2615; X86-NEXT:    sete %al
2616; X86-NEXT:    retl
2617;
2618; X64-LABEL: issubnormal_or_zero_or_nan_f_daz:
2619; X64:       # %bb.0:
2620; X64-NEXT:    xorps %xmm1, %xmm1
2621; X64-NEXT:    ucomiss %xmm1, %xmm0
2622; X64-NEXT:    sete %al
2623; X64-NEXT:    retq
2624  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 243)  ; 0xf0|0x3 = "subnormal|zero|nan"
2625  ret i1 %class
2626}
2627
2628define i1 @issubnormal_or_zero_or_snan_f(float %x) {
2629; X86-LABEL: issubnormal_or_zero_or_snan_f:
2630; X86:       # %bb.0:
2631; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2632; X86-NEXT:    movl %eax, %ecx
2633; X86-NEXT:    andl $2147483647, %ecx # imm = 0x7FFFFFFF
2634; X86-NEXT:    cmpl $2143289344, %ecx # imm = 0x7FC00000
2635; X86-NEXT:    setl %dl
2636; X86-NEXT:    cmpl $2139095041, %ecx # imm = 0x7F800001
2637; X86-NEXT:    setge %cl
2638; X86-NEXT:    andb %dl, %cl
2639; X86-NEXT:    testl $2139095040, %eax # imm = 0x7F800000
2640; X86-NEXT:    sete %al
2641; X86-NEXT:    orb %cl, %al
2642; X86-NEXT:    retl
2643;
2644; X64-GENERIC-LABEL: issubnormal_or_zero_or_snan_f:
2645; X64-GENERIC:       # %bb.0:
2646; X64-GENERIC-NEXT:    movd %xmm0, %eax
2647; X64-GENERIC-NEXT:    movl %eax, %ecx
2648; X64-GENERIC-NEXT:    andl $2147483647, %ecx # imm = 0x7FFFFFFF
2649; X64-GENERIC-NEXT:    cmpl $2143289344, %ecx # imm = 0x7FC00000
2650; X64-GENERIC-NEXT:    setl %dl
2651; X64-GENERIC-NEXT:    cmpl $2139095041, %ecx # imm = 0x7F800001
2652; X64-GENERIC-NEXT:    setge %cl
2653; X64-GENERIC-NEXT:    andb %dl, %cl
2654; X64-GENERIC-NEXT:    testl $2139095040, %eax # imm = 0x7F800000
2655; X64-GENERIC-NEXT:    sete %al
2656; X64-GENERIC-NEXT:    orb %cl, %al
2657; X64-GENERIC-NEXT:    retq
2658;
2659; X64-NDD-LABEL: issubnormal_or_zero_or_snan_f:
2660; X64-NDD:       # %bb.0:
2661; X64-NDD-NEXT:    movd %xmm0, %eax
2662; X64-NDD-NEXT:    andl $2147483647, %eax, %ecx # imm = 0x7FFFFFFF
2663; X64-NDD-NEXT:    cmpl $2143289344, %ecx # imm = 0x7FC00000
2664; X64-NDD-NEXT:    setl %dl
2665; X64-NDD-NEXT:    cmpl $2139095041, %ecx # imm = 0x7F800001
2666; X64-NDD-NEXT:    setge %cl
2667; X64-NDD-NEXT:    andb %dl, %cl
2668; X64-NDD-NEXT:    testl $2139095040, %eax # imm = 0x7F800000
2669; X64-NDD-NEXT:    sete %al
2670; X64-NDD-NEXT:    orb %cl, %al
2671; X64-NDD-NEXT:    retq
2672  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 241)  ; 0x90|0x1 = "subnormal|snan"
2673  ret i1 %class
2674}
2675
2676define i1 @issubnormal_or_zero_or_qnan_f(float %x) {
2677; X86-LABEL: issubnormal_or_zero_or_qnan_f:
2678; X86:       # %bb.0:
2679; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2680; X86-NEXT:    testl $2139095040, %eax # imm = 0x7F800000
2681; X86-NEXT:    sete %cl
2682; X86-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2683; X86-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2684; X86-NEXT:    setge %al
2685; X86-NEXT:    orb %cl, %al
2686; X86-NEXT:    retl
2687;
2688; X64-LABEL: issubnormal_or_zero_or_qnan_f:
2689; X64:       # %bb.0:
2690; X64-NEXT:    movd %xmm0, %eax
2691; X64-NEXT:    testl $2139095040, %eax # imm = 0x7F800000
2692; X64-NEXT:    sete %cl
2693; X64-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2694; X64-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2695; X64-NEXT:    setge %al
2696; X64-NEXT:    orb %cl, %al
2697; X64-NEXT:    retq
2698  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 242)  ; 0x90|0x2 = "subnormal|qnan"
2699  ret i1 %class
2700}
2701
2702define i1 @not_issubnormal_or_nan_f(float %x) {
2703; X86-LABEL: not_issubnormal_or_nan_f:
2704; X86:       # %bb.0:
2705; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
2706; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
2707; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2708; X86-NEXT:    sete %cl
2709; X86-NEXT:    testl %eax, %eax
2710; X86-NEXT:    sete %dl
2711; X86-NEXT:    orb %cl, %dl
2712; X86-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
2713; X86-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
2714; X86-NEXT:    setb %al
2715; X86-NEXT:    orb %dl, %al
2716; X86-NEXT:    retl
2717;
2718; X64-GENERIC-LABEL: not_issubnormal_or_nan_f:
2719; X64-GENERIC:       # %bb.0:
2720; X64-GENERIC-NEXT:    movd %xmm0, %eax
2721; X64-GENERIC-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2722; X64-GENERIC-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2723; X64-GENERIC-NEXT:    sete %cl
2724; X64-GENERIC-NEXT:    testl %eax, %eax
2725; X64-GENERIC-NEXT:    sete %dl
2726; X64-GENERIC-NEXT:    orb %cl, %dl
2727; X64-GENERIC-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
2728; X64-GENERIC-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
2729; X64-GENERIC-NEXT:    setb %al
2730; X64-GENERIC-NEXT:    orb %dl, %al
2731; X64-GENERIC-NEXT:    retq
2732;
2733; X64-NDD-LABEL: not_issubnormal_or_nan_f:
2734; X64-NDD:       # %bb.0:
2735; X64-NDD-NEXT:    movd %xmm0, %eax
2736; X64-NDD-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2737; X64-NDD-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2738; X64-NDD-NEXT:    sete %cl
2739; X64-NDD-NEXT:    testl %eax, %eax
2740; X64-NDD-NEXT:    sete %dl
2741; X64-NDD-NEXT:    orb %dl, %cl
2742; X64-NDD-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
2743; X64-NDD-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
2744; X64-NDD-NEXT:    setb %al
2745; X64-NDD-NEXT:    orb %cl, %al
2746; X64-NDD-NEXT:    retq
2747  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 876)  ; ~(0x90|0x3) = ~"subnormal|nan"
2748  ret i1 %class
2749}
2750
2751define i1 @not_issubnormal_or_zero_or_nan_f(float %x) {
2752; X86-LABEL: not_issubnormal_or_zero_or_nan_f:
2753; X86:       # %bb.0:
2754; X86-NEXT:    flds {{[0-9]+}}(%esp)
2755; X86-NEXT:    fabs
2756; X86-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2757; X86-NEXT:    fxch %st(1)
2758; X86-NEXT:    fucompp
2759; X86-NEXT:    fnstsw %ax
2760; X86-NEXT:    # kill: def $ah killed $ah killed $ax
2761; X86-NEXT:    sahf
2762; X86-NEXT:    setae %al
2763; X86-NEXT:    retl
2764;
2765; X64-LABEL: not_issubnormal_or_zero_or_nan_f:
2766; X64:       # %bb.0:
2767; X64-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2768; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2769; X64-NEXT:    setae %al
2770; X64-NEXT:    retq
2771  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 780)  ; ~(0xf0|0x3) = ~"subnormal|zero|nan"
2772  ret i1 %class
2773}
2774
2775define i1 @not_issubnormal_or_zero_or_nan_f_daz(float %x) #0 {
2776; X86-LABEL: not_issubnormal_or_zero_or_nan_f_daz:
2777; X86:       # %bb.0:
2778; X86-NEXT:    flds {{[0-9]+}}(%esp)
2779; X86-NEXT:    fldz
2780; X86-NEXT:    fucompp
2781; X86-NEXT:    fnstsw %ax
2782; X86-NEXT:    # kill: def $ah killed $ah killed $ax
2783; X86-NEXT:    sahf
2784; X86-NEXT:    setne %al
2785; X86-NEXT:    retl
2786;
2787; X64-LABEL: not_issubnormal_or_zero_or_nan_f_daz:
2788; X64:       # %bb.0:
2789; X64-NEXT:    xorps %xmm1, %xmm1
2790; X64-NEXT:    ucomiss %xmm1, %xmm0
2791; X64-NEXT:    setne %al
2792; X64-NEXT:    retq
2793  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 780)  ; ~(0xf0|0x3) = ~"subnormal|zero|nan"
2794  ret i1 %class
2795}
2796
2797define i1 @not_issubnormal_or_zero_or_snan_f(float %x) {
2798; X86-LABEL: not_issubnormal_or_zero_or_snan_f:
2799; X86:       # %bb.0:
2800; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
2801; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
2802; X86-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2803; X86-NEXT:    setge %cl
2804; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2805; X86-NEXT:    sete %dl
2806; X86-NEXT:    orb %cl, %dl
2807; X86-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
2808; X86-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
2809; X86-NEXT:    setb %al
2810; X86-NEXT:    orb %dl, %al
2811; X86-NEXT:    retl
2812;
2813; X64-GENERIC-LABEL: not_issubnormal_or_zero_or_snan_f:
2814; X64-GENERIC:       # %bb.0:
2815; X64-GENERIC-NEXT:    movd %xmm0, %eax
2816; X64-GENERIC-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2817; X64-GENERIC-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2818; X64-GENERIC-NEXT:    setge %cl
2819; X64-GENERIC-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2820; X64-GENERIC-NEXT:    sete %dl
2821; X64-GENERIC-NEXT:    orb %cl, %dl
2822; X64-GENERIC-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
2823; X64-GENERIC-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
2824; X64-GENERIC-NEXT:    setb %al
2825; X64-GENERIC-NEXT:    orb %dl, %al
2826; X64-GENERIC-NEXT:    retq
2827;
2828; X64-NDD-LABEL: not_issubnormal_or_zero_or_snan_f:
2829; X64-NDD:       # %bb.0:
2830; X64-NDD-NEXT:    movd %xmm0, %eax
2831; X64-NDD-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2832; X64-NDD-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2833; X64-NDD-NEXT:    setge %cl
2834; X64-NDD-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2835; X64-NDD-NEXT:    sete %dl
2836; X64-NDD-NEXT:    orb %dl, %cl
2837; X64-NDD-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
2838; X64-NDD-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
2839; X64-NDD-NEXT:    setb %al
2840; X64-NDD-NEXT:    orb %cl, %al
2841; X64-NDD-NEXT:    retq
2842  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 782)  ; ~(0x90|0x1) = ~"subnormal|snan"
2843  ret i1 %class
2844}
2845
2846define i1 @not_issubnormal_or_zero_or_qnan_f(float %x) {
2847; X86-LABEL: not_issubnormal_or_zero_or_qnan_f:
2848; X86:       # %bb.0:
2849; X86-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
2850; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
2851; X86-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2852; X86-NEXT:    setl %cl
2853; X86-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
2854; X86-NEXT:    setge %dl
2855; X86-NEXT:    andb %cl, %dl
2856; X86-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2857; X86-NEXT:    sete %cl
2858; X86-NEXT:    orb %dl, %cl
2859; X86-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
2860; X86-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
2861; X86-NEXT:    setb %al
2862; X86-NEXT:    orb %cl, %al
2863; X86-NEXT:    retl
2864;
2865; X64-GENERIC-LABEL: not_issubnormal_or_zero_or_qnan_f:
2866; X64-GENERIC:       # %bb.0:
2867; X64-GENERIC-NEXT:    movd %xmm0, %eax
2868; X64-GENERIC-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2869; X64-GENERIC-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2870; X64-GENERIC-NEXT:    setl %cl
2871; X64-GENERIC-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
2872; X64-GENERIC-NEXT:    setge %dl
2873; X64-GENERIC-NEXT:    andb %cl, %dl
2874; X64-GENERIC-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2875; X64-GENERIC-NEXT:    sete %cl
2876; X64-GENERIC-NEXT:    orb %dl, %cl
2877; X64-GENERIC-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
2878; X64-GENERIC-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
2879; X64-GENERIC-NEXT:    setb %al
2880; X64-GENERIC-NEXT:    orb %cl, %al
2881; X64-GENERIC-NEXT:    retq
2882;
2883; X64-NDD-LABEL: not_issubnormal_or_zero_or_qnan_f:
2884; X64-NDD:       # %bb.0:
2885; X64-NDD-NEXT:    movd %xmm0, %eax
2886; X64-NDD-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
2887; X64-NDD-NEXT:    cmpl $2143289344, %eax # imm = 0x7FC00000
2888; X64-NDD-NEXT:    setl %cl
2889; X64-NDD-NEXT:    cmpl $2139095041, %eax # imm = 0x7F800001
2890; X64-NDD-NEXT:    setge %dl
2891; X64-NDD-NEXT:    andb %dl, %cl
2892; X64-NDD-NEXT:    cmpl $2139095040, %eax # imm = 0x7F800000
2893; X64-NDD-NEXT:    sete %dl
2894; X64-NDD-NEXT:    orb %dl, %cl
2895; X64-NDD-NEXT:    addl $-8388608, %eax # imm = 0xFF800000
2896; X64-NDD-NEXT:    cmpl $2130706432, %eax # imm = 0x7F000000
2897; X64-NDD-NEXT:    setb %al
2898; X64-NDD-NEXT:    orb %cl, %al
2899; X64-NDD-NEXT:    retq
2900  %class = tail call i1 @llvm.is.fpclass.f32(float %x, i32 781)  ; ~(0x90|0x2) = ~"subnormal|qnan"
2901  ret i1 %class
2902}
2903
2904declare i1 @llvm.is.fpclass.f32(float, i32)
2905declare i1 @llvm.is.fpclass.f64(double, i32)
2906declare <1 x i1> @llvm.is.fpclass.v1f32(<1 x float>, i32)
2907declare <2 x i1> @llvm.is.fpclass.v2f32(<2 x float>, i32)
2908declare <4 x i1> @llvm.is.fpclass.v4f32(<4 x float>, i32)
2909
2910; Assume DAZ
2911attributes #0 = { "denormal-fp-math"="ieee,preserve-sign" }
2912
2913; Maybe daz
2914attributes #1 = { "denormal-fp-math"="ieee,dynamic" }
2915