@@ -16485,6 +16485,34 @@ static SDValue expandMulToAddOrSubOfShl(SDNode *N, SelectionDAG &DAG,
1648516485 return DAG.getNode(Op, DL, VT, Shift1, Shift2);
1648616486}
1648716487
16488+ static SDValue getShlAddShlAdd(SDNode *N, SelectionDAG &DAG, int ShX, int ShY) {
16489+ SDLoc DL(N);
16490+ EVT VT = N->getValueType(0);
16491+ SDValue X = N->getOperand(0);
16492+ SDValue Mul359 = DAG.getNode(RISCVISD::SHL_ADD, DL, VT, X,
16493+ DAG.getConstant(ShY, DL, VT), X);
16494+ return DAG.getNode(RISCVISD::SHL_ADD, DL, VT, Mul359,
16495+ DAG.getConstant(ShX, DL, VT), Mul359);
16496+ }
16497+
16498+ static SDValue expandMulToShlAddShlAdd(SDNode *N, SelectionDAG &DAG,
16499+ uint64_t MulAmt) {
16500+ switch (MulAmt) {
16501+ case 5 * 3:
16502+ return getShlAddShlAdd(N, DAG, 2, 1);
16503+ case 9 * 3:
16504+ return getShlAddShlAdd(N, DAG, 3, 1);
16505+ case 5 * 5:
16506+ return getShlAddShlAdd(N, DAG, 2, 2);
16507+ case 9 * 5:
16508+ return getShlAddShlAdd(N, DAG, 3, 2);
16509+ case 9 * 9:
16510+ return getShlAddShlAdd(N, DAG, 3, 3);
16511+ default:
16512+ return SDValue();
16513+ }
16514+ }
16515+
1648816516// Try to expand a scalar multiply to a faster sequence.
1648916517static SDValue expandMul(SDNode *N, SelectionDAG &DAG,
1649016518 TargetLowering::DAGCombinerInfo &DCI,
@@ -16542,38 +16570,8 @@ static SDValue expandMul(SDNode *N, SelectionDAG &DAG,
1654216570 }
1654316571
1654416572 // 3/5/9 * 3/5/9 -> shXadd (shYadd X, X), (shYadd X, X)
16545- int ShX;
16546- int ShY;
16547- switch (MulAmt) {
16548- case 3 * 5:
16549- ShY = 1;
16550- ShX = 2;
16551- break;
16552- case 3 * 9:
16553- ShY = 1;
16554- ShX = 3;
16555- break;
16556- case 5 * 5:
16557- ShX = ShY = 2;
16558- break;
16559- case 5 * 9:
16560- ShY = 2;
16561- ShX = 3;
16562- break;
16563- case 9 * 9:
16564- ShX = ShY = 3;
16565- break;
16566- default:
16567- ShX = ShY = 0;
16568- break;
16569- }
16570- if (ShX) {
16571- SDLoc DL(N);
16572- SDValue Mul359 = DAG.getNode(RISCVISD::SHL_ADD, DL, VT, X,
16573- DAG.getConstant(ShY, DL, VT), X);
16574- return DAG.getNode(RISCVISD::SHL_ADD, DL, VT, Mul359,
16575- DAG.getConstant(ShX, DL, VT), Mul359);
16576- }
16573+ if (SDValue V = expandMulToShlAddShlAdd(N, DAG, MulAmt))
16574+ return V;
1657716575
1657816576 // If this is a power 2 + 2/4/8, we can use a shift followed by a single
1657916577 // shXadd. First check if this a sum of two power of 2s because that's
0 commit comments