@@ -519,7 +519,8 @@ MipsTargetLowering::MipsTargetLowering(const MipsTargetMachine &TM,
519519 setOperationAction (ISD::TRAP, MVT::Other, Legal);
520520
521521 setTargetDAGCombine ({ISD::SDIVREM, ISD::UDIVREM, ISD::SELECT, ISD::AND,
522- ISD::OR, ISD::ADD, ISD::SUB, ISD::AssertZext, ISD::SHL});
522+ ISD::OR, ISD::ADD, ISD::SUB, ISD::AssertZext, ISD::SHL,
523+ ISD::SIGN_EXTEND});
523524
524525 if (Subtarget.isGP64bit ())
525526 setMaxAtomicSizeInBitsSupported (64 );
@@ -1213,6 +1214,30 @@ static SDValue performSHLCombine(SDNode *N, SelectionDAG &DAG,
12131214 DAG.getConstant (SMSize, DL, MVT::i32 ));
12141215}
12151216
1217+ static SDValue performSignExtendCombine (SDNode *N, SelectionDAG &DAG,
1218+ TargetLowering::DAGCombinerInfo &DCI,
1219+ const MipsSubtarget &Subtarget) {
1220+ SDValue N0 = N->getOperand (0 );
1221+ EVT VT = N->getValueType (0 );
1222+
1223+ // $dst = sign_extend (xor (trunc $src), imm)
1224+ // => $dst = sign_extend (trunc (xor $src, imm))
1225+ if (N0.getOpcode () == ISD::XOR &&
1226+ N0.getOperand (0 ).getOpcode () == ISD::TRUNCATE &&
1227+ N0.getOperand (1 ).getOpcode () == ISD::Constant) {
1228+ SDValue TruncateOperand = N0.getOperand (0 ).getOperand (0 );
1229+ APInt Mask = N0.getConstantOperandAPInt (1 ).zext (VT.getSizeInBits ());
1230+
1231+ SDValue Xor = DAG.getNode (ISD::XOR, SDLoc (N), VT, TruncateOperand,
1232+ DAG.getTargetConstant (Mask, SDLoc (N), VT));
1233+ SDValue Truncate =
1234+ DAG.getNode (ISD::TRUNCATE, SDLoc (N), N0->getValueType (0 ), Xor);
1235+ return DAG.getNode (ISD::SIGN_EXTEND, SDLoc (N), VT, Truncate);
1236+ }
1237+
1238+ return SDValue ();
1239+ }
1240+
12161241SDValue MipsTargetLowering::PerformDAGCombine (SDNode *N, DAGCombinerInfo &DCI)
12171242 const {
12181243 SelectionDAG &DAG = DCI.DAG ;
@@ -1238,6 +1263,8 @@ SDValue MipsTargetLowering::PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI)
12381263 return performSHLCombine (N, DAG, DCI, Subtarget);
12391264 case ISD::SUB:
12401265 return performSUBCombine (N, DAG, DCI, Subtarget);
1266+ case ISD::SIGN_EXTEND:
1267+ return performSignExtendCombine (N, DAG, DCI, Subtarget);
12411268 }
12421269
12431270 return SDValue ();
0 commit comments