[llvm] [AArch64][Isel] Add lowering for fixed-width interleave3 (PR #192677)
Paul Walker via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 17 09:08:04 PDT 2026
================
@@ -32292,6 +32260,32 @@ SDValue AArch64TargetLowering::LowerVECTOR_INTERLEAVE(SDValue Op,
SDLoc DL(Op);
EVT OpVT = Op.getValueType();
+ if (OpVT.isFixedLengthVector() && Op->getNumOperands() == 3) {
+ Align Alignment = DAG.getReducedAlign(OpVT, /*UseABI=*/false);
+ SDValue StackPtr =
+ DAG.CreateStackTemporary(OpVT.getStoreSize() * 3, Alignment);
+
+ SmallVector<SDValue, 6> Ops;
+ Ops.push_back(DAG.getEntryNode());
+ Ops.push_back(
+ DAG.getTargetConstant(Intrinsic::aarch64_neon_st3, DL, MVT::i64));
+ for (SDValue V : Op->ops())
+ Ops.push_back(V);
+ Ops.push_back(StackPtr);
+
+ SDValue Chain = DAG.getMemIntrinsicNode(
+ ISD::INTRINSIC_VOID, DL, DAG.getVTList(MVT::Other), Ops, OpVT,
+ MachinePointerInfo(), Alignment, MachineMemOperand::MOStore);
+
+ SmallVector<SDValue, 3> Results;
+ for (unsigned I = 0; I < 3; ++I) {
+ SDValue Ptr =
+ DAG.getMemBasePlusOffset(StackPtr, OpVT.getStoreSize() * I, DL);
+ Results.push_back(
+ DAG.getLoad(OpVT, DL, Chain, Ptr, MachinePointerInfo()));
+ }
+ return DAG.getMergeValues(Results, DL);
+ }
----------------
paulwalker-arm wrote:
nit: newline please
https://github.com/llvm/llvm-project/pull/192677
More information about the llvm-commits
mailing list