@@ -5924,6 +5924,96 @@ void CombinerHelper::applyUMulHToLShr(MachineInstr &MI) const {
59245924 MI.eraseFromParent ();
59255925}
59265926
5927+ bool CombinerHelper::matchTruncSSatS (MachineInstr &MI,
5928+ Register &MatchInfo) const {
5929+ Register Dst = MI.getOperand (0 ).getReg ();
5930+ Register Src = MI.getOperand (1 ).getReg ();
5931+ LLT DstTy = MRI.getType (Dst);
5932+ LLT SrcTy = MRI.getType (Src);
5933+ unsigned NumDstBits = DstTy.getScalarSizeInBits ();
5934+ unsigned NumSrcBits = SrcTy.getScalarSizeInBits ();
5935+ assert (NumSrcBits > NumDstBits && " Unexpected types for truncate operation" );
5936+
5937+ if (!LI || !isLegal ({TargetOpcode::G_TRUNC_SSAT_S, {DstTy, SrcTy}}))
5938+ return false ;
5939+
5940+ APInt SignedMax = APInt::getSignedMaxValue (NumDstBits).sext (NumSrcBits);
5941+ APInt SignedMin = APInt::getSignedMinValue (NumDstBits).sext (NumSrcBits);
5942+ return mi_match (Src, MRI,
5943+ m_GSMin (m_GSMax (m_Reg (MatchInfo),
5944+ m_SpecificICstOrSplat (SignedMin)),
5945+ m_SpecificICstOrSplat (SignedMax))) ||
5946+ mi_match (Src, MRI,
5947+ m_GSMax (m_GSMin (m_Reg (MatchInfo),
5948+ m_SpecificICstOrSplat (SignedMax)),
5949+ m_SpecificICstOrSplat (SignedMin)));
5950+ }
5951+
5952+ void CombinerHelper::applyTruncSSatS (MachineInstr &MI,
5953+ Register &MatchInfo) const {
5954+ Register Dst = MI.getOperand (0 ).getReg ();
5955+ Builder.buildTruncSSatS (Dst, MatchInfo);
5956+ MI.eraseFromParent ();
5957+ }
5958+
5959+ bool CombinerHelper::matchTruncSSatU (MachineInstr &MI,
5960+ Register &MatchInfo) const {
5961+ Register Dst = MI.getOperand (0 ).getReg ();
5962+ Register Src = MI.getOperand (1 ).getReg ();
5963+ LLT DstTy = MRI.getType (Dst);
5964+ LLT SrcTy = MRI.getType (Src);
5965+ unsigned NumDstBits = DstTy.getScalarSizeInBits ();
5966+ unsigned NumSrcBits = SrcTy.getScalarSizeInBits ();
5967+ assert (NumSrcBits > NumDstBits && " Unexpected types for truncate operation" );
5968+
5969+ if (!LI || !isLegal ({TargetOpcode::G_TRUNC_SSAT_U, {DstTy, SrcTy}}))
5970+ return false ;
5971+ APInt UnsignedMax = APInt::getMaxValue (NumDstBits).zext (NumSrcBits);
5972+ return mi_match (Src, MRI,
5973+ m_GSMin (m_GSMax (m_Reg (MatchInfo), m_SpecificICstOrSplat (0 )),
5974+ m_SpecificICstOrSplat (UnsignedMax))) ||
5975+ mi_match (Src, MRI,
5976+ m_GSMax (m_GSMin (m_Reg (MatchInfo),
5977+ m_SpecificICstOrSplat (UnsignedMax)),
5978+ m_SpecificICstOrSplat (0 ))) ||
5979+ mi_match (Src, MRI,
5980+ m_GUMin (m_GSMax (m_Reg (MatchInfo), m_SpecificICstOrSplat (0 )),
5981+ m_SpecificICstOrSplat (UnsignedMax)));
5982+ }
5983+
5984+ void CombinerHelper::applyTruncSSatU (MachineInstr &MI,
5985+ Register &MatchInfo) const {
5986+ Register Dst = MI.getOperand (0 ).getReg ();
5987+ Builder.buildTruncSSatU (Dst, MatchInfo);
5988+ MI.eraseFromParent ();
5989+ }
5990+
5991+ bool CombinerHelper::matchTruncUSatU (MachineInstr &MI,
5992+ MachineInstr &MinMI) const {
5993+ Register Min = MinMI.getOperand (2 ).getReg ();
5994+ Register Val = MinMI.getOperand (1 ).getReg ();
5995+ LLT DstTy = MRI.getType (MI.getOperand (0 ).getReg ());
5996+ LLT SrcTy = MRI.getType (Val);
5997+ unsigned NumDstBits = DstTy.getScalarSizeInBits ();
5998+ unsigned NumSrcBits = SrcTy.getScalarSizeInBits ();
5999+ assert (NumSrcBits > NumDstBits && " Unexpected types for truncate operation" );
6000+
6001+ if (!LI || !isLegal ({TargetOpcode::G_TRUNC_SSAT_U, {DstTy, SrcTy}}))
6002+ return false ;
6003+ APInt UnsignedMax = APInt::getMaxValue (NumDstBits).zext (NumSrcBits);
6004+ return mi_match (Min, MRI, m_SpecificICstOrSplat (UnsignedMax)) &&
6005+ !mi_match (Val, MRI, m_GSMax (m_Reg (), m_Reg ()));
6006+ }
6007+
6008+ bool CombinerHelper::matchTruncUSatUToFPTOUISat (MachineInstr &MI,
6009+ MachineInstr &SrcMI) const {
6010+ LLT DstTy = MRI.getType (MI.getOperand (0 ).getReg ());
6011+ LLT SrcTy = MRI.getType (SrcMI.getOperand (1 ).getReg ());
6012+
6013+ return LI &&
6014+ isLegalOrBeforeLegalizer ({TargetOpcode::G_FPTOUI_SAT, {DstTy, SrcTy}});
6015+ }
6016+
59276017bool CombinerHelper::matchRedundantNegOperands (MachineInstr &MI,
59286018 BuildFnTy &MatchInfo) const {
59296019 unsigned Opc = MI.getOpcode ();
0 commit comments