[llvm] [X86] i512 shift expansion on AVX512 targets (PR #180432)

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 17 01:59:47 PST 2026


================
@@ -34354,6 +34333,83 @@ void X86TargetLowering::ReplaceNodeResults(SDNode *N,
     Results.push_back(DAG.getBitcast(VT, Res));
     return;
   }
+  case ISD::SRA:
+  case ISD::SRL:
+  case ISD::SHL: {
+    SDValue ShiftVal = N->getOperand(0);
+    SDValue ShiftAmt = N->getOperand(1);
+    SDLoc DL(N);
+    EVT VT = N->getValueType(0);
+    assert(VT == MVT::i512 && "Unexpected VT!");
+    assert(Subtarget.useAVX512Regs() && "AVX512 required");
+
+    EVT VecVT = MVT::v8i64;
+    SDValue ShiftValVec = DAG.getBitcast(VecVT, ShiftVal);
+    SDValue ShiftAmtExt = DAG.getZExtOrTrunc(ShiftAmt, DL, MVT::i32);
+
+    // Complete Lanes to shift
+    SDValue LaneShift = DAG.getNode(ISD::SRL, DL, MVT::i32, ShiftAmtExt,
+                                    DAG.getConstant(6, DL, MVT::i32));
+
+    // Remaining bits to shift
+    SDValue BitShift = DAG.getNode(ISD::UREM, DL, MVT::i32, ShiftAmtExt,
+                                   DAG.getConstant(64, DL, MVT::i32));
+
+    SDValue BitShift64 = DAG.getZExtOrTrunc(BitShift, DL, MVT::i64);
+    SDValue BitShiftV = DAG.getSplatBuildVector(VecVT, DL, BitShift64);
+
+    SDValue MaskShift =
+        DAG.getNode(ISD::SHL, DL, MVT::i8, DAG.getConstant(0xFF, DL, MVT::i8),
+                    DAG.getZExtOrTrunc(LaneShift, DL, MVT::i8));
+
+    SDValue ZeroV = DAG.getConstant(0, DL, VecVT);
+
+    SDValue Lo, Hi, Res;
+    bool IsShiftLeft = Opc == ISD::SHL;
+
+    switch (Opc) {
+    case ISD::SHL: {
+      Lo =
+          DAG.getNode(X86ISD::EXPAND, DL, VecVT, ShiftValVec, MaskShift, ZeroV);
+
+      Hi = DAG.getNode(X86ISD::PALIGNR, DL, VecVT, Lo, ZeroV,
+                       DAG.getConstant(7 * 8, DL, MVT::i8));
+      break;
+    }
+    case ISD::SRL: {
+      Hi = DAG.getNode(X86ISD::COMPRESS, DL, VecVT, ShiftValVec, MaskShift,
----------------
RKSimon wrote:

The argument order is CmpVec, PassThru, MaskPredicate

https://github.com/llvm/llvm-project/pull/180432


More information about the llvm-commits mailing list