[clang] [llvm] [AArch64][SME] Remove immediate argument restriction for svldr and svstr (PR #68565)

Sam Tebbs via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 31 09:38:52 PDT 2023


================
@@ -1741,6 +1742,54 @@ void AArch64DAGToDAGISel::SelectCVTIntrinsic(SDNode *N, unsigned NumVecs,
   CurDAG->RemoveDeadNode(N);
 }
 
+void AArch64DAGToDAGISel::SelectSMELdrStrZA(SDNode *N, bool IsLoad) {
+  // Lower an SME LDR/STR ZA intrinsic to LDR_ZA_PSEUDO or STR_ZA.
+  // If the vector select parameter is an immediate in the range 0-15 then we
+  // can emit it directly into the instruction as it's a legal operand.
+  // Otherwise we must emit 0 as the vector select operand and modify the base
+  // register instead.
+  SDLoc DL(N);
+
+  SDValue VecNum = N->getOperand(4), Base = N->getOperand(3),
+          TileSlice = N->getOperand(2);
+  int Imm = -1;
+  if (auto ImmNode = dyn_cast<ConstantSDNode>(VecNum))
+    Imm = ImmNode->getZExtValue();
+
+  if (Imm >= 0 && Imm <= 15) {
----------------
SamTebbs33 wrote:

We had an offline discussion and agreed that when the vnum is an immediate but is greater than a multiple of 15, it makes sense to modify the base and slice registers by that multiple and put the remainder in the immediate field of the instruction. That way when we unroll a loop with lots of ldrs offset by one from each other, they can all share the base and slice modifications but have increasing immediates.

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


More information about the llvm-commits mailing list