================ @@ -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) { ---------------- sdesmalen-arm wrote:
Something still needs to happen with the immediate argument when it doesn't fit entirely into the instruction's immediate operand. The current result is not correct. Maybe you can restructure the code in such a way that it first tries to fold as much of the constant into the instruction's immediate operand, and then adds the remainder to the tile-slice and to the pointer (multiplied by SVL), as you do in the code below. https://github.com/llvm/llvm-project/pull/68565 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits