1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-02-01 13:11:39 +01:00
llvm-mirror/test/CodeGen/PowerPC/fast-isel-fcmp-nan.ll
Tim Shen 695f1e65cb [PPC, FastISel] Fix ordered/unordered fcmp
For fcmp, major concern about the following 6 cases is NaN result. The
comparison result consists of 4 bits, indicating lt, eq, gt and un (unordered),
only one of which will be set. The result is generated by fcmpu
instruction. However, bc instruction only inspects one of the first 3
bits, so when un is set, bc instruction may jump to to an undesired
place.

More specifically, if we expect an unordered comparison and un is set, we
expect to always go to true branch; in such case UEQ, UGT and ULT still
give false, which are undesired; but UNE, UGE, ULE happen to give true,
since they are tested by inspecting !eq, !lt, !gt, respectively.

Similarly, for ordered comparison, when un is set, we always expect the
result to be false. In such case OGT, OLT and OEQ is good, since they are
actually testing GT, LT, and EQ respectively, which are false. OGE, OLE
and ONE are tested through !lt, !gt and !eq, and these are true.

llvm-svn: 263753
2016-03-17 22:27:58 +00:00

188 lines
2.7 KiB
LLVM

; RUN: llc -mtriple powerpc64le-unknown-linux-gnu -fast-isel -O0 < %s | FileCheck %s
define i1 @TestULT(double %t0) {
; CHECK-LABEL: TestULT:
; CHECK: mcrf
; CHECK: blr
entry:
%t1 = fcmp ult double %t0, 0.000000e+00
br i1 %t1, label %good, label %bad
bad:
ret i1 false
good:
ret i1 true
}
define i1 @TestULE(double %t0) {
; CHECK-LABEL: TestULE:
; CHECK: fcmpu
; CHECK-NEXT: ble
; CHECK: blr
entry:
%t1 = fcmp ule double %t0, 0.000000e+00
br i1 %t1, label %good, label %bad
bad:
ret i1 false
good:
ret i1 true
}
define i1 @TestUNE(double %t0) {
; CHECK-LABEL: TestUNE:
; CHECK: fcmpu
; CHECK-NEXT: bne
; CHECK: blr
entry:
%t1 = fcmp une double %t0, 0.000000e+00
br i1 %t1, label %good, label %bad
bad:
ret i1 false
good:
ret i1 true
}
define i1 @TestUEQ(double %t0) {
; CHECK-LABEL: TestUEQ:
; CHECK: mcrf
; CHECK: blr
entry:
%t1 = fcmp ueq double %t0, 0.000000e+00
br i1 %t1, label %good, label %bad
bad:
ret i1 false
good:
ret i1 true
}
define i1 @TestUGT(double %t0) {
; CHECK-LABEL: TestUGT:
; CHECK: mcrf
; CHECK: blr
entry:
%t1 = fcmp ugt double %t0, 0.000000e+00
br i1 %t1, label %good, label %bad
bad:
ret i1 false
good:
ret i1 true
}
define i1 @TestUGE(double %t0) {
; CHECK-LABEL: TestUGE:
; CHECK: fcmpu
; CHECK-NEXT: bge
; CHECK: blr
entry:
%t1 = fcmp uge double %t0, 0.000000e+00
br i1 %t1, label %good, label %bad
bad:
ret i1 false
good:
ret i1 true
}
define i1 @TestOLT(double %t0) {
; CHECK-LABEL: TestOLT:
; CHECK: fcmpu
; CHECK-NEXT: blt
; CHECK: blr
entry:
%t1 = fcmp olt double %t0, 0.000000e+00
br i1 %t1, label %good, label %bad
bad:
ret i1 false
good:
ret i1 true
}
define i1 @TestOLE(double %t0) {
; CHECK-LABEL: TestOLE:
; CHECK: mcrf
; CHECK: blr
entry:
%t1 = fcmp ole double %t0, 0.000000e+00
br i1 %t1, label %good, label %bad
bad:
ret i1 false
good:
ret i1 true
}
define i1 @TestONE(double %t0) {
; CHECK-LABEL: TestONE:
; CHECK: mcrf
; CHECK: blr
entry:
%t1 = fcmp one double %t0, 0.000000e+00
br i1 %t1, label %good, label %bad
bad:
ret i1 false
good:
ret i1 true
}
define i1 @TestOEQ(double %t0) {
; CHECK-LABEL: TestOEQ:
; CHECK: fcmpu
; CHECK-NEXT: beq
; CHECK: blr
entry:
%t1 = fcmp oeq double %t0, 0.000000e+00
br i1 %t1, label %good, label %bad
bad:
ret i1 false
good:
ret i1 true
}
define i1 @TestOGT(double %t0) {
; CHECK-LABEL: TestOGT:
; CHECK: fcmpu
; CHECK-NEXT: bgt
; CHECK: blr
entry:
%t1 = fcmp ogt double %t0, 0.000000e+00
br i1 %t1, label %good, label %bad
bad:
ret i1 false
good:
ret i1 true
}
define i1 @TestOGE(double %t0) {
; CHECK-LABEL: TestOGE:
; CHECK: mcrf
; CHECK: blr
entry:
%t1 = fcmp oge double %t0, 0.000000e+00
br i1 %t1, label %good, label %bad
bad:
ret i1 false
good:
ret i1 true
}