[llvm] use multiplication with holes for 32-bit/64-bit clmul fallback (PR #203727)
Ramkumar Ramachandra via llvm-commits
llvm-commits at lists.llvm.org
Sat Jun 13 15:16:57 PDT 2026
================
@@ -8899,6 +8899,57 @@ SDValue TargetLowering::expandCLMUL(SDNode *Node, SelectionDAG &DAG) const {
// calculation in BasicTTIImpl::getTypeBasedIntrinsicInstrCost for
// Intrinsic::clmul.
+ // Strategy 4: multiplication with holes.
+ //
+ // Uses "holes" (sequences of zeroes) to avoid carry spilling. When carries
+ // do occur, they wind up in a "hole" and are subsequently masked out of the
+ // result.
+ //
+ // A hole of 3 bits is optimal for 32-bit and 64-bit inputs. 128-bit
+ // integers need a larger hole, and for smaller integers the fallback below
+ // is more efficient.
+ //
+ // Based on bmul64 in bearssl and bmul in the rust polyval crate.
+ if (BW >= 32 && BW <= 64 &&
+ isOperationLegalOrCustom(ISD::MUL, getTypeToTransformTo(Ctx, VT))) {
+
+ // Set every fourth bit of each nibble, equivalent to 0b100010001...0001.
+ APInt MaskVal(BW, 0);
+ for (unsigned i = 0; i < BW; i += 4)
+ MaskVal.setBit(i);
+
+ // Create versions of X and Y that keep only the first, second, third, or
+ // fourth bit of every nibble.
+ SDValue M[4], Xp[4], Yp[4];
+ for (unsigned i = 0; i < 4; ++i) {
----------------
artagnon wrote:
```suggestion
for (unsigned I = 0; I < 4; ++I) {
```
to avoid unnecessary clang-tidy lint errors.
https://github.com/llvm/llvm-project/pull/203727
More information about the llvm-commits
mailing list