1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 03:02:36 +01:00

[CodeGen] Expand float operand for STRICT_FSETCC/STRICT_FSETCCS

This patch is the continue work of https://reviews.llvm.org/D69281
to implement the way that expands STRICT_FSETCC/STRICT_FSETCCS.

Reviewed By: uweigand

Differential Revision: https://reviews.llvm.org/D81906
This commit is contained in:
QingShan Zhang 2020-08-11 05:53:02 +00:00
parent 8446fc61f4
commit 1cb3ec8219
3 changed files with 1021 additions and 25 deletions

View File

@ -1710,6 +1710,8 @@ bool DAGTypeLegalizer::ExpandFloatOperand(SDNode *N, unsigned OpNo) {
case ISD::LRINT: Res = ExpandFloatOp_LRINT(N); break;
case ISD::LLRINT: Res = ExpandFloatOp_LLRINT(N); break;
case ISD::SELECT_CC: Res = ExpandFloatOp_SELECT_CC(N); break;
case ISD::STRICT_FSETCC:
case ISD::STRICT_FSETCCS:
case ISD::SETCC: Res = ExpandFloatOp_SETCC(N); break;
case ISD::STORE: Res = ExpandFloatOp_STORE(cast<StoreSDNode>(N),
OpNo); break;
@ -1735,7 +1737,8 @@ bool DAGTypeLegalizer::ExpandFloatOperand(SDNode *N, unsigned OpNo) {
void DAGTypeLegalizer::FloatExpandSetCCOperands(SDValue &NewLHS,
SDValue &NewRHS,
ISD::CondCode &CCCode,
const SDLoc &dl) {
const SDLoc &dl, SDValue &Chain,
bool IsSignaling) {
SDValue LHSLo, LHSHi, RHSLo, RHSHi;
GetExpandedFloat(NewLHS, LHSLo, LHSHi);
GetExpandedFloat(NewRHS, RHSLo, RHSHi);
@ -1747,25 +1750,31 @@ void DAGTypeLegalizer::FloatExpandSetCCOperands(SDValue &NewLHS,
// BNE crN, L:
// FCMPU crN, lo1, lo2
// The following can be improved, but not that much.
SDValue Tmp1, Tmp2, Tmp3;
Tmp1 = DAG.getSetCC(dl, getSetCCResultType(LHSHi.getValueType()),
LHSHi, RHSHi, ISD::SETOEQ);
Tmp2 = DAG.getSetCC(dl, getSetCCResultType(LHSLo.getValueType()),
LHSLo, RHSLo, CCCode);
SDValue Tmp1, Tmp2, Tmp3, OutputChain;
Tmp1 = DAG.getSetCC(dl, getSetCCResultType(LHSHi.getValueType()), LHSHi,
RHSHi, ISD::SETOEQ, Chain, IsSignaling);
OutputChain = Tmp1->getNumValues() > 1 ? Tmp1.getValue(1) : SDValue();
Tmp2 = DAG.getSetCC(dl, getSetCCResultType(LHSLo.getValueType()), LHSLo,
RHSLo, CCCode, OutputChain, IsSignaling);
OutputChain = Tmp2->getNumValues() > 1 ? Tmp2.getValue(1) : SDValue();
Tmp3 = DAG.getNode(ISD::AND, dl, Tmp1.getValueType(), Tmp1, Tmp2);
Tmp1 = DAG.getSetCC(dl, getSetCCResultType(LHSHi.getValueType()),
LHSHi, RHSHi, ISD::SETUNE);
Tmp2 = DAG.getSetCC(dl, getSetCCResultType(LHSHi.getValueType()),
LHSHi, RHSHi, CCCode);
Tmp1 = DAG.getSetCC(dl, getSetCCResultType(LHSHi.getValueType()), LHSHi,
RHSHi, ISD::SETUNE, OutputChain, IsSignaling);
OutputChain = Tmp1->getNumValues() > 1 ? Tmp1.getValue(1) : SDValue();
Tmp2 = DAG.getSetCC(dl, getSetCCResultType(LHSHi.getValueType()), LHSHi,
RHSHi, CCCode, OutputChain, IsSignaling);
OutputChain = Tmp2->getNumValues() > 1 ? Tmp2.getValue(1) : SDValue();
Tmp1 = DAG.getNode(ISD::AND, dl, Tmp1.getValueType(), Tmp1, Tmp2);
NewLHS = DAG.getNode(ISD::OR, dl, Tmp1.getValueType(), Tmp1, Tmp3);
NewRHS = SDValue(); // LHS is the result, not a compare.
Chain = OutputChain;
}
SDValue DAGTypeLegalizer::ExpandFloatOp_BR_CC(SDNode *N) {
SDValue NewLHS = N->getOperand(2), NewRHS = N->getOperand(3);
ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(1))->get();
FloatExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(N));
SDValue Chain;
FloatExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(N), Chain);
// If ExpandSetCCOperands returned a scalar, we need to compare the result
// against zero to select between true and false values.
@ -1863,7 +1872,8 @@ SDValue DAGTypeLegalizer::ExpandFloatOp_FP_TO_UINT(SDNode *N) {
SDValue DAGTypeLegalizer::ExpandFloatOp_SELECT_CC(SDNode *N) {
SDValue NewLHS = N->getOperand(0), NewRHS = N->getOperand(1);
ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(4))->get();
FloatExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(N));
SDValue Chain;
FloatExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(N), Chain);
// If ExpandSetCCOperands returned a scalar, we need to compare the result
// against zero to select between true and false values.
@ -1879,20 +1889,25 @@ SDValue DAGTypeLegalizer::ExpandFloatOp_SELECT_CC(SDNode *N) {
}
SDValue DAGTypeLegalizer::ExpandFloatOp_SETCC(SDNode *N) {
SDValue NewLHS = N->getOperand(0), NewRHS = N->getOperand(1);
ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(2))->get();
FloatExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(N));
bool IsStrict = N->isStrictFPOpcode();
SDValue NewLHS = N->getOperand(IsStrict ? 1 : 0);
SDValue NewRHS = N->getOperand(IsStrict ? 2 : 1);
SDValue Chain = IsStrict ? N->getOperand(0) : SDValue();
ISD::CondCode CCCode =
cast<CondCodeSDNode>(N->getOperand(IsStrict ? 3 : 2))->get();
FloatExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(N), Chain,
N->getOpcode() == ISD::STRICT_FSETCCS);
// If ExpandSetCCOperands returned a scalar, use it.
if (!NewRHS.getNode()) {
assert(NewLHS.getValueType() == N->getValueType(0) &&
"Unexpected setcc expansion!");
return NewLHS;
// FloatExpandSetCCOperands always returned a scalar.
assert(!NewRHS.getNode() && "Expect to return scalar");
assert(NewLHS.getValueType() == N->getValueType(0) &&
"Unexpected setcc expansion!");
if (Chain) {
ReplaceValueWith(SDValue(N, 0), NewLHS);
ReplaceValueWith(SDValue(N, 1), Chain);
return SDValue();
}
// Otherwise, update N to have the operands specified.
return SDValue(DAG.UpdateNodeOperands(N, NewLHS, NewRHS,
DAG.getCondCode(CCCode)), 0);
return NewLHS;
}
SDValue DAGTypeLegalizer::ExpandFloatOp_STORE(SDNode *N, unsigned OpNo) {

View File

@ -629,7 +629,8 @@ private:
SDValue ExpandFloatOp_STORE(SDNode *N, unsigned OpNo);
void FloatExpandSetCCOperands(SDValue &NewLHS, SDValue &NewRHS,
ISD::CondCode &CCCode, const SDLoc &dl);
ISD::CondCode &CCCode, const SDLoc &dl,
SDValue &Chain, bool IsSignaling = false);
//===--------------------------------------------------------------------===//
// Float promotion support: LegalizeFloatTypes.cpp

