[llvm] [RISCV] Expand constant multiplication for targets without M extension (PR #137195)
Max Graey via llvm-commits
llvm-commits at lists.llvm.org
Sat Apr 26 07:33:08 PDT 2025
================
@@ -15436,6 +15439,140 @@ static SDValue performXORCombine(SDNode *N, SelectionDAG &DAG,
return combineSelectAndUseCommutative(N, DAG, /*AllOnes*/ false, Subtarget);
}
+static SDValue expandMulToNAFSequence(SDNode *N, SelectionDAG &DAG,
+ const SDLoc &DL, uint64_t MulAmt) {
+ EVT VT = N->getValueType(0);
+ const uint64_t BitWidth = VT.getFixedSizeInBits();
+
+ // Find the Non-adjacent form of the multiplier.
+ llvm::SmallVector<std::pair<bool, uint64_t>> Sequence; // {isAdd, shamt}
+ uint64_t E = MulAmt;
+ uint64_t I = 0;
+ while (E > 0) {
+ if (E & 1) {
+ if (I >= BitWidth)
+ break;
+ int8_t Z = ((E & 3) == 1) ? 1 : -1;
+ Sequence.push_back({(Z == 1), I});
+ E -= Z;
+ }
+ E >>= 1;
+ I++;
+ }
----------------
MaxGraey wrote:
How about to simplify this a little:
```suggestion
llvm::SmallVector<std::pair<bool, uint64_t>> Sequence;
for (auto E = MulAmt, I = 0; E && I < BitWidth; ++I, E >>= 1) {
if (E & 1) {
bool isAdd = (E & 3) == 1;
Sequence.push_back({isAdd, I});
E -= isAdd ? 1 : -1;
}
}
```
https://github.com/llvm/llvm-project/pull/137195
More information about the llvm-commits
mailing list