Skip to content

Commit bd06efb

Browse files
committed
[RISCV][NFC] Extract the expandMulToShlAddShlAdd method
1 parent a3d3c29 commit bd06efb

File tree

1 file changed

+30
-32
lines changed

1 file changed

+30
-32
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
1648916517
static 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

Comments
 (0)