View File

@ -2689,6 +2689,984 @@ define i32 @fcmps_une_f128(fp128 %a, fp128 %b) #0 {
ret i32 %conv
}
define i32 @fcmp_olt_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmp_olt_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpu cr0, f1, f3
; P8-NEXT: fcmpu cr1, f2, f4
; P8-NEXT: li r3, 1
; P8-NEXT: crand 4*cr5+lt, eq, 4*cr1+lt
; P8-NEXT: crandc 4*cr5+gt, lt, eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmp_olt_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpu cr0, f1, f3
; P9-NEXT: fcmpu cr1, f2, f4
; P9-NEXT: li r3, 1
; P9-NEXT: crand 4*cr5+lt, eq, 4*cr1+lt
; P9-NEXT: crandc 4*cr5+gt, lt, eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmp_olt_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpu cr0, f1, f3
; NOVSX-NEXT: fcmpu cr1, f2, f4
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: crand 4*cr5+lt, eq, 4*cr1+lt
; NOVSX-NEXT: crandc 4*cr5+gt, lt, eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"olt", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmp_ole_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmp_ole_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpu cr0, f2, f4
; P8-NEXT: fcmpu cr1, f1, f3
; P8-NEXT: li r3, 1
; P8-NEXT: crnor 4*cr5+lt, un, gt
; P8-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+gt
; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmp_ole_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpu cr0, f2, f4
; P9-NEXT: li r3, 1
; P9-NEXT: crnor 4*cr5+lt, un, gt
; P9-NEXT: fcmpu cr0, f1, f3
; P9-NEXT: crnor 4*cr5+gt, un, gt
; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt
; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmp_ole_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpu cr0, f2, f4
; NOVSX-NEXT: fcmpu cr1, f1, f3
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: crnor 4*cr5+lt, un, gt
; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+gt
; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ole", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmp_ogt_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmp_ogt_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpu cr0, f1, f3
; P8-NEXT: fcmpu cr1, f2, f4
; P8-NEXT: li r3, 1
; P8-NEXT: crand 4*cr5+lt, eq, 4*cr1+gt
; P8-NEXT: crandc 4*cr5+gt, gt, eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmp_ogt_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpu cr0, f1, f3
; P9-NEXT: fcmpu cr1, f2, f4
; P9-NEXT: li r3, 1
; P9-NEXT: crand 4*cr5+lt, eq, 4*cr1+gt
; P9-NEXT: crandc 4*cr5+gt, gt, eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmp_ogt_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpu cr0, f1, f3
; NOVSX-NEXT: fcmpu cr1, f2, f4
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: crand 4*cr5+lt, eq, 4*cr1+gt
; NOVSX-NEXT: crandc 4*cr5+gt, gt, eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ogt", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmp_oge_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmp_oge_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpu cr0, f2, f4
; P8-NEXT: fcmpu cr1, f1, f3
; P8-NEXT: li r3, 1
; P8-NEXT: crnor 4*cr5+lt, un, lt
; P8-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+lt
; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmp_oge_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpu cr0, f2, f4
; P9-NEXT: li r3, 1
; P9-NEXT: crnor 4*cr5+lt, un, lt
; P9-NEXT: fcmpu cr0, f1, f3
; P9-NEXT: crnor 4*cr5+gt, un, lt
; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt
; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmp_oge_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpu cr0, f2, f4
; NOVSX-NEXT: fcmpu cr1, f1, f3
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: crnor 4*cr5+lt, un, lt
; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+lt
; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"oge", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmp_oeq_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmp_oeq_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpu cr0, f1, f3
; P8-NEXT: fcmpu cr1, f2, f4
; P8-NEXT: li r3, 1
; P8-NEXT: crand 4*cr5+lt, eq, 4*cr1+eq
; P8-NEXT: crandc 4*cr5+gt, eq, eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmp_oeq_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpu cr0, f1, f3
; P9-NEXT: fcmpu cr1, f2, f4
; P9-NEXT: li r3, 1
; P9-NEXT: crand 4*cr5+lt, eq, 4*cr1+eq
; P9-NEXT: crandc 4*cr5+gt, eq, eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmp_oeq_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpu cr0, f1, f3
; NOVSX-NEXT: fcmpu cr1, f2, f4
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: crand 4*cr5+lt, eq, 4*cr1+eq
; NOVSX-NEXT: crandc 4*cr5+gt, eq, eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"oeq", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmp_one_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmp_one_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpu cr0, f2, f4
; P8-NEXT: fcmpu cr1, f1, f3
; P8-NEXT: li r3, 1
; P8-NEXT: crnor 4*cr5+lt, un, eq
; P8-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+eq
; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmp_one_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpu cr0, f2, f4
; P9-NEXT: li r3, 1
; P9-NEXT: crnor 4*cr5+lt, un, eq
; P9-NEXT: fcmpu cr0, f1, f3
; P9-NEXT: crnor 4*cr5+gt, un, eq
; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt
; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmp_one_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpu cr0, f2, f4
; NOVSX-NEXT: fcmpu cr1, f1, f3
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: crnor 4*cr5+lt, un, eq
; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+eq
; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"one", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmp_ult_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmp_ult_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpu cr0, f2, f4
; P8-NEXT: fcmpu cr1, f1, f3
; P8-NEXT: li r3, 1
; P8-NEXT: cror 4*cr5+lt, lt, un
; P8-NEXT: cror 4*cr5+gt, 4*cr1+lt, 4*cr1+un
; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmp_ult_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpu cr0, f1, f3
; P9-NEXT: fcmpu cr1, f2, f4
; P9-NEXT: li r3, 1
; P9-NEXT: cror 4*cr5+lt, 4*cr1+lt, 4*cr1+un
; P9-NEXT: cror 4*cr5+gt, lt, un
; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt
; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmp_ult_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpu cr0, f2, f4
; NOVSX-NEXT: fcmpu cr1, f1, f3
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: cror 4*cr5+lt, lt, un
; NOVSX-NEXT: cror 4*cr5+gt, 4*cr1+lt, 4*cr1+un
; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ult", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmp_ule_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmp_ule_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpu cr0, f2, f4
; P8-NEXT: fcmpu cr1, f1, f3
; P8-NEXT: li r3, 1
; P8-NEXT: crandc 4*cr5+lt, 4*cr1+eq, gt
; P8-NEXT: crnor 4*cr5+gt, 4*cr1+gt, 4*cr1+eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmp_ule_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpu cr0, f2, f4
; P9-NEXT: fcmpu cr1, f1, f3
; P9-NEXT: li r3, 1
; P9-NEXT: crandc 4*cr5+lt, 4*cr1+eq, gt
; P9-NEXT: crnor 4*cr5+gt, 4*cr1+gt, 4*cr1+eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmp_ule_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpu cr0, f2, f4
; NOVSX-NEXT: fcmpu cr1, f1, f3
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: crandc 4*cr5+lt, 4*cr1+eq, gt
; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+gt, 4*cr1+eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ule", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmp_ugt_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmp_ugt_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpu cr0, f2, f4
; P8-NEXT: fcmpu cr1, f1, f3
; P8-NEXT: li r3, 1
; P8-NEXT: cror 4*cr5+lt, gt, un
; P8-NEXT: cror 4*cr5+gt, 4*cr1+gt, 4*cr1+un
; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmp_ugt_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpu cr0, f1, f3
; P9-NEXT: fcmpu cr1, f2, f4
; P9-NEXT: li r3, 1
; P9-NEXT: cror 4*cr5+lt, 4*cr1+gt, 4*cr1+un
; P9-NEXT: cror 4*cr5+gt, gt, un
; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt
; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmp_ugt_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpu cr0, f2, f4
; NOVSX-NEXT: fcmpu cr1, f1, f3
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: cror 4*cr5+lt, gt, un
; NOVSX-NEXT: cror 4*cr5+gt, 4*cr1+gt, 4*cr1+un
; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ugt", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmp_uge_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmp_uge_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpu cr0, f2, f4
; P8-NEXT: fcmpu cr1, f1, f3
; P8-NEXT: li r3, 1
; P8-NEXT: crandc 4*cr5+lt, 4*cr1+eq, lt
; P8-NEXT: crnor 4*cr5+gt, 4*cr1+lt, 4*cr1+eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmp_uge_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpu cr0, f2, f4
; P9-NEXT: fcmpu cr1, f1, f3
; P9-NEXT: li r3, 1
; P9-NEXT: crandc 4*cr5+lt, 4*cr1+eq, lt
; P9-NEXT: crnor 4*cr5+gt, 4*cr1+lt, 4*cr1+eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmp_uge_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpu cr0, f2, f4
; NOVSX-NEXT: fcmpu cr1, f1, f3
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: crandc 4*cr5+lt, 4*cr1+eq, lt
; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+lt, 4*cr1+eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"uge", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmp_ueq_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmp_ueq_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpu cr0, f2, f4
; P8-NEXT: fcmpu cr1, f1, f3
; P8-NEXT: li r3, 1
; P8-NEXT: cror 4*cr5+lt, eq, un
; P8-NEXT: cror 4*cr5+gt, 4*cr1+eq, 4*cr1+un
; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmp_ueq_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpu cr0, f1, f3
; P9-NEXT: fcmpu cr1, f2, f4
; P9-NEXT: li r3, 1
; P9-NEXT: cror 4*cr5+lt, 4*cr1+eq, 4*cr1+un
; P9-NEXT: cror 4*cr5+gt, eq, un
; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt
; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmp_ueq_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpu cr0, f2, f4
; NOVSX-NEXT: fcmpu cr1, f1, f3
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: cror 4*cr5+lt, eq, un
; NOVSX-NEXT: cror 4*cr5+gt, 4*cr1+eq, 4*cr1+un
; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ueq", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmp_une_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmp_une_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpu cr0, f2, f4
; P8-NEXT: fcmpu cr1, f1, f3
; P8-NEXT: li r3, 1
; P8-NEXT: crandc 4*cr5+lt, 4*cr1+eq, eq
; P8-NEXT: crandc 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmp_une_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpu cr0, f2, f4
; P9-NEXT: fcmpu cr1, f1, f3
; P9-NEXT: li r3, 1
; P9-NEXT: crandc 4*cr5+lt, 4*cr1+eq, eq
; P9-NEXT: crandc 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmp_une_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpu cr0, f2, f4
; NOVSX-NEXT: fcmpu cr1, f1, f3
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: crandc 4*cr5+lt, 4*cr1+eq, eq
; NOVSX-NEXT: crandc 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"une", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmps_olt_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmps_olt_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpo cr0, f1, f3
; P8-NEXT: fcmpo cr1, f2, f4
; P8-NEXT: li r3, 1
; P8-NEXT: crand 4*cr5+lt, eq, 4*cr1+lt
; P8-NEXT: crandc 4*cr5+gt, lt, eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmps_olt_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpo cr0, f1, f3
; P9-NEXT: fcmpo cr1, f2, f4
; P9-NEXT: li r3, 1
; P9-NEXT: crand 4*cr5+lt, eq, 4*cr1+lt
; P9-NEXT: crandc 4*cr5+gt, lt, eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmps_olt_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpo cr0, f1, f3
; NOVSX-NEXT: fcmpo cr1, f2, f4
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: crand 4*cr5+lt, eq, 4*cr1+lt
; NOVSX-NEXT: crandc 4*cr5+gt, lt, eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"olt", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmps_ole_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmps_ole_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpo cr0, f2, f4
; P8-NEXT: fcmpo cr1, f1, f3
; P8-NEXT: li r3, 1
; P8-NEXT: crnor 4*cr5+lt, un, gt
; P8-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+gt
; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmps_ole_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpo cr0, f2, f4
; P9-NEXT: li r3, 1
; P9-NEXT: crnor 4*cr5+lt, un, gt
; P9-NEXT: fcmpo cr0, f1, f3
; P9-NEXT: crnor 4*cr5+gt, un, gt
; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt
; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmps_ole_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpo cr0, f2, f4
; NOVSX-NEXT: fcmpo cr1, f1, f3
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: crnor 4*cr5+lt, un, gt
; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+gt
; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ole", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmps_ogt_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmps_ogt_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpo cr0, f1, f3
; P8-NEXT: fcmpo cr1, f2, f4
; P8-NEXT: li r3, 1
; P8-NEXT: crand 4*cr5+lt, eq, 4*cr1+gt
; P8-NEXT: crandc 4*cr5+gt, gt, eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmps_ogt_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpo cr0, f1, f3
; P9-NEXT: fcmpo cr1, f2, f4
; P9-NEXT: li r3, 1
; P9-NEXT: crand 4*cr5+lt, eq, 4*cr1+gt
; P9-NEXT: crandc 4*cr5+gt, gt, eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmps_ogt_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpo cr0, f1, f3
; NOVSX-NEXT: fcmpo cr1, f2, f4
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: crand 4*cr5+lt, eq, 4*cr1+gt
; NOVSX-NEXT: crandc 4*cr5+gt, gt, eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ogt", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmps_oge_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmps_oge_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpo cr0, f2, f4
; P8-NEXT: fcmpo cr1, f1, f3
; P8-NEXT: li r3, 1
; P8-NEXT: crnor 4*cr5+lt, un, lt
; P8-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+lt
; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmps_oge_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpo cr0, f2, f4
; P9-NEXT: li r3, 1
; P9-NEXT: crnor 4*cr5+lt, un, lt
; P9-NEXT: fcmpo cr0, f1, f3
; P9-NEXT: crnor 4*cr5+gt, un, lt
; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt
; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmps_oge_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpo cr0, f2, f4
; NOVSX-NEXT: fcmpo cr1, f1, f3
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: crnor 4*cr5+lt, un, lt
; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+lt
; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"oge", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmps_oeq_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmps_oeq_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpo cr0, f1, f3
; P8-NEXT: fcmpo cr1, f2, f4
; P8-NEXT: li r3, 1
; P8-NEXT: crand 4*cr5+lt, eq, 4*cr1+eq
; P8-NEXT: crandc 4*cr5+gt, eq, eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmps_oeq_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpo cr0, f1, f3
; P9-NEXT: fcmpo cr1, f2, f4
; P9-NEXT: li r3, 1
; P9-NEXT: crand 4*cr5+lt, eq, 4*cr1+eq
; P9-NEXT: crandc 4*cr5+gt, eq, eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmps_oeq_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpo cr0, f1, f3
; NOVSX-NEXT: fcmpo cr1, f2, f4
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: crand 4*cr5+lt, eq, 4*cr1+eq
; NOVSX-NEXT: crandc 4*cr5+gt, eq, eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"oeq", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmps_one_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmps_one_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpo cr0, f2, f4
; P8-NEXT: fcmpo cr1, f1, f3
; P8-NEXT: li r3, 1
; P8-NEXT: crnor 4*cr5+lt, un, eq
; P8-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+eq
; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmps_one_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpo cr0, f2, f4
; P9-NEXT: li r3, 1
; P9-NEXT: crnor 4*cr5+lt, un, eq
; P9-NEXT: fcmpo cr0, f1, f3
; P9-NEXT: crnor 4*cr5+gt, un, eq
; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt
; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmps_one_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpo cr0, f2, f4
; NOVSX-NEXT: fcmpo cr1, f1, f3
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: crnor 4*cr5+lt, un, eq
; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+un, 4*cr1+eq
; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"one", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmps_ult_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmps_ult_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpo cr0, f2, f4
; P8-NEXT: fcmpo cr1, f1, f3
; P8-NEXT: li r3, 1
; P8-NEXT: cror 4*cr5+lt, lt, un
; P8-NEXT: cror 4*cr5+gt, 4*cr1+lt, 4*cr1+un
; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmps_ult_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpo cr0, f1, f3
; P9-NEXT: fcmpo cr1, f2, f4
; P9-NEXT: li r3, 1
; P9-NEXT: cror 4*cr5+lt, 4*cr1+lt, 4*cr1+un
; P9-NEXT: cror 4*cr5+gt, lt, un
; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt
; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmps_ult_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpo cr0, f2, f4
; NOVSX-NEXT: fcmpo cr1, f1, f3
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: cror 4*cr5+lt, lt, un
; NOVSX-NEXT: cror 4*cr5+gt, 4*cr1+lt, 4*cr1+un
; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ult", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmps_ule_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmps_ule_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpo cr0, f2, f4
; P8-NEXT: fcmpo cr1, f1, f3
; P8-NEXT: li r3, 1
; P8-NEXT: crandc 4*cr5+lt, 4*cr1+eq, gt
; P8-NEXT: crnor 4*cr5+gt, 4*cr1+gt, 4*cr1+eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmps_ule_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpo cr0, f2, f4
; P9-NEXT: fcmpo cr1, f1, f3
; P9-NEXT: li r3, 1
; P9-NEXT: crandc 4*cr5+lt, 4*cr1+eq, gt
; P9-NEXT: crnor 4*cr5+gt, 4*cr1+gt, 4*cr1+eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmps_ule_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpo cr0, f2, f4
; NOVSX-NEXT: fcmpo cr1, f1, f3
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: crandc 4*cr5+lt, 4*cr1+eq, gt
; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+gt, 4*cr1+eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ule", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmps_ugt_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmps_ugt_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpo cr0, f2, f4
; P8-NEXT: fcmpo cr1, f1, f3
; P8-NEXT: li r3, 1
; P8-NEXT: cror 4*cr5+lt, gt, un
; P8-NEXT: cror 4*cr5+gt, 4*cr1+gt, 4*cr1+un
; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmps_ugt_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpo cr0, f1, f3
; P9-NEXT: fcmpo cr1, f2, f4
; P9-NEXT: li r3, 1
; P9-NEXT: cror 4*cr5+lt, 4*cr1+gt, 4*cr1+un
; P9-NEXT: cror 4*cr5+gt, gt, un
; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt
; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmps_ugt_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpo cr0, f2, f4
; NOVSX-NEXT: fcmpo cr1, f1, f3
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: cror 4*cr5+lt, gt, un
; NOVSX-NEXT: cror 4*cr5+gt, 4*cr1+gt, 4*cr1+un
; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ugt", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmps_uge_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmps_uge_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpo cr0, f2, f4
; P8-NEXT: fcmpo cr1, f1, f3
; P8-NEXT: li r3, 1
; P8-NEXT: crandc 4*cr5+lt, 4*cr1+eq, lt
; P8-NEXT: crnor 4*cr5+gt, 4*cr1+lt, 4*cr1+eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmps_uge_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpo cr0, f2, f4
; P9-NEXT: fcmpo cr1, f1, f3
; P9-NEXT: li r3, 1
; P9-NEXT: crandc 4*cr5+lt, 4*cr1+eq, lt
; P9-NEXT: crnor 4*cr5+gt, 4*cr1+lt, 4*cr1+eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmps_uge_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpo cr0, f2, f4
; NOVSX-NEXT: fcmpo cr1, f1, f3
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: crandc 4*cr5+lt, 4*cr1+eq, lt
; NOVSX-NEXT: crnor 4*cr5+gt, 4*cr1+lt, 4*cr1+eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"uge", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmps_ueq_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmps_ueq_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpo cr0, f2, f4
; P8-NEXT: fcmpo cr1, f1, f3
; P8-NEXT: li r3, 1
; P8-NEXT: cror 4*cr5+lt, eq, un
; P8-NEXT: cror 4*cr5+gt, 4*cr1+eq, 4*cr1+un
; P8-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; P8-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; P8-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmps_ueq_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpo cr0, f1, f3
; P9-NEXT: fcmpo cr1, f2, f4
; P9-NEXT: li r3, 1
; P9-NEXT: cror 4*cr5+lt, 4*cr1+eq, 4*cr1+un
; P9-NEXT: cror 4*cr5+gt, eq, un
; P9-NEXT: crand 4*cr5+lt, eq, 4*cr5+lt
; P9-NEXT: crandc 4*cr5+gt, 4*cr5+gt, eq
; P9-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmps_ueq_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpo cr0, f2, f4
; NOVSX-NEXT: fcmpo cr1, f1, f3
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: cror 4*cr5+lt, eq, un
; NOVSX-NEXT: cror 4*cr5+gt, 4*cr1+eq, 4*cr1+un
; NOVSX-NEXT: crand 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; NOVSX-NEXT: crandc 4*cr5+gt, 4*cr5+gt, 4*cr1+eq
; NOVSX-NEXT: crnor 4*cr5+lt, 4*cr5+gt, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"ueq", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
define i32 @fcmps_une_ppcf128(ppc_fp128 %a, ppc_fp128 %b) #0 {
; P8-LABEL: fcmps_une_ppcf128:
; P8: # %bb.0:
; P8-NEXT: fcmpo cr0, f2, f4
; P8-NEXT: fcmpo cr1, f1, f3
; P8-NEXT: li r3, 1
; P8-NEXT: crandc 4*cr5+lt, 4*cr1+eq, eq
; P8-NEXT: crandc 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; P8-NEXT: isel r3, 0, r3, 4*cr5+lt
; P8-NEXT: blr
;
; P9-LABEL: fcmps_une_ppcf128:
; P9: # %bb.0:
; P9-NEXT: fcmpo cr0, f2, f4
; P9-NEXT: fcmpo cr1, f1, f3
; P9-NEXT: li r3, 1
; P9-NEXT: crandc 4*cr5+lt, 4*cr1+eq, eq
; P9-NEXT: crandc 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; P9-NEXT: isel r3, 0, r3, 4*cr5+lt
; P9-NEXT: blr
;
; NOVSX-LABEL: fcmps_une_ppcf128:
; NOVSX: # %bb.0:
; NOVSX-NEXT: fcmpo cr0, f2, f4
; NOVSX-NEXT: fcmpo cr1, f1, f3
; NOVSX-NEXT: li r3, 1
; NOVSX-NEXT: crandc 4*cr5+lt, 4*cr1+eq, eq
; NOVSX-NEXT: crandc 4*cr5+lt, 4*cr1+eq, 4*cr5+lt
; NOVSX-NEXT: isel r3, 0, r3, 4*cr5+lt
; NOVSX-NEXT: blr
%cmp = call i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128 %a, ppc_fp128 %b, metadata !"une", metadata !"fpexcept.strict") #0
%conv = zext i1 %cmp to i32
ret i32 %conv
}
attributes #0 = { strictfp nounwind }
declare i1 @llvm.experimental.constrained.fcmp.f32(float, float, metadata, metadata)
@ -2697,3 +3675,5 @@ declare i1 @llvm.experimental.constrained.fcmps.f32(float, float, metadata, meta
declare i1 @llvm.experimental.constrained.fcmps.f64(double, double, metadata, metadata)
declare i1 @llvm.experimental.constrained.fcmps.f128(fp128, fp128, metadata, metadata)
declare i1 @llvm.experimental.constrained.fcmp.f128(fp128, fp128, metadata, metadata)
declare i1 @llvm.experimental.constrained.fcmps.ppcf128(ppc_fp128, ppc_fp128, metadata, metadata)
declare i1 @llvm.experimental.constrained.fcmp.ppcf128(ppc_fp128, ppc_fp128, metadata, metadata)