[llvm] 00a8cb4 - [RISCV] Move NSRL/NSRA isel to tablegen. NFC (#181096)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 12 07:03:49 PST 2026
Author: Craig Topper
Date: 2026-02-12T07:03:44-08:00
New Revision: 00a8cb4a6be8854408014eeac690b9aaf98cabff
URL: https://github.com/llvm/llvm-project/commit/00a8cb4a6be8854408014eeac690b9aaf98cabff
DIFF: https://github.com/llvm/llvm-project/commit/00a8cb4a6be8854408014eeac690b9aaf98cabff.diff
LOG: [RISCV] Move NSRL/NSRA isel to tablegen. NFC (#181096)
These nodes produce a single result so we can handle them in tablegen.
Assisted-by: claude
Added:
Modified:
llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h
llvm/lib/Target/RISCV/RISCVInstrInfoP.td
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
index b7dfd7e243382..db65d6ac1a5df 100644
--- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
@@ -1791,40 +1791,6 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
CurDAG->RemoveDeadNode(Node);
return;
}
- case RISCVISD::NSRL:
- case RISCVISD::NSRA: {
- assert(Subtarget->hasStdExtP() && !Subtarget->is64Bit() && VT == MVT::i32 &&
- "Unexpected opcode");
-
- bool IsSRA = Node->getOpcode() == RISCVISD::NSRA;
- SDValue Lo = Node->getOperand(0);
- SDValue Hi = Node->getOperand(1);
- SDValue ShAmt = Node->getOperand(2);
-
- SDValue Ops[] = {
- CurDAG->getTargetConstant(RISCV::GPRPairRegClassID, DL, MVT::i32), Lo,
- CurDAG->getTargetConstant(RISCV::sub_gpr_even, DL, MVT::i32), Hi,
- CurDAG->getTargetConstant(RISCV::sub_gpr_odd, DL, MVT::i32)};
- SDValue Pair = SDValue(CurDAG->getMachineNode(TargetOpcode::REG_SEQUENCE,
- DL, MVT::Untyped, Ops),
- 0);
-
- MachineSDNode *Res;
- if (auto *ShAmtC = dyn_cast<ConstantSDNode>(ShAmt)) {
- unsigned Opc = IsSRA ? RISCV::NSRAI : RISCV::NSRLI;
- Res = CurDAG->getMachineNode(
- Opc, DL, MVT::i32, Pair,
- CurDAG->getTargetConstant(*ShAmtC->getConstantIntValue(), DL,
- MVT::i32));
- } else {
- // NSRL/NSRA only read 6 bits of the shift amount.
- selectShiftMask(ShAmt, 64, ShAmt);
- unsigned Opc = IsSRA ? RISCV::NSRA : RISCV::NSRL;
- Res = CurDAG->getMachineNode(Opc, DL, MVT::i32, Pair, ShAmt);
- }
- ReplaceNode(Node, Res);
- return;
- }
case ISD::LOAD: {
if (tryIndexedLoad(Node))
return;
diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h
index 19ee103af1425..eea041fe23432 100644
--- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h
+++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.h
@@ -89,6 +89,9 @@ class RISCVDAGToDAGISel : public SelectionDAGISel {
bool selectShiftMask32(SDValue N, SDValue &ShAmt) {
return selectShiftMask(N, 32, ShAmt);
}
+ bool selectShiftMask64(SDValue N, SDValue &ShAmt) {
+ return selectShiftMask(N, 64, ShAmt);
+ }
bool selectSETCC(SDValue N, ISD::CondCode ExpectedCCVal, SDValue &Val);
bool selectSETNE(SDValue N, SDValue &Val) {
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoP.td b/llvm/lib/Target/RISCV/RISCVInstrInfoP.td
index e39e400f7d369..5d9a52644a38f 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoP.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoP.td
@@ -1504,6 +1504,13 @@ def SDT_RISCVNarrowingShift : SDTypeProfile<1, 3, [SDTCisVT<0, i32>,
def riscv_nsrl : RVSDNode<"NSRL", SDT_RISCVNarrowingShift>;
def riscv_nsra : RVSDNode<"NSRA", SDT_RISCVNarrowingShift>;
+// ComplexPattern for 64-bit shift mask (NSRL/NSRA only read 6 bits).
+def shiftMask64 : ComplexPattern<i32, 1, "selectShiftMask64", [], [], 0>;
+
+// Build a GPRPair from two GPR registers for narrowing shift instructions.
+def BuildGPRPair : OutPatFrag<(ops node:$lo, node:$hi),
+ (REG_SEQUENCE GPRPair, $lo, sub_gpr_even, $hi, sub_gpr_odd)>;
+
// Averaging subtraction, (a - b) >> 2
def riscv_asub : RVSDNode<"ASUB", SDTIntBinOp>;
def riscv_asubu : RVSDNode<"ASUBU", SDTIntBinOp>;
@@ -1726,6 +1733,18 @@ let Predicates = [HasStdExtP, IsRV32] in {
def : PatGprGpr<usubsat, SSUBU>;
def : PatGprGpr<sshlsat, SSHA>;
+ // Narrowing shift patterns (NSRL/NSRA)
+ // Immediate shift amount patterns
+ def : Pat<(i32 (riscv_nsrl GPR:$lo, GPR:$hi, uimm6:$shamt)),
+ (NSRLI (BuildGPRPair GPR:$lo, GPR:$hi), uimm6:$shamt)>;
+ def : Pat<(i32 (riscv_nsra GPR:$lo, GPR:$hi, uimm6:$shamt)),
+ (NSRAI (BuildGPRPair GPR:$lo, GPR:$hi), uimm6:$shamt)>;
+ // Register shift amount patterns
+ def : Pat<(i32 (riscv_nsrl GPR:$lo, GPR:$hi, shiftMask64:$shamt)),
+ (NSRL (BuildGPRPair GPR:$lo, GPR:$hi), shiftMask64:$shamt)>;
+ def : Pat<(i32 (riscv_nsra GPR:$lo, GPR:$hi, shiftMask64:$shamt)),
+ (NSRA (BuildGPRPair GPR:$lo, GPR:$hi), shiftMask64:$shamt)>;
+
// 8/16-bit multiply low patterns
def: Pat<(v4i8 (mul GPR:$rs1, GPR:$rs2)),
(PNSRLI_B (PWMUL_B GPR:$rs1, GPR:$rs2), 0)>;
More information about the llvm-commits
mailing list