@@ -5924,6 +5924,134 @@ 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+ APInt MinConst, MaxConst;
5938+ APInt SignedMax = APInt::getSignedMaxValue (NumDstBits).sext (NumSrcBits);
5939+ APInt SignedMin = APInt::getSignedMinValue (NumDstBits).sext (NumSrcBits);
5940+
5941+ if (isLegal ({TargetOpcode::G_TRUNC_SSAT_S, {DstTy, SrcTy}})) {
5942+ if (mi_match (Src, MRI,
5943+ m_GSMin (m_GSMax (m_Reg (MatchInfo), m_ICstOrSplat (MinConst)),
5944+ m_ICstOrSplat (MaxConst))) &&
5945+ APInt::isSameValue (MinConst, SignedMin) &&
5946+ APInt::isSameValue (MaxConst, SignedMax))
5947+ return true ;
5948+ if (mi_match (Src, MRI,
5949+ m_GSMax (m_GSMin (m_Reg (MatchInfo), m_ICstOrSplat (MaxConst)),
5950+ m_ICstOrSplat (MinConst))) &&
5951+ APInt::isSameValue (MinConst, SignedMin) &&
5952+ APInt::isSameValue (MaxConst, SignedMax))
5953+ return true ;
5954+ }
5955+ return false ;
5956+ }
5957+
5958+ void CombinerHelper::applyTruncSSatS (MachineInstr &MI,
5959+ Register &MatchInfo) const {
5960+ Register Dst = MI.getOperand (0 ).getReg ();
5961+ Builder.buildTruncSSatS (Dst, MatchInfo);
5962+ MI.eraseFromParent ();
5963+ }
5964+
5965+ bool CombinerHelper::matchTruncSSatU (MachineInstr &MI,
5966+ Register &MatchInfo) const {
5967+ Register Dst = MI.getOperand (0 ).getReg ();
5968+ Register Src = MI.getOperand (1 ).getReg ();
5969+ LLT DstTy = MRI.getType (Dst);
5970+ LLT SrcTy = MRI.getType (Src);
5971+ unsigned NumDstBits = DstTy.getScalarSizeInBits ();
5972+ unsigned NumSrcBits = SrcTy.getScalarSizeInBits ();
5973+ assert (NumSrcBits > NumDstBits && " Unexpected types for truncate operation" );
5974+
5975+ APInt MaxConst;
5976+ APInt UnsignedMax = APInt::getMaxValue (NumDstBits).zext (NumSrcBits);
5977+
5978+ if (isLegal ({TargetOpcode::G_TRUNC_SSAT_U, {DstTy, SrcTy}})) {
5979+ if (mi_match (Src, MRI,
5980+ m_GSMin (m_GSMax (m_Reg (MatchInfo), m_SpecificICstOrSplat (0 )),
5981+ m_ICstOrSplat (MaxConst))) &&
5982+ APInt::isSameValue (MaxConst, UnsignedMax))
5983+ return true ;
5984+ if (mi_match (Src, MRI,
5985+ m_GSMax (m_GSMin (m_Reg (MatchInfo), m_ICstOrSplat (MaxConst)),
5986+ m_SpecificICstOrSplat (0 ))) &&
5987+ APInt::isSameValue (MaxConst, UnsignedMax))
5988+ return true ;
5989+ if (mi_match (Src, MRI,
5990+ m_GUMin (m_GSMax (m_Reg (MatchInfo), m_SpecificICstOrSplat (0 )),
5991+ m_ICstOrSplat (MaxConst))) &&
5992+ APInt::isSameValue (MaxConst, UnsignedMax))
5993+ return true ;
5994+ }
5995+ return false ;
5996+ }
5997+
5998+ void CombinerHelper::applyTruncSSatU (MachineInstr &MI,
5999+ Register &MatchInfo) const {
6000+ Register Dst = MI.getOperand (0 ).getReg ();
6001+ Builder.buildTruncSSatU (Dst, MatchInfo);
6002+ MI.eraseFromParent ();
6003+ }
6004+
6005+ bool CombinerHelper::matchTruncUSatU (MachineInstr &MI,
6006+ Register &MatchInfo) const {
6007+ Register Dst = MI.getOperand (0 ).getReg ();
6008+ Register Src = MI.getOperand (1 ).getReg ();
6009+ LLT DstTy = MRI.getType (Dst);
6010+ LLT SrcTy = MRI.getType (Src);
6011+ unsigned NumDstBits = DstTy.getScalarSizeInBits ();
6012+ unsigned NumSrcBits = SrcTy.getScalarSizeInBits ();
6013+ assert (NumSrcBits > NumDstBits && " Unexpected types for truncate operation" );
6014+
6015+ APInt MaxConst;
6016+ APInt UnsignedMax = APInt::getMaxValue (NumDstBits).zext (NumSrcBits);
6017+
6018+ if (isLegal ({TargetOpcode::G_TRUNC_SSAT_U, {DstTy, SrcTy}})) {
6019+ if (mi_match (Src, MRI,
6020+ m_GUMin (m_Reg (MatchInfo), m_ICstOrSplat (MaxConst))) &&
6021+ APInt::isSameValue (MaxConst, UnsignedMax))
6022+ return true ;
6023+ }
6024+ return false ;
6025+ }
6026+
6027+ void CombinerHelper::applyTruncUSatU (MachineInstr &MI,
6028+ Register &MatchInfo) const {
6029+ Register Dst = MI.getOperand (0 ).getReg ();
6030+ Builder.buildTruncUSatU (Dst, MatchInfo);
6031+ MI.eraseFromParent ();
6032+ }
6033+
6034+ bool CombinerHelper::matchTruncUSatUToFPTOUISat (MachineInstr &MI,
6035+ Register &MatchInfo) const {
6036+ Register Dst = MI.getOperand (0 ).getReg ();
6037+ Register Src = MI.getOperand (1 ).getReg ();
6038+ LLT DstTy = MRI.getType (Dst);
6039+ LLT SrcTy = MRI.getType (Src);
6040+
6041+ if (isLegalOrBeforeLegalizer ({TargetOpcode::G_FPTOUI_SAT, {DstTy, SrcTy}})) {
6042+ if (mi_match (Src, MRI, m_GFPToUI ((m_Reg (MatchInfo)))))
6043+ return true ;
6044+ }
6045+ return false ;
6046+ }
6047+
6048+ void CombinerHelper::applyTruncUSatUToFPTOUISat (MachineInstr &MI,
6049+ Register &MatchInfo) const {
6050+ Register Dst = MI.getOperand (0 ).getReg ();
6051+ Builder.buildFPTOUI_SAT (Dst, MatchInfo);
6052+ MI.eraseFromParent ();
6053+ }
6054+
59276055bool CombinerHelper::matchRedundantNegOperands (MachineInstr &MI,
59286056 BuildFnTy &MatchInfo) const {
59296057 unsigned Opc = MI.getOpcode ();
0 commit comments