diff test/CodeGen/X86/compare-inf.ll @ 0:95c75e76d11b LLVM3.4

LLVM 3.4
author Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
date Thu, 12 Dec 2013 13:56:28 +0900
parents
children 803732b1fca8
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/CodeGen/X86/compare-inf.ll	Thu Dec 12 13:56:28 2013 +0900
@@ -0,0 +1,126 @@
+; RUN: llc < %s -march=x86-64 | FileCheck %s
+
+; Convert oeq and une to ole/oge/ule/uge when comparing with infinity
+; and negative infinity, because those are more efficient on x86.
+
+declare void @f() nounwind
+
+; CHECK-LABEL: oeq_inff:
+; CHECK: ucomiss
+; CHECK: jb
+define void @oeq_inff(float %x) nounwind {
+  %t0 = fcmp oeq float %x, 0x7FF0000000000000
+  br i1 %t0, label %true, label %false
+
+true:
+  call void @f() nounwind
+  br label %false
+
+false:
+  ret void
+}
+
+; CHECK-LABEL: oeq_inf:
+; CHECK: ucomisd
+; CHECK: jb
+define void @oeq_inf(double %x) nounwind {
+  %t0 = fcmp oeq double %x, 0x7FF0000000000000
+  br i1 %t0, label %true, label %false
+
+true:
+  call void @f() nounwind
+  br label %false
+
+false:
+  ret void
+}
+
+; CHECK-LABEL: une_inff:
+; CHECK: ucomiss
+; CHECK: jae
+define void @une_inff(float %x) nounwind {
+  %t0 = fcmp une float %x, 0x7FF0000000000000
+  br i1 %t0, label %true, label %false
+
+true:
+  call void @f() nounwind
+  br label %false
+
+false:
+  ret void
+}
+
+; CHECK-LABEL: une_inf:
+; CHECK: ucomisd
+; CHECK: jae
+define void @une_inf(double %x) nounwind {
+  %t0 = fcmp une double %x, 0x7FF0000000000000
+  br i1 %t0, label %true, label %false
+
+true:
+  call void @f() nounwind
+  br label %false
+
+false:
+  ret void
+}
+
+; CHECK-LABEL: oeq_neg_inff:
+; CHECK: ucomiss
+; CHECK: jb
+define void @oeq_neg_inff(float %x) nounwind {
+  %t0 = fcmp oeq float %x, 0xFFF0000000000000
+  br i1 %t0, label %true, label %false
+
+true:
+  call void @f() nounwind
+  br label %false
+
+false:
+  ret void
+}
+
+; CHECK-LABEL: oeq_neg_inf:
+; CHECK: ucomisd
+; CHECK: jb
+define void @oeq_neg_inf(double %x) nounwind {
+  %t0 = fcmp oeq double %x, 0xFFF0000000000000
+  br i1 %t0, label %true, label %false
+
+true:
+  call void @f() nounwind
+  br label %false
+
+false:
+  ret void
+}
+
+; CHECK-LABEL: une_neg_inff:
+; CHECK: ucomiss
+; CHECK: jae
+define void @une_neg_inff(float %x) nounwind {
+  %t0 = fcmp une float %x, 0xFFF0000000000000
+  br i1 %t0, label %true, label %false
+
+true:
+  call void @f() nounwind
+  br label %false
+
+false:
+  ret void
+}
+
+; CHECK-LABEL: une_neg_inf:
+; CHECK: ucomisd
+; CHECK: jae
+define void @une_neg_inf(double %x) nounwind {
+  %t0 = fcmp une double %x, 0xFFF0000000000000
+  br i1 %t0, label %true, label %false
+
+true:
+  call void @f() nounwind
+  br label %false
+
+false:
+  ret void
+}