diff options
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp index 623d2e0..ad957aa 100644 --- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -10358,6 +10358,27 @@ SDValue TargetLowering::expandAddSubSat(SDNode *Node, SelectionDAG &DAG) const { return DAG.getSelect(dl, VT, Overflow, Result, SumDiff); } +SDValue TargetLowering::expandCMP(SDNode *Node, SelectionDAG &DAG) const { + unsigned Opcode = Node->getOpcode(); + SDValue LHS = Node->getOperand(0); + SDValue RHS = Node->getOperand(1); + EVT VT = LHS.getValueType(); + EVT ResVT = Node->getValueType(0); + EVT BoolVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT); + SDLoc dl(Node); + + auto LTPredicate = (Opcode == ISD::UCMP ? ISD::SETULT : ISD::SETLT); + auto GTPredicate = (Opcode == ISD::UCMP ? ISD::SETUGT : ISD::SETGT); + + SDValue IsLT = DAG.getSetCC(dl, BoolVT, LHS, RHS, LTPredicate); + SDValue IsGT = DAG.getSetCC(dl, BoolVT, LHS, RHS, GTPredicate); + SDValue SelectZeroOrOne = + DAG.getSelect(dl, ResVT, IsGT, DAG.getConstant(1, dl, ResVT), + DAG.getConstant(0, dl, ResVT)); + return DAG.getSelect(dl, ResVT, IsLT, DAG.getConstant(-1, dl, ResVT), + SelectZeroOrOne); +} + SDValue TargetLowering::expandShlSat(SDNode *Node, SelectionDAG &DAG) const { unsigned Opcode = Node->getOpcode(); bool IsSigned = Opcode == ISD::SSHLSAT; |