Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / X86 / is_fpclass-fp80.ll
blob52d294ca017203ee57ed939ccb8072a5ef0a9f37
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
5 define 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
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
22 entry:
23   %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 3)  ; "nan"
24   ret i1 %0
27 define 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
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
69 entry:
70   %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 3) strictfp ; "nan"
71   ret i1 %0
74 define 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
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
117 entry:
118   %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 1)  ; "snan"
119   ret i1 %0
122 define 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
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
146 entry:
147   %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 2)  ; "qnan"
148   ret i1 %0
151 define 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
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
168 entry:
169   %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 96)  ; 0x60 = "zero"
170   ret i1 %0
173 define 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
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
190 entry:
191   %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 96) strictfp ; 0x60 = "zero"
192   ret i1 %0
195 define 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
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
210 entry:
211   %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 64)  ; 0x40 = "+zero"
212   ret i1 %0
215 define 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
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
232 entry:
233   %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 32)  ; 0x20 = "-zero"
234   ret i1 %0
237 define 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
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
260 entry:
261   %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 516)  ; 0x204 = "inf"
262   ret i1 %0
265 define 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
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
286 entry:
287   %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 512)  ; 0x200 = "+inf"
288   ret i1 %0
291 define 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
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
312 entry:
313   %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 4)  ; "-inf"
314   ret i1 %0
317 define 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
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
346 entry:
347   %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 264)  ; 0x108 = "normal"
348   ret i1 %0
351 define 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
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
390 entry:
391   %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 256)  ; 0x100 = "+normal"
392   ret i1 %0
395 define 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
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
434 entry:
435   %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 8)  ; "-normal"
436   ret i1 %0
439 define 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
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
472 entry:
473   %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 144)  ; 0x90 = "subnormal"
474   ret i1 %0
477 define 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
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
509 entry:
510   %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 128)  ; 0x80 = "+subnormal"
511   ret i1 %0
514 define 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
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
557 entry:
558   %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 16)  ; 0x10 = "-subnormal"
559   ret i1 %0
562 declare i1 @llvm.is.fpclass.f80(x86_fp80, i32)