[llvm] [SelectionDAGBuilder] Remove NoNaNsFPMath (PR #169904)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 28 06:01:48 PST 2025
https://github.com/paperchalice updated https://github.com/llvm/llvm-project/pull/169904
>From cb990d42fda162048bc3d068f347c67b858f488f Mon Sep 17 00:00:00 2001
From: PaperChalice <liujunchang97 at outlook.com>
Date: Fri, 28 Nov 2025 19:36:20 +0800
Subject: [PATCH 1/4] [SelectionDAG] Remove NoNaNsFPMath Replaced by checking
fast-math flags or nofpclass.
---
.../SelectionDAG/SelectionDAGBuilder.cpp | 57 ++++++++++++++++---
1 file changed, 50 insertions(+), 7 deletions(-)
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index 88b0809b767b5..4e1c2a9de16a9 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -2444,6 +2444,52 @@ static bool InBlock(const Value *V, const BasicBlock *BB) {
return true;
}
+// Similar with isKnownNonNaN in lib/Analysis/ValueTracking.cpp
+// but this version also inspects the def.
+static bool IsKnownNonNaN(const Value *V) {
+ if (auto *C = dyn_cast<ConstantFP>(V))
+ return !C->isNaN();
+
+ if (auto *C = dyn_cast<ConstantDataVector>(V)) {
+ if (!C->getElementType()->isFloatingPointTy())
+ return false;
+ for (unsigned I = 0, E = C->getNumElements(); I < E; ++I) {
+ if (C->getElementAsAPFloat(I).isNaN())
+ return false;
+ }
+ return true;
+ }
+
+ if (isa<ConstantAggregateZero>(V))
+ return true;
+
+ if (const auto *FPOp = dyn_cast<FPMathOperator>(V))
+ return FPOp->hasNoNaNs();
+
+ if (const auto *Arg = dyn_cast<Argument>(V))
+ return Arg->getNoFPClass() & fcNan;
+
+ return false;
+}
+
+static bool AreFCmpOperandsNonNaN(const Instruction *Inst) {
+ assert((isa<FCmpInst>(Inst) || isa<ConstrainedFPCmpIntrinsic>(Inst)) &&
+ "Not fcmp instruction or its intrinsic variants!");
+ if (const auto *VPFCmp = dyn_cast<VPIntrinsic>(Inst))
+ assert(VPFCmp->getIntrinsicID() == Intrinsic::vp_fcmp &&
+ "Not fcmp instruction or its intrinsic variants!");
+
+ if (const auto *FPOp = dyn_cast<FPMathOperator>(Inst))
+ if (FPOp->hasNoNaNs())
+ return true;
+
+ for (const auto &U : Inst->operands())
+ if (!IsKnownNonNaN(U))
+ return false;
+
+ return true;
+}
+
/// EmitBranchForMergedCondition - Helper method for FindMergedConditions.
/// This function emits a branch and is used at the leaves of an OR or an
/// AND operator tree.
@@ -2477,7 +2523,7 @@ SelectionDAGBuilder::EmitBranchForMergedCondition(const Value *Cond,
FCmpInst::Predicate Pred =
InvertCond ? FC->getInversePredicate() : FC->getPredicate();
Condition = getFCmpCondCode(Pred);
- if (TM.Options.NoNaNsFPMath)
+ if (AreFCmpOperandsNonNaN(FC))
Condition = getFCmpCodeWithoutNaN(Condition);
}
@@ -3756,7 +3802,7 @@ void SelectionDAGBuilder::visitFCmp(const FCmpInst &I) {
ISD::CondCode Condition = getFCmpCondCode(predicate);
auto *FPMO = cast<FPMathOperator>(&I);
- if (FPMO->hasNoNaNs() || TM.Options.NoNaNsFPMath)
+ if (AreFCmpOperandsNonNaN(&I))
Condition = getFCmpCodeWithoutNaN(Condition);
SDNodeFlags Flags;
@@ -8480,7 +8526,7 @@ void SelectionDAGBuilder::visitConstrainedFPIntrinsic(
case ISD::STRICT_FSETCCS: {
auto *FPCmp = dyn_cast<ConstrainedFPCmpIntrinsic>(&FPI);
ISD::CondCode Condition = getFCmpCondCode(FPCmp->getPredicate());
- if (TM.Options.NoNaNsFPMath)
+ if (AreFCmpOperandsNonNaN(FPCmp))
Condition = getFCmpCodeWithoutNaN(Condition);
Opers.push_back(DAG.getCondCode(Condition));
break;
@@ -8763,11 +8809,8 @@ void SelectionDAGBuilder::visitVPCmp(const VPCmpIntrinsic &VPIntrin) {
CmpInst::Predicate CondCode = VPIntrin.getPredicate();
bool IsFP = VPIntrin.getOperand(0)->getType()->isFPOrFPVectorTy();
if (IsFP) {
- // FIXME: Regular fcmps are FPMathOperators which may have fast-math (nnan)
- // flags, but calls that don't return floating-point types can't be
- // FPMathOperators, like vp.fcmp. This affects constrained fcmp too.
Condition = getFCmpCondCode(CondCode);
- if (TM.Options.NoNaNsFPMath)
+ if (AreFCmpOperandsNonNaN(&VPIntrin))
Condition = getFCmpCodeWithoutNaN(Condition);
} else {
Condition = getICmpCondCode(CondCode);
>From 3f961c7b3cc2ec6e672878e1823e59a1cb136d8d Mon Sep 17 00:00:00 2001
From: PaperChalice <liujunchang97 at outlook.com>
Date: Fri, 28 Nov 2025 21:19:32 +0800
Subject: [PATCH 2/4] [X86] Consider fast-math flags when combining select
---
llvm/lib/Target/X86/X86ISelLowering.cpp | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 05a854a0bf3fa..679558c8bb766 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -47822,6 +47822,8 @@ static SDValue combineSelect(SDNode *N, SelectionDAG &DAG,
}
if (Opcode) {
+ // Propagate fast-math-flags.
+ SelectionDAG::FlagInserter FlagsInserter(DAG, N->getFlags());
if (IsStrict) {
SDValue Ret = DAG.getNode(Opcode == X86ISD::FMIN ? X86ISD::STRICT_FMIN
: X86ISD::STRICT_FMAX,
@@ -55338,8 +55340,9 @@ static SDValue combineFMinFMax(SDNode *N, SelectionDAG &DAG) {
assert(N->getOpcode() == X86ISD::FMIN || N->getOpcode() == X86ISD::FMAX);
// FMIN/FMAX are commutative if no NaNs and no negative zeros are allowed.
- if (!DAG.getTarget().Options.NoNaNsFPMath ||
- !DAG.getTarget().Options.NoSignedZerosFPMath)
+ if ((!DAG.getTarget().Options.NoNaNsFPMath && !N->getFlags().hasNoNaNs()) ||
+ (!DAG.getTarget().Options.NoSignedZerosFPMath &&
+ !N->getFlags().hasNoSignedZeros()))
return SDValue();
// If we run in unsafe-math mode, then convert the FMAX and FMIN nodes
>From 7266a1fcc87418d179273250953ad116986c2b1c Mon Sep 17 00:00:00 2001
From: PaperChalice <liujunchang97 at outlook.com>
Date: Fri, 28 Nov 2025 21:36:44 +0800
Subject: [PATCH 3/4] Fix X86 tests
---
llvm/test/CodeGen/X86/2006-05-22-FPSetEQ.ll | 16 +-
llvm/test/CodeGen/X86/avx-minmax.ll | 18 +-
llvm/test/CodeGen/X86/sse-minmax-finite.ll | 787 +++++++++++
llvm/test/CodeGen/X86/sse-minmax-unsafe.ll | 687 ++++++++++
llvm/test/CodeGen/X86/sse-minmax.ll | 1332 ++++++-------------
5 files changed, 1924 insertions(+), 916 deletions(-)
create mode 100644 llvm/test/CodeGen/X86/sse-minmax-finite.ll
create mode 100644 llvm/test/CodeGen/X86/sse-minmax-unsafe.ll
diff --git a/llvm/test/CodeGen/X86/2006-05-22-FPSetEQ.ll b/llvm/test/CodeGen/X86/2006-05-22-FPSetEQ.ll
index 940fe8cf6ba75..9f072c6334c07 100644
--- a/llvm/test/CodeGen/X86/2006-05-22-FPSetEQ.ll
+++ b/llvm/test/CodeGen/X86/2006-05-22-FPSetEQ.ll
@@ -1,13 +1,17 @@
-; RUN: llc < %s -mtriple=i686-- -mattr=-sse | FileCheck %s -check-prefix=WITHNANS
-; RUN: llc < %s -mtriple=i686-- -mattr=-sse -enable-no-nans-fp-math | FileCheck %s -check-prefix=NONANS
+; RUN: llc < %s -mtriple=i686-- -mattr=-sse | FileCheck %s
-; WITHNANS-LABEL: test:
-; WITHNANS: setnp
-; NONANS-LABEL: test:
-; NONANS-NOT: setnp
define i32 @test(float %f) {
+; CHECK-LABEL: test:
+; CHECK: setnp
%tmp = fcmp oeq float %f, 0.000000e+00 ; <i1> [#uses=1]
%tmp.upgrd.1 = zext i1 %tmp to i32 ; <i32> [#uses=1]
ret i32 %tmp.upgrd.1
}
+define i32 @test_nnan(float %f) {
+; CHECK-LABEL: test_nnan:
+; CHECK-NOT: setnp
+ %tmp = fcmp nnan oeq float %f, 0.000000e+00 ; <i1> [#uses=1]
+ %tmp.upgrd.1 = zext i1 %tmp to i32 ; <i32> [#uses=1]
+ ret i32 %tmp.upgrd.1
+}
diff --git a/llvm/test/CodeGen/X86/avx-minmax.ll b/llvm/test/CodeGen/X86/avx-minmax.ll
index 8e4b6c6af4cb1..27864a9eefa8e 100644
--- a/llvm/test/CodeGen/X86/avx-minmax.ll
+++ b/llvm/test/CodeGen/X86/avx-minmax.ll
@@ -1,12 +1,12 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx -enable-no-nans-fp-math | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx | FileCheck %s
define <2 x double> @maxpd(<2 x double> %x, <2 x double> %y) {
; CHECK-LABEL: maxpd:
; CHECK: # %bb.0:
; CHECK-NEXT: vmaxpd %xmm1, %xmm0, %xmm0
; CHECK-NEXT: retq
- %max_is_x = fcmp oge <2 x double> %x, %y
+ %max_is_x = fcmp nnan oge <2 x double> %x, %y
%max = select <2 x i1> %max_is_x, <2 x double> %x, <2 x double> %y
ret <2 x double> %max
}
@@ -16,7 +16,7 @@ define <2 x double> @minpd(<2 x double> %x, <2 x double> %y) {
; CHECK: # %bb.0:
; CHECK-NEXT: vminpd %xmm1, %xmm0, %xmm0
; CHECK-NEXT: retq
- %min_is_x = fcmp ole <2 x double> %x, %y
+ %min_is_x = fcmp nnan ole <2 x double> %x, %y
%min = select <2 x i1> %min_is_x, <2 x double> %x, <2 x double> %y
ret <2 x double> %min
}
@@ -26,7 +26,7 @@ define <4 x float> @maxps(<4 x float> %x, <4 x float> %y) {
; CHECK: # %bb.0:
; CHECK-NEXT: vmaxps %xmm1, %xmm0, %xmm0
; CHECK-NEXT: retq
- %max_is_x = fcmp oge <4 x float> %x, %y
+ %max_is_x = fcmp nnan oge <4 x float> %x, %y
%max = select <4 x i1> %max_is_x, <4 x float> %x, <4 x float> %y
ret <4 x float> %max
}
@@ -36,7 +36,7 @@ define <4 x float> @minps(<4 x float> %x, <4 x float> %y) {
; CHECK: # %bb.0:
; CHECK-NEXT: vminps %xmm1, %xmm0, %xmm0
; CHECK-NEXT: retq
- %min_is_x = fcmp ole <4 x float> %x, %y
+ %min_is_x = fcmp nnan ole <4 x float> %x, %y
%min = select <4 x i1> %min_is_x, <4 x float> %x, <4 x float> %y
ret <4 x float> %min
}
@@ -46,7 +46,7 @@ define <4 x double> @vmaxpd(<4 x double> %x, <4 x double> %y) {
; CHECK: # %bb.0:
; CHECK-NEXT: vmaxpd %ymm1, %ymm0, %ymm0
; CHECK-NEXT: retq
- %max_is_x = fcmp oge <4 x double> %x, %y
+ %max_is_x = fcmp nnan oge <4 x double> %x, %y
%max = select <4 x i1> %max_is_x, <4 x double> %x, <4 x double> %y
ret <4 x double> %max
}
@@ -56,7 +56,7 @@ define <4 x double> @vminpd(<4 x double> %x, <4 x double> %y) {
; CHECK: # %bb.0:
; CHECK-NEXT: vminpd %ymm1, %ymm0, %ymm0
; CHECK-NEXT: retq
- %min_is_x = fcmp ole <4 x double> %x, %y
+ %min_is_x = fcmp nnan ole <4 x double> %x, %y
%min = select <4 x i1> %min_is_x, <4 x double> %x, <4 x double> %y
ret <4 x double> %min
}
@@ -66,7 +66,7 @@ define <8 x float> @vmaxps(<8 x float> %x, <8 x float> %y) {
; CHECK: # %bb.0:
; CHECK-NEXT: vmaxps %ymm1, %ymm0, %ymm0
; CHECK-NEXT: retq
- %max_is_x = fcmp oge <8 x float> %x, %y
+ %max_is_x = fcmp nnan oge <8 x float> %x, %y
%max = select <8 x i1> %max_is_x, <8 x float> %x, <8 x float> %y
ret <8 x float> %max
}
@@ -76,7 +76,7 @@ define <8 x float> @vminps(<8 x float> %x, <8 x float> %y) {
; CHECK: # %bb.0:
; CHECK-NEXT: vminps %ymm1, %ymm0, %ymm0
; CHECK-NEXT: retq
- %min_is_x = fcmp ole <8 x float> %x, %y
+ %min_is_x = fcmp nnan ole <8 x float> %x, %y
%min = select <8 x i1> %min_is_x, <8 x float> %x, <8 x float> %y
ret <8 x float> %min
}
diff --git a/llvm/test/CodeGen/X86/sse-minmax-finite.ll b/llvm/test/CodeGen/X86/sse-minmax-finite.ll
new file mode 100644
index 0000000000000..469637964d849
--- /dev/null
+++ b/llvm/test/CodeGen/X86/sse-minmax-finite.ll
@@ -0,0 +1,787 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.2 | FileCheck %s
+
+; Some of these patterns can be matched as SSE min or max. Some of
+; them can be matched provided that the operands are swapped.
+; Some of them can't be matched at all and require a comparison
+; and a conditional branch.
+
+; The naming convention is {,x_,y_}{o,u}{gt,lt,ge,le}{,_inverse}
+; _x: use 0.0 instead of %y
+; _y: use -0.0 instead of %y
+; _inverse : swap the arms of the select.
+
+define double @ogt(double %x, double %y) {
+; CHECK-LABEL: ogt:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ogt double %x, %y
+ %d = select i1 %c, double %x, double %y
+ ret double %d
+}
+
+define double @olt(double %x, double %y) {
+; CHECK-LABEL: olt:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan olt double %x, %y
+ %d = select i1 %c, double %x, double %y
+ ret double %d
+}
+
+define double @ogt_inverse(double %x, double %y) {
+; CHECK-LABEL: ogt_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ogt double %x, %y
+ %d = select i1 %c, double %y, double %x
+ ret double %d
+}
+
+define double @olt_inverse(double %x, double %y) {
+; CHECK-LABEL: olt_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan olt double %x, %y
+ %d = select i1 %c, double %y, double %x
+ ret double %d
+}
+
+define double @oge(double %x, double %y) {
+; CHECK-LABEL: oge:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan oge double %x, %y
+ %d = select i1 %c, double %x, double %y
+ ret double %d
+}
+
+define double @ole(double %x, double %y) {
+; CHECK-LABEL: ole:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ole double %x, %y
+ %d = select i1 %c, double %x, double %y
+ ret double %d
+}
+
+define double @oge_inverse(double %x, double %y) {
+; RELAX-LABEL: oge_inverse:
+; RELAX: # %bb.0:
+; RELAX-NEXT: minsd %xmm1, %xmm0
+; RELAX-NEXT: retq
+; CHECK-LABEL: oge_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan oge double %x, %y
+ %d = select i1 %c, double %y, double %x
+ ret double %d
+}
+
+define double @ole_inverse(double %x, double %y) {
+; RELAX-LABEL: ole_inverse:
+; RELAX: # %bb.0:
+; RELAX-NEXT: maxsd %xmm1, %xmm0
+; RELAX-NEXT: retq
+; CHECK-LABEL: ole_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ole double %x, %y
+ %d = select i1 %c, double %y, double %x
+ ret double %d
+}
+
+define double @ogt_x(double %x) {
+; CHECK-LABEL: ogt_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ogt double %x, 0.000000e+00
+ %d = select i1 %c, double %x, double 0.000000e+00
+ ret double %d
+}
+
+define double @olt_x(double %x) {
+; CHECK-LABEL: olt_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan olt double %x, 0.000000e+00
+ %d = select i1 %c, double %x, double 0.000000e+00
+ ret double %d
+}
+
+define double @ogt_inverse_x(double %x) {
+; CHECK-LABEL: ogt_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ogt double %x, 0.000000e+00
+ %d = select i1 %c, double 0.000000e+00, double %x
+ ret double %d
+}
+
+define double @olt_inverse_x(double %x) {
+; CHECK-LABEL: olt_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan olt double %x, 0.000000e+00
+ %d = select i1 %c, double 0.000000e+00, double %x
+ ret double %d
+}
+
+define double @oge_x(double %x) {
+; CHECK-LABEL: oge_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan oge double %x, 0.000000e+00
+ %d = select i1 %c, double %x, double 0.000000e+00
+ ret double %d
+}
+
+define double @ole_x(double %x) {
+; CHECK-LABEL: ole_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ole double %x, 0.000000e+00
+ %d = select i1 %c, double %x, double 0.000000e+00
+ ret double %d
+}
+
+define double @oge_inverse_x(double %x) {
+; RELAX-LABEL: oge_inverse_x:
+; RELAX: # %bb.0:
+; RELAX-NEXT: xorpd %xmm1, %xmm1
+; RELAX-NEXT: minsd %xmm1, %xmm0
+; RELAX-NEXT: retq
+; CHECK-LABEL: oge_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan oge double %x, 0.000000e+00
+ %d = select i1 %c, double 0.000000e+00, double %x
+ ret double %d
+}
+
+define double @ole_inverse_x(double %x) {
+; RELAX-LABEL: ole_inverse_x:
+; RELAX: # %bb.0:
+; RELAX-NEXT: xorpd %xmm1, %xmm1
+; RELAX-NEXT: maxsd %xmm1, %xmm0
+; RELAX-NEXT: retq
+; CHECK-LABEL: ole_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ole double %x, 0.000000e+00
+ %d = select i1 %c, double 0.000000e+00, double %x
+ ret double %d
+}
+
+define double @ugt(double %x, double %y) {
+; RELAX-LABEL: ugt:
+; RELAX: # %bb.0:
+; RELAX-NEXT: maxsd %xmm1, %xmm0
+; RELAX-NEXT: retq
+; CHECK-LABEL: ugt:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ugt double %x, %y
+ %d = select i1 %c, double %x, double %y
+ ret double %d
+}
+
+define double @ult(double %x, double %y) {
+; RELAX-LABEL: ult:
+; RELAX: # %bb.0:
+; RELAX-NEXT: minsd %xmm1, %xmm0
+; RELAX-NEXT: retq
+; CHECK-LABEL: ult:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ult double %x, %y
+ %d = select i1 %c, double %x, double %y
+ ret double %d
+}
+
+define double @ugt_inverse(double %x, double %y) {
+; CHECK-LABEL: ugt_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ugt double %x, %y
+ %d = select i1 %c, double %y, double %x
+ ret double %d
+}
+
+define double @ult_inverse(double %x, double %y) {
+; CHECK-LABEL: ult_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ult double %x, %y
+ %d = select i1 %c, double %y, double %x
+ ret double %d
+}
+
+define double @uge(double %x, double %y) {
+; CHECK-LABEL: uge:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan uge double %x, %y
+ %d = select i1 %c, double %x, double %y
+ ret double %d
+}
+
+define double @ule(double %x, double %y) {
+; CHECK-LABEL: ule:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ule double %x, %y
+ %d = select i1 %c, double %x, double %y
+ ret double %d
+}
+
+define double @uge_inverse(double %x, double %y) {
+; CHECK-LABEL: uge_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan uge double %x, %y
+ %d = select i1 %c, double %y, double %x
+ ret double %d
+}
+
+define double @ule_inverse(double %x, double %y) {
+; CHECK-LABEL: ule_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ule double %x, %y
+ %d = select i1 %c, double %y, double %x
+ ret double %d
+}
+
+define double @ugt_x(double %x) {
+; RELAX-LABEL: ugt_x:
+; RELAX: # %bb.0:
+; RELAX-NEXT: xorpd %xmm1, %xmm1
+; RELAX-NEXT: maxsd %xmm1, %xmm0
+; RELAX-NEXT: retq
+; CHECK-LABEL: ugt_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ugt double %x, 0.000000e+00
+ %d = select i1 %c, double %x, double 0.000000e+00
+ ret double %d
+}
+
+define double @ult_x(double %x) {
+; RELAX-LABEL: ult_x:
+; RELAX: # %bb.0:
+; RELAX-NEXT: xorpd %xmm1, %xmm1
+; RELAX-NEXT: minsd %xmm1, %xmm0
+; RELAX-NEXT: retq
+; CHECK-LABEL: ult_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ult double %x, 0.000000e+00
+ %d = select i1 %c, double %x, double 0.000000e+00
+ ret double %d
+}
+
+define double @ugt_inverse_x(double %x) {
+; CHECK-LABEL: ugt_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ugt double %x, 0.000000e+00
+ %d = select i1 %c, double 0.000000e+00, double %x
+ ret double %d
+}
+
+define double @ult_inverse_x(double %x) {
+; CHECK-LABEL: ult_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ult double %x, 0.000000e+00
+ %d = select i1 %c, double 0.000000e+00, double %x
+ ret double %d
+}
+
+define double @uge_x(double %x) {
+; CHECK-LABEL: uge_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan uge double %x, 0.000000e+00
+ %d = select i1 %c, double %x, double 0.000000e+00
+ ret double %d
+}
+
+define double @ule_x(double %x) {
+; CHECK-LABEL: ule_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ule double %x, 0.000000e+00
+ %d = select i1 %c, double %x, double 0.000000e+00
+ ret double %d
+}
+
+define double @uge_inverse_x(double %x) {
+; CHECK-LABEL: uge_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan uge double %x, 0.000000e+00
+ %d = select i1 %c, double 0.000000e+00, double %x
+ ret double %d
+}
+
+define double @ule_inverse_x(double %x) {
+; CHECK-LABEL: ule_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ule double %x, 0.000000e+00
+ %d = select i1 %c, double 0.000000e+00, double %x
+ ret double %d
+}
+
+define double @ogt_y(double %x) {
+; CHECK-LABEL: ogt_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ogt double %x, -0.000000e+00
+ %d = select i1 %c, double %x, double -0.000000e+00
+ ret double %d
+}
+
+define double @olt_y(double %x) {
+; CHECK-LABEL: olt_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan olt double %x, -0.000000e+00
+ %d = select i1 %c, double %x, double -0.000000e+00
+ ret double %d
+}
+
+define double @ogt_inverse_y(double %x) {
+; CHECK-LABEL: ogt_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ogt double %x, -0.000000e+00
+ %d = select i1 %c, double -0.000000e+00, double %x
+ ret double %d
+}
+
+define double @olt_inverse_y(double %x) {
+; CHECK-LABEL: olt_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan olt double %x, -0.000000e+00
+ %d = select i1 %c, double -0.000000e+00, double %x
+ ret double %d
+}
+
+define double @oge_y(double %x) {
+; CHECK-LABEL: oge_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan oge double %x, -0.000000e+00
+ %d = select i1 %c, double %x, double -0.000000e+00
+ ret double %d
+}
+
+define double @ole_y(double %x) {
+; CHECK-LABEL: ole_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ole double %x, -0.000000e+00
+ %d = select i1 %c, double %x, double -0.000000e+00
+ ret double %d
+}
+
+define double @oge_inverse_y(double %x) {
+; RELAX-LABEL: oge_inverse_y:
+; RELAX: # %bb.0:
+; RELAX-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; RELAX-NEXT: retq
+; CHECK-LABEL: oge_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan oge double %x, -0.000000e+00
+ %d = select i1 %c, double -0.000000e+00, double %x
+ ret double %d
+}
+
+define double @ole_inverse_y(double %x) {
+; RELAX-LABEL: ole_inverse_y:
+; RELAX: # %bb.0:
+; RELAX-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; RELAX-NEXT: retq
+; CHECK-LABEL: ole_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ole double %x, -0.000000e+00
+ %d = select i1 %c, double -0.000000e+00, double %x
+ ret double %d
+}
+
+define double @ugt_y(double %x) {
+; RELAX-LABEL: ugt_y:
+; RELAX: # %bb.0:
+; RELAX-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; RELAX-NEXT: retq
+; CHECK-LABEL: ugt_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ugt double %x, -0.000000e+00
+ %d = select i1 %c, double %x, double -0.000000e+00
+ ret double %d
+}
+
+define double @ult_y(double %x) {
+; RELAX-LABEL: ult_y:
+; RELAX: # %bb.0:
+; RELAX-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; RELAX-NEXT: retq
+; CHECK-LABEL: ult_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ult double %x, -0.000000e+00
+ %d = select i1 %c, double %x, double -0.000000e+00
+ ret double %d
+}
+
+define double @ugt_inverse_y(double %x) {
+; CHECK-LABEL: ugt_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ugt double %x, -0.000000e+00
+ %d = select i1 %c, double -0.000000e+00, double %x
+ ret double %d
+}
+
+define double @ult_inverse_y(double %x) {
+; CHECK-LABEL: ult_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ult double %x, -0.000000e+00
+ %d = select i1 %c, double -0.000000e+00, double %x
+ ret double %d
+}
+
+define double @uge_y(double %x) {
+; CHECK-LABEL: uge_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan uge double %x, -0.000000e+00
+ %d = select i1 %c, double %x, double -0.000000e+00
+ ret double %d
+}
+
+define double @ule_y(double %x) {
+; CHECK-LABEL: ule_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ule double %x, -0.000000e+00
+ %d = select i1 %c, double %x, double -0.000000e+00
+ ret double %d
+}
+
+define double @uge_inverse_y(double %x) {
+; CHECK-LABEL: uge_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan uge double %x, -0.000000e+00
+ %d = select i1 %c, double -0.000000e+00, double %x
+ ret double %d
+}
+
+define double @ule_inverse_y(double %x) {
+; CHECK-LABEL: ule_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nnan ule double %x, -0.000000e+00
+ %d = select i1 %c, double -0.000000e+00, double %x
+ ret double %d
+}
+
+; Test a few more misc. cases.
+
+define double @clampTo3k_a(double %x) {
+; CHECK-LABEL: clampTo3k_a:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %t0 = fcmp nnan ogt double %x, 3.000000e+03
+ %y = select i1 %t0, double 3.000000e+03, double %x
+ ret double %y
+}
+
+define double @clampTo3k_b(double %x) {
+; CHECK-LABEL: clampTo3k_b:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %t0 = fcmp nnan uge double %x, 3.000000e+03
+ %y = select i1 %t0, double 3.000000e+03, double %x
+ ret double %y
+}
+
+define double @clampTo3k_c(double %x) {
+; CHECK-LABEL: clampTo3k_c:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %t0 = fcmp nnan olt double %x, 3.000000e+03
+ %y = select i1 %t0, double 3.000000e+03, double %x
+ ret double %y
+}
+
+define double @clampTo3k_d(double %x) {
+; CHECK-LABEL: clampTo3k_d:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %t0 = fcmp nnan ule double %x, 3.000000e+03
+ %y = select i1 %t0, double 3.000000e+03, double %x
+ ret double %y
+}
+
+define double @clampTo3k_e(double %x) {
+; CHECK-LABEL: clampTo3k_e:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %t0 = fcmp nnan olt double %x, 3.000000e+03
+ %y = select i1 %t0, double 3.000000e+03, double %x
+ ret double %y
+}
+
+define double @clampTo3k_f(double %x) {
+; CHECK-LABEL: clampTo3k_f:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %t0 = fcmp nnan ule double %x, 3.000000e+03
+ %y = select i1 %t0, double 3.000000e+03, double %x
+ ret double %y
+}
+
+define double @clampTo3k_g(double %x) {
+; CHECK-LABEL: clampTo3k_g:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %t0 = fcmp nnan ogt double %x, 3.000000e+03
+ %y = select i1 %t0, double 3.000000e+03, double %x
+ ret double %y
+}
+
+define double @clampTo3k_h(double %x) {
+; CHECK-LABEL: clampTo3k_h:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %t0 = fcmp nnan uge double %x, 3.000000e+03
+ %y = select i1 %t0, double 3.000000e+03, double %x
+ ret double %y
+}
+
+define <2 x double> @test_maxpd(<2 x double> %x, <2 x double> %y) {
+; CHECK-LABEL: test_maxpd:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxpd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %max_is_x = fcmp nnan oge <2 x double> %x, %y
+ %max = select <2 x i1> %max_is_x, <2 x double> %x, <2 x double> %y
+ ret <2 x double> %max
+}
+
+define <2 x double> @test_minpd(<2 x double> %x, <2 x double> %y) {
+; CHECK-LABEL: test_minpd:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minpd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %min_is_x = fcmp nnan ole <2 x double> %x, %y
+ %min = select <2 x i1> %min_is_x, <2 x double> %x, <2 x double> %y
+ ret <2 x double> %min
+}
+
+define <4 x float> @test_maxps(<4 x float> %x, <4 x float> %y) {
+; CHECK-LABEL: test_maxps:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxps %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %max_is_x = fcmp nnan oge <4 x float> %x, %y
+ %max = select <4 x i1> %max_is_x, <4 x float> %x, <4 x float> %y
+ ret <4 x float> %max
+}
+
+define <4 x float> @test_minps(<4 x float> %x, <4 x float> %y) {
+; CHECK-LABEL: test_minps:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minps %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %min_is_x = fcmp nnan ole <4 x float> %x, %y
+ %min = select <4 x i1> %min_is_x, <4 x float> %x, <4 x float> %y
+ ret <4 x float> %min
+}
+
+define <2 x float> @test_maxps_illegal_v2f32(<2 x float> %x, <2 x float> %y) {
+; CHECK-LABEL: test_maxps_illegal_v2f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxps %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %max_is_x = fcmp nnan oge <2 x float> %x, %y
+ %max = select <2 x i1> %max_is_x, <2 x float> %x, <2 x float> %y
+ ret <2 x float> %max
+}
+
+define <2 x float> @test_minps_illegal_v2f32(<2 x float> %x, <2 x float> %y) {
+; CHECK-LABEL: test_minps_illegal_v2f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minps %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %min_is_x = fcmp nnan ole <2 x float> %x, %y
+ %min = select <2 x i1> %min_is_x, <2 x float> %x, <2 x float> %y
+ ret <2 x float> %min
+}
+
+define <3 x float> @test_maxps_illegal_v3f32(<3 x float> %x, <3 x float> %y) {
+; CHECK-LABEL: test_maxps_illegal_v3f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxps %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %max_is_x = fcmp nnan oge <3 x float> %x, %y
+ %max = select <3 x i1> %max_is_x, <3 x float> %x, <3 x float> %y
+ ret <3 x float> %max
+}
+
+define <3 x float> @test_minps_illegal_v3f32(<3 x float> %x, <3 x float> %y) {
+; CHECK-LABEL: test_minps_illegal_v3f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minps %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %min_is_x = fcmp nnan ole <3 x float> %x, %y
+ %min = select <3 x i1> %min_is_x, <3 x float> %x, <3 x float> %y
+ ret <3 x float> %min
+}
+
+; OSS-Fuzz #13838
+; https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=13838
+define float @ossfuzz13838(float %x) {
+; CHECK-LABEL: ossfuzz13838:
+; CHECK: # %bb.0: # %bb
+; CHECK-NEXT: movss {{.*#+}} xmm0 = [2.55E+2,0.0E+0,0.0E+0,0.0E+0]
+; CHECK-NEXT: retq
+bb:
+ %cmp2 = fcmp nnan fast olt float %x, 2.550000e+02
+ %B1 = urem i1 %cmp2, %cmp2
+ %min = select i1 %B1, float %x, float 2.550000e+02
+ %B = frem float %min, 0x47EFFFFFE0000000
+ %cmp1 = fcmp nnan fast olt float %B, 1.000000e+00
+ %r = select i1 %cmp1, float 1.000000e+00, float %min
+ ret float %r
+}
diff --git a/llvm/test/CodeGen/X86/sse-minmax-unsafe.ll b/llvm/test/CodeGen/X86/sse-minmax-unsafe.ll
new file mode 100644
index 0000000000000..88167250a5314
--- /dev/null
+++ b/llvm/test/CodeGen/X86/sse-minmax-unsafe.ll
@@ -0,0 +1,687 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.2 | FileCheck %s
+
+; Some of these patterns can be matched as SSE min or max. Some of
+; them can be matched provided that the operands are swapped.
+; Some of them can't be matched at all and require a comparison
+; and a conditional branch.
+
+; The naming convention is {,x_,y_}{o,u}{gt,lt,ge,le}{,_inverse}
+; _x: use 0.0 instead of %y
+; _y: use -0.0 instead of %y
+; _inverse : swap the arms of the select.
+
+define double @ogt(double %x, double %y) {
+; CHECK-LABEL: ogt:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ogt double %x, %y
+ %d = select nsz nnan i1 %c, double %x, double %y
+ ret double %d
+}
+
+define double @olt(double %x, double %y) {
+; CHECK-LABEL: olt:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan olt double %x, %y
+ %d = select nsz nnan i1 %c, double %x, double %y
+ ret double %d
+}
+
+define double @ogt_inverse(double %x, double %y) {
+; CHECK-LABEL: ogt_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ogt double %x, %y
+ %d = select nsz nnan i1 %c, double %y, double %x
+ ret double %d
+}
+
+define double @olt_inverse(double %x, double %y) {
+; CHECK-LABEL: olt_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan olt double %x, %y
+ %d = select nsz nnan i1 %c, double %y, double %x
+ ret double %d
+}
+
+define double @oge(double %x, double %y) {
+; CHECK-LABEL: oge:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan oge double %x, %y
+ %d = select nsz nnan i1 %c, double %x, double %y
+ ret double %d
+}
+
+define double @ole(double %x, double %y) {
+; CHECK-LABEL: ole:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ole double %x, %y
+ %d = select nsz nnan i1 %c, double %x, double %y
+ ret double %d
+}
+
+define double @oge_inverse(double %x, double %y) {
+; CHECK-LABEL: oge_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan oge double %x, %y
+ %d = select nsz nnan i1 %c, double %y, double %x
+ ret double %d
+}
+
+define double @ole_inverse(double %x, double %y) {
+; CHECK-LABEL: ole_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ole double %x, %y
+ %d = select nsz nnan i1 %c, double %y, double %x
+ ret double %d
+}
+
+define double @ogt_x(double %x) {
+; CHECK-LABEL: ogt_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ogt double %x, 0.000000e+00
+ %d = select nsz nnan i1 %c, double %x, double 0.000000e+00
+ ret double %d
+}
+
+define double @olt_x(double %x) {
+; CHECK-LABEL: olt_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan olt double %x, 0.000000e+00
+ %d = select nsz nnan i1 %c, double %x, double 0.000000e+00
+ ret double %d
+}
+
+define double @ogt_inverse_x(double %x) {
+; CHECK-LABEL: ogt_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ogt double %x, 0.000000e+00
+ %d = select nsz nnan i1 %c, double 0.000000e+00, double %x
+ ret double %d
+}
+
+define double @olt_inverse_x(double %x) {
+; CHECK-LABEL: olt_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan olt double %x, 0.000000e+00
+ %d = select nsz nnan i1 %c, double 0.000000e+00, double %x
+ ret double %d
+}
+
+define double @oge_x(double %x) {
+; CHECK-LABEL: oge_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan oge double %x, 0.000000e+00
+ %d = select nsz nnan i1 %c, double %x, double 0.000000e+00
+ ret double %d
+}
+
+define double @ole_x(double %x) {
+; CHECK-LABEL: ole_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ole double %x, 0.000000e+00
+ %d = select nsz nnan i1 %c, double %x, double 0.000000e+00
+ ret double %d
+}
+
+define double @oge_inverse_x(double %x) {
+; CHECK-LABEL: oge_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan oge double %x, 0.000000e+00
+ %d = select nsz nnan i1 %c, double 0.000000e+00, double %x
+ ret double %d
+}
+
+define double @ole_inverse_x(double %x) {
+; CHECK-LABEL: ole_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ole double %x, 0.000000e+00
+ %d = select nsz nnan i1 %c, double 0.000000e+00, double %x
+ ret double %d
+}
+
+define double @ugt(double %x, double %y) {
+; CHECK-LABEL: ugt:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ugt double %x, %y
+ %d = select nsz nnan i1 %c, double %x, double %y
+ ret double %d
+}
+
+define double @ult(double %x, double %y) {
+; CHECK-LABEL: ult:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ult double %x, %y
+ %d = select nsz nnan i1 %c, double %x, double %y
+ ret double %d
+}
+
+define double @ugt_inverse(double %x, double %y) {
+; CHECK-LABEL: ugt_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ugt double %x, %y
+ %d = select nsz nnan i1 %c, double %y, double %x
+ ret double %d
+}
+
+define double @ult_inverse(double %x, double %y) {
+; CHECK-LABEL: ult_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ult double %x, %y
+ %d = select nsz nnan i1 %c, double %y, double %x
+ ret double %d
+}
+
+define double @uge(double %x, double %y) {
+; CHECK-LABEL: uge:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan uge double %x, %y
+ %d = select nsz nnan i1 %c, double %x, double %y
+ ret double %d
+}
+
+define double @ule(double %x, double %y) {
+; CHECK-LABEL: ule:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ule double %x, %y
+ %d = select nsz nnan i1 %c, double %x, double %y
+ ret double %d
+}
+
+define double @uge_inverse(double %x, double %y) {
+; CHECK-LABEL: uge_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan uge double %x, %y
+ %d = select nsz nnan i1 %c, double %y, double %x
+ ret double %d
+}
+
+define double @ule_inverse(double %x, double %y) {
+; CHECK-LABEL: ule_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ule double %x, %y
+ %d = select nsz nnan i1 %c, double %y, double %x
+ ret double %d
+}
+
+define double @ugt_x(double %x) {
+; CHECK-LABEL: ugt_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ugt double %x, 0.000000e+00
+ %d = select nsz nnan i1 %c, double %x, double 0.000000e+00
+ ret double %d
+}
+
+define double @ult_x(double %x) {
+; CHECK-LABEL: ult_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ult double %x, 0.000000e+00
+ %d = select nsz nnan i1 %c, double %x, double 0.000000e+00
+ ret double %d
+}
+
+define double @ugt_inverse_x(double %x) {
+; CHECK-LABEL: ugt_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ugt double %x, 0.000000e+00
+ %d = select nsz nnan i1 %c, double 0.000000e+00, double %x
+ ret double %d
+}
+
+define double @ult_inverse_x(double %x) {
+; CHECK-LABEL: ult_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ult double %x, 0.000000e+00
+ %d = select nsz nnan i1 %c, double 0.000000e+00, double %x
+ ret double %d
+}
+
+define double @uge_x(double %x) {
+; CHECK-LABEL: uge_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan uge double %x, 0.000000e+00
+ %d = select nsz nnan i1 %c, double %x, double 0.000000e+00
+ ret double %d
+}
+
+define double @ule_x(double %x) {
+; CHECK-LABEL: ule_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ule double %x, 0.000000e+00
+ %d = select nsz nnan i1 %c, double %x, double 0.000000e+00
+ ret double %d
+}
+
+define double @uge_inverse_x(double %x) {
+; CHECK-LABEL: uge_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan uge double %x, 0.000000e+00
+ %d = select nsz nnan i1 %c, double 0.000000e+00, double %x
+ ret double %d
+}
+
+define double @ule_inverse_x(double %x) {
+; CHECK-LABEL: ule_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ule double %x, 0.000000e+00
+ %d = select nsz nnan i1 %c, double 0.000000e+00, double %x
+ ret double %d
+}
+
+define double @ogt_y(double %x) {
+; CHECK-LABEL: ogt_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ogt double %x, -0.000000e+00
+ %d = select nsz nnan i1 %c, double %x, double -0.000000e+00
+ ret double %d
+}
+
+define double @olt_y(double %x) {
+; CHECK-LABEL: olt_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan olt double %x, -0.000000e+00
+ %d = select nsz nnan i1 %c, double %x, double -0.000000e+00
+ ret double %d
+}
+
+define double @ogt_inverse_y(double %x) {
+; CHECK-LABEL: ogt_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ogt double %x, -0.000000e+00
+ %d = select nsz nnan i1 %c, double -0.000000e+00, double %x
+ ret double %d
+}
+
+define double @olt_inverse_y(double %x) {
+; CHECK-LABEL: olt_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan olt double %x, -0.000000e+00
+ %d = select nsz nnan i1 %c, double -0.000000e+00, double %x
+ ret double %d
+}
+
+define double @oge_y(double %x) {
+; CHECK-LABEL: oge_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan oge double %x, -0.000000e+00
+ %d = select nsz nnan i1 %c, double %x, double -0.000000e+00
+ ret double %d
+}
+
+define double @ole_y(double %x) {
+; CHECK-LABEL: ole_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ole double %x, -0.000000e+00
+ %d = select nsz nnan i1 %c, double %x, double -0.000000e+00
+ ret double %d
+}
+
+define double @oge_inverse_y(double %x) {
+; CHECK-LABEL: oge_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan oge double %x, -0.000000e+00
+ %d = select nsz nnan i1 %c, double -0.000000e+00, double %x
+ ret double %d
+}
+
+define double @ole_inverse_y(double %x) {
+; CHECK-LABEL: ole_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ole double %x, -0.000000e+00
+ %d = select nsz nnan i1 %c, double -0.000000e+00, double %x
+ ret double %d
+}
+
+define double @ugt_y(double %x) {
+; CHECK-LABEL: ugt_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ugt double %x, -0.000000e+00
+ %d = select nsz nnan i1 %c, double %x, double -0.000000e+00
+ ret double %d
+}
+
+define double @ult_y(double %x) {
+; CHECK-LABEL: ult_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ult double %x, -0.000000e+00
+ %d = select nsz nnan i1 %c, double %x, double -0.000000e+00
+ ret double %d
+}
+
+define double @ugt_inverse_y(double %x) {
+; CHECK-LABEL: ugt_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ugt double %x, -0.000000e+00
+ %d = select nsz nnan i1 %c, double -0.000000e+00, double %x
+ ret double %d
+}
+
+define double @ult_inverse_y(double %x) {
+; CHECK-LABEL: ult_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ult double %x, -0.000000e+00
+ %d = select nsz nnan i1 %c, double -0.000000e+00, double %x
+ ret double %d
+}
+
+define double @uge_y(double %x) {
+; CHECK-LABEL: uge_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan uge double %x, -0.000000e+00
+ %d = select nsz nnan i1 %c, double %x, double -0.000000e+00
+ ret double %d
+}
+
+define double @ule_y(double %x) {
+; CHECK-LABEL: ule_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ule double %x, -0.000000e+00
+ %d = select nsz nnan i1 %c, double %x, double -0.000000e+00
+ ret double %d
+}
+
+define double @uge_inverse_y(double %x) {
+; CHECK-LABEL: uge_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan uge double %x, -0.000000e+00
+ %d = select nsz nnan i1 %c, double -0.000000e+00, double %x
+ ret double %d
+}
+
+define double @ule_inverse_y(double %x) {
+; CHECK-LABEL: ule_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %c = fcmp nsz nnan ule double %x, -0.000000e+00
+ %d = select nsz nnan i1 %c, double -0.000000e+00, double %x
+ ret double %d
+}
+
+; Test a few more misc. cases.
+
+define double @clampTo3k_a(double %x) {
+; CHECK-LABEL: clampTo3k_a:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %t0 = fcmp nsz nnan ogt double %x, 3.000000e+03
+ %y = select nsz nnan i1 %t0, double 3.000000e+03, double %x
+ ret double %y
+}
+
+define double @clampTo3k_b(double %x) {
+; CHECK-LABEL: clampTo3k_b:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %t0 = fcmp nsz nnan uge double %x, 3.000000e+03
+ %y = select nsz nnan i1 %t0, double 3.000000e+03, double %x
+ ret double %y
+}
+
+define double @clampTo3k_c(double %x) {
+; CHECK-LABEL: clampTo3k_c:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %t0 = fcmp nsz nnan olt double %x, 3.000000e+03
+ %y = select nsz nnan i1 %t0, double 3.000000e+03, double %x
+ ret double %y
+}
+
+define double @clampTo3k_d(double %x) {
+; CHECK-LABEL: clampTo3k_d:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %t0 = fcmp nsz nnan ule double %x, 3.000000e+03
+ %y = select nsz nnan i1 %t0, double 3.000000e+03, double %x
+ ret double %y
+}
+
+define double @clampTo3k_e(double %x) {
+; CHECK-LABEL: clampTo3k_e:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %t0 = fcmp nsz nnan olt double %x, 3.000000e+03
+ %y = select nsz nnan i1 %t0, double 3.000000e+03, double %x
+ ret double %y
+}
+
+define double @clampTo3k_f(double %x) {
+; CHECK-LABEL: clampTo3k_f:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %t0 = fcmp nsz nnan ule double %x, 3.000000e+03
+ %y = select nsz nnan i1 %t0, double 3.000000e+03, double %x
+ ret double %y
+}
+
+define double @clampTo3k_g(double %x) {
+; CHECK-LABEL: clampTo3k_g:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %t0 = fcmp nsz nnan ogt double %x, 3.000000e+03
+ %y = select nsz nnan i1 %t0, double 3.000000e+03, double %x
+ ret double %y
+}
+
+define double @clampTo3k_h(double %x) {
+; CHECK-LABEL: clampTo3k_h:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
+ %t0 = fcmp nsz nnan uge double %x, 3.000000e+03
+ %y = select nsz nnan i1 %t0, double 3.000000e+03, double %x
+ ret double %y
+}
+
+define <2 x double> @test_maxpd(<2 x double> %x, <2 x double> %y) {
+; CHECK-LABEL: test_maxpd:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxpd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %max_is_x = fcmp nsz nnan oge <2 x double> %x, %y
+ %max = select nsz nnan <2 x i1> %max_is_x, <2 x double> %x, <2 x double> %y
+ ret <2 x double> %max
+}
+
+define <2 x double> @test_minpd(<2 x double> %x, <2 x double> %y) {
+; CHECK-LABEL: test_minpd:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minpd %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %min_is_x = fcmp nsz nnan ole <2 x double> %x, %y
+ %min = select nsz nnan <2 x i1> %min_is_x, <2 x double> %x, <2 x double> %y
+ ret <2 x double> %min
+}
+
+define <4 x float> @test_maxps(<4 x float> %x, <4 x float> %y) {
+; CHECK-LABEL: test_maxps:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxps %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %max_is_x = fcmp nsz nnan oge <4 x float> %x, %y
+ %max = select nsz nnan <4 x i1> %max_is_x, <4 x float> %x, <4 x float> %y
+ ret <4 x float> %max
+}
+
+define <4 x float> @test_minps(<4 x float> %x, <4 x float> %y) {
+; CHECK-LABEL: test_minps:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minps %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %min_is_x = fcmp nsz nnan ole <4 x float> %x, %y
+ %min = select nsz nnan <4 x i1> %min_is_x, <4 x float> %x, <4 x float> %y
+ ret <4 x float> %min
+}
+
+define <2 x float> @test_maxps_illegal_v2f32(<2 x float> %x, <2 x float> %y) {
+; CHECK-LABEL: test_maxps_illegal_v2f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxps %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %max_is_x = fcmp nsz nnan oge <2 x float> %x, %y
+ %max = select nsz nnan <2 x i1> %max_is_x, <2 x float> %x, <2 x float> %y
+ ret <2 x float> %max
+}
+
+define <2 x float> @test_minps_illegal_v2f32(<2 x float> %x, <2 x float> %y) {
+; CHECK-LABEL: test_minps_illegal_v2f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minps %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %min_is_x = fcmp nsz nnan ole <2 x float> %x, %y
+ %min = select nsz nnan <2 x i1> %min_is_x, <2 x float> %x, <2 x float> %y
+ ret <2 x float> %min
+}
+
+define <3 x float> @test_maxps_illegal_v3f32(<3 x float> %x, <3 x float> %y) {
+; CHECK-LABEL: test_maxps_illegal_v3f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxps %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %max_is_x = fcmp nsz nnan oge <3 x float> %x, %y
+ %max = select nsz nnan <3 x i1> %max_is_x, <3 x float> %x, <3 x float> %y
+ ret <3 x float> %max
+}
+
+define <3 x float> @test_minps_illegal_v3f32(<3 x float> %x, <3 x float> %y) {
+; CHECK-LABEL: test_minps_illegal_v3f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minps %xmm1, %xmm0
+; CHECK-NEXT: retq
+ %min_is_x = fcmp nsz nnan ole <3 x float> %x, %y
+ %min = select nsz nnan <3 x i1> %min_is_x, <3 x float> %x, <3 x float> %y
+ ret <3 x float> %min
+}
+
+; OSS-Fuzz #13838
+; https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=13838
+define float @ossfuzz13838(float %x) {
+; CHECK-LABEL: ossfuzz13838:
+; CHECK: # %bb.0: # %bb
+; CHECK-NEXT: movss {{.*#+}} xmm0 = [2.55E+2,0.0E+0,0.0E+0,0.0E+0]
+; CHECK-NEXT: retq
+bb:
+ %cmp2 = fcmp nsz nnan fast olt float %x, 2.550000e+02
+ %B1 = urem i1 %cmp2, %cmp2
+ %min = select nsz nnan i1 %B1, float %x, float 2.550000e+02
+ %B = frem float %min, 0x47EFFFFFE0000000
+ %cmp1 = fcmp nsz nnan fast olt float %B, 1.000000e+00
+ %r = select nsz nnan i1 %cmp1, float 1.000000e+00, float %min
+ ret float %r
+}
diff --git a/llvm/test/CodeGen/X86/sse-minmax.ll b/llvm/test/CodeGen/X86/sse-minmax.ll
index 7904b21a3b1fa..2b97f98450973 100644
--- a/llvm/test/CodeGen/X86/sse-minmax.ll
+++ b/llvm/test/CodeGen/X86/sse-minmax.ll
@@ -1,7 +1,5 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.2 | FileCheck %s --check-prefix=ALL --check-prefix=STRICT
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.2 -enable-no-signed-zeros-fp-math -enable-no-nans-fp-math | FileCheck %s --check-prefix=ALL --check-prefix=RELAX --check-prefix=UNSAFE
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.2 -enable-no-nans-fp-math | FileCheck %s --check-prefix=ALL --check-prefix=RELAX --check-prefix=FINITE
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.2 | FileCheck %s
; Some of these patterns can be matched as SSE min or max. Some of
; them can be matched provided that the operands are swapped.
@@ -14,972 +12,640 @@
; _inverse : swap the arms of the select.
define double @ogt(double %x, double %y) {
-; ALL-LABEL: ogt:
-; ALL: # %bb.0:
-; ALL-NEXT: maxsd %xmm1, %xmm0
-; ALL-NEXT: retq
+; CHECK-LABEL: ogt:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ogt double %x, %y
%d = select i1 %c, double %x, double %y
ret double %d
}
define double @olt(double %x, double %y) {
-; ALL-LABEL: olt:
-; ALL: # %bb.0:
-; ALL-NEXT: minsd %xmm1, %xmm0
-; ALL-NEXT: retq
+; CHECK-LABEL: olt:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp olt double %x, %y
%d = select i1 %c, double %x, double %y
ret double %d
}
define double @ogt_inverse(double %x, double %y) {
-; STRICT-LABEL: ogt_inverse:
-; STRICT: # %bb.0:
-; STRICT-NEXT: minsd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: ogt_inverse:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: minsd %xmm1, %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: ogt_inverse:
-; FINITE: # %bb.0:
-; FINITE-NEXT: minsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: ogt_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ogt double %x, %y
%d = select i1 %c, double %y, double %x
ret double %d
}
define double @olt_inverse(double %x, double %y) {
-; STRICT-LABEL: olt_inverse:
-; STRICT: # %bb.0:
-; STRICT-NEXT: maxsd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: olt_inverse:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: maxsd %xmm1, %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: olt_inverse:
-; FINITE: # %bb.0:
-; FINITE-NEXT: maxsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: olt_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp olt double %x, %y
%d = select i1 %c, double %y, double %x
ret double %d
}
define double @oge(double %x, double %y) {
-; STRICT-LABEL: oge:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movapd %xmm0, %xmm2
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: cmplesd %xmm2, %xmm0
-; STRICT-NEXT: blendvpd %xmm0, %xmm2, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: oge:
-; RELAX: # %bb.0:
-; RELAX-NEXT: maxsd %xmm1, %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: oge:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movapd %xmm0, %xmm2
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: cmplesd %xmm2, %xmm0
+; CHECK-NEXT: blendvpd %xmm0, %xmm2, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp oge double %x, %y
%d = select i1 %c, double %x, double %y
ret double %d
}
define double @ole(double %x, double %y) {
-; STRICT-LABEL: ole:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movapd %xmm0, %xmm2
-; STRICT-NEXT: cmplesd %xmm1, %xmm0
-; STRICT-NEXT: blendvpd %xmm0, %xmm2, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: ole:
-; RELAX: # %bb.0:
-; RELAX-NEXT: minsd %xmm1, %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: ole:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movapd %xmm0, %xmm2
+; CHECK-NEXT: cmplesd %xmm1, %xmm0
+; CHECK-NEXT: blendvpd %xmm0, %xmm2, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ole double %x, %y
%d = select i1 %c, double %x, double %y
ret double %d
}
define double @oge_inverse(double %x, double %y) {
-; STRICT-LABEL: oge_inverse:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movapd %xmm0, %xmm2
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: cmplesd %xmm2, %xmm0
-; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2
-; STRICT-NEXT: movapd %xmm2, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: oge_inverse:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: minsd %xmm1, %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: oge_inverse:
-; FINITE: # %bb.0:
-; FINITE-NEXT: minsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; RELAX-LABEL: oge_inverse:
+; RELAX: # %bb.0:
+; RELAX-NEXT: minsd %xmm1, %xmm0
+; RELAX-NEXT: retq
+; CHECK-LABEL: oge_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movapd %xmm0, %xmm2
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: cmplesd %xmm2, %xmm0
+; CHECK-NEXT: blendvpd %xmm0, %xmm1, %xmm2
+; CHECK-NEXT: movapd %xmm2, %xmm0
+; CHECK-NEXT: retq
%c = fcmp oge double %x, %y
%d = select i1 %c, double %y, double %x
ret double %d
}
define double @ole_inverse(double %x, double %y) {
-; STRICT-LABEL: ole_inverse:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movapd %xmm0, %xmm2
-; STRICT-NEXT: cmplesd %xmm1, %xmm0
-; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2
-; STRICT-NEXT: movapd %xmm2, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: ole_inverse:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: maxsd %xmm1, %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: ole_inverse:
-; FINITE: # %bb.0:
-; FINITE-NEXT: maxsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; RELAX-LABEL: ole_inverse:
+; RELAX: # %bb.0:
+; RELAX-NEXT: maxsd %xmm1, %xmm0
+; RELAX-NEXT: retq
+; CHECK-LABEL: ole_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movapd %xmm0, %xmm2
+; CHECK-NEXT: cmplesd %xmm1, %xmm0
+; CHECK-NEXT: blendvpd %xmm0, %xmm1, %xmm2
+; CHECK-NEXT: movapd %xmm2, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ole double %x, %y
%d = select i1 %c, double %y, double %x
ret double %d
}
define double @ogt_x(double %x) {
-; ALL-LABEL: ogt_x:
-; ALL: # %bb.0:
-; ALL-NEXT: xorpd %xmm1, %xmm1
-; ALL-NEXT: maxsd %xmm1, %xmm0
-; ALL-NEXT: retq
+; CHECK-LABEL: ogt_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ogt double %x, 0.000000e+00
%d = select i1 %c, double %x, double 0.000000e+00
ret double %d
}
define double @olt_x(double %x) {
-; ALL-LABEL: olt_x:
-; ALL: # %bb.0:
-; ALL-NEXT: xorpd %xmm1, %xmm1
-; ALL-NEXT: minsd %xmm1, %xmm0
-; ALL-NEXT: retq
+; CHECK-LABEL: olt_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp olt double %x, 0.000000e+00
%d = select i1 %c, double %x, double 0.000000e+00
ret double %d
}
define double @ogt_inverse_x(double %x) {
-; STRICT-LABEL: ogt_inverse_x:
-; STRICT: # %bb.0:
-; STRICT-NEXT: xorpd %xmm1, %xmm1
-; STRICT-NEXT: minsd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: ogt_inverse_x:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: xorpd %xmm1, %xmm1
-; UNSAFE-NEXT: minsd %xmm1, %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: ogt_inverse_x:
-; FINITE: # %bb.0:
-; FINITE-NEXT: xorpd %xmm1, %xmm1
-; FINITE-NEXT: minsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: ogt_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ogt double %x, 0.000000e+00
%d = select i1 %c, double 0.000000e+00, double %x
ret double %d
}
define double @olt_inverse_x(double %x) {
-; STRICT-LABEL: olt_inverse_x:
-; STRICT: # %bb.0:
-; STRICT-NEXT: xorpd %xmm1, %xmm1
-; STRICT-NEXT: maxsd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: olt_inverse_x:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: xorpd %xmm1, %xmm1
-; UNSAFE-NEXT: maxsd %xmm1, %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: olt_inverse_x:
-; FINITE: # %bb.0:
-; FINITE-NEXT: xorpd %xmm1, %xmm1
-; FINITE-NEXT: maxsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: olt_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp olt double %x, 0.000000e+00
%d = select i1 %c, double 0.000000e+00, double %x
ret double %d
}
define double @oge_x(double %x) {
-; STRICT-LABEL: oge_x:
-; STRICT: # %bb.0:
-; STRICT-NEXT: xorpd %xmm1, %xmm1
-; STRICT-NEXT: cmplesd %xmm0, %xmm1
-; STRICT-NEXT: andpd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: oge_x:
-; RELAX: # %bb.0:
-; RELAX-NEXT: xorpd %xmm1, %xmm1
-; RELAX-NEXT: maxsd %xmm1, %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: oge_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: cmplesd %xmm0, %xmm1
+; CHECK-NEXT: andpd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp oge double %x, 0.000000e+00
%d = select i1 %c, double %x, double 0.000000e+00
ret double %d
}
define double @ole_x(double %x) {
-; STRICT-LABEL: ole_x:
-; STRICT: # %bb.0:
-; STRICT-NEXT: xorpd %xmm1, %xmm1
-; STRICT-NEXT: movapd %xmm0, %xmm2
-; STRICT-NEXT: cmplesd %xmm1, %xmm2
-; STRICT-NEXT: andpd %xmm2, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: ole_x:
-; RELAX: # %bb.0:
-; RELAX-NEXT: xorpd %xmm1, %xmm1
-; RELAX-NEXT: minsd %xmm1, %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: ole_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: movapd %xmm0, %xmm2
+; CHECK-NEXT: cmplesd %xmm1, %xmm2
+; CHECK-NEXT: andpd %xmm2, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ole double %x, 0.000000e+00
%d = select i1 %c, double %x, double 0.000000e+00
ret double %d
}
define double @oge_inverse_x(double %x) {
-; STRICT-LABEL: oge_inverse_x:
-; STRICT: # %bb.0:
-; STRICT-NEXT: xorpd %xmm1, %xmm1
-; STRICT-NEXT: cmplesd %xmm0, %xmm1
-; STRICT-NEXT: andnpd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: oge_inverse_x:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: xorpd %xmm1, %xmm1
-; UNSAFE-NEXT: minsd %xmm1, %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: oge_inverse_x:
-; FINITE: # %bb.0:
-; FINITE-NEXT: xorpd %xmm1, %xmm1
-; FINITE-NEXT: minsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; RELAX-LABEL: oge_inverse_x:
+; RELAX: # %bb.0:
+; RELAX-NEXT: xorpd %xmm1, %xmm1
+; RELAX-NEXT: minsd %xmm1, %xmm0
+; RELAX-NEXT: retq
+; CHECK-LABEL: oge_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: cmplesd %xmm0, %xmm1
+; CHECK-NEXT: andnpd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp oge double %x, 0.000000e+00
%d = select i1 %c, double 0.000000e+00, double %x
ret double %d
}
define double @ole_inverse_x(double %x) {
-; STRICT-LABEL: ole_inverse_x:
-; STRICT: # %bb.0:
-; STRICT-NEXT: xorpd %xmm2, %xmm2
-; STRICT-NEXT: movapd %xmm0, %xmm1
-; STRICT-NEXT: cmplesd %xmm2, %xmm1
-; STRICT-NEXT: andnpd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: ole_inverse_x:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: xorpd %xmm1, %xmm1
-; UNSAFE-NEXT: maxsd %xmm1, %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: ole_inverse_x:
-; FINITE: # %bb.0:
-; FINITE-NEXT: xorpd %xmm1, %xmm1
-; FINITE-NEXT: maxsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; RELAX-LABEL: ole_inverse_x:
+; RELAX: # %bb.0:
+; RELAX-NEXT: xorpd %xmm1, %xmm1
+; RELAX-NEXT: maxsd %xmm1, %xmm0
+; RELAX-NEXT: retq
+; CHECK-LABEL: ole_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm2, %xmm2
+; CHECK-NEXT: movapd %xmm0, %xmm1
+; CHECK-NEXT: cmplesd %xmm2, %xmm1
+; CHECK-NEXT: andnpd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ole double %x, 0.000000e+00
%d = select i1 %c, double 0.000000e+00, double %x
ret double %d
}
define double @ugt(double %x, double %y) {
-; STRICT-LABEL: ugt:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movapd %xmm0, %xmm2
-; STRICT-NEXT: cmpnlesd %xmm1, %xmm0
-; STRICT-NEXT: blendvpd %xmm0, %xmm2, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
; RELAX-LABEL: ugt:
; RELAX: # %bb.0:
; RELAX-NEXT: maxsd %xmm1, %xmm0
; RELAX-NEXT: retq
+; CHECK-LABEL: ugt:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movapd %xmm0, %xmm2
+; CHECK-NEXT: cmpnlesd %xmm1, %xmm0
+; CHECK-NEXT: blendvpd %xmm0, %xmm2, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ugt double %x, %y
%d = select i1 %c, double %x, double %y
ret double %d
}
define double @ult(double %x, double %y) {
-; STRICT-LABEL: ult:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movapd %xmm0, %xmm2
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: cmpnlesd %xmm2, %xmm0
-; STRICT-NEXT: blendvpd %xmm0, %xmm2, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
; RELAX-LABEL: ult:
; RELAX: # %bb.0:
; RELAX-NEXT: minsd %xmm1, %xmm0
; RELAX-NEXT: retq
+; CHECK-LABEL: ult:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movapd %xmm0, %xmm2
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: cmpnlesd %xmm2, %xmm0
+; CHECK-NEXT: blendvpd %xmm0, %xmm2, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ult double %x, %y
%d = select i1 %c, double %x, double %y
ret double %d
}
define double @ugt_inverse(double %x, double %y) {
-; STRICT-LABEL: ugt_inverse:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movapd %xmm0, %xmm2
-; STRICT-NEXT: cmpnlesd %xmm1, %xmm0
-; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2
-; STRICT-NEXT: movapd %xmm2, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: ugt_inverse:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: minsd %xmm1, %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: ugt_inverse:
-; FINITE: # %bb.0:
-; FINITE-NEXT: minsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: ugt_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movapd %xmm0, %xmm2
+; CHECK-NEXT: cmpnlesd %xmm1, %xmm0
+; CHECK-NEXT: blendvpd %xmm0, %xmm1, %xmm2
+; CHECK-NEXT: movapd %xmm2, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ugt double %x, %y
%d = select i1 %c, double %y, double %x
ret double %d
}
define double @ult_inverse(double %x, double %y) {
-; STRICT-LABEL: ult_inverse:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movapd %xmm0, %xmm2
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: cmpnlesd %xmm2, %xmm0
-; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2
-; STRICT-NEXT: movapd %xmm2, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: ult_inverse:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: maxsd %xmm1, %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: ult_inverse:
-; FINITE: # %bb.0:
-; FINITE-NEXT: maxsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: ult_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movapd %xmm0, %xmm2
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: cmpnlesd %xmm2, %xmm0
+; CHECK-NEXT: blendvpd %xmm0, %xmm1, %xmm2
+; CHECK-NEXT: movapd %xmm2, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ult double %x, %y
%d = select i1 %c, double %y, double %x
ret double %d
}
define double @uge(double %x, double %y) {
-; STRICT-LABEL: uge:
-; STRICT: # %bb.0:
-; STRICT-NEXT: maxsd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: uge:
-; RELAX: # %bb.0:
-; RELAX-NEXT: maxsd %xmm1, %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: uge:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp uge double %x, %y
%d = select i1 %c, double %x, double %y
ret double %d
}
define double @ule(double %x, double %y) {
-; STRICT-LABEL: ule:
-; STRICT: # %bb.0:
-; STRICT-NEXT: minsd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: ule:
-; RELAX: # %bb.0:
-; RELAX-NEXT: minsd %xmm1, %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: ule:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ule double %x, %y
%d = select i1 %c, double %x, double %y
ret double %d
}
define double @uge_inverse(double %x, double %y) {
-; STRICT-LABEL: uge_inverse:
-; STRICT: # %bb.0:
-; STRICT-NEXT: minsd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: uge_inverse:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: minsd %xmm1, %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: uge_inverse:
-; FINITE: # %bb.0:
-; FINITE-NEXT: minsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: uge_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp uge double %x, %y
%d = select i1 %c, double %y, double %x
ret double %d
}
define double @ule_inverse(double %x, double %y) {
-; STRICT-LABEL: ule_inverse:
-; STRICT: # %bb.0:
-; STRICT-NEXT: maxsd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: ule_inverse:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: maxsd %xmm1, %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: ule_inverse:
-; FINITE: # %bb.0:
-; FINITE-NEXT: maxsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: ule_inverse:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ule double %x, %y
%d = select i1 %c, double %y, double %x
ret double %d
}
define double @ugt_x(double %x) {
-; STRICT-LABEL: ugt_x:
-; STRICT: # %bb.0:
-; STRICT-NEXT: xorpd %xmm1, %xmm1
-; STRICT-NEXT: movapd %xmm0, %xmm2
-; STRICT-NEXT: cmpnlesd %xmm1, %xmm2
-; STRICT-NEXT: andpd %xmm2, %xmm0
-; STRICT-NEXT: retq
-;
; RELAX-LABEL: ugt_x:
; RELAX: # %bb.0:
; RELAX-NEXT: xorpd %xmm1, %xmm1
; RELAX-NEXT: maxsd %xmm1, %xmm0
; RELAX-NEXT: retq
+; CHECK-LABEL: ugt_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: movapd %xmm0, %xmm2
+; CHECK-NEXT: cmpnlesd %xmm1, %xmm2
+; CHECK-NEXT: andpd %xmm2, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ugt double %x, 0.000000e+00
%d = select i1 %c, double %x, double 0.000000e+00
ret double %d
}
define double @ult_x(double %x) {
-; STRICT-LABEL: ult_x:
-; STRICT: # %bb.0:
-; STRICT-NEXT: xorpd %xmm1, %xmm1
-; STRICT-NEXT: cmpnlesd %xmm0, %xmm1
-; STRICT-NEXT: andpd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
; RELAX-LABEL: ult_x:
; RELAX: # %bb.0:
; RELAX-NEXT: xorpd %xmm1, %xmm1
; RELAX-NEXT: minsd %xmm1, %xmm0
; RELAX-NEXT: retq
+; CHECK-LABEL: ult_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: cmpnlesd %xmm0, %xmm1
+; CHECK-NEXT: andpd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ult double %x, 0.000000e+00
%d = select i1 %c, double %x, double 0.000000e+00
ret double %d
}
define double @ugt_inverse_x(double %x) {
-; STRICT-LABEL: ugt_inverse_x:
-; STRICT: # %bb.0:
-; STRICT-NEXT: xorpd %xmm2, %xmm2
-; STRICT-NEXT: movapd %xmm0, %xmm1
-; STRICT-NEXT: cmpnlesd %xmm2, %xmm1
-; STRICT-NEXT: andnpd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: ugt_inverse_x:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: xorpd %xmm1, %xmm1
-; UNSAFE-NEXT: minsd %xmm1, %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: ugt_inverse_x:
-; FINITE: # %bb.0:
-; FINITE-NEXT: xorpd %xmm1, %xmm1
-; FINITE-NEXT: minsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: ugt_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm2, %xmm2
+; CHECK-NEXT: movapd %xmm0, %xmm1
+; CHECK-NEXT: cmpnlesd %xmm2, %xmm1
+; CHECK-NEXT: andnpd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ugt double %x, 0.000000e+00
%d = select i1 %c, double 0.000000e+00, double %x
ret double %d
}
define double @ult_inverse_x(double %x) {
-; STRICT-LABEL: ult_inverse_x:
-; STRICT: # %bb.0:
-; STRICT-NEXT: xorpd %xmm1, %xmm1
-; STRICT-NEXT: cmpnlesd %xmm0, %xmm1
-; STRICT-NEXT: andnpd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: ult_inverse_x:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: xorpd %xmm1, %xmm1
-; UNSAFE-NEXT: maxsd %xmm1, %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: ult_inverse_x:
-; FINITE: # %bb.0:
-; FINITE-NEXT: xorpd %xmm1, %xmm1
-; FINITE-NEXT: maxsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: ult_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: cmpnlesd %xmm0, %xmm1
+; CHECK-NEXT: andnpd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ult double %x, 0.000000e+00
%d = select i1 %c, double 0.000000e+00, double %x
ret double %d
}
define double @uge_x(double %x) {
-; STRICT-LABEL: uge_x:
-; STRICT: # %bb.0:
-; STRICT-NEXT: xorpd %xmm1, %xmm1
-; STRICT-NEXT: maxsd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: uge_x:
-; RELAX: # %bb.0:
-; RELAX-NEXT: xorpd %xmm1, %xmm1
-; RELAX-NEXT: maxsd %xmm1, %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: uge_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp uge double %x, 0.000000e+00
%d = select i1 %c, double %x, double 0.000000e+00
ret double %d
}
define double @ule_x(double %x) {
-; STRICT-LABEL: ule_x:
-; STRICT: # %bb.0:
-; STRICT-NEXT: xorpd %xmm1, %xmm1
-; STRICT-NEXT: minsd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: ule_x:
-; RELAX: # %bb.0:
-; RELAX-NEXT: xorpd %xmm1, %xmm1
-; RELAX-NEXT: minsd %xmm1, %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: ule_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ule double %x, 0.000000e+00
%d = select i1 %c, double %x, double 0.000000e+00
ret double %d
}
define double @uge_inverse_x(double %x) {
-; STRICT-LABEL: uge_inverse_x:
-; STRICT: # %bb.0:
-; STRICT-NEXT: xorpd %xmm1, %xmm1
-; STRICT-NEXT: minsd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: uge_inverse_x:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: xorpd %xmm1, %xmm1
-; UNSAFE-NEXT: minsd %xmm1, %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: uge_inverse_x:
-; FINITE: # %bb.0:
-; FINITE-NEXT: xorpd %xmm1, %xmm1
-; FINITE-NEXT: minsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: uge_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: minsd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp uge double %x, 0.000000e+00
%d = select i1 %c, double 0.000000e+00, double %x
ret double %d
}
define double @ule_inverse_x(double %x) {
-; STRICT-LABEL: ule_inverse_x:
-; STRICT: # %bb.0:
-; STRICT-NEXT: xorpd %xmm1, %xmm1
-; STRICT-NEXT: maxsd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: ule_inverse_x:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: xorpd %xmm1, %xmm1
-; UNSAFE-NEXT: maxsd %xmm1, %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: ule_inverse_x:
-; FINITE: # %bb.0:
-; FINITE-NEXT: xorpd %xmm1, %xmm1
-; FINITE-NEXT: maxsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: ule_inverse_x:
+; CHECK: # %bb.0:
+; CHECK-NEXT: xorpd %xmm1, %xmm1
+; CHECK-NEXT: maxsd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ule double %x, 0.000000e+00
%d = select i1 %c, double 0.000000e+00, double %x
ret double %d
}
define double @ogt_y(double %x) {
-; ALL-LABEL: ogt_y:
-; ALL: # %bb.0:
-; ALL-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; ALL-NEXT: retq
+; CHECK-LABEL: ogt_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
%c = fcmp ogt double %x, -0.000000e+00
%d = select i1 %c, double %x, double -0.000000e+00
ret double %d
}
define double @olt_y(double %x) {
-; ALL-LABEL: olt_y:
-; ALL: # %bb.0:
-; ALL-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; ALL-NEXT: retq
+; CHECK-LABEL: olt_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
%c = fcmp olt double %x, -0.000000e+00
%d = select i1 %c, double %x, double -0.000000e+00
ret double %d
}
define double @ogt_inverse_y(double %x) {
-; STRICT-LABEL: ogt_inverse_y:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
-; STRICT-NEXT: minsd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: ogt_inverse_y:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: ogt_inverse_y:
-; FINITE: # %bb.0:
-; FINITE-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
-; FINITE-NEXT: minsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: ogt_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ogt double %x, -0.000000e+00
%d = select i1 %c, double -0.000000e+00, double %x
ret double %d
}
define double @olt_inverse_y(double %x) {
-; STRICT-LABEL: olt_inverse_y:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
-; STRICT-NEXT: maxsd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: olt_inverse_y:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: olt_inverse_y:
-; FINITE: # %bb.0:
-; FINITE-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
-; FINITE-NEXT: maxsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: olt_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp olt double %x, -0.000000e+00
%d = select i1 %c, double -0.000000e+00, double %x
ret double %d
}
define double @oge_y(double %x) {
-; STRICT-LABEL: oge_y:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movapd %xmm0, %xmm1
-; STRICT-NEXT: movsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]
-; STRICT-NEXT: cmplesd %xmm1, %xmm0
-; STRICT-NEXT: movapd {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]
-; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2
-; STRICT-NEXT: movapd %xmm2, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: oge_y:
-; RELAX: # %bb.0:
-; RELAX-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: oge_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movapd %xmm0, %xmm1
+; CHECK-NEXT: movsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]
+; CHECK-NEXT: cmplesd %xmm1, %xmm0
+; CHECK-NEXT: movapd {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]
+; CHECK-NEXT: blendvpd %xmm0, %xmm1, %xmm2
+; CHECK-NEXT: movapd %xmm2, %xmm0
+; CHECK-NEXT: retq
%c = fcmp oge double %x, -0.000000e+00
%d = select i1 %c, double %x, double -0.000000e+00
ret double %d
}
define double @ole_y(double %x) {
-; STRICT-LABEL: ole_y:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movapd %xmm0, %xmm1
-; STRICT-NEXT: cmplesd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; STRICT-NEXT: movapd {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]
-; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2
-; STRICT-NEXT: movapd %xmm2, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: ole_y:
-; RELAX: # %bb.0:
-; RELAX-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: ole_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movapd %xmm0, %xmm1
+; CHECK-NEXT: cmplesd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: movapd {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]
+; CHECK-NEXT: blendvpd %xmm0, %xmm1, %xmm2
+; CHECK-NEXT: movapd %xmm2, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ole double %x, -0.000000e+00
%d = select i1 %c, double %x, double -0.000000e+00
ret double %d
}
define double @oge_inverse_y(double %x) {
-; STRICT-LABEL: oge_inverse_y:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movapd %xmm0, %xmm1
-; STRICT-NEXT: movsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]
-; STRICT-NEXT: cmplesd %xmm1, %xmm0
-; STRICT-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: oge_inverse_y:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: oge_inverse_y:
-; FINITE: # %bb.0:
-; FINITE-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
-; FINITE-NEXT: minsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; RELAX-LABEL: oge_inverse_y:
+; RELAX: # %bb.0:
+; RELAX-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; RELAX-NEXT: retq
+; CHECK-LABEL: oge_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movapd %xmm0, %xmm1
+; CHECK-NEXT: movsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]
+; CHECK-NEXT: cmplesd %xmm1, %xmm0
+; CHECK-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp oge double %x, -0.000000e+00
%d = select i1 %c, double -0.000000e+00, double %x
ret double %d
}
define double @ole_inverse_y(double %x) {
-; STRICT-LABEL: ole_inverse_y:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movapd %xmm0, %xmm1
-; STRICT-NEXT: cmplesd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; STRICT-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: ole_inverse_y:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: ole_inverse_y:
-; FINITE: # %bb.0:
-; FINITE-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
-; FINITE-NEXT: maxsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; RELAX-LABEL: ole_inverse_y:
+; RELAX: # %bb.0:
+; RELAX-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; RELAX-NEXT: retq
+; CHECK-LABEL: ole_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movapd %xmm0, %xmm1
+; CHECK-NEXT: cmplesd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ole double %x, -0.000000e+00
%d = select i1 %c, double -0.000000e+00, double %x
ret double %d
}
define double @ugt_y(double %x) {
-; STRICT-LABEL: ugt_y:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movapd %xmm0, %xmm1
-; STRICT-NEXT: cmpnlesd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; STRICT-NEXT: movapd {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]
-; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2
-; STRICT-NEXT: movapd %xmm2, %xmm0
-; STRICT-NEXT: retq
-;
; RELAX-LABEL: ugt_y:
; RELAX: # %bb.0:
; RELAX-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
; RELAX-NEXT: retq
+; CHECK-LABEL: ugt_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movapd %xmm0, %xmm1
+; CHECK-NEXT: cmpnlesd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: movapd {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]
+; CHECK-NEXT: blendvpd %xmm0, %xmm1, %xmm2
+; CHECK-NEXT: movapd %xmm2, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ugt double %x, -0.000000e+00
%d = select i1 %c, double %x, double -0.000000e+00
ret double %d
}
define double @ult_y(double %x) {
-; STRICT-LABEL: ult_y:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movapd %xmm0, %xmm1
-; STRICT-NEXT: movsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]
-; STRICT-NEXT: cmpnlesd %xmm1, %xmm0
-; STRICT-NEXT: movapd {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]
-; STRICT-NEXT: blendvpd %xmm0, %xmm1, %xmm2
-; STRICT-NEXT: movapd %xmm2, %xmm0
-; STRICT-NEXT: retq
-;
; RELAX-LABEL: ult_y:
; RELAX: # %bb.0:
; RELAX-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
; RELAX-NEXT: retq
+; CHECK-LABEL: ult_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movapd %xmm0, %xmm1
+; CHECK-NEXT: movsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]
+; CHECK-NEXT: cmpnlesd %xmm1, %xmm0
+; CHECK-NEXT: movapd {{.*#+}} xmm2 = [-0.0E+0,-0.0E+0]
+; CHECK-NEXT: blendvpd %xmm0, %xmm1, %xmm2
+; CHECK-NEXT: movapd %xmm2, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ult double %x, -0.000000e+00
%d = select i1 %c, double %x, double -0.000000e+00
ret double %d
}
define double @ugt_inverse_y(double %x) {
-; STRICT-LABEL: ugt_inverse_y:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movapd %xmm0, %xmm1
-; STRICT-NEXT: cmpnlesd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; STRICT-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: ugt_inverse_y:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: ugt_inverse_y:
-; FINITE: # %bb.0:
-; FINITE-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
-; FINITE-NEXT: minsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: ugt_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movapd %xmm0, %xmm1
+; CHECK-NEXT: cmpnlesd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ugt double %x, -0.000000e+00
%d = select i1 %c, double -0.000000e+00, double %x
ret double %d
}
define double @ult_inverse_y(double %x) {
-; STRICT-LABEL: ult_inverse_y:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movapd %xmm0, %xmm1
-; STRICT-NEXT: movsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]
-; STRICT-NEXT: cmpnlesd %xmm1, %xmm0
-; STRICT-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: ult_inverse_y:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: ult_inverse_y:
-; FINITE: # %bb.0:
-; FINITE-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
-; FINITE-NEXT: maxsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: ult_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movapd %xmm0, %xmm1
+; CHECK-NEXT: movsd {{.*#+}} xmm0 = [-0.0E+0,0.0E+0]
+; CHECK-NEXT: cmpnlesd %xmm1, %xmm0
+; CHECK-NEXT: blendvpd %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ult double %x, -0.000000e+00
%d = select i1 %c, double -0.000000e+00, double %x
ret double %d
}
define double @uge_y(double %x) {
-; STRICT-LABEL: uge_y:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
-; STRICT-NEXT: maxsd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: uge_y:
-; RELAX: # %bb.0:
-; RELAX-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: uge_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp uge double %x, -0.000000e+00
%d = select i1 %c, double %x, double -0.000000e+00
ret double %d
}
define double @ule_y(double %x) {
-; STRICT-LABEL: ule_y:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
-; STRICT-NEXT: minsd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: ule_y:
-; RELAX: # %bb.0:
-; RELAX-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: ule_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%c = fcmp ule double %x, -0.000000e+00
%d = select i1 %c, double %x, double -0.000000e+00
ret double %d
}
define double @uge_inverse_y(double %x) {
-; STRICT-LABEL: uge_inverse_y:
-; STRICT: # %bb.0:
-; STRICT-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: uge_inverse_y:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: uge_inverse_y:
-; FINITE: # %bb.0:
-; FINITE-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
-; FINITE-NEXT: minsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: uge_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
%c = fcmp uge double %x, -0.000000e+00
%d = select i1 %c, double -0.000000e+00, double %x
ret double %d
}
define double @ule_inverse_y(double %x) {
-; STRICT-LABEL: ule_inverse_y:
-; STRICT: # %bb.0:
-; STRICT-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: ule_inverse_y:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: ule_inverse_y:
-; FINITE: # %bb.0:
-; FINITE-NEXT: movsd {{.*#+}} xmm1 = [-0.0E+0,0.0E+0]
-; FINITE-NEXT: maxsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: ule_inverse_y:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
%c = fcmp ule double %x, -0.000000e+00
%d = select i1 %c, double -0.000000e+00, double %x
ret double %d
@@ -988,332 +654,196 @@ define double @ule_inverse_y(double %x) {
; Test a few more misc. cases.
define double @clampTo3k_a(double %x) {
-; STRICT-LABEL: clampTo3k_a:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
-; STRICT-NEXT: minsd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: clampTo3k_a:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: clampTo3k_a:
-; FINITE: # %bb.0:
-; FINITE-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
-; FINITE-NEXT: minsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: clampTo3k_a:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%t0 = fcmp ogt double %x, 3.000000e+03
%y = select i1 %t0, double 3.000000e+03, double %x
ret double %y
}
define double @clampTo3k_b(double %x) {
-; STRICT-LABEL: clampTo3k_b:
-; STRICT: # %bb.0:
-; STRICT-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: clampTo3k_b:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: clampTo3k_b:
-; FINITE: # %bb.0:
-; FINITE-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
-; FINITE-NEXT: minsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: clampTo3k_b:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
%t0 = fcmp uge double %x, 3.000000e+03
%y = select i1 %t0, double 3.000000e+03, double %x
ret double %y
}
define double @clampTo3k_c(double %x) {
-; STRICT-LABEL: clampTo3k_c:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
-; STRICT-NEXT: maxsd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: clampTo3k_c:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: clampTo3k_c:
-; FINITE: # %bb.0:
-; FINITE-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
-; FINITE-NEXT: maxsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: clampTo3k_c:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%t0 = fcmp olt double %x, 3.000000e+03
%y = select i1 %t0, double 3.000000e+03, double %x
ret double %y
}
define double @clampTo3k_d(double %x) {
-; STRICT-LABEL: clampTo3k_d:
-; STRICT: # %bb.0:
-; STRICT-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: clampTo3k_d:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: clampTo3k_d:
-; FINITE: # %bb.0:
-; FINITE-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
-; FINITE-NEXT: maxsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: clampTo3k_d:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
%t0 = fcmp ule double %x, 3.000000e+03
%y = select i1 %t0, double 3.000000e+03, double %x
ret double %y
}
define double @clampTo3k_e(double %x) {
-; STRICT-LABEL: clampTo3k_e:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
-; STRICT-NEXT: maxsd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: clampTo3k_e:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: clampTo3k_e:
-; FINITE: # %bb.0:
-; FINITE-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
-; FINITE-NEXT: maxsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: clampTo3k_e:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
+; CHECK-NEXT: maxsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%t0 = fcmp olt double %x, 3.000000e+03
%y = select i1 %t0, double 3.000000e+03, double %x
ret double %y
}
define double @clampTo3k_f(double %x) {
-; STRICT-LABEL: clampTo3k_f:
-; STRICT: # %bb.0:
-; STRICT-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: clampTo3k_f:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: clampTo3k_f:
-; FINITE: # %bb.0:
-; FINITE-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
-; FINITE-NEXT: maxsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: clampTo3k_f:
+; CHECK: # %bb.0:
+; CHECK-NEXT: maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
%t0 = fcmp ule double %x, 3.000000e+03
%y = select i1 %t0, double 3.000000e+03, double %x
ret double %y
}
define double @clampTo3k_g(double %x) {
-; STRICT-LABEL: clampTo3k_g:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
-; STRICT-NEXT: minsd %xmm0, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: clampTo3k_g:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: clampTo3k_g:
-; FINITE: # %bb.0:
-; FINITE-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
-; FINITE-NEXT: minsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: clampTo3k_g:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
+; CHECK-NEXT: minsd %xmm0, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%t0 = fcmp ogt double %x, 3.000000e+03
%y = select i1 %t0, double 3.000000e+03, double %x
ret double %y
}
define double @clampTo3k_h(double %x) {
-; STRICT-LABEL: clampTo3k_h:
-; STRICT: # %bb.0:
-; STRICT-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; STRICT-NEXT: retq
-;
-; UNSAFE-LABEL: clampTo3k_h:
-; UNSAFE: # %bb.0:
-; UNSAFE-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; UNSAFE-NEXT: retq
-;
-; FINITE-LABEL: clampTo3k_h:
-; FINITE: # %bb.0:
-; FINITE-NEXT: movsd {{.*#+}} xmm1 = [3.0E+3,0.0E+0]
-; FINITE-NEXT: minsd %xmm0, %xmm1
-; FINITE-NEXT: movapd %xmm1, %xmm0
-; FINITE-NEXT: retq
+; CHECK-LABEL: clampTo3k_h:
+; CHECK: # %bb.0:
+; CHECK-NEXT: minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; CHECK-NEXT: retq
%t0 = fcmp uge double %x, 3.000000e+03
%y = select i1 %t0, double 3.000000e+03, double %x
ret double %y
}
define <2 x double> @test_maxpd(<2 x double> %x, <2 x double> %y) {
-; STRICT-LABEL: test_maxpd:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movapd %xmm0, %xmm2
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: cmplepd %xmm2, %xmm0
-; STRICT-NEXT: blendvpd %xmm0, %xmm2, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: test_maxpd:
-; RELAX: # %bb.0:
-; RELAX-NEXT: maxpd %xmm1, %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: test_maxpd:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movapd %xmm0, %xmm2
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: cmplepd %xmm2, %xmm0
+; CHECK-NEXT: blendvpd %xmm0, %xmm2, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%max_is_x = fcmp oge <2 x double> %x, %y
%max = select <2 x i1> %max_is_x, <2 x double> %x, <2 x double> %y
ret <2 x double> %max
}
define <2 x double> @test_minpd(<2 x double> %x, <2 x double> %y) {
-; STRICT-LABEL: test_minpd:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movapd %xmm0, %xmm2
-; STRICT-NEXT: cmplepd %xmm1, %xmm0
-; STRICT-NEXT: blendvpd %xmm0, %xmm2, %xmm1
-; STRICT-NEXT: movapd %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: test_minpd:
-; RELAX: # %bb.0:
-; RELAX-NEXT: minpd %xmm1, %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: test_minpd:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movapd %xmm0, %xmm2
+; CHECK-NEXT: cmplepd %xmm1, %xmm0
+; CHECK-NEXT: blendvpd %xmm0, %xmm2, %xmm1
+; CHECK-NEXT: movapd %xmm1, %xmm0
+; CHECK-NEXT: retq
%min_is_x = fcmp ole <2 x double> %x, %y
%min = select <2 x i1> %min_is_x, <2 x double> %x, <2 x double> %y
ret <2 x double> %min
}
define <4 x float> @test_maxps(<4 x float> %x, <4 x float> %y) {
-; STRICT-LABEL: test_maxps:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movaps %xmm0, %xmm2
-; STRICT-NEXT: movaps %xmm1, %xmm0
-; STRICT-NEXT: cmpleps %xmm2, %xmm0
-; STRICT-NEXT: blendvps %xmm0, %xmm2, %xmm1
-; STRICT-NEXT: movaps %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: test_maxps:
-; RELAX: # %bb.0:
-; RELAX-NEXT: maxps %xmm1, %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: test_maxps:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movaps %xmm0, %xmm2
+; CHECK-NEXT: movaps %xmm1, %xmm0
+; CHECK-NEXT: cmpleps %xmm2, %xmm0
+; CHECK-NEXT: blendvps %xmm0, %xmm2, %xmm1
+; CHECK-NEXT: movaps %xmm1, %xmm0
+; CHECK-NEXT: retq
%max_is_x = fcmp oge <4 x float> %x, %y
%max = select <4 x i1> %max_is_x, <4 x float> %x, <4 x float> %y
ret <4 x float> %max
}
define <4 x float> @test_minps(<4 x float> %x, <4 x float> %y) {
-; STRICT-LABEL: test_minps:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movaps %xmm0, %xmm2
-; STRICT-NEXT: cmpleps %xmm1, %xmm0
-; STRICT-NEXT: blendvps %xmm0, %xmm2, %xmm1
-; STRICT-NEXT: movaps %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: test_minps:
-; RELAX: # %bb.0:
-; RELAX-NEXT: minps %xmm1, %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: test_minps:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movaps %xmm0, %xmm2
+; CHECK-NEXT: cmpleps %xmm1, %xmm0
+; CHECK-NEXT: blendvps %xmm0, %xmm2, %xmm1
+; CHECK-NEXT: movaps %xmm1, %xmm0
+; CHECK-NEXT: retq
%min_is_x = fcmp ole <4 x float> %x, %y
%min = select <4 x i1> %min_is_x, <4 x float> %x, <4 x float> %y
ret <4 x float> %min
}
define <2 x float> @test_maxps_illegal_v2f32(<2 x float> %x, <2 x float> %y) {
-; STRICT-LABEL: test_maxps_illegal_v2f32:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movaps %xmm0, %xmm2
-; STRICT-NEXT: movaps %xmm1, %xmm0
-; STRICT-NEXT: cmpleps %xmm2, %xmm0
-; STRICT-NEXT: blendvps %xmm0, %xmm2, %xmm1
-; STRICT-NEXT: movaps %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: test_maxps_illegal_v2f32:
-; RELAX: # %bb.0:
-; RELAX-NEXT: maxps %xmm1, %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: test_maxps_illegal_v2f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movaps %xmm0, %xmm2
+; CHECK-NEXT: movaps %xmm1, %xmm0
+; CHECK-NEXT: cmpleps %xmm2, %xmm0
+; CHECK-NEXT: blendvps %xmm0, %xmm2, %xmm1
+; CHECK-NEXT: movaps %xmm1, %xmm0
+; CHECK-NEXT: retq
%max_is_x = fcmp oge <2 x float> %x, %y
%max = select <2 x i1> %max_is_x, <2 x float> %x, <2 x float> %y
ret <2 x float> %max
}
define <2 x float> @test_minps_illegal_v2f32(<2 x float> %x, <2 x float> %y) {
-; STRICT-LABEL: test_minps_illegal_v2f32:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movaps %xmm0, %xmm2
-; STRICT-NEXT: cmpleps %xmm1, %xmm0
-; STRICT-NEXT: blendvps %xmm0, %xmm2, %xmm1
-; STRICT-NEXT: movaps %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: test_minps_illegal_v2f32:
-; RELAX: # %bb.0:
-; RELAX-NEXT: minps %xmm1, %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: test_minps_illegal_v2f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movaps %xmm0, %xmm2
+; CHECK-NEXT: cmpleps %xmm1, %xmm0
+; CHECK-NEXT: blendvps %xmm0, %xmm2, %xmm1
+; CHECK-NEXT: movaps %xmm1, %xmm0
+; CHECK-NEXT: retq
%min_is_x = fcmp ole <2 x float> %x, %y
%min = select <2 x i1> %min_is_x, <2 x float> %x, <2 x float> %y
ret <2 x float> %min
}
define <3 x float> @test_maxps_illegal_v3f32(<3 x float> %x, <3 x float> %y) {
-; STRICT-LABEL: test_maxps_illegal_v3f32:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movaps %xmm0, %xmm2
-; STRICT-NEXT: movaps %xmm1, %xmm0
-; STRICT-NEXT: cmpleps %xmm2, %xmm0
-; STRICT-NEXT: blendvps %xmm0, %xmm2, %xmm1
-; STRICT-NEXT: movaps %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: test_maxps_illegal_v3f32:
-; RELAX: # %bb.0:
-; RELAX-NEXT: maxps %xmm1, %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: test_maxps_illegal_v3f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movaps %xmm0, %xmm2
+; CHECK-NEXT: movaps %xmm1, %xmm0
+; CHECK-NEXT: cmpleps %xmm2, %xmm0
+; CHECK-NEXT: blendvps %xmm0, %xmm2, %xmm1
+; CHECK-NEXT: movaps %xmm1, %xmm0
+; CHECK-NEXT: retq
%max_is_x = fcmp oge <3 x float> %x, %y
%max = select <3 x i1> %max_is_x, <3 x float> %x, <3 x float> %y
ret <3 x float> %max
}
define <3 x float> @test_minps_illegal_v3f32(<3 x float> %x, <3 x float> %y) {
-; STRICT-LABEL: test_minps_illegal_v3f32:
-; STRICT: # %bb.0:
-; STRICT-NEXT: movaps %xmm0, %xmm2
-; STRICT-NEXT: cmpleps %xmm1, %xmm0
-; STRICT-NEXT: blendvps %xmm0, %xmm2, %xmm1
-; STRICT-NEXT: movaps %xmm1, %xmm0
-; STRICT-NEXT: retq
-;
-; RELAX-LABEL: test_minps_illegal_v3f32:
-; RELAX: # %bb.0:
-; RELAX-NEXT: minps %xmm1, %xmm0
-; RELAX-NEXT: retq
+; CHECK-LABEL: test_minps_illegal_v3f32:
+; CHECK: # %bb.0:
+; CHECK-NEXT: movaps %xmm0, %xmm2
+; CHECK-NEXT: cmpleps %xmm1, %xmm0
+; CHECK-NEXT: blendvps %xmm0, %xmm2, %xmm1
+; CHECK-NEXT: movaps %xmm1, %xmm0
+; CHECK-NEXT: retq
%min_is_x = fcmp ole <3 x float> %x, %y
%min = select <3 x i1> %min_is_x, <3 x float> %x, <3 x float> %y
ret <3 x float> %min
@@ -1322,10 +852,10 @@ define <3 x float> @test_minps_illegal_v3f32(<3 x float> %x, <3 x float> %y) {
; OSS-Fuzz #13838
; https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=13838
define float @ossfuzz13838(float %x) {
-; ALL-LABEL: ossfuzz13838:
-; ALL: # %bb.0: # %bb
-; ALL-NEXT: movss {{.*#+}} xmm0 = [2.55E+2,0.0E+0,0.0E+0,0.0E+0]
-; ALL-NEXT: retq
+; CHECK-LABEL: ossfuzz13838:
+; CHECK: # %bb.0: # %bb
+; CHECK-NEXT: movss {{.*#+}} xmm0 = [2.55E+2,0.0E+0,0.0E+0,0.0E+0]
+; CHECK-NEXT: retq
bb:
%cmp2 = fcmp fast olt float %x, 2.550000e+02
%B1 = urem i1 %cmp2, %cmp2
>From 7fef08f353ef1fddf93ab1bb147bda752d9bac3c Mon Sep 17 00:00:00 2001
From: PaperChalice <liujunchang97 at outlook.com>
Date: Fri, 28 Nov 2025 21:52:33 +0800
Subject: [PATCH 4/4] Fix PowerPC tests
---
llvm/test/CodeGen/PowerPC/change-no-infs.ll | 67 -
llvm/test/CodeGen/PowerPC/fsel.ll | 20 +-
llvm/test/CodeGen/PowerPC/scalar-equal.ll | 110 +-
llvm/test/CodeGen/PowerPC/scalar_cmp.ll | 1494 +++++++------------
4 files changed, 621 insertions(+), 1070 deletions(-)
delete mode 100644 llvm/test/CodeGen/PowerPC/change-no-infs.ll
diff --git a/llvm/test/CodeGen/PowerPC/change-no-infs.ll b/llvm/test/CodeGen/PowerPC/change-no-infs.ll
deleted file mode 100644
index 0cd5eb5408e3e..0000000000000
--- a/llvm/test/CodeGen/PowerPC/change-no-infs.ll
+++ /dev/null
@@ -1,67 +0,0 @@
-; Check that we can enable/disable NoInfsFPMath and NoNaNsInFPMath via function
-; attributes. An attribute on one function should not magically apply to the
-; next one.
-
-; RUN: llc < %s -mtriple=powerpc64-unknown-unknown -mcpu=pwr7 -mattr=-vsx \
-; RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=SAFE
-
-; RUN: llc < %s -mtriple=powerpc64-unknown-unknown -mcpu=pwr7 -mattr=-vsx \
-; RUN: -enable-no-infs-fp-math -enable-no-nans-fp-math \
-; RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=UNSAFE
-
-; The fcmp+select in these functions should be converted to a fsel instruction
-; when both NoInfsFPMath and NoNaNsInFPMath are enabled.
-
-; CHECK-LABEL: default0:
-define double @default0(double %a, double %y, double %z) {
-entry:
-; SAFE-NOT: fsel
-; UNSAFE: fsel
- %cmp = fcmp ult double %a, 0.000000e+00
- %z.y = select i1 %cmp, double %z, double %y
- ret double %z.y
-}
-
-; CHECK-LABEL: unsafe_math_off:
-define double @unsafe_math_off(double %a, double %y, double %z) #0 #2 {
-entry:
-; SAFE-NOT: fsel
-; UNSAFE-NOT: fsel
- %cmp = fcmp ult double %a, 0.000000e+00
- %z.y = select i1 %cmp, double %z, double %y
- ret double %z.y
-}
-
-; CHECK-LABEL: default1:
-define double @default1(double %a, double %y, double %z) {
-; SAFE-NOT: fsel
-; UNSAFE: fsel
- %cmp = fcmp ult double %a, 0.000000e+00
- %z.y = select i1 %cmp, double %z, double %y
- ret double %z.y
-}
-
-; CHECK-LABEL: unsafe_math_on:
-define double @unsafe_math_on(double %a, double %y, double %z) #1 #3 {
-entry:
-; SAFE-NOT: fsel
-; UNSAFE-NOT: fsel
- %cmp = fcmp ult double %a, 0.000000e+00
- %z.y = select i1 %cmp, double %z, double %y
- ret double %z.y
-}
-
-; CHECK-LABEL: default2:
-define double @default2(double %a, double %y, double %z) {
-; SAFE-NOT: fsel
-; UNSAFE: fsel
- %cmp = fcmp ult double %a, 0.000000e+00
- %z.y = select i1 %cmp, double %z, double %y
- ret double %z.y
-}
-
-attributes #0 = { "no-infs-fp-math"="false" }
-attributes #1 = { "no-nans-fp-math"="false" }
-
-attributes #2 = { "no-infs-fp-math"="false" }
-attributes #3 = { "no-infs-fp-math"="true" }
diff --git a/llvm/test/CodeGen/PowerPC/fsel.ll b/llvm/test/CodeGen/PowerPC/fsel.ll
index dea442d8404e1..13d94d1c28822 100644
--- a/llvm/test/CodeGen/PowerPC/fsel.ll
+++ b/llvm/test/CodeGen/PowerPC/fsel.ll
@@ -1,12 +1,12 @@
; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -mattr=-vsx | FileCheck %s
-; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -enable-no-infs-fp-math -enable-no-nans-fp-math -mattr=-vsx | FileCheck -check-prefix=CHECK-FM %s
-; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -enable-no-infs-fp-math -enable-no-nans-fp-math -mattr=+vsx | FileCheck -check-prefix=CHECK-FM-VSX %s
+; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -enable-no-infs-fp-math -mattr=-vsx | FileCheck -check-prefix=CHECK-FM %s
+; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -enable-no-infs-fp-math -mattr=+vsx | FileCheck -check-prefix=CHECK-FM-VSX %s
target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64"
target triple = "powerpc64-unknown-linux-gnu"
define double @zerocmp1(double %a, double %y, double %z) #0 {
entry:
- %cmp = fcmp ult double %a, 0.000000e+00
+ %cmp = fcmp nnan ult double %a, 0.000000e+00
%z.y = select i1 %cmp, double %z, double %y
ret double %z.y
@@ -25,7 +25,7 @@ entry:
define double @zerocmp2(double %a, double %y, double %z) #0 {
entry:
- %cmp = fcmp ogt double %a, 0.000000e+00
+ %cmp = fcmp nnan ogt double %a, 0.000000e+00
%y.z = select i1 %cmp, double %y, double %z
ret double %y.z
@@ -46,7 +46,7 @@ entry:
define double @zerocmp3(double %a, double %y, double %z) #0 {
entry:
- %cmp = fcmp oeq double %a, 0.000000e+00
+ %cmp = fcmp nnan oeq double %a, 0.000000e+00
%y.z = select i1 %cmp, double %y, double %z
ret double %y.z
@@ -69,7 +69,7 @@ entry:
define double @min1(double %a, double %b) #0 {
entry:
- %cmp = fcmp ole double %a, %b
+ %cmp = fcmp nnan ole double %a, %b
%cond = select i1 %cmp, double %a, double %b
ret double %cond
@@ -90,7 +90,7 @@ entry:
define double @max1(double %a, double %b) #0 {
entry:
- %cmp = fcmp oge double %a, %b
+ %cmp = fcmp nnan oge double %a, %b
%cond = select i1 %cmp, double %a, double %b
ret double %cond
@@ -111,7 +111,7 @@ entry:
define double @cmp1(double %a, double %b, double %y, double %z) #0 {
entry:
- %cmp = fcmp ult double %a, %b
+ %cmp = fcmp nnan ult double %a, %b
%z.y = select i1 %cmp, double %z, double %y
ret double %z.y
@@ -132,7 +132,7 @@ entry:
define double @cmp2(double %a, double %b, double %y, double %z) #0 {
entry:
- %cmp = fcmp ogt double %a, %b
+ %cmp = fcmp nnan ogt double %a, %b
%y.z = select i1 %cmp, double %y, double %z
ret double %y.z
@@ -153,7 +153,7 @@ entry:
define double @cmp3(double %a, double %b, double %y, double %z) #0 {
entry:
- %cmp = fcmp oeq double %a, %b
+ %cmp = fcmp nnan oeq double %a, %b
%y.z = select i1 %cmp, double %y, double %z
ret double %y.z
diff --git a/llvm/test/CodeGen/PowerPC/scalar-equal.ll b/llvm/test/CodeGen/PowerPC/scalar-equal.ll
index c0b11b47236a9..de829b5d54dee 100644
--- a/llvm/test/CodeGen/PowerPC/scalar-equal.ll
+++ b/llvm/test/CodeGen/PowerPC/scalar-equal.ll
@@ -1,57 +1,31 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names \
-; RUN: -verify-machineinstrs --enable-no-signed-zeros-fp-math \
-; RUN: --enable-no-nans-fp-math --enable-no-infs-fp-math \
-; RUN: -mtriple=powerpc64le-unknown-unknown < %s | FileCheck %s \
-; RUN: --check-prefix=FAST-P8
-; RUN: llc -mcpu=pwr9 -ppc-asm-full-reg-names \
-; RUN: -verify-machineinstrs --enable-no-signed-zeros-fp-math \
-; RUN: --enable-no-nans-fp-math --enable-no-infs-fp-math \
-; RUN: -mtriple=powerpc64le-unknown-unknown < %s | FileCheck %s \
-; RUN: --check-prefix=FAST-P9
; RUN: llc -mcpu=pwr9 -ppc-asm-full-reg-names -verify-machineinstrs \
; RUN: -mtriple=powerpc64le-unknown-unknown < %s | FileCheck %s \
-; RUN: --check-prefix=NO-FAST-P9
+; RUN: --check-prefix=P9
; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names -verify-machineinstrs \
; RUN: -mtriple=powerpc64le-unknown-unknown < %s | FileCheck %s \
-; RUN: --check-prefix=NO-FAST-P8
+; RUN: --check-prefix=P8
define double @testoeq(double %a, double %b, double %c, double %d) {
-; FAST-P8-LABEL: testoeq:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubdp f0, f1, f2
-; FAST-P8-NEXT: fsel f1, f0, f3, f4
-; FAST-P8-NEXT: xsnegdp f0, f0
-; FAST-P8-NEXT: fsel f1, f0, f1, f4
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: testoeq:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubdp f0, f1, f2
-; FAST-P9-NEXT: fsel f1, f0, f3, f4
-; FAST-P9-NEXT: xsnegdp f0, f0
-; FAST-P9-NEXT: fsel f1, f0, f1, f4
-; FAST-P9-NEXT: blr
+; P9-LABEL: testoeq:
+; P9: # %bb.0: # %entry
+; P9-NEXT: xscmpudp cr0, f1, f2
+; P9-NEXT: beq cr0, .LBB0_2
+; P9-NEXT: # %bb.1: # %entry
+; P9-NEXT: fmr f3, f4
+; P9-NEXT: .LBB0_2: # %entry
+; P9-NEXT: fmr f1, f3
+; P9-NEXT: blr
;
-; NO-FAST-P9-LABEL: testoeq:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: xscmpudp cr0, f1, f2
-; NO-FAST-P9-NEXT: beq cr0, .LBB0_2
-; NO-FAST-P9-NEXT: # %bb.1: # %entry
-; NO-FAST-P9-NEXT: fmr f3, f4
-; NO-FAST-P9-NEXT: .LBB0_2: # %entry
-; NO-FAST-P9-NEXT: fmr f1, f3
-; NO-FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: testoeq:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: xscmpudp cr0, f1, f2
-; NO-FAST-P8-NEXT: beq cr0, .LBB0_2
-; NO-FAST-P8-NEXT: # %bb.1: # %entry
-; NO-FAST-P8-NEXT: fmr f3, f4
-; NO-FAST-P8-NEXT: .LBB0_2: # %entry
-; NO-FAST-P8-NEXT: fmr f1, f3
-; NO-FAST-P8-NEXT: blr
+; P8-LABEL: testoeq:
+; P8: # %bb.0: # %entry
+; P8-NEXT: xscmpudp cr0, f1, f2
+; P8-NEXT: beq cr0, .LBB0_2
+; P8-NEXT: # %bb.1: # %entry
+; P8-NEXT: fmr f3, f4
+; P8-NEXT: .LBB0_2: # %entry
+; P8-NEXT: fmr f1, f3
+; P8-NEXT: blr
entry:
%cmp = fcmp oeq double %a, %b
%cond = select i1 %cmp, double %c, double %d
@@ -59,37 +33,21 @@ entry:
}
define double @testoeq_fast(double %a, double %b, double %c, double %d) {
-; FAST-P8-LABEL: testoeq_fast:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubdp f0, f1, f2
-; FAST-P8-NEXT: fsel f1, f0, f3, f4
-; FAST-P8-NEXT: xsnegdp f0, f0
-; FAST-P8-NEXT: fsel f1, f0, f1, f4
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: testoeq_fast:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubdp f0, f1, f2
-; FAST-P9-NEXT: fsel f1, f0, f3, f4
-; FAST-P9-NEXT: xsnegdp f0, f0
-; FAST-P9-NEXT: fsel f1, f0, f1, f4
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P9-LABEL: testoeq_fast:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: xssubdp f0, f1, f2
-; NO-FAST-P9-NEXT: fsel f1, f0, f3, f4
-; NO-FAST-P9-NEXT: xsnegdp f0, f0
-; NO-FAST-P9-NEXT: fsel f1, f0, f1, f4
-; NO-FAST-P9-NEXT: blr
+; P9-LABEL: testoeq_fast:
+; P9: # %bb.0: # %entry
+; P9-NEXT: xssubdp f0, f1, f2
+; P9-NEXT: fsel f1, f0, f3, f4
+; P9-NEXT: xsnegdp f0, f0
+; P9-NEXT: fsel f1, f0, f1, f4
+; P9-NEXT: blr
;
-; NO-FAST-P8-LABEL: testoeq_fast:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: xssubdp f0, f1, f2
-; NO-FAST-P8-NEXT: fsel f1, f0, f3, f4
-; NO-FAST-P8-NEXT: xsnegdp f0, f0
-; NO-FAST-P8-NEXT: fsel f1, f0, f1, f4
-; NO-FAST-P8-NEXT: blr
+; P8-LABEL: testoeq_fast:
+; P8: # %bb.0: # %entry
+; P8-NEXT: xssubdp f0, f1, f2
+; P8-NEXT: fsel f1, f0, f3, f4
+; P8-NEXT: xsnegdp f0, f0
+; P8-NEXT: fsel f1, f0, f1, f4
+; P8-NEXT: blr
entry:
%cmp = fcmp nnan ninf nsz oeq double %a, %b
%cond = select nnan ninf nsz i1 %cmp, double %c, double %d
diff --git a/llvm/test/CodeGen/PowerPC/scalar_cmp.ll b/llvm/test/CodeGen/PowerPC/scalar_cmp.ll
index 881d1f4c4093b..878b7f2449141 100644
--- a/llvm/test/CodeGen/PowerPC/scalar_cmp.ll
+++ b/llvm/test/CodeGen/PowerPC/scalar_cmp.ll
@@ -1,58 +1,36 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names \
; RUN: -verify-machineinstrs --enable-no-signed-zeros-fp-math \
-; RUN: --enable-no-nans-fp-math --enable-no-infs-fp-math \
+; RUN: --enable-no-nans-fp-math \
; RUN: -mtriple=powerpc64le-unknown-unknown < %s | FileCheck %s \
-; RUN: --check-prefix=FAST-P8
+; RUN: --check-prefix=P8
; RUN: llc -mcpu=pwr9 -ppc-asm-full-reg-names \
; RUN: -verify-machineinstrs --enable-no-signed-zeros-fp-math \
-; RUN: --enable-no-nans-fp-math --enable-no-infs-fp-math \
+; RUN: --enable-no-nans-fp-math \
; RUN: -mtriple=powerpc64le-unknown-unknown < %s | FileCheck %s \
-; RUN: --check-prefix=FAST-P9
-; RUN: llc -mcpu=pwr8 -ppc-asm-full-reg-names -verify-machineinstrs \
-; RUN: -mtriple=powerpc64le-unknown-unknown < %s | FileCheck %s \
-; RUN: --check-prefix=NO-FAST-P8
-; RUN: llc -mcpu=pwr9 -ppc-asm-full-reg-names -verify-machineinstrs \
-; RUN: -mtriple=powerpc64le-unknown-unknown < %s | FileCheck %s \
-; RUN: --check-prefix=NO-FAST-P9
+; RUN: --check-prefix=P9
; Test oeq
define float @select_oeq_float(float %a, float %b, float %c, float %d) {
-; FAST-P8-LABEL: select_oeq_float:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubsp f0, f1, f2
-; FAST-P8-NEXT: xsnegdp f1, f0
-; FAST-P8-NEXT: fsel f0, f0, f3, f4
-; FAST-P8-NEXT: fsel f1, f1, f0, f4
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_oeq_float:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubsp f0, f1, f2
-; FAST-P9-NEXT: xsnegdp f1, f0
-; FAST-P9-NEXT: fsel f0, f0, f3, f4
-; FAST-P9-NEXT: fsel f1, f1, f0, f4
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_oeq_float:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P8-NEXT: beq cr0, .LBB0_2
-; NO-FAST-P8-NEXT: # %bb.1: # %entry
-; NO-FAST-P8-NEXT: fmr f3, f4
-; NO-FAST-P8-NEXT: .LBB0_2: # %entry
-; NO-FAST-P8-NEXT: fmr f1, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_oeq_float:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P9-NEXT: beq cr0, .LBB0_2
-; NO-FAST-P9-NEXT: # %bb.1: # %entry
-; NO-FAST-P9-NEXT: fmr f3, f4
-; NO-FAST-P9-NEXT: .LBB0_2: # %entry
-; NO-FAST-P9-NEXT: fmr f1, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_oeq_float:
+; P8: # %bb.0: # %entry
+; P8-NEXT: fcmpu cr0, f1, f2
+; P8-NEXT: beq cr0, .LBB0_2
+; P8-NEXT: # %bb.1: # %entry
+; P8-NEXT: fmr f3, f4
+; P8-NEXT: .LBB0_2: # %entry
+; P8-NEXT: fmr f1, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_oeq_float:
+; P9: # %bb.0: # %entry
+; P9-NEXT: fcmpu cr0, f1, f2
+; P9-NEXT: beq cr0, .LBB0_2
+; P9-NEXT: # %bb.1: # %entry
+; P9-NEXT: fmr f3, f4
+; P9-NEXT: .LBB0_2: # %entry
+; P9-NEXT: fmr f1, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp oeq float %a, %b
%cond = select i1 %cmp, float %c, float %d
@@ -60,41 +38,25 @@ entry:
}
define float @select_oeq_float_nsz(float %a, float %b, float %c, float %d) {
-; FAST-P8-LABEL: select_oeq_float_nsz:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubsp f0, f2, f1
-; FAST-P8-NEXT: xssubsp f1, f1, f2
-; FAST-P8-NEXT: fsel f1, f1, f3, f4
-; FAST-P8-NEXT: fsel f1, f0, f1, f4
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_oeq_float_nsz:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubsp f0, f2, f1
-; FAST-P9-NEXT: xssubsp f1, f1, f2
-; FAST-P9-NEXT: fsel f1, f1, f3, f4
-; FAST-P9-NEXT: fsel f1, f0, f1, f4
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_oeq_float_nsz:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P8-NEXT: beq cr0, .LBB1_2
-; NO-FAST-P8-NEXT: # %bb.1: # %entry
-; NO-FAST-P8-NEXT: fmr f3, f4
-; NO-FAST-P8-NEXT: .LBB1_2: # %entry
-; NO-FAST-P8-NEXT: fmr f1, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_oeq_float_nsz:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P9-NEXT: beq cr0, .LBB1_2
-; NO-FAST-P9-NEXT: # %bb.1: # %entry
-; NO-FAST-P9-NEXT: fmr f3, f4
-; NO-FAST-P9-NEXT: .LBB1_2: # %entry
-; NO-FAST-P9-NEXT: fmr f1, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_oeq_float_nsz:
+; P8: # %bb.0: # %entry
+; P8-NEXT: fcmpu cr0, f1, f2
+; P8-NEXT: beq cr0, .LBB1_2
+; P8-NEXT: # %bb.1: # %entry
+; P8-NEXT: fmr f3, f4
+; P8-NEXT: .LBB1_2: # %entry
+; P8-NEXT: fmr f1, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_oeq_float_nsz:
+; P9: # %bb.0: # %entry
+; P9-NEXT: fcmpu cr0, f1, f2
+; P9-NEXT: beq cr0, .LBB1_2
+; P9-NEXT: # %bb.1: # %entry
+; P9-NEXT: fmr f3, f4
+; P9-NEXT: .LBB1_2: # %entry
+; P9-NEXT: fmr f1, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp nsz oeq float %a, %b
%cond = select i1 %cmp, float %c, float %d
@@ -102,41 +64,25 @@ entry:
}
define double @select_oeq_double(double %a, double %b, double %c, double %d) {
-; FAST-P8-LABEL: select_oeq_double:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubdp f0, f1, f2
-; FAST-P8-NEXT: fsel f1, f0, f3, f4
-; FAST-P8-NEXT: xsnegdp f0, f0
-; FAST-P8-NEXT: fsel f1, f0, f1, f4
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_oeq_double:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubdp f0, f1, f2
-; FAST-P9-NEXT: fsel f1, f0, f3, f4
-; FAST-P9-NEXT: xsnegdp f0, f0
-; FAST-P9-NEXT: fsel f1, f0, f1, f4
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_oeq_double:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: xscmpudp cr0, f1, f2
-; NO-FAST-P8-NEXT: beq cr0, .LBB2_2
-; NO-FAST-P8-NEXT: # %bb.1: # %entry
-; NO-FAST-P8-NEXT: fmr f3, f4
-; NO-FAST-P8-NEXT: .LBB2_2: # %entry
-; NO-FAST-P8-NEXT: fmr f1, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_oeq_double:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: xscmpudp cr0, f1, f2
-; NO-FAST-P9-NEXT: beq cr0, .LBB2_2
-; NO-FAST-P9-NEXT: # %bb.1: # %entry
-; NO-FAST-P9-NEXT: fmr f3, f4
-; NO-FAST-P9-NEXT: .LBB2_2: # %entry
-; NO-FAST-P9-NEXT: fmr f1, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_oeq_double:
+; P8: # %bb.0: # %entry
+; P8-NEXT: xscmpudp cr0, f1, f2
+; P8-NEXT: beq cr0, .LBB2_2
+; P8-NEXT: # %bb.1: # %entry
+; P8-NEXT: fmr f3, f4
+; P8-NEXT: .LBB2_2: # %entry
+; P8-NEXT: fmr f1, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_oeq_double:
+; P9: # %bb.0: # %entry
+; P9-NEXT: xscmpudp cr0, f1, f2
+; P9-NEXT: beq cr0, .LBB2_2
+; P9-NEXT: # %bb.1: # %entry
+; P9-NEXT: fmr f3, f4
+; P9-NEXT: .LBB2_2: # %entry
+; P9-NEXT: fmr f1, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp oeq double %a, %b
%cond = select i1 %cmp, double %c, double %d
@@ -144,37 +90,21 @@ entry:
}
define float @select_fast_oeq_float(float %a, float %b, float %c, float %d) {
-; FAST-P8-LABEL: select_fast_oeq_float:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubsp f0, f2, f1
-; FAST-P8-NEXT: xssubsp f1, f1, f2
-; FAST-P8-NEXT: fsel f1, f1, f3, f4
-; FAST-P8-NEXT: fsel f1, f0, f1, f4
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_fast_oeq_float:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubsp f0, f2, f1
-; FAST-P9-NEXT: xssubsp f1, f1, f2
-; FAST-P9-NEXT: fsel f1, f1, f3, f4
-; FAST-P9-NEXT: fsel f1, f0, f1, f4
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_fast_oeq_float:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: xssubsp f0, f2, f1
-; NO-FAST-P8-NEXT: xssubsp f1, f1, f2
-; NO-FAST-P8-NEXT: fsel f1, f1, f3, f4
-; NO-FAST-P8-NEXT: fsel f1, f0, f1, f4
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_fast_oeq_float:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: xssubsp f0, f2, f1
-; NO-FAST-P9-NEXT: xssubsp f1, f1, f2
-; NO-FAST-P9-NEXT: fsel f1, f1, f3, f4
-; NO-FAST-P9-NEXT: fsel f1, f0, f1, f4
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_fast_oeq_float:
+; P8: # %bb.0: # %entry
+; P8-NEXT: xssubsp f0, f2, f1
+; P8-NEXT: xssubsp f1, f1, f2
+; P8-NEXT: fsel f1, f1, f3, f4
+; P8-NEXT: fsel f1, f0, f1, f4
+; P8-NEXT: blr
+;
+; P9-LABEL: select_fast_oeq_float:
+; P9: # %bb.0: # %entry
+; P9-NEXT: xssubsp f0, f2, f1
+; P9-NEXT: xssubsp f1, f1, f2
+; P9-NEXT: fsel f1, f1, f3, f4
+; P9-NEXT: fsel f1, f0, f1, f4
+; P9-NEXT: blr
entry:
%cmp = fcmp nnan ninf nsz oeq float %a, %b
%cond = select i1 %cmp, float %c, float %d
@@ -182,37 +112,21 @@ entry:
}
define double @select_fast_oeq_double(double %a, double %b, double %c, double %d) {
-; FAST-P8-LABEL: select_fast_oeq_double:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubdp f0, f1, f2
-; FAST-P8-NEXT: fsel f1, f0, f3, f4
-; FAST-P8-NEXT: xsnegdp f0, f0
-; FAST-P8-NEXT: fsel f1, f0, f1, f4
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_fast_oeq_double:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubdp f0, f1, f2
-; FAST-P9-NEXT: fsel f1, f0, f3, f4
-; FAST-P9-NEXT: xsnegdp f0, f0
-; FAST-P9-NEXT: fsel f1, f0, f1, f4
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_fast_oeq_double:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: xssubdp f0, f1, f2
-; NO-FAST-P8-NEXT: fsel f1, f0, f3, f4
-; NO-FAST-P8-NEXT: xsnegdp f0, f0
-; NO-FAST-P8-NEXT: fsel f1, f0, f1, f4
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_fast_oeq_double:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: xssubdp f0, f1, f2
-; NO-FAST-P9-NEXT: fsel f1, f0, f3, f4
-; NO-FAST-P9-NEXT: xsnegdp f0, f0
-; NO-FAST-P9-NEXT: fsel f1, f0, f1, f4
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_fast_oeq_double:
+; P8: # %bb.0: # %entry
+; P8-NEXT: xssubdp f0, f1, f2
+; P8-NEXT: fsel f1, f0, f3, f4
+; P8-NEXT: xsnegdp f0, f0
+; P8-NEXT: fsel f1, f0, f1, f4
+; P8-NEXT: blr
+;
+; P9-LABEL: select_fast_oeq_double:
+; P9: # %bb.0: # %entry
+; P9-NEXT: xssubdp f0, f1, f2
+; P9-NEXT: fsel f1, f0, f3, f4
+; P9-NEXT: xsnegdp f0, f0
+; P9-NEXT: fsel f1, f0, f1, f4
+; P9-NEXT: blr
entry:
%cmp = fcmp nnan ninf nsz oeq double %a, %b
%cond = select i1 %cmp, double %c, double %d
@@ -222,43 +136,27 @@ entry:
; Test one
define float @select_one_float(float %a, float %b, float %c, float %d) {
-; FAST-P8-LABEL: select_one_float:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubsp f0, f1, f2
-; FAST-P8-NEXT: xsnegdp f1, f0
-; FAST-P8-NEXT: fsel f0, f0, f4, f3
-; FAST-P8-NEXT: fsel f1, f1, f0, f3
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_one_float:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubsp f0, f1, f2
-; FAST-P9-NEXT: xsnegdp f1, f0
-; FAST-P9-NEXT: fsel f0, f0, f4, f3
-; FAST-P9-NEXT: fsel f1, f1, f0, f3
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_one_float:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P8-NEXT: crnor 4*cr5+lt, un, eq
-; NO-FAST-P8-NEXT: bc 12, 4*cr5+lt, .LBB5_2
-; NO-FAST-P8-NEXT: # %bb.1: # %entry
-; NO-FAST-P8-NEXT: fmr f3, f4
-; NO-FAST-P8-NEXT: .LBB5_2: # %entry
-; NO-FAST-P8-NEXT: fmr f1, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_one_float:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P9-NEXT: crnor 4*cr5+lt, un, eq
-; NO-FAST-P9-NEXT: bc 12, 4*cr5+lt, .LBB5_2
-; NO-FAST-P9-NEXT: # %bb.1: # %entry
-; NO-FAST-P9-NEXT: fmr f3, f4
-; NO-FAST-P9-NEXT: .LBB5_2: # %entry
-; NO-FAST-P9-NEXT: fmr f1, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_one_float:
+; P8: # %bb.0: # %entry
+; P8-NEXT: fcmpu cr0, f1, f2
+; P8-NEXT: crnor 4*cr5+lt, un, eq
+; P8-NEXT: bc 12, 4*cr5+lt, .LBB5_2
+; P8-NEXT: # %bb.1: # %entry
+; P8-NEXT: fmr f3, f4
+; P8-NEXT: .LBB5_2: # %entry
+; P8-NEXT: fmr f1, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_one_float:
+; P9: # %bb.0: # %entry
+; P9-NEXT: fcmpu cr0, f1, f2
+; P9-NEXT: crnor 4*cr5+lt, un, eq
+; P9-NEXT: bc 12, 4*cr5+lt, .LBB5_2
+; P9-NEXT: # %bb.1: # %entry
+; P9-NEXT: fmr f3, f4
+; P9-NEXT: .LBB5_2: # %entry
+; P9-NEXT: fmr f1, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp one float %a, %b
%cond = select i1 %cmp, float %c, float %d
@@ -266,43 +164,27 @@ entry:
}
define float @select_one_float_nsz(float %a, float %b, float %c, float %d) {
-; FAST-P8-LABEL: select_one_float_nsz:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubsp f0, f2, f1
-; FAST-P8-NEXT: xssubsp f1, f1, f2
-; FAST-P8-NEXT: fsel f1, f1, f4, f3
-; FAST-P8-NEXT: fsel f1, f0, f1, f3
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_one_float_nsz:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubsp f0, f2, f1
-; FAST-P9-NEXT: xssubsp f1, f1, f2
-; FAST-P9-NEXT: fsel f1, f1, f4, f3
-; FAST-P9-NEXT: fsel f1, f0, f1, f3
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_one_float_nsz:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P8-NEXT: crnor 4*cr5+lt, un, eq
-; NO-FAST-P8-NEXT: bc 12, 4*cr5+lt, .LBB6_2
-; NO-FAST-P8-NEXT: # %bb.1: # %entry
-; NO-FAST-P8-NEXT: fmr f3, f4
-; NO-FAST-P8-NEXT: .LBB6_2: # %entry
-; NO-FAST-P8-NEXT: fmr f1, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_one_float_nsz:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P9-NEXT: crnor 4*cr5+lt, un, eq
-; NO-FAST-P9-NEXT: bc 12, 4*cr5+lt, .LBB6_2
-; NO-FAST-P9-NEXT: # %bb.1: # %entry
-; NO-FAST-P9-NEXT: fmr f3, f4
-; NO-FAST-P9-NEXT: .LBB6_2: # %entry
-; NO-FAST-P9-NEXT: fmr f1, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_one_float_nsz:
+; P8: # %bb.0: # %entry
+; P8-NEXT: fcmpu cr0, f1, f2
+; P8-NEXT: crnor 4*cr5+lt, un, eq
+; P8-NEXT: bc 12, 4*cr5+lt, .LBB6_2
+; P8-NEXT: # %bb.1: # %entry
+; P8-NEXT: fmr f3, f4
+; P8-NEXT: .LBB6_2: # %entry
+; P8-NEXT: fmr f1, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_one_float_nsz:
+; P9: # %bb.0: # %entry
+; P9-NEXT: fcmpu cr0, f1, f2
+; P9-NEXT: crnor 4*cr5+lt, un, eq
+; P9-NEXT: bc 12, 4*cr5+lt, .LBB6_2
+; P9-NEXT: # %bb.1: # %entry
+; P9-NEXT: fmr f3, f4
+; P9-NEXT: .LBB6_2: # %entry
+; P9-NEXT: fmr f1, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp nsz one float %a, %b
%cond = select i1 %cmp, float %c, float %d
@@ -310,43 +192,27 @@ entry:
}
define double @select_one_double(double %a, double %b, double %c, double %d) {
-; FAST-P8-LABEL: select_one_double:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubdp f0, f1, f2
-; FAST-P8-NEXT: fsel f1, f0, f4, f3
-; FAST-P8-NEXT: xsnegdp f0, f0
-; FAST-P8-NEXT: fsel f1, f0, f1, f3
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_one_double:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubdp f0, f1, f2
-; FAST-P9-NEXT: fsel f1, f0, f4, f3
-; FAST-P9-NEXT: xsnegdp f0, f0
-; FAST-P9-NEXT: fsel f1, f0, f1, f3
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_one_double:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P8-NEXT: crnor 4*cr5+lt, un, eq
-; NO-FAST-P8-NEXT: bc 12, 4*cr5+lt, .LBB7_2
-; NO-FAST-P8-NEXT: # %bb.1: # %entry
-; NO-FAST-P8-NEXT: fmr f3, f4
-; NO-FAST-P8-NEXT: .LBB7_2: # %entry
-; NO-FAST-P8-NEXT: fmr f1, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_one_double:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P9-NEXT: crnor 4*cr5+lt, un, eq
-; NO-FAST-P9-NEXT: bc 12, 4*cr5+lt, .LBB7_2
-; NO-FAST-P9-NEXT: # %bb.1: # %entry
-; NO-FAST-P9-NEXT: fmr f3, f4
-; NO-FAST-P9-NEXT: .LBB7_2: # %entry
-; NO-FAST-P9-NEXT: fmr f1, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_one_double:
+; P8: # %bb.0: # %entry
+; P8-NEXT: fcmpu cr0, f1, f2
+; P8-NEXT: crnor 4*cr5+lt, un, eq
+; P8-NEXT: bc 12, 4*cr5+lt, .LBB7_2
+; P8-NEXT: # %bb.1: # %entry
+; P8-NEXT: fmr f3, f4
+; P8-NEXT: .LBB7_2: # %entry
+; P8-NEXT: fmr f1, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_one_double:
+; P9: # %bb.0: # %entry
+; P9-NEXT: fcmpu cr0, f1, f2
+; P9-NEXT: crnor 4*cr5+lt, un, eq
+; P9-NEXT: bc 12, 4*cr5+lt, .LBB7_2
+; P9-NEXT: # %bb.1: # %entry
+; P9-NEXT: fmr f3, f4
+; P9-NEXT: .LBB7_2: # %entry
+; P9-NEXT: fmr f1, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp one double %a, %b
%cond = select i1 %cmp, double %c, double %d
@@ -354,37 +220,21 @@ entry:
}
define float @select_fast_one_float(float %a, float %b, float %c, float %d) {
-; FAST-P8-LABEL: select_fast_one_float:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubsp f0, f2, f1
-; FAST-P8-NEXT: xssubsp f1, f1, f2
-; FAST-P8-NEXT: fsel f1, f1, f4, f3
-; FAST-P8-NEXT: fsel f1, f0, f1, f3
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_fast_one_float:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubsp f0, f2, f1
-; FAST-P9-NEXT: xssubsp f1, f1, f2
-; FAST-P9-NEXT: fsel f1, f1, f4, f3
-; FAST-P9-NEXT: fsel f1, f0, f1, f3
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_fast_one_float:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: xssubsp f0, f2, f1
-; NO-FAST-P8-NEXT: xssubsp f1, f1, f2
-; NO-FAST-P8-NEXT: fsel f1, f1, f4, f3
-; NO-FAST-P8-NEXT: fsel f1, f0, f1, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_fast_one_float:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: xssubsp f0, f2, f1
-; NO-FAST-P9-NEXT: xssubsp f1, f1, f2
-; NO-FAST-P9-NEXT: fsel f1, f1, f4, f3
-; NO-FAST-P9-NEXT: fsel f1, f0, f1, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_fast_one_float:
+; P8: # %bb.0: # %entry
+; P8-NEXT: xssubsp f0, f2, f1
+; P8-NEXT: xssubsp f1, f1, f2
+; P8-NEXT: fsel f1, f1, f4, f3
+; P8-NEXT: fsel f1, f0, f1, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_fast_one_float:
+; P9: # %bb.0: # %entry
+; P9-NEXT: xssubsp f0, f2, f1
+; P9-NEXT: xssubsp f1, f1, f2
+; P9-NEXT: fsel f1, f1, f4, f3
+; P9-NEXT: fsel f1, f0, f1, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp nnan ninf nsz one float %a, %b
%cond = select i1 %cmp, float %c, float %d
@@ -392,37 +242,21 @@ entry:
}
define double @select_fast_one_double(double %a, double %b, double %c, double %d) {
-; FAST-P8-LABEL: select_fast_one_double:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubdp f0, f1, f2
-; FAST-P8-NEXT: fsel f1, f0, f4, f3
-; FAST-P8-NEXT: xsnegdp f0, f0
-; FAST-P8-NEXT: fsel f1, f0, f1, f3
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_fast_one_double:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubdp f0, f1, f2
-; FAST-P9-NEXT: fsel f1, f0, f4, f3
-; FAST-P9-NEXT: xsnegdp f0, f0
-; FAST-P9-NEXT: fsel f1, f0, f1, f3
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_fast_one_double:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: xssubdp f0, f1, f2
-; NO-FAST-P8-NEXT: fsel f1, f0, f4, f3
-; NO-FAST-P8-NEXT: xsnegdp f0, f0
-; NO-FAST-P8-NEXT: fsel f1, f0, f1, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_fast_one_double:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: xssubdp f0, f1, f2
-; NO-FAST-P9-NEXT: fsel f1, f0, f4, f3
-; NO-FAST-P9-NEXT: xsnegdp f0, f0
-; NO-FAST-P9-NEXT: fsel f1, f0, f1, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_fast_one_double:
+; P8: # %bb.0: # %entry
+; P8-NEXT: xssubdp f0, f1, f2
+; P8-NEXT: fsel f1, f0, f4, f3
+; P8-NEXT: xsnegdp f0, f0
+; P8-NEXT: fsel f1, f0, f1, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_fast_one_double:
+; P9: # %bb.0: # %entry
+; P9-NEXT: xssubdp f0, f1, f2
+; P9-NEXT: fsel f1, f0, f4, f3
+; P9-NEXT: xsnegdp f0, f0
+; P9-NEXT: fsel f1, f0, f1, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp nnan ninf nsz one double %a, %b
%cond = select i1 %cmp, double %c, double %d
@@ -432,39 +266,27 @@ entry:
; Test oge
define float @select_oge_float(float %a, float %b, float %c, float %d) {
-; FAST-P8-LABEL: select_oge_float:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubsp f0, f1, f2
-; FAST-P8-NEXT: fsel f1, f0, f3, f4
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_oge_float:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubsp f0, f1, f2
-; FAST-P9-NEXT: fsel f1, f0, f3, f4
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_oge_float:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P8-NEXT: crnor 4*cr5+lt, un, lt
-; NO-FAST-P8-NEXT: bc 12, 4*cr5+lt, .LBB10_2
-; NO-FAST-P8-NEXT: # %bb.1: # %entry
-; NO-FAST-P8-NEXT: fmr f3, f4
-; NO-FAST-P8-NEXT: .LBB10_2: # %entry
-; NO-FAST-P8-NEXT: fmr f1, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_oge_float:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P9-NEXT: crnor 4*cr5+lt, un, lt
-; NO-FAST-P9-NEXT: bc 12, 4*cr5+lt, .LBB10_2
-; NO-FAST-P9-NEXT: # %bb.1: # %entry
-; NO-FAST-P9-NEXT: fmr f3, f4
-; NO-FAST-P9-NEXT: .LBB10_2: # %entry
-; NO-FAST-P9-NEXT: fmr f1, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_oge_float:
+; P8: # %bb.0: # %entry
+; P8-NEXT: fcmpu cr0, f1, f2
+; P8-NEXT: crnor 4*cr5+lt, un, lt
+; P8-NEXT: bc 12, 4*cr5+lt, .LBB10_2
+; P8-NEXT: # %bb.1: # %entry
+; P8-NEXT: fmr f3, f4
+; P8-NEXT: .LBB10_2: # %entry
+; P8-NEXT: fmr f1, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_oge_float:
+; P9: # %bb.0: # %entry
+; P9-NEXT: fcmpu cr0, f1, f2
+; P9-NEXT: crnor 4*cr5+lt, un, lt
+; P9-NEXT: bc 12, 4*cr5+lt, .LBB10_2
+; P9-NEXT: # %bb.1: # %entry
+; P9-NEXT: fmr f3, f4
+; P9-NEXT: .LBB10_2: # %entry
+; P9-NEXT: fmr f1, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp oge float %a, %b
%cond = select i1 %cmp, float %c, float %d
@@ -472,39 +294,27 @@ entry:
}
define double @select_oge_double(double %a, double %b, double %c, double %d) {
-; FAST-P8-LABEL: select_oge_double:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubdp f0, f1, f2
-; FAST-P8-NEXT: fsel f1, f0, f3, f4
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_oge_double:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubdp f0, f1, f2
-; FAST-P9-NEXT: fsel f1, f0, f3, f4
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_oge_double:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P8-NEXT: crnor 4*cr5+lt, un, lt
-; NO-FAST-P8-NEXT: bc 12, 4*cr5+lt, .LBB11_2
-; NO-FAST-P8-NEXT: # %bb.1: # %entry
-; NO-FAST-P8-NEXT: fmr f3, f4
-; NO-FAST-P8-NEXT: .LBB11_2: # %entry
-; NO-FAST-P8-NEXT: fmr f1, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_oge_double:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P9-NEXT: crnor 4*cr5+lt, un, lt
-; NO-FAST-P9-NEXT: bc 12, 4*cr5+lt, .LBB11_2
-; NO-FAST-P9-NEXT: # %bb.1: # %entry
-; NO-FAST-P9-NEXT: fmr f3, f4
-; NO-FAST-P9-NEXT: .LBB11_2: # %entry
-; NO-FAST-P9-NEXT: fmr f1, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_oge_double:
+; P8: # %bb.0: # %entry
+; P8-NEXT: fcmpu cr0, f1, f2
+; P8-NEXT: crnor 4*cr5+lt, un, lt
+; P8-NEXT: bc 12, 4*cr5+lt, .LBB11_2
+; P8-NEXT: # %bb.1: # %entry
+; P8-NEXT: fmr f3, f4
+; P8-NEXT: .LBB11_2: # %entry
+; P8-NEXT: fmr f1, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_oge_double:
+; P9: # %bb.0: # %entry
+; P9-NEXT: fcmpu cr0, f1, f2
+; P9-NEXT: crnor 4*cr5+lt, un, lt
+; P9-NEXT: bc 12, 4*cr5+lt, .LBB11_2
+; P9-NEXT: # %bb.1: # %entry
+; P9-NEXT: fmr f3, f4
+; P9-NEXT: .LBB11_2: # %entry
+; P9-NEXT: fmr f1, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp oge double %a, %b
%cond = select i1 %cmp, double %c, double %d
@@ -512,29 +322,17 @@ entry:
}
define float @select_fast_oge_float(float %a, float %b, float %c, float %d) {
-; FAST-P8-LABEL: select_fast_oge_float:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubsp f0, f1, f2
-; FAST-P8-NEXT: fsel f1, f0, f3, f4
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_fast_oge_float:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubsp f0, f1, f2
-; FAST-P9-NEXT: fsel f1, f0, f3, f4
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_fast_oge_float:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: xssubsp f0, f1, f2
-; NO-FAST-P8-NEXT: fsel f1, f0, f3, f4
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_fast_oge_float:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: xssubsp f0, f1, f2
-; NO-FAST-P9-NEXT: fsel f1, f0, f3, f4
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_fast_oge_float:
+; P8: # %bb.0: # %entry
+; P8-NEXT: xssubsp f0, f1, f2
+; P8-NEXT: fsel f1, f0, f3, f4
+; P8-NEXT: blr
+;
+; P9-LABEL: select_fast_oge_float:
+; P9: # %bb.0: # %entry
+; P9-NEXT: xssubsp f0, f1, f2
+; P9-NEXT: fsel f1, f0, f3, f4
+; P9-NEXT: blr
entry:
%cmp = fcmp nnan ninf nsz oge float %a, %b
%cond = select i1 %cmp, float %c, float %d
@@ -542,29 +340,17 @@ entry:
}
define double @select_fast_oge_double(double %a, double %b, double %c, double %d) {
-; FAST-P8-LABEL: select_fast_oge_double:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubdp f0, f1, f2
-; FAST-P8-NEXT: fsel f1, f0, f3, f4
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_fast_oge_double:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubdp f0, f1, f2
-; FAST-P9-NEXT: fsel f1, f0, f3, f4
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_fast_oge_double:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: xssubdp f0, f1, f2
-; NO-FAST-P8-NEXT: fsel f1, f0, f3, f4
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_fast_oge_double:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: xssubdp f0, f1, f2
-; NO-FAST-P9-NEXT: fsel f1, f0, f3, f4
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_fast_oge_double:
+; P8: # %bb.0: # %entry
+; P8-NEXT: xssubdp f0, f1, f2
+; P8-NEXT: fsel f1, f0, f3, f4
+; P8-NEXT: blr
+;
+; P9-LABEL: select_fast_oge_double:
+; P9: # %bb.0: # %entry
+; P9-NEXT: xssubdp f0, f1, f2
+; P9-NEXT: fsel f1, f0, f3, f4
+; P9-NEXT: blr
entry:
%cmp = fcmp nnan ninf nsz oge double %a, %b
%cond = select i1 %cmp, double %c, double %d
@@ -574,37 +360,25 @@ entry:
; Test olt
define float @select_olt_float(float %a, float %b, float %c, float %d) {
-; FAST-P8-LABEL: select_olt_float:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubsp f0, f1, f2
-; FAST-P8-NEXT: fsel f1, f0, f4, f3
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_olt_float:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubsp f0, f1, f2
-; FAST-P9-NEXT: fsel f1, f0, f4, f3
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_olt_float:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P8-NEXT: blt cr0, .LBB14_2
-; NO-FAST-P8-NEXT: # %bb.1: # %entry
-; NO-FAST-P8-NEXT: fmr f3, f4
-; NO-FAST-P8-NEXT: .LBB14_2: # %entry
-; NO-FAST-P8-NEXT: fmr f1, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_olt_float:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P9-NEXT: blt cr0, .LBB14_2
-; NO-FAST-P9-NEXT: # %bb.1: # %entry
-; NO-FAST-P9-NEXT: fmr f3, f4
-; NO-FAST-P9-NEXT: .LBB14_2: # %entry
-; NO-FAST-P9-NEXT: fmr f1, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_olt_float:
+; P8: # %bb.0: # %entry
+; P8-NEXT: fcmpu cr0, f1, f2
+; P8-NEXT: blt cr0, .LBB14_2
+; P8-NEXT: # %bb.1: # %entry
+; P8-NEXT: fmr f3, f4
+; P8-NEXT: .LBB14_2: # %entry
+; P8-NEXT: fmr f1, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_olt_float:
+; P9: # %bb.0: # %entry
+; P9-NEXT: fcmpu cr0, f1, f2
+; P9-NEXT: blt cr0, .LBB14_2
+; P9-NEXT: # %bb.1: # %entry
+; P9-NEXT: fmr f3, f4
+; P9-NEXT: .LBB14_2: # %entry
+; P9-NEXT: fmr f1, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp olt float %a, %b
%cond = select i1 %cmp, float %c, float %d
@@ -612,37 +386,25 @@ entry:
}
define double @select_olt_double(double %a, double %b, double %c, double %d) {
-; FAST-P8-LABEL: select_olt_double:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubdp f0, f1, f2
-; FAST-P8-NEXT: fsel f1, f0, f4, f3
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_olt_double:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubdp f0, f1, f2
-; FAST-P9-NEXT: fsel f1, f0, f4, f3
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_olt_double:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: xscmpudp cr0, f1, f2
-; NO-FAST-P8-NEXT: blt cr0, .LBB15_2
-; NO-FAST-P8-NEXT: # %bb.1: # %entry
-; NO-FAST-P8-NEXT: fmr f3, f4
-; NO-FAST-P8-NEXT: .LBB15_2: # %entry
-; NO-FAST-P8-NEXT: fmr f1, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_olt_double:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: xscmpudp cr0, f1, f2
-; NO-FAST-P9-NEXT: blt cr0, .LBB15_2
-; NO-FAST-P9-NEXT: # %bb.1: # %entry
-; NO-FAST-P9-NEXT: fmr f3, f4
-; NO-FAST-P9-NEXT: .LBB15_2: # %entry
-; NO-FAST-P9-NEXT: fmr f1, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_olt_double:
+; P8: # %bb.0: # %entry
+; P8-NEXT: xscmpudp cr0, f1, f2
+; P8-NEXT: blt cr0, .LBB15_2
+; P8-NEXT: # %bb.1: # %entry
+; P8-NEXT: fmr f3, f4
+; P8-NEXT: .LBB15_2: # %entry
+; P8-NEXT: fmr f1, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_olt_double:
+; P9: # %bb.0: # %entry
+; P9-NEXT: xscmpudp cr0, f1, f2
+; P9-NEXT: blt cr0, .LBB15_2
+; P9-NEXT: # %bb.1: # %entry
+; P9-NEXT: fmr f3, f4
+; P9-NEXT: .LBB15_2: # %entry
+; P9-NEXT: fmr f1, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp olt double %a, %b
%cond = select i1 %cmp, double %c, double %d
@@ -650,29 +412,17 @@ entry:
}
define float @select_fast_olt_float(float %a, float %b, float %c, float %d) {
-; FAST-P8-LABEL: select_fast_olt_float:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubsp f0, f1, f2
-; FAST-P8-NEXT: fsel f1, f0, f4, f3
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_fast_olt_float:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubsp f0, f1, f2
-; FAST-P9-NEXT: fsel f1, f0, f4, f3
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_fast_olt_float:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: xssubsp f0, f1, f2
-; NO-FAST-P8-NEXT: fsel f1, f0, f4, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_fast_olt_float:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: xssubsp f0, f1, f2
-; NO-FAST-P9-NEXT: fsel f1, f0, f4, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_fast_olt_float:
+; P8: # %bb.0: # %entry
+; P8-NEXT: xssubsp f0, f1, f2
+; P8-NEXT: fsel f1, f0, f4, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_fast_olt_float:
+; P9: # %bb.0: # %entry
+; P9-NEXT: xssubsp f0, f1, f2
+; P9-NEXT: fsel f1, f0, f4, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp ninf nnan nsz olt float %a, %b
%cond = select i1 %cmp, float %c, float %d
@@ -680,29 +430,17 @@ entry:
}
define double @select_fast_olt_double(double %a, double %b, double %c, double %d) {
-; FAST-P8-LABEL: select_fast_olt_double:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubdp f0, f1, f2
-; FAST-P8-NEXT: fsel f1, f0, f4, f3
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_fast_olt_double:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubdp f0, f1, f2
-; FAST-P9-NEXT: fsel f1, f0, f4, f3
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_fast_olt_double:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: xssubdp f0, f1, f2
-; NO-FAST-P8-NEXT: fsel f1, f0, f4, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_fast_olt_double:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: xssubdp f0, f1, f2
-; NO-FAST-P9-NEXT: fsel f1, f0, f4, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_fast_olt_double:
+; P8: # %bb.0: # %entry
+; P8-NEXT: xssubdp f0, f1, f2
+; P8-NEXT: fsel f1, f0, f4, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_fast_olt_double:
+; P9: # %bb.0: # %entry
+; P9-NEXT: xssubdp f0, f1, f2
+; P9-NEXT: fsel f1, f0, f4, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp nnan ninf nsz olt double %a, %b
%cond = select i1 %cmp, double %c, double %d
@@ -712,37 +450,25 @@ entry:
; Test ogt
define float @select_ogt_float(float %a, float %b, float %c, float %d) {
-; FAST-P8-LABEL: select_ogt_float:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubsp f0, f2, f1
-; FAST-P8-NEXT: fsel f1, f0, f4, f3
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_ogt_float:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubsp f0, f2, f1
-; FAST-P9-NEXT: fsel f1, f0, f4, f3
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_ogt_float:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P8-NEXT: bgt cr0, .LBB18_2
-; NO-FAST-P8-NEXT: # %bb.1: # %entry
-; NO-FAST-P8-NEXT: fmr f3, f4
-; NO-FAST-P8-NEXT: .LBB18_2: # %entry
-; NO-FAST-P8-NEXT: fmr f1, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_ogt_float:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P9-NEXT: bgt cr0, .LBB18_2
-; NO-FAST-P9-NEXT: # %bb.1: # %entry
-; NO-FAST-P9-NEXT: fmr f3, f4
-; NO-FAST-P9-NEXT: .LBB18_2: # %entry
-; NO-FAST-P9-NEXT: fmr f1, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_ogt_float:
+; P8: # %bb.0: # %entry
+; P8-NEXT: fcmpu cr0, f1, f2
+; P8-NEXT: bgt cr0, .LBB18_2
+; P8-NEXT: # %bb.1: # %entry
+; P8-NEXT: fmr f3, f4
+; P8-NEXT: .LBB18_2: # %entry
+; P8-NEXT: fmr f1, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_ogt_float:
+; P9: # %bb.0: # %entry
+; P9-NEXT: fcmpu cr0, f1, f2
+; P9-NEXT: bgt cr0, .LBB18_2
+; P9-NEXT: # %bb.1: # %entry
+; P9-NEXT: fmr f3, f4
+; P9-NEXT: .LBB18_2: # %entry
+; P9-NEXT: fmr f1, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp ogt float %a, %b
%cond = select i1 %cmp, float %c, float %d
@@ -750,37 +476,25 @@ entry:
}
define double @select_ogt_double(double %a, double %b, double %c, double %d) {
-; FAST-P8-LABEL: select_ogt_double:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubdp f0, f2, f1
-; FAST-P8-NEXT: fsel f1, f0, f4, f3
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_ogt_double:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubdp f0, f2, f1
-; FAST-P9-NEXT: fsel f1, f0, f4, f3
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_ogt_double:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: xscmpudp cr0, f1, f2
-; NO-FAST-P8-NEXT: bgt cr0, .LBB19_2
-; NO-FAST-P8-NEXT: # %bb.1: # %entry
-; NO-FAST-P8-NEXT: fmr f3, f4
-; NO-FAST-P8-NEXT: .LBB19_2: # %entry
-; NO-FAST-P8-NEXT: fmr f1, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_ogt_double:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: xscmpudp cr0, f1, f2
-; NO-FAST-P9-NEXT: bgt cr0, .LBB19_2
-; NO-FAST-P9-NEXT: # %bb.1: # %entry
-; NO-FAST-P9-NEXT: fmr f3, f4
-; NO-FAST-P9-NEXT: .LBB19_2: # %entry
-; NO-FAST-P9-NEXT: fmr f1, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_ogt_double:
+; P8: # %bb.0: # %entry
+; P8-NEXT: xscmpudp cr0, f1, f2
+; P8-NEXT: bgt cr0, .LBB19_2
+; P8-NEXT: # %bb.1: # %entry
+; P8-NEXT: fmr f3, f4
+; P8-NEXT: .LBB19_2: # %entry
+; P8-NEXT: fmr f1, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_ogt_double:
+; P9: # %bb.0: # %entry
+; P9-NEXT: xscmpudp cr0, f1, f2
+; P9-NEXT: bgt cr0, .LBB19_2
+; P9-NEXT: # %bb.1: # %entry
+; P9-NEXT: fmr f3, f4
+; P9-NEXT: .LBB19_2: # %entry
+; P9-NEXT: fmr f1, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp ogt double %a, %b
%cond = select i1 %cmp, double %c, double %d
@@ -788,29 +502,17 @@ entry:
}
define float @select_fast_ogt_float(float %a, float %b, float %c, float %d) {
-; FAST-P8-LABEL: select_fast_ogt_float:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubsp f0, f2, f1
-; FAST-P8-NEXT: fsel f1, f0, f4, f3
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_fast_ogt_float:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubsp f0, f2, f1
-; FAST-P9-NEXT: fsel f1, f0, f4, f3
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_fast_ogt_float:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: xssubsp f0, f2, f1
-; NO-FAST-P8-NEXT: fsel f1, f0, f4, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_fast_ogt_float:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: xssubsp f0, f2, f1
-; NO-FAST-P9-NEXT: fsel f1, f0, f4, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_fast_ogt_float:
+; P8: # %bb.0: # %entry
+; P8-NEXT: xssubsp f0, f2, f1
+; P8-NEXT: fsel f1, f0, f4, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_fast_ogt_float:
+; P9: # %bb.0: # %entry
+; P9-NEXT: xssubsp f0, f2, f1
+; P9-NEXT: fsel f1, f0, f4, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp nnan ninf nsz ogt float %a, %b
%cond = select i1 %cmp, float %c, float %d
@@ -818,29 +520,17 @@ entry:
}
define double @select_fast_ogt_double(double %a, double %b, double %c, double %d) {
-; FAST-P8-LABEL: select_fast_ogt_double:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubdp f0, f2, f1
-; FAST-P8-NEXT: fsel f1, f0, f4, f3
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_fast_ogt_double:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubdp f0, f2, f1
-; FAST-P9-NEXT: fsel f1, f0, f4, f3
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_fast_ogt_double:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: xssubdp f0, f2, f1
-; NO-FAST-P8-NEXT: fsel f1, f0, f4, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_fast_ogt_double:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: xssubdp f0, f2, f1
-; NO-FAST-P9-NEXT: fsel f1, f0, f4, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_fast_ogt_double:
+; P8: # %bb.0: # %entry
+; P8-NEXT: xssubdp f0, f2, f1
+; P8-NEXT: fsel f1, f0, f4, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_fast_ogt_double:
+; P9: # %bb.0: # %entry
+; P9-NEXT: xssubdp f0, f2, f1
+; P9-NEXT: fsel f1, f0, f4, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp nnan ninf nsz ogt double %a, %b
%cond = select i1 %cmp, double %c, double %d
@@ -850,39 +540,27 @@ entry:
; Test ole
define float @select_ole_float(float %a, float %b, float %c, float %d) {
-; FAST-P8-LABEL: select_ole_float:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubsp f0, f2, f1
-; FAST-P8-NEXT: fsel f1, f0, f3, f4
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_ole_float:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubsp f0, f2, f1
-; FAST-P9-NEXT: fsel f1, f0, f3, f4
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_ole_float:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P8-NEXT: crnor 4*cr5+lt, un, gt
-; NO-FAST-P8-NEXT: bc 12, 4*cr5+lt, .LBB22_2
-; NO-FAST-P8-NEXT: # %bb.1: # %entry
-; NO-FAST-P8-NEXT: fmr f3, f4
-; NO-FAST-P8-NEXT: .LBB22_2: # %entry
-; NO-FAST-P8-NEXT: fmr f1, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_ole_float:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P9-NEXT: crnor 4*cr5+lt, un, gt
-; NO-FAST-P9-NEXT: bc 12, 4*cr5+lt, .LBB22_2
-; NO-FAST-P9-NEXT: # %bb.1: # %entry
-; NO-FAST-P9-NEXT: fmr f3, f4
-; NO-FAST-P9-NEXT: .LBB22_2: # %entry
-; NO-FAST-P9-NEXT: fmr f1, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_ole_float:
+; P8: # %bb.0: # %entry
+; P8-NEXT: fcmpu cr0, f1, f2
+; P8-NEXT: crnor 4*cr5+lt, un, gt
+; P8-NEXT: bc 12, 4*cr5+lt, .LBB22_2
+; P8-NEXT: # %bb.1: # %entry
+; P8-NEXT: fmr f3, f4
+; P8-NEXT: .LBB22_2: # %entry
+; P8-NEXT: fmr f1, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_ole_float:
+; P9: # %bb.0: # %entry
+; P9-NEXT: fcmpu cr0, f1, f2
+; P9-NEXT: crnor 4*cr5+lt, un, gt
+; P9-NEXT: bc 12, 4*cr5+lt, .LBB22_2
+; P9-NEXT: # %bb.1: # %entry
+; P9-NEXT: fmr f3, f4
+; P9-NEXT: .LBB22_2: # %entry
+; P9-NEXT: fmr f1, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp ole float %a, %b
%cond = select i1 %cmp, float %c, float %d
@@ -890,39 +568,27 @@ entry:
}
define double @select_ole_double(double %a, double %b, double %c, double %d) {
-; FAST-P8-LABEL: select_ole_double:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubdp f0, f2, f1
-; FAST-P8-NEXT: fsel f1, f0, f3, f4
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_ole_double:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubdp f0, f2, f1
-; FAST-P9-NEXT: fsel f1, f0, f3, f4
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_ole_double:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P8-NEXT: crnor 4*cr5+lt, un, gt
-; NO-FAST-P8-NEXT: bc 12, 4*cr5+lt, .LBB23_2
-; NO-FAST-P8-NEXT: # %bb.1: # %entry
-; NO-FAST-P8-NEXT: fmr f3, f4
-; NO-FAST-P8-NEXT: .LBB23_2: # %entry
-; NO-FAST-P8-NEXT: fmr f1, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_ole_double:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: fcmpu cr0, f1, f2
-; NO-FAST-P9-NEXT: crnor 4*cr5+lt, un, gt
-; NO-FAST-P9-NEXT: bc 12, 4*cr5+lt, .LBB23_2
-; NO-FAST-P9-NEXT: # %bb.1: # %entry
-; NO-FAST-P9-NEXT: fmr f3, f4
-; NO-FAST-P9-NEXT: .LBB23_2: # %entry
-; NO-FAST-P9-NEXT: fmr f1, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_ole_double:
+; P8: # %bb.0: # %entry
+; P8-NEXT: fcmpu cr0, f1, f2
+; P8-NEXT: crnor 4*cr5+lt, un, gt
+; P8-NEXT: bc 12, 4*cr5+lt, .LBB23_2
+; P8-NEXT: # %bb.1: # %entry
+; P8-NEXT: fmr f3, f4
+; P8-NEXT: .LBB23_2: # %entry
+; P8-NEXT: fmr f1, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: select_ole_double:
+; P9: # %bb.0: # %entry
+; P9-NEXT: fcmpu cr0, f1, f2
+; P9-NEXT: crnor 4*cr5+lt, un, gt
+; P9-NEXT: bc 12, 4*cr5+lt, .LBB23_2
+; P9-NEXT: # %bb.1: # %entry
+; P9-NEXT: fmr f3, f4
+; P9-NEXT: .LBB23_2: # %entry
+; P9-NEXT: fmr f1, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp ole double %a, %b
%cond = select i1 %cmp, double %c, double %d
@@ -930,29 +596,17 @@ entry:
}
define float @select_fast_ole_float(float %a, float %b, float %c, float %d) {
-; FAST-P8-LABEL: select_fast_ole_float:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubsp f0, f2, f1
-; FAST-P8-NEXT: fsel f1, f0, f3, f4
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_fast_ole_float:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubsp f0, f2, f1
-; FAST-P9-NEXT: fsel f1, f0, f3, f4
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_fast_ole_float:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: xssubsp f0, f2, f1
-; NO-FAST-P8-NEXT: fsel f1, f0, f3, f4
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_fast_ole_float:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: xssubsp f0, f2, f1
-; NO-FAST-P9-NEXT: fsel f1, f0, f3, f4
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_fast_ole_float:
+; P8: # %bb.0: # %entry
+; P8-NEXT: xssubsp f0, f2, f1
+; P8-NEXT: fsel f1, f0, f3, f4
+; P8-NEXT: blr
+;
+; P9-LABEL: select_fast_ole_float:
+; P9: # %bb.0: # %entry
+; P9-NEXT: xssubsp f0, f2, f1
+; P9-NEXT: fsel f1, f0, f3, f4
+; P9-NEXT: blr
entry:
%cmp = fcmp nnan ninf nsz ole float %a, %b
%cond = select i1 %cmp, float %c, float %d
@@ -960,29 +614,17 @@ entry:
}
define double @select_fast_ole_double(double %a, double %b, double %c, double %d) {
-; FAST-P8-LABEL: select_fast_ole_double:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: xssubdp f0, f2, f1
-; FAST-P8-NEXT: fsel f1, f0, f3, f4
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: select_fast_ole_double:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: xssubdp f0, f2, f1
-; FAST-P9-NEXT: fsel f1, f0, f3, f4
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: select_fast_ole_double:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: xssubdp f0, f2, f1
-; NO-FAST-P8-NEXT: fsel f1, f0, f3, f4
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: select_fast_ole_double:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: xssubdp f0, f2, f1
-; NO-FAST-P9-NEXT: fsel f1, f0, f3, f4
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: select_fast_ole_double:
+; P8: # %bb.0: # %entry
+; P8-NEXT: xssubdp f0, f2, f1
+; P8-NEXT: fsel f1, f0, f3, f4
+; P8-NEXT: blr
+;
+; P9-LABEL: select_fast_ole_double:
+; P9: # %bb.0: # %entry
+; P9-NEXT: xssubdp f0, f2, f1
+; P9-NEXT: fsel f1, f0, f3, f4
+; P9-NEXT: blr
entry:
%cmp = fcmp nnan ninf nsz ole double %a, %b
%cond = select i1 %cmp, double %c, double %d
@@ -991,149 +633,167 @@ entry:
; Test RHS is 1.000000e+00
define double @onecmp1(double %a, double %y, double %z) {
-; FAST-P8-LABEL: onecmp1:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: vspltisw v2, -1
-; FAST-P8-NEXT: xvcvsxwdp vs0, vs34
-; FAST-P8-NEXT: xsadddp f0, f1, f0
-; FAST-P8-NEXT: fsel f1, f0, f2, f3
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: onecmp1:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: vspltisw v2, -1
-; FAST-P9-NEXT: xvcvsxwdp vs0, vs34
-; FAST-P9-NEXT: xsadddp f0, f1, f0
-; FAST-P9-NEXT: fsel f1, f0, f2, f3
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: onecmp1:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: vspltisw v2, 1
-; NO-FAST-P8-NEXT: xvcvsxwdp vs0, vs34
-; NO-FAST-P8-NEXT: fcmpu cr0, f1, f0
-; NO-FAST-P8-NEXT: bc 12, lt, .LBB26_3
-; NO-FAST-P8-NEXT: # %bb.1: # %entry
-; NO-FAST-P8-NEXT: fcmpu cr0, f1, f1
-; NO-FAST-P8-NEXT: bc 12, un, .LBB26_3
-; NO-FAST-P8-NEXT: # %bb.2: # %entry
-; NO-FAST-P8-NEXT: fmr f3, f2
-; NO-FAST-P8-NEXT: .LBB26_3: # %entry
-; NO-FAST-P8-NEXT: fmr f1, f3
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: onecmp1:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: vspltisw v2, 1
-; NO-FAST-P9-NEXT: xvcvsxwdp vs0, vs34
-; NO-FAST-P9-NEXT: fcmpu cr0, f1, f0
-; NO-FAST-P9-NEXT: bc 12, lt, .LBB26_3
-; NO-FAST-P9-NEXT: # %bb.1: # %entry
-; NO-FAST-P9-NEXT: fcmpu cr0, f1, f1
-; NO-FAST-P9-NEXT: bc 12, un, .LBB26_3
-; NO-FAST-P9-NEXT: # %bb.2: # %entry
-; NO-FAST-P9-NEXT: fmr f3, f2
-; NO-FAST-P9-NEXT: .LBB26_3: # %entry
-; NO-FAST-P9-NEXT: fmr f1, f3
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: onecmp1:
+; P8: # %bb.0: # %entry
+; P8-NEXT: vspltisw v2, 1
+; P8-NEXT: xvcvsxwdp vs0, vs34
+; P8-NEXT: fcmpu cr0, f1, f0
+; P8-NEXT: bc 12, lt, .LBB26_3
+; P8-NEXT: # %bb.1: # %entry
+; P8-NEXT: fcmpu cr0, f1, f1
+; P8-NEXT: bc 12, un, .LBB26_3
+; P8-NEXT: # %bb.2: # %entry
+; P8-NEXT: fmr f3, f2
+; P8-NEXT: .LBB26_3: # %entry
+; P8-NEXT: fmr f1, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: onecmp1:
+; P9: # %bb.0: # %entry
+; P9-NEXT: vspltisw v2, 1
+; P9-NEXT: xvcvsxwdp vs0, vs34
+; P9-NEXT: fcmpu cr0, f1, f0
+; P9-NEXT: bc 12, lt, .LBB26_3
+; P9-NEXT: # %bb.1: # %entry
+; P9-NEXT: fcmpu cr0, f1, f1
+; P9-NEXT: bc 12, un, .LBB26_3
+; P9-NEXT: # %bb.2: # %entry
+; P9-NEXT: fmr f3, f2
+; P9-NEXT: .LBB26_3: # %entry
+; P9-NEXT: fmr f1, f3
+; P9-NEXT: blr
entry:
%cmp = fcmp ult double %a, 1.000000e+00
%z.y = select i1 %cmp, double %z, double %y
ret double %z.y
}
+define double @onecmp1_fast(double %a, double %y, double %z) {
+; P8-LABEL: onecmp1_fast:
+; P8: # %bb.0: # %entry
+; P8-NEXT: vspltisw v2, -1
+; P8-NEXT: xvcvsxwdp vs0, vs34
+; P8-NEXT: xsadddp f0, f1, f0
+; P8-NEXT: fsel f1, f0, f2, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: onecmp1_fast:
+; P9: # %bb.0: # %entry
+; P9-NEXT: vspltisw v2, -1
+; P9-NEXT: xvcvsxwdp vs0, vs34
+; P9-NEXT: xsadddp f0, f1, f0
+; P9-NEXT: fsel f1, f0, f2, f3
+; P9-NEXT: blr
+entry:
+ %cmp = fcmp nnan ninf nsz ult double %a, 1.000000e+00
+ %z.y = select i1 %cmp, double %z, double %y
+ ret double %z.y
+}
+
define double @onecmp2(double %a, double %y, double %z) {
-; FAST-P8-LABEL: onecmp2:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: vspltisw v2, 1
-; FAST-P8-NEXT: xvcvsxwdp vs0, vs34
-; FAST-P8-NEXT: xssubdp f0, f0, f1
-; FAST-P8-NEXT: fsel f1, f0, f3, f2
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: onecmp2:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: vspltisw v2, 1
-; FAST-P9-NEXT: xvcvsxwdp vs0, vs34
-; FAST-P9-NEXT: xssubdp f0, f0, f1
-; FAST-P9-NEXT: fsel f1, f0, f3, f2
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: onecmp2:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: vspltisw v2, 1
-; NO-FAST-P8-NEXT: xvcvsxwdp vs0, vs34
-; NO-FAST-P8-NEXT: xscmpudp cr0, f1, f0
-; NO-FAST-P8-NEXT: bgt cr0, .LBB27_2
-; NO-FAST-P8-NEXT: # %bb.1: # %entry
-; NO-FAST-P8-NEXT: fmr f2, f3
-; NO-FAST-P8-NEXT: .LBB27_2: # %entry
-; NO-FAST-P8-NEXT: fmr f1, f2
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: onecmp2:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: vspltisw v2, 1
-; NO-FAST-P9-NEXT: xvcvsxwdp vs0, vs34
-; NO-FAST-P9-NEXT: xscmpudp cr0, f1, f0
-; NO-FAST-P9-NEXT: bgt cr0, .LBB27_2
-; NO-FAST-P9-NEXT: # %bb.1: # %entry
-; NO-FAST-P9-NEXT: fmr f2, f3
-; NO-FAST-P9-NEXT: .LBB27_2: # %entry
-; NO-FAST-P9-NEXT: fmr f1, f2
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: onecmp2:
+; P8: # %bb.0: # %entry
+; P8-NEXT: vspltisw v2, 1
+; P8-NEXT: xvcvsxwdp vs0, vs34
+; P8-NEXT: xscmpudp cr0, f1, f0
+; P8-NEXT: bgt cr0, .LBB28_2
+; P8-NEXT: # %bb.1: # %entry
+; P8-NEXT: fmr f2, f3
+; P8-NEXT: .LBB28_2: # %entry
+; P8-NEXT: fmr f1, f2
+; P8-NEXT: blr
+;
+; P9-LABEL: onecmp2:
+; P9: # %bb.0: # %entry
+; P9-NEXT: vspltisw v2, 1
+; P9-NEXT: xvcvsxwdp vs0, vs34
+; P9-NEXT: xscmpudp cr0, f1, f0
+; P9-NEXT: bgt cr0, .LBB28_2
+; P9-NEXT: # %bb.1: # %entry
+; P9-NEXT: fmr f2, f3
+; P9-NEXT: .LBB28_2: # %entry
+; P9-NEXT: fmr f1, f2
+; P9-NEXT: blr
entry:
%cmp = fcmp ogt double %a, 1.000000e+00
%y.z = select i1 %cmp, double %y, double %z
ret double %y.z
}
+define double @onecmp2_fast(double %a, double %y, double %z) {
+; P8-LABEL: onecmp2_fast:
+; P8: # %bb.0: # %entry
+; P8-NEXT: vspltisw v2, 1
+; P8-NEXT: xvcvsxwdp vs0, vs34
+; P8-NEXT: xssubdp f0, f0, f1
+; P8-NEXT: fsel f1, f0, f3, f2
+; P8-NEXT: blr
+;
+; P9-LABEL: onecmp2_fast:
+; P9: # %bb.0: # %entry
+; P9-NEXT: vspltisw v2, 1
+; P9-NEXT: xvcvsxwdp vs0, vs34
+; P9-NEXT: xssubdp f0, f0, f1
+; P9-NEXT: fsel f1, f0, f3, f2
+; P9-NEXT: blr
+entry:
+ %cmp = fcmp nnan ninf nsz ogt double %a, 1.000000e+00
+ %y.z = select i1 %cmp, double %y, double %z
+ ret double %y.z
+}
+
define double @onecmp3(double %a, double %y, double %z) {
-; FAST-P8-LABEL: onecmp3:
-; FAST-P8: # %bb.0: # %entry
-; FAST-P8-NEXT: vspltisw v2, -1
-; FAST-P8-NEXT: xvcvsxwdp vs0, vs34
-; FAST-P8-NEXT: xsadddp f0, f1, f0
-; FAST-P8-NEXT: fsel f1, f0, f2, f3
-; FAST-P8-NEXT: xsnegdp f0, f0
-; FAST-P8-NEXT: fsel f1, f0, f1, f3
-; FAST-P8-NEXT: blr
-;
-; FAST-P9-LABEL: onecmp3:
-; FAST-P9: # %bb.0: # %entry
-; FAST-P9-NEXT: vspltisw v2, -1
-; FAST-P9-NEXT: xvcvsxwdp vs0, vs34
-; FAST-P9-NEXT: xsadddp f0, f1, f0
-; FAST-P9-NEXT: fsel f1, f0, f2, f3
-; FAST-P9-NEXT: xsnegdp f0, f0
-; FAST-P9-NEXT: fsel f1, f0, f1, f3
-; FAST-P9-NEXT: blr
-;
-; NO-FAST-P8-LABEL: onecmp3:
-; NO-FAST-P8: # %bb.0: # %entry
-; NO-FAST-P8-NEXT: vspltisw v2, 1
-; NO-FAST-P8-NEXT: xvcvsxwdp vs0, vs34
-; NO-FAST-P8-NEXT: xscmpudp cr0, f1, f0
-; NO-FAST-P8-NEXT: beq cr0, .LBB28_2
-; NO-FAST-P8-NEXT: # %bb.1: # %entry
-; NO-FAST-P8-NEXT: fmr f2, f3
-; NO-FAST-P8-NEXT: .LBB28_2: # %entry
-; NO-FAST-P8-NEXT: fmr f1, f2
-; NO-FAST-P8-NEXT: blr
-;
-; NO-FAST-P9-LABEL: onecmp3:
-; NO-FAST-P9: # %bb.0: # %entry
-; NO-FAST-P9-NEXT: vspltisw v2, 1
-; NO-FAST-P9-NEXT: xvcvsxwdp vs0, vs34
-; NO-FAST-P9-NEXT: xscmpudp cr0, f1, f0
-; NO-FAST-P9-NEXT: beq cr0, .LBB28_2
-; NO-FAST-P9-NEXT: # %bb.1: # %entry
-; NO-FAST-P9-NEXT: fmr f2, f3
-; NO-FAST-P9-NEXT: .LBB28_2: # %entry
-; NO-FAST-P9-NEXT: fmr f1, f2
-; NO-FAST-P9-NEXT: blr
+; P8-LABEL: onecmp3:
+; P8: # %bb.0: # %entry
+; P8-NEXT: vspltisw v2, 1
+; P8-NEXT: xvcvsxwdp vs0, vs34
+; P8-NEXT: xscmpudp cr0, f1, f0
+; P8-NEXT: beq cr0, .LBB30_2
+; P8-NEXT: # %bb.1: # %entry
+; P8-NEXT: fmr f2, f3
+; P8-NEXT: .LBB30_2: # %entry
+; P8-NEXT: fmr f1, f2
+; P8-NEXT: blr
+;
+; P9-LABEL: onecmp3:
+; P9: # %bb.0: # %entry
+; P9-NEXT: vspltisw v2, 1
+; P9-NEXT: xvcvsxwdp vs0, vs34
+; P9-NEXT: xscmpudp cr0, f1, f0
+; P9-NEXT: beq cr0, .LBB30_2
+; P9-NEXT: # %bb.1: # %entry
+; P9-NEXT: fmr f2, f3
+; P9-NEXT: .LBB30_2: # %entry
+; P9-NEXT: fmr f1, f2
+; P9-NEXT: blr
entry:
%cmp = fcmp oeq double %a, 1.000000e+00
%y.z = select i1 %cmp, double %y, double %z
ret double %y.z
}
+
+define double @onecmp3_fast(double %a, double %y, double %z) {
+; P8-LABEL: onecmp3_fast:
+; P8: # %bb.0: # %entry
+; P8-NEXT: vspltisw v2, -1
+; P8-NEXT: xvcvsxwdp vs0, vs34
+; P8-NEXT: xsadddp f0, f1, f0
+; P8-NEXT: fsel f1, f0, f2, f3
+; P8-NEXT: xsnegdp f0, f0
+; P8-NEXT: fsel f1, f0, f1, f3
+; P8-NEXT: blr
+;
+; P9-LABEL: onecmp3_fast:
+; P9: # %bb.0: # %entry
+; P9-NEXT: vspltisw v2, -1
+; P9-NEXT: xvcvsxwdp vs0, vs34
+; P9-NEXT: xsadddp f0, f1, f0
+; P9-NEXT: fsel f1, f0, f2, f3
+; P9-NEXT: xsnegdp f0, f0
+; P9-NEXT: fsel f1, f0, f1, f3
+; P9-NEXT: blr
+entry:
+ %cmp = fcmp nnan ninf nsz oeq double %a, 1.000000e+00
+ %y.z = select i1 %cmp, double %y, double %z
+ ret double %y.z
+}
More information about the llvm-commits
mailing list