xref: /llvm-project/llvm/test/CodeGen/X86/is_fpclass-fp80.ll (revision 928fde3f43f835c217e5d04dc469942fae7473a9)
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
4
5define i1 @is_nan_f80(x86_fp80 %x) nounwind {
6; X86-LABEL: is_nan_f80:
7; X86:       # %bb.0: # %entry
8; X86-NEXT:    fldt {{[0-9]+}}(%esp)
9; X86-NEXT:    fucomp %st(0)
10; X86-NEXT:    fnstsw %ax
11; X86-NEXT:    # kill: def $ah killed $ah killed $ax
12; X86-NEXT:    sahf
13; X86-NEXT:    setp %al
14; X86-NEXT:    retl
15;
16; X64-LABEL: is_nan_f80:
17; X64:       # %bb.0: # %entry
18; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
19; X64-NEXT:    fucompi %st(0), %st
20; X64-NEXT:    setp %al
21; X64-NEXT:    retq
22entry:
23  %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 3)  ; "nan"
24  ret i1 %0
25}
26
27define i1 @is_nan_f80_strict(x86_fp80 %x) nounwind strictfp {
28; X86-LABEL: is_nan_f80_strict:
29; X86:       # %bb.0: # %entry
30; X86-NEXT:    pushl %esi
31; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
32; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
33; X86-NEXT:    andl $32767, %ecx # imm = 0x7FFF
34; X86-NEXT:    xorl %edx, %edx
35; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %edx
36; X86-NEXT:    movl $-2147483648, %esi # imm = 0x80000000
37; X86-NEXT:    sbbl %eax, %esi
38; X86-NEXT:    movl $32767, %esi # imm = 0x7FFF
39; X86-NEXT:    sbbl %ecx, %esi
40; X86-NEXT:    sbbl %edx, %edx
41; X86-NEXT:    setl %dl
42; X86-NEXT:    testl %ecx, %ecx
43; X86-NEXT:    sete %cl
44; X86-NEXT:    shrl $31, %eax
45; X86-NEXT:    xorb %cl, %al
46; X86-NEXT:    xorb $1, %al
47; X86-NEXT:    orb %dl, %al
48; X86-NEXT:    # kill: def $al killed $al killed $eax
49; X86-NEXT:    popl %esi
50; X86-NEXT:    retl
51;
52; X64-LABEL: is_nan_f80_strict:
53; X64:       # %bb.0: # %entry
54; X64-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
55; X64-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
56; X64-NEXT:    andl $32767, %eax # imm = 0x7FFF
57; X64-NEXT:    movabsq $-9223372036854775808, %rdx # imm = 0x8000000000000000
58; X64-NEXT:    cmpq %rcx, %rdx
59; X64-NEXT:    movl $32767, %edx # imm = 0x7FFF
60; X64-NEXT:    sbbq %rax, %rdx
61; X64-NEXT:    setl %dl
62; X64-NEXT:    shrq $63, %rcx
63; X64-NEXT:    testq %rax, %rax
64; X64-NEXT:    sete %al
65; X64-NEXT:    xorb %cl, %al
66; X64-NEXT:    xorb $1, %al
67; X64-NEXT:    orb %dl, %al
68; X64-NEXT:    retq
69entry:
70  %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 3) strictfp ; "nan"
71  ret i1 %0
72}
73
74define i1 @is_snan_f80(x86_fp80 %x) nounwind {
75; X86-LABEL: is_snan_f80:
76; X86:       # %bb.0: # %entry
77; X86-NEXT:    pushl %ebx
78; X86-NEXT:    pushl %esi
79; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
80; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
81; X86-NEXT:    andl $32767, %eax # imm = 0x7FFF
82; X86-NEXT:    xorl %ecx, %ecx
83; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %ecx
84; X86-NEXT:    movl $-2147483648, %esi # imm = 0x80000000
85; X86-NEXT:    sbbl %edx, %esi
86; X86-NEXT:    movl $32767, %esi # imm = 0x7FFF
87; X86-NEXT:    sbbl %eax, %esi
88; X86-NEXT:    movl $0, %esi
89; X86-NEXT:    sbbl %esi, %esi
90; X86-NEXT:    setl %bl
91; X86-NEXT:    cmpl $-1073741824, %edx # imm = 0xC0000000
92; X86-NEXT:    sbbl $32767, %eax # imm = 0x7FFF
93; X86-NEXT:    sbbl %ecx, %ecx
94; X86-NEXT:    setl %al
95; X86-NEXT:    andb %bl, %al
96; X86-NEXT:    popl %esi
97; X86-NEXT:    popl %ebx
98; X86-NEXT:    retl
99;
100; X64-LABEL: is_snan_f80:
101; X64:       # %bb.0: # %entry
102; X64-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
103; X64-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
104; X64-NEXT:    andl $32767, %eax # imm = 0x7FFF
105; X64-NEXT:    movabsq $-4611686018427387904, %rdx # imm = 0xC000000000000000
106; X64-NEXT:    cmpq %rdx, %rcx
107; X64-NEXT:    movq %rax, %rdx
108; X64-NEXT:    sbbq $32767, %rdx # imm = 0x7FFF
109; X64-NEXT:    setl %dl
110; X64-NEXT:    movabsq $-9223372036854775808, %rsi # imm = 0x8000000000000000
111; X64-NEXT:    cmpq %rcx, %rsi
112; X64-NEXT:    movl $32767, %ecx # imm = 0x7FFF
113; X64-NEXT:    sbbq %rax, %rcx
114; X64-NEXT:    setl %al
115; X64-NEXT:    andb %dl, %al
116; X64-NEXT:    retq
117entry:
118  %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 1)  ; "snan"
119  ret i1 %0
120}
121
122define i1 @is_qnan_f80(x86_fp80 %x) nounwind {
123; X86-LABEL: is_qnan_f80:
124; X86:       # %bb.0: # %entry
125; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
126; X86-NEXT:    andl $32767, %eax # imm = 0x7FFF
127; X86-NEXT:    xorl %ecx, %ecx
128; X86-NEXT:    movl $-1073741825, %edx # imm = 0xBFFFFFFF
129; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %edx
130; X86-NEXT:    movl $32767, %edx # imm = 0x7FFF
131; X86-NEXT:    sbbl %eax, %edx
132; X86-NEXT:    sbbl %ecx, %ecx
133; X86-NEXT:    setl %al
134; X86-NEXT:    retl
135;
136; X64-LABEL: is_qnan_f80:
137; X64:       # %bb.0: # %entry
138; X64-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
139; X64-NEXT:    andl $32767, %eax # imm = 0x7FFF
140; X64-NEXT:    movabsq $-4611686018427387905, %rcx # imm = 0xBFFFFFFFFFFFFFFF
141; X64-NEXT:    cmpq {{[0-9]+}}(%rsp), %rcx
142; X64-NEXT:    movl $32767, %ecx # imm = 0x7FFF
143; X64-NEXT:    sbbq %rax, %rcx
144; X64-NEXT:    setl %al
145; X64-NEXT:    retq
146entry:
147  %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 2)  ; "qnan"
148  ret i1 %0
149}
150
151define i1 @is_zero_f80(x86_fp80 %x) nounwind {
152; X86-LABEL: is_zero_f80:
153; X86:       # %bb.0: # %entry
154; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
155; X86-NEXT:    andl $32767, %eax # imm = 0x7FFF
156; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax
157; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax
158; X86-NEXT:    sete %al
159; X86-NEXT:    retl
160;
161; X64-LABEL: is_zero_f80:
162; X64:       # %bb.0: # %entry
163; X64-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
164; X64-NEXT:    andl $32767, %eax # imm = 0x7FFF
165; X64-NEXT:    orq {{[0-9]+}}(%rsp), %rax
166; X64-NEXT:    sete %al
167; X64-NEXT:    retq
168entry:
169  %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 96)  ; 0x60 = "zero"
170  ret i1 %0
171}
172
173define i1 @is_zero_f80_strict(x86_fp80 %x) nounwind strictfp {
174; X86-LABEL: is_zero_f80_strict:
175; X86:       # %bb.0: # %entry
176; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
177; X86-NEXT:    andl $32767, %eax # imm = 0x7FFF
178; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax
179; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax
180; X86-NEXT:    sete %al
181; X86-NEXT:    retl
182;
183; X64-LABEL: is_zero_f80_strict:
184; X64:       # %bb.0: # %entry
185; X64-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
186; X64-NEXT:    andl $32767, %eax # imm = 0x7FFF
187; X64-NEXT:    orq {{[0-9]+}}(%rsp), %rax
188; X64-NEXT:    sete %al
189; X64-NEXT:    retq
190entry:
191  %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 96) strictfp ; 0x60 = "zero"
192  ret i1 %0
193}
194
195define i1 @is_poszero_f80(x86_fp80 %x) nounwind {
196; X86-LABEL: is_poszero_f80:
197; X86:       # %bb.0: # %entry
198; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
199; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax
200; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax
201; X86-NEXT:    sete %al
202; X86-NEXT:    retl
203;
204; X64-LABEL: is_poszero_f80:
205; X64:       # %bb.0: # %entry
206; X64-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
207; X64-NEXT:    orq {{[0-9]+}}(%rsp), %rax
208; X64-NEXT:    sete %al
209; X64-NEXT:    retq
210entry:
211  %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 64)  ; 0x40 = "+zero"
212  ret i1 %0
213}
214
215define i1 @is_negzero_f80(x86_fp80 %x) nounwind {
216; X86-LABEL: is_negzero_f80:
217; X86:       # %bb.0: # %entry
218; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
219; X86-NEXT:    xorl $32768, %eax # imm = 0x8000
220; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax
221; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax
222; X86-NEXT:    sete %al
223; X86-NEXT:    retl
224;
225; X64-LABEL: is_negzero_f80:
226; X64:       # %bb.0: # %entry
227; X64-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
228; X64-NEXT:    xorq $32768, %rax # imm = 0x8000
229; X64-NEXT:    orq {{[0-9]+}}(%rsp), %rax
230; X64-NEXT:    sete %al
231; X64-NEXT:    retq
232entry:
233  %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 32)  ; 0x20 = "-zero"
234  ret i1 %0
235}
236
237define i1 @is_inf_f80(x86_fp80 %x) nounwind {
238; X86-LABEL: is_inf_f80:
239; X86:       # %bb.0: # %entry
240; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
241; X86-NEXT:    notl %eax
242; X86-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000
243; X86-NEXT:    xorl {{[0-9]+}}(%esp), %ecx
244; X86-NEXT:    andl $32767, %eax # imm = 0x7FFF
245; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax
246; X86-NEXT:    orl %ecx, %eax
247; X86-NEXT:    sete %al
248; X86-NEXT:    retl
249;
250; X64-LABEL: is_inf_f80:
251; X64:       # %bb.0: # %entry
252; X64-NEXT:    movl {{[0-9]+}}(%rsp), %eax
253; X64-NEXT:    notl %eax
254; X64-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
255; X64-NEXT:    xorq {{[0-9]+}}(%rsp), %rcx
256; X64-NEXT:    andl $32767, %eax # imm = 0x7FFF
257; X64-NEXT:    orq %rcx, %rax
258; X64-NEXT:    sete %al
259; X64-NEXT:    retq
260entry:
261  %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 516)  ; 0x204 = "inf"
262  ret i1 %0
263}
264
265define i1 @is_posinf_f80(x86_fp80 %x) nounwind {
266; X86-LABEL: is_posinf_f80:
267; X86:       # %bb.0: # %entry
268; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
269; X86-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000
270; X86-NEXT:    xorl {{[0-9]+}}(%esp), %ecx
271; X86-NEXT:    xorl $32767, %eax # imm = 0x7FFF
272; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax
273; X86-NEXT:    orl %ecx, %eax
274; X86-NEXT:    sete %al
275; X86-NEXT:    retl
276;
277; X64-LABEL: is_posinf_f80:
278; X64:       # %bb.0: # %entry
279; X64-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
280; X64-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
281; X64-NEXT:    xorq {{[0-9]+}}(%rsp), %rcx
282; X64-NEXT:    xorq $32767, %rax # imm = 0x7FFF
283; X64-NEXT:    orq %rcx, %rax
284; X64-NEXT:    sete %al
285; X64-NEXT:    retq
286entry:
287  %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 512)  ; 0x200 = "+inf"
288  ret i1 %0
289}
290
291define i1 @is_neginf_f80(x86_fp80 %x) nounwind {
292; X86-LABEL: is_neginf_f80:
293; X86:       # %bb.0: # %entry
294; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
295; X86-NEXT:    xorl $65535, %eax # imm = 0xFFFF
296; X86-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000
297; X86-NEXT:    xorl {{[0-9]+}}(%esp), %ecx
298; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax
299; X86-NEXT:    orl %ecx, %eax
300; X86-NEXT:    sete %al
301; X86-NEXT:    retl
302;
303; X64-LABEL: is_neginf_f80:
304; X64:       # %bb.0: # %entry
305; X64-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
306; X64-NEXT:    xorq $65535, %rax # imm = 0xFFFF
307; X64-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
308; X64-NEXT:    xorq {{[0-9]+}}(%rsp), %rcx
309; X64-NEXT:    orq %rax, %rcx
310; X64-NEXT:    sete %al
311; X64-NEXT:    retq
312entry:
313  %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 4)  ; "-inf"
314  ret i1 %0
315}
316
317define i1 @is_normal_f80(x86_fp80 %x) nounwind {
318; X86-LABEL: is_normal_f80:
319; X86:       # %bb.0: # %entry
320; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
321; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
322; X86-NEXT:    andl $32767, %ecx # imm = 0x7FFF
323; X86-NEXT:    decl %ecx
324; X86-NEXT:    movzwl %cx, %ecx
325; X86-NEXT:    xorl %edx, %edx
326; X86-NEXT:    cmpl $32766, %ecx # imm = 0x7FFE
327; X86-NEXT:    sbbl %edx, %edx
328; X86-NEXT:    setb %cl
329; X86-NEXT:    shrl $31, %eax
330; X86-NEXT:    andb %cl, %al
331; X86-NEXT:    # kill: def $al killed $al killed $eax
332; X86-NEXT:    retl
333;
334; X64-LABEL: is_normal_f80:
335; X64:       # %bb.0: # %entry
336; X64-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
337; X64-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
338; X64-NEXT:    shrq $63, %rcx
339; X64-NEXT:    andl $32767, %eax # imm = 0x7FFF
340; X64-NEXT:    decl %eax
341; X64-NEXT:    movzwl %ax, %eax
342; X64-NEXT:    cmpl $32766, %eax # imm = 0x7FFE
343; X64-NEXT:    setb %al
344; X64-NEXT:    andb %cl, %al
345; X64-NEXT:    retq
346entry:
347  %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 264)  ; 0x108 = "normal"
348  ret i1 %0
349}
350
351define i1 @is_posnormal_f80(x86_fp80 %x) nounwind {
352; X86-LABEL: is_posnormal_f80:
353; X86:       # %bb.0: # %entry
354; X86-NEXT:    pushl %esi
355; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
356; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
357; X86-NEXT:    movl %ecx, %edx
358; X86-NEXT:    andl $32767, %edx # imm = 0x7FFF
359; X86-NEXT:    decl %edx
360; X86-NEXT:    movzwl %dx, %edx
361; X86-NEXT:    xorl %esi, %esi
362; X86-NEXT:    cmpl $32766, %edx # imm = 0x7FFE
363; X86-NEXT:    sbbl %esi, %esi
364; X86-NEXT:    setb %dl
365; X86-NEXT:    testl $32768, %ecx # imm = 0x8000
366; X86-NEXT:    sete %cl
367; X86-NEXT:    shrl $31, %eax
368; X86-NEXT:    andb %cl, %al
369; X86-NEXT:    andb %dl, %al
370; X86-NEXT:    # kill: def $al killed $al killed $eax
371; X86-NEXT:    popl %esi
372; X86-NEXT:    retl
373;
374; X64-LABEL: is_posnormal_f80:
375; X64:       # %bb.0: # %entry
376; X64-NEXT:    movq {{[0-9]+}}(%rsp), %rax
377; X64-NEXT:    movswq {{[0-9]+}}(%rsp), %rcx
378; X64-NEXT:    testq %rcx, %rcx
379; X64-NEXT:    setns %dl
380; X64-NEXT:    andl $32767, %ecx # imm = 0x7FFF
381; X64-NEXT:    decl %ecx
382; X64-NEXT:    movzwl %cx, %ecx
383; X64-NEXT:    cmpl $32766, %ecx # imm = 0x7FFE
384; X64-NEXT:    setb %cl
385; X64-NEXT:    shrq $63, %rax
386; X64-NEXT:    andb %dl, %al
387; X64-NEXT:    andb %cl, %al
388; X64-NEXT:    # kill: def $al killed $al killed $rax
389; X64-NEXT:    retq
390entry:
391  %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 256)  ; 0x100 = "+normal"
392  ret i1 %0
393}
394
395define i1 @is_negnormal_f80(x86_fp80 %x) nounwind {
396; X86-LABEL: is_negnormal_f80:
397; X86:       # %bb.0: # %entry
398; X86-NEXT:    pushl %esi
399; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
400; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
401; X86-NEXT:    movl %ecx, %edx
402; X86-NEXT:    andl $32767, %edx # imm = 0x7FFF
403; X86-NEXT:    decl %edx
404; X86-NEXT:    movzwl %dx, %edx
405; X86-NEXT:    xorl %esi, %esi
406; X86-NEXT:    cmpl $32766, %edx # imm = 0x7FFE
407; X86-NEXT:    sbbl %esi, %esi
408; X86-NEXT:    setb %dl
409; X86-NEXT:    testl $32768, %ecx # imm = 0x8000
410; X86-NEXT:    setne %cl
411; X86-NEXT:    shrl $31, %eax
412; X86-NEXT:    andb %cl, %al
413; X86-NEXT:    andb %dl, %al
414; X86-NEXT:    # kill: def $al killed $al killed $eax
415; X86-NEXT:    popl %esi
416; X86-NEXT:    retl
417;
418; X64-LABEL: is_negnormal_f80:
419; X64:       # %bb.0: # %entry
420; X64-NEXT:    movq {{[0-9]+}}(%rsp), %rax
421; X64-NEXT:    movswq {{[0-9]+}}(%rsp), %rcx
422; X64-NEXT:    testq %rcx, %rcx
423; X64-NEXT:    sets %dl
424; X64-NEXT:    andl $32767, %ecx # imm = 0x7FFF
425; X64-NEXT:    decl %ecx
426; X64-NEXT:    movzwl %cx, %ecx
427; X64-NEXT:    cmpl $32766, %ecx # imm = 0x7FFE
428; X64-NEXT:    setb %cl
429; X64-NEXT:    shrq $63, %rax
430; X64-NEXT:    andb %dl, %al
431; X64-NEXT:    andb %cl, %al
432; X64-NEXT:    # kill: def $al killed $al killed $rax
433; X64-NEXT:    retq
434entry:
435  %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 8)  ; "-normal"
436  ret i1 %0
437}
438
439define i1 @is_subnormal_f80(x86_fp80 %x) nounwind {
440; X86-LABEL: is_subnormal_f80:
441; X86:       # %bb.0: # %entry
442; X86-NEXT:    pushl %esi
443; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
444; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
445; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
446; X86-NEXT:    andl $32767, %eax # imm = 0x7FFF
447; X86-NEXT:    xorl %edx, %edx
448; X86-NEXT:    addl $-1, %esi
449; X86-NEXT:    adcl $-1, %ecx
450; X86-NEXT:    adcl $-1, %eax
451; X86-NEXT:    adcl $-1, %edx
452; X86-NEXT:    cmpl $-1, %esi
453; X86-NEXT:    sbbl $2147483647, %ecx # imm = 0x7FFFFFFF
454; X86-NEXT:    sbbl $0, %eax
455; X86-NEXT:    sbbl $0, %edx
456; X86-NEXT:    setb %al
457; X86-NEXT:    popl %esi
458; X86-NEXT:    retl
459;
460; X64-LABEL: is_subnormal_f80:
461; X64:       # %bb.0: # %entry
462; X64-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
463; X64-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
464; X64-NEXT:    andl $32767, %eax # imm = 0x7FFF
465; X64-NEXT:    addq $-1, %rcx
466; X64-NEXT:    adcq $-1, %rax
467; X64-NEXT:    movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF
468; X64-NEXT:    cmpq %rdx, %rcx
469; X64-NEXT:    sbbq $0, %rax
470; X64-NEXT:    setb %al
471; X64-NEXT:    retq
472entry:
473  %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 144)  ; 0x90 = "subnormal"
474  ret i1 %0
475}
476
477define i1 @is_possubnormal_f80(x86_fp80 %x) nounwind {
478; X86-LABEL: is_possubnormal_f80:
479; X86:       # %bb.0: # %entry
480; X86-NEXT:    pushl %esi
481; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
482; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
483; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
484; X86-NEXT:    addl $-1, %ecx
485; X86-NEXT:    adcl $-1, %edx
486; X86-NEXT:    adcl $-1, %eax
487; X86-NEXT:    movzwl %ax, %eax
488; X86-NEXT:    xorl %esi, %esi
489; X86-NEXT:    cmpl $-1, %ecx
490; X86-NEXT:    sbbl $2147483647, %edx # imm = 0x7FFFFFFF
491; X86-NEXT:    sbbl $0, %eax
492; X86-NEXT:    sbbl %esi, %esi
493; X86-NEXT:    setb %al
494; X86-NEXT:    popl %esi
495; X86-NEXT:    retl
496;
497; X64-LABEL: is_possubnormal_f80:
498; X64:       # %bb.0: # %entry
499; X64-NEXT:    movl {{[0-9]+}}(%rsp), %eax
500; X64-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
501; X64-NEXT:    addq $-1, %rcx
502; X64-NEXT:    adcq $-1, %rax
503; X64-NEXT:    movzwl %ax, %eax
504; X64-NEXT:    movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF
505; X64-NEXT:    cmpq %rdx, %rcx
506; X64-NEXT:    sbbq $0, %rax
507; X64-NEXT:    setb %al
508; X64-NEXT:    retq
509entry:
510  %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 128)  ; 0x80 = "+subnormal"
511  ret i1 %0
512}
513
514define i1 @is_negsubnormal_f80(x86_fp80 %x) nounwind {
515; X86-LABEL: is_negsubnormal_f80:
516; X86:       # %bb.0: # %entry
517; X86-NEXT:    pushl %edi
518; X86-NEXT:    pushl %esi
519; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
520; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
521; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
522; X86-NEXT:    movl %eax, %ecx
523; X86-NEXT:    andl $32767, %ecx # imm = 0x7FFF
524; X86-NEXT:    xorl %esi, %esi
525; X86-NEXT:    addl $-1, %edi
526; X86-NEXT:    adcl $-1, %edx
527; X86-NEXT:    adcl $-1, %ecx
528; X86-NEXT:    adcl $-1, %esi
529; X86-NEXT:    cmpl $-1, %edi
530; X86-NEXT:    sbbl $2147483647, %edx # imm = 0x7FFFFFFF
531; X86-NEXT:    sbbl $0, %ecx
532; X86-NEXT:    sbbl $0, %esi
533; X86-NEXT:    setb %cl
534; X86-NEXT:    testl $32768, %eax # imm = 0x8000
535; X86-NEXT:    setne %al
536; X86-NEXT:    andb %cl, %al
537; X86-NEXT:    popl %esi
538; X86-NEXT:    popl %edi
539; X86-NEXT:    retl
540;
541; X64-LABEL: is_negsubnormal_f80:
542; X64:       # %bb.0: # %entry
543; X64-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
544; X64-NEXT:    movswq %ax, %rcx
545; X64-NEXT:    movq {{[0-9]+}}(%rsp), %rdx
546; X64-NEXT:    andl $32767, %eax # imm = 0x7FFF
547; X64-NEXT:    addq $-1, %rdx
548; X64-NEXT:    adcq $-1, %rax
549; X64-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
550; X64-NEXT:    cmpq %rsi, %rdx
551; X64-NEXT:    sbbq $0, %rax
552; X64-NEXT:    setb %dl
553; X64-NEXT:    testq %rcx, %rcx
554; X64-NEXT:    sets %al
555; X64-NEXT:    andb %dl, %al
556; X64-NEXT:    retq
557entry:
558  %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 16)  ; 0x10 = "-subnormal"
559  ret i1 %0
560}
561
562declare i1 @llvm.is.fpclass.f80(x86_fp80, i32)
563