@@ -2529,20 +2529,28 @@ static SDValue foldAddSubBoolOfMaskedVal(SDNode *N, SelectionDAG &DAG) {
2529
2529
return DAG.getNode(IsAdd ? ISD::SUB : ISD::ADD, DL, VT, C1, LowBit);
2530
2530
}
2531
2531
2532
- // Attempt to form avgceilu (A, B) from (A | B) - ((A ^ B) >> 1)
2533
- static SDValue combineFixedwidthToAVGCEILU (SDNode *N, SelectionDAG &DAG) {
2532
+ // Attempt to form avgceil (A, B) from (A | B) - ((A ^ B) >> 1)
2533
+ static SDValue combineFixedwidthToAVGCEIL (SDNode *N, SelectionDAG &DAG) {
2534
2534
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
2535
2535
SDValue N0 = N->getOperand(0);
2536
2536
EVT VT = N0.getValueType();
2537
2537
SDLoc DL(N);
2538
+ SDValue A, B;
2539
+
2538
2540
if (TLI.isOperationLegal(ISD::AVGCEILU, VT)) {
2539
- SDValue A, B;
2540
2541
if (sd_match(N, m_Sub(m_Or(m_Value(A), m_Value(B)),
2541
2542
m_Srl(m_Xor(m_Deferred(A), m_Deferred(B)),
2542
2543
m_SpecificInt(1))))) {
2543
2544
return DAG.getNode(ISD::AVGCEILU, DL, VT, A, B);
2544
2545
}
2545
2546
}
2547
+ if (TLI.isOperationLegal(ISD::AVGCEILS, VT)) {
2548
+ if (sd_match(N, m_Sub(m_Or(m_Value(A), m_Value(B)),
2549
+ m_Sra(m_Xor(m_Deferred(A), m_Deferred(B)),
2550
+ m_SpecificInt(1))))) {
2551
+ return DAG.getNode(ISD::AVGCEILS, DL, VT, A, B);
2552
+ }
2553
+ }
2546
2554
return SDValue();
2547
2555
}
2548
2556
@@ -2837,20 +2845,29 @@ SDValue DAGCombiner::visitADDLike(SDNode *N) {
2837
2845
return SDValue();
2838
2846
}
2839
2847
2840
- // Attempt to form avgflooru (A, B) from (A & B) + ((A ^ B) >> 1)
2841
- static SDValue combineFixedwidthToAVGFLOORU (SDNode *N, SelectionDAG &DAG) {
2848
+ // Attempt to form avgfloor (A, B) from (A & B) + ((A ^ B) >> 1)
2849
+ static SDValue combineFixedwidthToAVGFLOOR (SDNode *N, SelectionDAG &DAG) {
2842
2850
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
2843
2851
SDValue N0 = N->getOperand(0);
2844
2852
EVT VT = N0.getValueType();
2845
2853
SDLoc DL(N);
2854
+ SDValue A, B;
2855
+
2846
2856
if (TLI.isOperationLegal(ISD::AVGFLOORU, VT)) {
2847
- SDValue A, B;
2848
2857
if (sd_match(N, m_Add(m_And(m_Value(A), m_Value(B)),
2849
2858
m_Srl(m_Xor(m_Deferred(A), m_Deferred(B)),
2850
2859
m_SpecificInt(1))))) {
2851
2860
return DAG.getNode(ISD::AVGFLOORU, DL, VT, A, B);
2852
2861
}
2853
2862
}
2863
+ if (TLI.isOperationLegal(ISD::AVGFLOORS, VT)) {
2864
+ if (sd_match(N, m_Add(m_And(m_Value(A), m_Value(B)),
2865
+ m_Sra(m_Xor(m_Deferred(A), m_Deferred(B)),
2866
+ m_SpecificInt(1))))) {
2867
+ return DAG.getNode(ISD::AVGFLOORS, DL, VT, A, B);
2868
+ }
2869
+ }
2870
+
2854
2871
return SDValue();
2855
2872
}
2856
2873
@@ -2869,8 +2886,8 @@ SDValue DAGCombiner::visitADD(SDNode *N) {
2869
2886
if (SDValue V = foldAddSubOfSignBit(N, DAG))
2870
2887
return V;
2871
2888
2872
- // Try to match AVGFLOORU fixedwidth pattern
2873
- if (SDValue V = combineFixedwidthToAVGFLOORU (N, DAG))
2889
+ // Try to match AVGFLOOR fixedwidth pattern
2890
+ if (SDValue V = combineFixedwidthToAVGFLOOR (N, DAG))
2874
2891
return V;
2875
2892
2876
2893
// fold (a+b) -> (a|b) iff a and b share no bits.
@@ -3868,8 +3885,8 @@ SDValue DAGCombiner::visitSUB(SDNode *N) {
3868
3885
if (SDValue V = foldAddSubOfSignBit(N, DAG))
3869
3886
return V;
3870
3887
3871
- // Try to match AVGCEILU fixedwidth pattern
3872
- if (SDValue V = combineFixedwidthToAVGCEILU (N, DAG))
3888
+ // Try to match AVGCEIL fixedwidth pattern
3889
+ if (SDValue V = combineFixedwidthToAVGCEIL (N, DAG))
3873
3890
return V;
3874
3891
3875
3892
if (SDValue V = foldAddSubMasked1(false, N0, N1, DAG, SDLoc(N)))
0 commit comments