| ; RUN: llc < %s -mtriple=x86_64-pc-unknown -mattr=+sse2 | FileCheck -check-prefix=CHECK -check-prefix=CHECK64 %s | |
| ; PR19059 | |
| ; RUN: llc < %s -mtriple=i686-pc-unknown -mattr=+sse2 | FileCheck -check-prefix=CHECK -check-prefix=CHECK32 %s | |
| define i32 @isint_return(double %d) nounwind { | |
| ; CHECK-LABEL: isint_return: | |
| ; CHECK-NOT: xor | |
| ; CHECK: cvt | |
| %i = fptosi double %d to i32 | |
| ; CHECK-NEXT: cvt | |
| %e = sitofp i32 %i to double | |
| ; CHECK: cmpeqsd | |
| %c = fcmp oeq double %d, %e | |
| ; CHECK32-NOT: movd {{.*}}, %r{{.*}} | |
| ; CHECK32-NOT: andq | |
| ; CHECK32-NEXT: movd | |
| ; CHECK64-NEXT: movq | |
| ; CHECK-NEXT: andl | |
| %z = zext i1 %c to i32 | |
| ret i32 %z | |
| } | |
| define i32 @isint_float_return(float %f) nounwind { | |
| ; CHECK-LABEL: isint_float_return: | |
| ; CHECK-NOT: xor | |
| ; CHECK: cvt | |
| %i = fptosi float %f to i32 | |
| ; CHECK-NEXT: cvt | |
| %g = sitofp i32 %i to float | |
| ; CHECK: cmpeqss | |
| %c = fcmp oeq float %f, %g | |
| ; CHECK-NOT: movd {{.*}}, %r{{.*}} | |
| ; CHECK-NEXT: movd | |
| ; CHECK-NEXT: andl | |
| %z = zext i1 %c to i32 | |
| ret i32 %z | |
| } | |
| declare void @foo() | |
| define void @isint_branch(double %d) nounwind { | |
| ; CHECK-LABEL: isint_branch: | |
| ; CHECK: cvt | |
| %i = fptosi double %d to i32 | |
| ; CHECK-NEXT: cvt | |
| %e = sitofp i32 %i to double | |
| ; CHECK: ucomisd | |
| %c = fcmp oeq double %d, %e | |
| ; CHECK-NEXT: jne | |
| ; CHECK-NEXT: jp | |
| br i1 %c, label %true, label %false | |
| true: | |
| call void @foo() | |
| ret void | |
| false: | |
| ret void | |
| } |