473 PatternRewriter &rewriter)
const override {
475 if (comb::shouldUseBoothEncoding(op.getLhs(), op.getRhs()))
478 auto inputWidth = op.getLhs().getType().getIntOrFloatBitWidth();
481 if (!matchPattern(op.getLhs(), comb::m_SextBy(m_Any(&lhsReplBits))) ||
482 !matchPattern(op.getRhs(), comb::m_SextBy(m_Any(&rhsReplBits))))
486 inputWidth - lhsReplBits.getType().getIntOrFloatBitWidth();
488 inputWidth - rhsReplBits.getType().getIntOrFloatBitWidth();
490 size_t maxRows = std::max(lhsWidth, rhsWidth) - 1;
494 if (lhsWidth != rhsWidth || lhsWidth <= 1 || rhsWidth <= 1)
498 if (maxRows >= op.getNumResults())
502 auto lhsBaseWidth = lhsWidth - 1;
503 auto rhsBaseWidth = rhsWidth - 1;
505 op.getLhs(), lhsBaseWidth, 1);
507 op.getRhs(), rhsBaseWidth, 1);
515 comb::createZExt(rewriter, op.getLoc(), lhsBase, inputWidth);
517 comb::createZExt(rewriter, op.getLoc(), rhsBase, inputWidth);
518 auto newPP = datapath::PartialProductOp::create(
519 rewriter, op.getLoc(), ValueRange{lhsBaseZext, rhsBaseZext}, maxRows);
528 auto lhsSignReplicate = comb::ReplicateOp::create(rewriter, op.getLoc(),
529 lhsSignBit, rhsBaseWidth);
531 comb::AndOp::create(rewriter, op.getLoc(), lhsSignReplicate, rhsBase);
532 auto lhsSignCorrection =
533 comb::createOrFoldNot(rewriter, op.getLoc(), lhsSignAndRhs,
true);
536 auto alignLhsSignCorrection =
zeroPad(
537 rewriter, op.getLoc(), lhsSignCorrection, inputWidth, lhsBaseWidth);
540 auto rhsSignReplicate = comb::ReplicateOp::create(rewriter, op.getLoc(),
541 rhsSignBit, lhsBaseWidth);
543 comb::AndOp::create(rewriter, op.getLoc(), rhsSignReplicate, lhsBase);
544 auto rhsSignCorrection =
545 comb::createOrFoldNot(rewriter, op.getLoc(), rhsSignAndLhs,
true);
548 auto alignRhsSignCorrection =
zeroPad(
549 rewriter, op.getLoc(), rhsSignCorrection, inputWidth, rhsBaseWidth);
554 comb::AndOp::create(rewriter, op.getLoc(), lhsSignBit, rhsSignBit);
556 auto alignSignAndZext =
zeroPad(rewriter, op.getLoc(), signAnd, inputWidth,
557 lhsBaseWidth + rhsBaseWidth);
561 auto ones = APInt::getAllOnes(inputWidth);
562 auto lowerLhs = APInt::getOneBitSet(inputWidth, lhsBaseWidth);
563 auto lowerRhs = APInt::getOneBitSet(inputWidth, rhsBaseWidth);
564 auto msbCorrection = ones << (lhsBaseWidth + rhsBaseWidth);
565 auto correction = lowerLhs + lowerRhs + 2 * msbCorrection;
567 auto constantCorrection =
571 APInt::getZero(inputWidth));
573 SmallVector<Value> newResults(newPP.getResults().begin(),
574 newPP.getResults().end());
577 newResults.push_back(alignLhsSignCorrection);
579 newResults.push_back(alignRhsSignCorrection);
581 newResults.push_back(alignSignAndZext);
583 newResults.push_back(constantCorrection);
585 newResults.append(op.getNumResults() - newResults.size(), zero);
587 rewriter.replaceOp(op, newResults);