| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 | |
| ; RUN: llc < %s -mtriple=i686-linux | FileCheck %s -check-prefixes=X86 | |
| ; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s -check-prefixes=X64,X64-SDAGISEL | |
| ; RUN: llc < %s -mtriple=i686-linux -fast-isel -fast-isel-abort=1 | FileCheck %s -check-prefixes=X86-FASTISEL | |
| ; RUN: llc < %s -mtriple=x86_64-linux -fast-isel -fast-isel-abort=1 | FileCheck %s -check-prefixes=X64,X64-FASTISEL | |
| ; RUN: llc < %s -mtriple=x86_64-linux -global-isel -global-isel-abort=1 | FileCheck %s -check-prefixes=X64-GISEL | |
| ; RUN: llc < %s -mtriple=i686-linux -global-isel -global-isel-abort=2 | FileCheck %s -check-prefixes=X86 | |
| define i1 @isnone_f(float %x) nounwind { | |
| ; X86-LABEL: isnone_f: | |
| ; X86: # %bb.0: # %entry | |
| ; X86-NEXT: xorl %eax, %eax | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: isnone_f: | |
| ; X64: # %bb.0: # %entry | |
| ; X64-NEXT: xorl %eax, %eax | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-FASTISEL-LABEL: isnone_f: | |
| ; X86-FASTISEL: # %bb.0: # %entry | |
| ; X86-FASTISEL-NEXT: flds {{[0-9]+}}(%esp) | |
| ; X86-FASTISEL-NEXT: fstp %st(0) | |
| ; X86-FASTISEL-NEXT: xorl %eax, %eax | |
| ; X86-FASTISEL-NEXT: retl | |
| ; | |
| ; X64-GISEL-LABEL: isnone_f: | |
| ; X64-GISEL: # %bb.0: # %entry | |
| ; X64-GISEL-NEXT: xorl %eax, %eax | |
| ; X64-GISEL-NEXT: retq | |
| entry: | |
| %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 0) | |
| ret i1 %0 | |
| } | |
| define i1 @isany_f(float %x) nounwind { | |
| ; X86-LABEL: isany_f: | |
| ; X86: # %bb.0: # %entry | |
| ; X86-NEXT: movb $1, %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: isany_f: | |
| ; X64: # %bb.0: # %entry | |
| ; X64-NEXT: movb $1, %al | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-FASTISEL-LABEL: isany_f: | |
| ; X86-FASTISEL: # %bb.0: # %entry | |
| ; X86-FASTISEL-NEXT: flds {{[0-9]+}}(%esp) | |
| ; X86-FASTISEL-NEXT: fstp %st(0) | |
| ; X86-FASTISEL-NEXT: movb $1, %al | |
| ; X86-FASTISEL-NEXT: retl | |
| ; | |
| ; X64-GISEL-LABEL: isany_f: | |
| ; X64-GISEL: # %bb.0: # %entry | |
| ; X64-GISEL-NEXT: movb $1, %al | |
| ; X64-GISEL-NEXT: retq | |
| entry: | |
| %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1023) | |
| ret i1 %0 | |
| } | |
| define i1 @issignaling_f(float %x) nounwind { | |
| ; X86-LABEL: issignaling_f: | |
| ; X86: # %bb.0: | |
| ; X86-NEXT: movl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X86-NEXT: andl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: cmpl $2143289344, %eax # imm = 0x7FC00000 | |
| ; X86-NEXT: setl %cl | |
| ; X86-NEXT: cmpl $2139095041, %eax # imm = 0x7F800001 | |
| ; X86-NEXT: setge %al | |
| ; X86-NEXT: andb %cl, %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: issignaling_f: | |
| ; X64: # %bb.0: | |
| ; X64-NEXT: movd %xmm0, %eax | |
| ; X64-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X64-NEXT: cmpl $2143289344, %eax # imm = 0x7FC00000 | |
| ; X64-NEXT: setl %cl | |
| ; X64-NEXT: cmpl $2139095041, %eax # imm = 0x7F800001 | |
| ; X64-NEXT: setge %al | |
| ; X64-NEXT: andb %cl, %al | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-FASTISEL-LABEL: issignaling_f: | |
| ; X86-FASTISEL: # %bb.0: | |
| ; X86-FASTISEL-NEXT: pushl %eax | |
| ; X86-FASTISEL-NEXT: flds {{[0-9]+}}(%esp) | |
| ; X86-FASTISEL-NEXT: fstps (%esp) | |
| ; X86-FASTISEL-NEXT: movl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X86-FASTISEL-NEXT: andl (%esp), %eax | |
| ; X86-FASTISEL-NEXT: cmpl $2143289344, %eax # imm = 0x7FC00000 | |
| ; X86-FASTISEL-NEXT: setl %cl | |
| ; X86-FASTISEL-NEXT: cmpl $2139095041, %eax # imm = 0x7F800001 | |
| ; X86-FASTISEL-NEXT: setge %al | |
| ; X86-FASTISEL-NEXT: andb %cl, %al | |
| ; X86-FASTISEL-NEXT: popl %ecx | |
| ; X86-FASTISEL-NEXT: retl | |
| ; | |
| ; X64-GISEL-LABEL: issignaling_f: | |
| ; X64-GISEL: # %bb.0: | |
| ; X64-GISEL-NEXT: movd %xmm0, %eax | |
| ; X64-GISEL-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X64-GISEL-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000 | |
| ; X64-GISEL-NEXT: seta %cl | |
| ; X64-GISEL-NEXT: cmpl $2143289344, %eax # imm = 0x7FC00000 | |
| ; X64-GISEL-NEXT: setb %al | |
| ; X64-GISEL-NEXT: andb %cl, %al | |
| ; X64-GISEL-NEXT: retq | |
| %a0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1) ; "snan" | |
| ret i1 %a0 | |
| } | |
| define i1 @isquiet_f(float %x) nounwind { | |
| ; X86-LABEL: isquiet_f: | |
| ; X86: # %bb.0: # %entry | |
| ; X86-NEXT: movl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X86-NEXT: andl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: cmpl $2143289344, %eax # imm = 0x7FC00000 | |
| ; X86-NEXT: setge %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: isquiet_f: | |
| ; X64: # %bb.0: # %entry | |
| ; X64-NEXT: movd %xmm0, %eax | |
| ; X64-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X64-NEXT: cmpl $2143289344, %eax # imm = 0x7FC00000 | |
| ; X64-NEXT: setge %al | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-FASTISEL-LABEL: isquiet_f: | |
| ; X86-FASTISEL: # %bb.0: # %entry | |
| ; X86-FASTISEL-NEXT: pushl %eax | |
| ; X86-FASTISEL-NEXT: flds {{[0-9]+}}(%esp) | |
| ; X86-FASTISEL-NEXT: fstps (%esp) | |
| ; X86-FASTISEL-NEXT: movl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X86-FASTISEL-NEXT: andl (%esp), %eax | |
| ; X86-FASTISEL-NEXT: cmpl $2143289344, %eax # imm = 0x7FC00000 | |
| ; X86-FASTISEL-NEXT: setge %al | |
| ; X86-FASTISEL-NEXT: popl %ecx | |
| ; X86-FASTISEL-NEXT: retl | |
| ; | |
| ; X64-GISEL-LABEL: isquiet_f: | |
| ; X64-GISEL: # %bb.0: # %entry | |
| ; X64-GISEL-NEXT: movd %xmm0, %eax | |
| ; X64-GISEL-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X64-GISEL-NEXT: cmpl $2143289344, %eax # imm = 0x7FC00000 | |
| ; X64-GISEL-NEXT: setae %al | |
| ; X64-GISEL-NEXT: retq | |
| entry: | |
| %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 2) ; "qnan" | |
| ret i1 %0 | |
| } | |
| define i1 @not_isquiet_f(float %x) nounwind { | |
| ; X86-LABEL: not_isquiet_f: | |
| ; X86: # %bb.0: # %entry | |
| ; X86-NEXT: movl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X86-NEXT: andl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: cmpl $2143289344, %eax # imm = 0x7FC00000 | |
| ; X86-NEXT: setl %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: not_isquiet_f: | |
| ; X64: # %bb.0: # %entry | |
| ; X64-NEXT: movd %xmm0, %eax | |
| ; X64-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X64-NEXT: cmpl $2143289344, %eax # imm = 0x7FC00000 | |
| ; X64-NEXT: setl %al | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-FASTISEL-LABEL: not_isquiet_f: | |
| ; X86-FASTISEL: # %bb.0: # %entry | |
| ; X86-FASTISEL-NEXT: pushl %eax | |
| ; X86-FASTISEL-NEXT: flds {{[0-9]+}}(%esp) | |
| ; X86-FASTISEL-NEXT: fstps (%esp) | |
| ; X86-FASTISEL-NEXT: movl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X86-FASTISEL-NEXT: andl (%esp), %eax | |
| ; X86-FASTISEL-NEXT: cmpl $2143289344, %eax # imm = 0x7FC00000 | |
| ; X86-FASTISEL-NEXT: setl %al | |
| ; X86-FASTISEL-NEXT: popl %ecx | |
| ; X86-FASTISEL-NEXT: retl | |
| ; | |
| ; X64-GISEL-LABEL: not_isquiet_f: | |
| ; X64-GISEL: # %bb.0: # %entry | |
| ; X64-GISEL-NEXT: movd %xmm0, %eax | |
| ; X64-GISEL-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X64-GISEL-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000 | |
| ; X64-GISEL-NEXT: setb %cl | |
| ; X64-GISEL-NEXT: sete %dl | |
| ; X64-GISEL-NEXT: orb %cl, %dl | |
| ; X64-GISEL-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000 | |
| ; X64-GISEL-NEXT: seta %cl | |
| ; X64-GISEL-NEXT: cmpl $2143289344, %eax # imm = 0x7FC00000 | |
| ; X64-GISEL-NEXT: setb %al | |
| ; X64-GISEL-NEXT: andb %cl, %al | |
| ; X64-GISEL-NEXT: orb %dl, %al | |
| ; X64-GISEL-NEXT: retq | |
| entry: | |
| %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1021) ; ~"qnan" | |
| ret i1 %0 | |
| } | |
| define i1 @isinf_f(float %x) nounwind { | |
| ; X86-LABEL: isinf_f: | |
| ; X86: # %bb.0: # %entry | |
| ; X86-NEXT: movl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X86-NEXT: andl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000 | |
| ; X86-NEXT: sete %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: isinf_f: | |
| ; X64: # %bb.0: # %entry | |
| ; X64-NEXT: movd %xmm0, %eax | |
| ; X64-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X64-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000 | |
| ; X64-NEXT: sete %al | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-FASTISEL-LABEL: isinf_f: | |
| ; X86-FASTISEL: # %bb.0: # %entry | |
| ; X86-FASTISEL-NEXT: pushl %eax | |
| ; X86-FASTISEL-NEXT: flds {{[0-9]+}}(%esp) | |
| ; X86-FASTISEL-NEXT: fstps (%esp) | |
| ; X86-FASTISEL-NEXT: movl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X86-FASTISEL-NEXT: andl (%esp), %eax | |
| ; X86-FASTISEL-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000 | |
| ; X86-FASTISEL-NEXT: sete %al | |
| ; X86-FASTISEL-NEXT: popl %ecx | |
| ; X86-FASTISEL-NEXT: retl | |
| ; | |
| ; X64-GISEL-LABEL: isinf_f: | |
| ; X64-GISEL: # %bb.0: # %entry | |
| ; X64-GISEL-NEXT: movd %xmm0, %eax | |
| ; X64-GISEL-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X64-GISEL-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000 | |
| ; X64-GISEL-NEXT: sete %al | |
| ; X64-GISEL-NEXT: retq | |
| entry: | |
| %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 516) ; 0x204 = "inf" | |
| ret i1 %0 | |
| } | |
| define i1 @not_isinf_f(float %x) nounwind { | |
| ; X86-LABEL: not_isinf_f: | |
| ; X86: # %bb.0: # %entry | |
| ; X86-NEXT: movl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X86-NEXT: andl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000 | |
| ; X86-NEXT: setne %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: not_isinf_f: | |
| ; X64: # %bb.0: # %entry | |
| ; X64-NEXT: movd %xmm0, %eax | |
| ; X64-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X64-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000 | |
| ; X64-NEXT: setne %al | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-FASTISEL-LABEL: not_isinf_f: | |
| ; X86-FASTISEL: # %bb.0: # %entry | |
| ; X86-FASTISEL-NEXT: pushl %eax | |
| ; X86-FASTISEL-NEXT: flds {{[0-9]+}}(%esp) | |
| ; X86-FASTISEL-NEXT: fstps (%esp) | |
| ; X86-FASTISEL-NEXT: movl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X86-FASTISEL-NEXT: andl (%esp), %eax | |
| ; X86-FASTISEL-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000 | |
| ; X86-FASTISEL-NEXT: setne %al | |
| ; X86-FASTISEL-NEXT: popl %ecx | |
| ; X86-FASTISEL-NEXT: retl | |
| ; | |
| ; X64-GISEL-LABEL: not_isinf_f: | |
| ; X64-GISEL: # %bb.0: # %entry | |
| ; X64-GISEL-NEXT: movd %xmm0, %eax | |
| ; X64-GISEL-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X64-GISEL-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000 | |
| ; X64-GISEL-NEXT: setb %cl | |
| ; X64-GISEL-NEXT: seta %al | |
| ; X64-GISEL-NEXT: orb %cl, %al | |
| ; X64-GISEL-NEXT: retq | |
| entry: | |
| %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 507) ; ~0x204 = "~inf" | |
| ret i1 %0 | |
| } | |
| define i1 @is_plus_inf_f(float %x) nounwind { | |
| ; X86-LABEL: is_plus_inf_f: | |
| ; X86: # %bb.0: # %entry | |
| ; X86-NEXT: cmpl $2139095040, {{[0-9]+}}(%esp) # imm = 0x7F800000 | |
| ; X86-NEXT: sete %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: is_plus_inf_f: | |
| ; X64: # %bb.0: # %entry | |
| ; X64-NEXT: movd %xmm0, %eax | |
| ; X64-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000 | |
| ; X64-NEXT: sete %al | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-FASTISEL-LABEL: is_plus_inf_f: | |
| ; X86-FASTISEL: # %bb.0: # %entry | |
| ; X86-FASTISEL-NEXT: pushl %eax | |
| ; X86-FASTISEL-NEXT: flds {{[0-9]+}}(%esp) | |
| ; X86-FASTISEL-NEXT: fstps (%esp) | |
| ; X86-FASTISEL-NEXT: cmpl $2139095040, (%esp) # imm = 0x7F800000 | |
| ; X86-FASTISEL-NEXT: sete %al | |
| ; X86-FASTISEL-NEXT: popl %ecx | |
| ; X86-FASTISEL-NEXT: retl | |
| ; | |
| ; X64-GISEL-LABEL: is_plus_inf_f: | |
| ; X64-GISEL: # %bb.0: # %entry | |
| ; X64-GISEL-NEXT: movd %xmm0, %eax | |
| ; X64-GISEL-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000 | |
| ; X64-GISEL-NEXT: sete %al | |
| ; X64-GISEL-NEXT: retq | |
| entry: | |
| %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 512) ; 0x200 = "+inf" | |
| ret i1 %0 | |
| } | |
| define i1 @is_minus_inf_f(float %x) nounwind { | |
| ; X86-LABEL: is_minus_inf_f: | |
| ; X86: # %bb.0: # %entry | |
| ; X86-NEXT: cmpl $-8388608, {{[0-9]+}}(%esp) # imm = 0xFF800000 | |
| ; X86-NEXT: sete %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: is_minus_inf_f: | |
| ; X64: # %bb.0: # %entry | |
| ; X64-NEXT: movd %xmm0, %eax | |
| ; X64-NEXT: cmpl $-8388608, %eax # imm = 0xFF800000 | |
| ; X64-NEXT: sete %al | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-FASTISEL-LABEL: is_minus_inf_f: | |
| ; X86-FASTISEL: # %bb.0: # %entry | |
| ; X86-FASTISEL-NEXT: pushl %eax | |
| ; X86-FASTISEL-NEXT: flds {{[0-9]+}}(%esp) | |
| ; X86-FASTISEL-NEXT: fstps (%esp) | |
| ; X86-FASTISEL-NEXT: cmpl $-8388608, (%esp) # imm = 0xFF800000 | |
| ; X86-FASTISEL-NEXT: sete %al | |
| ; X86-FASTISEL-NEXT: popl %ecx | |
| ; X86-FASTISEL-NEXT: retl | |
| ; | |
| ; X64-GISEL-LABEL: is_minus_inf_f: | |
| ; X64-GISEL: # %bb.0: # %entry | |
| ; X64-GISEL-NEXT: movd %xmm0, %eax | |
| ; X64-GISEL-NEXT: cmpl $-8388608, %eax # imm = 0xFF800000 | |
| ; X64-GISEL-NEXT: sete %al | |
| ; X64-GISEL-NEXT: retq | |
| entry: | |
| %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 4) ; "-inf" | |
| ret i1 %0 | |
| } | |
| define i1 @not_is_minus_inf_f(float %x) nounwind { | |
| ; X86-LABEL: not_is_minus_inf_f: | |
| ; X86: # %bb.0: # %entry | |
| ; X86-NEXT: cmpl $-8388608, {{[0-9]+}}(%esp) # imm = 0xFF800000 | |
| ; X86-NEXT: setne %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: not_is_minus_inf_f: | |
| ; X64: # %bb.0: # %entry | |
| ; X64-NEXT: movd %xmm0, %eax | |
| ; X64-NEXT: cmpl $-8388608, %eax # imm = 0xFF800000 | |
| ; X64-NEXT: setne %al | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-FASTISEL-LABEL: not_is_minus_inf_f: | |
| ; X86-FASTISEL: # %bb.0: # %entry | |
| ; X86-FASTISEL-NEXT: pushl %eax | |
| ; X86-FASTISEL-NEXT: flds {{[0-9]+}}(%esp) | |
| ; X86-FASTISEL-NEXT: fstps (%esp) | |
| ; X86-FASTISEL-NEXT: cmpl $-8388608, (%esp) # imm = 0xFF800000 | |
| ; X86-FASTISEL-NEXT: setne %al | |
| ; X86-FASTISEL-NEXT: popl %ecx | |
| ; X86-FASTISEL-NEXT: retl | |
| ; | |
| ; X64-GISEL-LABEL: not_is_minus_inf_f: | |
| ; X64-GISEL: # %bb.0: # %entry | |
| ; X64-GISEL-NEXT: movd %xmm0, %eax | |
| ; X64-GISEL-NEXT: movl %eax, %ecx | |
| ; X64-GISEL-NEXT: andl $2147483647, %ecx # imm = 0x7FFFFFFF | |
| ; X64-GISEL-NEXT: cmpl $2139095040, %ecx # imm = 0x7F800000 | |
| ; X64-GISEL-NEXT: setb %dl | |
| ; X64-GISEL-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000 | |
| ; X64-GISEL-NEXT: sete %sil | |
| ; X64-GISEL-NEXT: orb %dl, %sil | |
| ; X64-GISEL-NEXT: cmpl $2139095040, %ecx # imm = 0x7F800000 | |
| ; X64-GISEL-NEXT: seta %al | |
| ; X64-GISEL-NEXT: orb %sil, %al | |
| ; X64-GISEL-NEXT: retq | |
| entry: | |
| %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 1019) ; ~"-inf" | |
| ret i1 %0 | |
| } | |
| define i1 @isfinite_f(float %x) nounwind { | |
| ; X86-LABEL: isfinite_f: | |
| ; X86: # %bb.0: # %entry | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: addl %eax, %eax | |
| ; X86-NEXT: cmpl $-16777216, %eax # imm = 0xFF000000 | |
| ; X86-NEXT: setb %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: isfinite_f: | |
| ; X64: # %bb.0: # %entry | |
| ; X64-NEXT: movd %xmm0, %eax | |
| ; X64-NEXT: addl %eax, %eax | |
| ; X64-NEXT: cmpl $-16777216, %eax # imm = 0xFF000000 | |
| ; X64-NEXT: setb %al | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-FASTISEL-LABEL: isfinite_f: | |
| ; X86-FASTISEL: # %bb.0: # %entry | |
| ; X86-FASTISEL-NEXT: pushl %eax | |
| ; X86-FASTISEL-NEXT: flds {{[0-9]+}}(%esp) | |
| ; X86-FASTISEL-NEXT: fstps (%esp) | |
| ; X86-FASTISEL-NEXT: movl (%esp), %eax | |
| ; X86-FASTISEL-NEXT: addl %eax, %eax | |
| ; X86-FASTISEL-NEXT: cmpl $-16777216, %eax # imm = 0xFF000000 | |
| ; X86-FASTISEL-NEXT: setb %al | |
| ; X86-FASTISEL-NEXT: popl %ecx | |
| ; X86-FASTISEL-NEXT: retl | |
| ; | |
| ; X64-GISEL-LABEL: isfinite_f: | |
| ; X64-GISEL: # %bb.0: # %entry | |
| ; X64-GISEL-NEXT: movd %xmm0, %eax | |
| ; X64-GISEL-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X64-GISEL-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000 | |
| ; X64-GISEL-NEXT: setb %al | |
| ; X64-GISEL-NEXT: retq | |
| entry: | |
| %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 504) ; 0x1f8 = "finite" | |
| ret i1 %0 | |
| } | |
| define i1 @not_isfinite_f(float %x) nounwind { | |
| ; X86-LABEL: not_isfinite_f: | |
| ; X86: # %bb.0: # %entry | |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax | |
| ; X86-NEXT: addl %eax, %eax | |
| ; X86-NEXT: cmpl $-16777216, %eax # imm = 0xFF000000 | |
| ; X86-NEXT: setae %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: not_isfinite_f: | |
| ; X64: # %bb.0: # %entry | |
| ; X64-NEXT: movd %xmm0, %eax | |
| ; X64-NEXT: addl %eax, %eax | |
| ; X64-NEXT: cmpl $-16777216, %eax # imm = 0xFF000000 | |
| ; X64-NEXT: setae %al | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-FASTISEL-LABEL: not_isfinite_f: | |
| ; X86-FASTISEL: # %bb.0: # %entry | |
| ; X86-FASTISEL-NEXT: pushl %eax | |
| ; X86-FASTISEL-NEXT: flds {{[0-9]+}}(%esp) | |
| ; X86-FASTISEL-NEXT: fstps (%esp) | |
| ; X86-FASTISEL-NEXT: movl (%esp), %eax | |
| ; X86-FASTISEL-NEXT: addl %eax, %eax | |
| ; X86-FASTISEL-NEXT: cmpl $-16777216, %eax # imm = 0xFF000000 | |
| ; X86-FASTISEL-NEXT: setae %al | |
| ; X86-FASTISEL-NEXT: popl %ecx | |
| ; X86-FASTISEL-NEXT: retl | |
| ; | |
| ; X64-GISEL-LABEL: not_isfinite_f: | |
| ; X64-GISEL: # %bb.0: # %entry | |
| ; X64-GISEL-NEXT: movd %xmm0, %eax | |
| ; X64-GISEL-NEXT: andl $2147483647, %eax # imm = 0x7FFFFFFF | |
| ; X64-GISEL-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000 | |
| ; X64-GISEL-NEXT: sete %cl | |
| ; X64-GISEL-NEXT: seta %al | |
| ; X64-GISEL-NEXT: orb %cl, %al | |
| ; X64-GISEL-NEXT: retq | |
| entry: | |
| %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 519) ; ~0x1f8 = "~finite" | |
| ret i1 %0 | |
| } | |
| define i1 @is_plus_finite_f(float %x) nounwind { | |
| ; X86-LABEL: is_plus_finite_f: | |
| ; X86: # %bb.0: # %entry | |
| ; X86-NEXT: cmpl $2139095040, {{[0-9]+}}(%esp) # imm = 0x7F800000 | |
| ; X86-NEXT: setb %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: is_plus_finite_f: | |
| ; X64: # %bb.0: # %entry | |
| ; X64-NEXT: movd %xmm0, %eax | |
| ; X64-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000 | |
| ; X64-NEXT: setb %al | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-FASTISEL-LABEL: is_plus_finite_f: | |
| ; X86-FASTISEL: # %bb.0: # %entry | |
| ; X86-FASTISEL-NEXT: pushl %eax | |
| ; X86-FASTISEL-NEXT: flds {{[0-9]+}}(%esp) | |
| ; X86-FASTISEL-NEXT: fstps (%esp) | |
| ; X86-FASTISEL-NEXT: cmpl $2139095040, (%esp) # imm = 0x7F800000 | |
| ; X86-FASTISEL-NEXT: setb %al | |
| ; X86-FASTISEL-NEXT: popl %ecx | |
| ; X86-FASTISEL-NEXT: retl | |
| ; | |
| ; X64-GISEL-LABEL: is_plus_finite_f: | |
| ; X64-GISEL: # %bb.0: # %entry | |
| ; X64-GISEL-NEXT: movd %xmm0, %eax | |
| ; X64-GISEL-NEXT: cmpl $2139095040, %eax # imm = 0x7F800000 | |
| ; X64-GISEL-NEXT: setb %al | |
| ; X64-GISEL-NEXT: retq | |
| entry: | |
| %0 = tail call i1 @llvm.is.fpclass.f32(float %x, i32 448) ; 0x1c0 = "+finite" | |
| ret i1 %0 | |
| } | |
| define i1 @isnone_d(double %x) nounwind { | |
| ; X86-LABEL: isnone_d: | |
| ; X86: # %bb.0: # %entry | |
| ; X86-NEXT: xorl %eax, %eax | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: isnone_d: | |
| ; X64: # %bb.0: # %entry | |
| ; X64-NEXT: xorl %eax, %eax | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-FASTISEL-LABEL: isnone_d: | |
| ; X86-FASTISEL: # %bb.0: # %entry | |
| ; X86-FASTISEL-NEXT: fldl {{[0-9]+}}(%esp) | |
| ; X86-FASTISEL-NEXT: fstp %st(0) | |
| ; X86-FASTISEL-NEXT: xorl %eax, %eax | |
| ; X86-FASTISEL-NEXT: retl | |
| ; | |
| ; X64-GISEL-LABEL: isnone_d: | |
| ; X64-GISEL: # %bb.0: # %entry | |
| ; X64-GISEL-NEXT: xorl %eax, %eax | |
| ; X64-GISEL-NEXT: retq | |
| entry: | |
| %0 = tail call i1 @llvm.is.fpclass.f64(double %x, i32 0) | |
| ret i1 %0 | |
| } | |
| define i1 @isany_d(double %x) nounwind { | |
| ; X86-LABEL: isany_d: | |
| ; X86: # %bb.0: # %entry | |
| ; X86-NEXT: movb $1, %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-LABEL: isany_d: | |
| ; X64: # %bb.0: # %entry | |
| ; X64-NEXT: movb $1, %al | |
| ; X64-NEXT: retq | |
| ; | |
| ; X86-FASTISEL-LABEL: isany_d: | |
| ; X86-FASTISEL: # %bb.0: # %entry | |
| ; X86-FASTISEL-NEXT: fldl {{[0-9]+}}(%esp) | |
| ; X86-FASTISEL-NEXT: fstp %st(0) | |
| ; X86-FASTISEL-NEXT: movb $1, %al | |
| ; X86-FASTISEL-NEXT: retl | |
| ; | |
| ; X64-GISEL-LABEL: isany_d: | |
| ; X64-GISEL: # %bb.0: # %entry | |
| ; X64-GISEL-NEXT: movb $1, %al | |
| ; X64-GISEL-NEXT: retq | |
| entry: | |
| %0 = tail call i1 @llvm.is.fpclass.f64(double %x, i32 1023) | |
| ret i1 %0 | |
| } | |
| define i1 @isnone_f80(x86_fp80 %x) nounwind { | |
| ; X86-LABEL: isnone_f80: | |
| ; X86: # %bb.0: # %entry | |
| ; X86-NEXT: xorl %eax, %eax | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-SDAGISEL-LABEL: isnone_f80: | |
| ; X64-SDAGISEL: # %bb.0: # %entry | |
| ; X64-SDAGISEL-NEXT: xorl %eax, %eax | |
| ; X64-SDAGISEL-NEXT: retq | |
| ; | |
| ; X86-FASTISEL-LABEL: isnone_f80: | |
| ; X86-FASTISEL: # %bb.0: # %entry | |
| ; X86-FASTISEL-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-FASTISEL-NEXT: fstp %st(0) | |
| ; X86-FASTISEL-NEXT: xorl %eax, %eax | |
| ; X86-FASTISEL-NEXT: retl | |
| ; | |
| ; X64-FASTISEL-LABEL: isnone_f80: | |
| ; X64-FASTISEL: # %bb.0: # %entry | |
| ; X64-FASTISEL-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-FASTISEL-NEXT: fstp %st(0) | |
| ; X64-FASTISEL-NEXT: xorl %eax, %eax | |
| ; X64-FASTISEL-NEXT: retq | |
| ; | |
| ; X64-GISEL-LABEL: isnone_f80: | |
| ; X64-GISEL: # %bb.0: # %entry | |
| ; X64-GISEL-NEXT: xorl %eax, %eax | |
| ; X64-GISEL-NEXT: retq | |
| entry: | |
| %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 0) | |
| ret i1 %0 | |
| } | |
| define i1 @isany_f80(x86_fp80 %x) nounwind { | |
| ; X86-LABEL: isany_f80: | |
| ; X86: # %bb.0: # %entry | |
| ; X86-NEXT: movb $1, %al | |
| ; X86-NEXT: retl | |
| ; | |
| ; X64-SDAGISEL-LABEL: isany_f80: | |
| ; X64-SDAGISEL: # %bb.0: # %entry | |
| ; X64-SDAGISEL-NEXT: movb $1, %al | |
| ; X64-SDAGISEL-NEXT: retq | |
| ; | |
| ; X86-FASTISEL-LABEL: isany_f80: | |
| ; X86-FASTISEL: # %bb.0: # %entry | |
| ; X86-FASTISEL-NEXT: fldt {{[0-9]+}}(%esp) | |
| ; X86-FASTISEL-NEXT: fstp %st(0) | |
| ; X86-FASTISEL-NEXT: movb $1, %al | |
| ; X86-FASTISEL-NEXT: retl | |
| ; | |
| ; X64-FASTISEL-LABEL: isany_f80: | |
| ; X64-FASTISEL: # %bb.0: # %entry | |
| ; X64-FASTISEL-NEXT: fldt {{[0-9]+}}(%rsp) | |
| ; X64-FASTISEL-NEXT: fstp %st(0) | |
| ; X64-FASTISEL-NEXT: movb $1, %al | |
| ; X64-FASTISEL-NEXT: retq | |
| ; | |
| ; X64-GISEL-LABEL: isany_f80: | |
| ; X64-GISEL: # %bb.0: # %entry | |
| ; X64-GISEL-NEXT: movb $1, %al | |
| ; X64-GISEL-NEXT: retq | |
| entry: | |
| %0 = tail call i1 @llvm.is.fpclass.f80(x86_fp80 %x, i32 1023) | |
| ret i1 %0 | |
| } |