[llvm] [AArch64] Extend usage of `XAR` instruction for fixed-length operations (PR #139460)
Rajveer Singh Bharadwaj via llvm-commits
llvm-commits at lists.llvm.org
Sun May 11 10:04:28 PDT 2025
https://github.com/Rajveer100 created https://github.com/llvm/llvm-project/pull/139460
Resolves #139229
In #137162, support for `v2i64` was implemented for vector rotate transformation, although types like `v4i32`, `v8i16` and `v16i8` do not have Neon SHA3, we can use SVE operations if sve2-sha3 is available.
>From 5f458a2f887df7ff068588b111a61526406fe190 Mon Sep 17 00:00:00 2001
From: Rajveer <rajveer.developer at icloud.com>
Date: Sun, 11 May 2025 22:27:50 +0530
Subject: [PATCH] [AArch64] Extend usage of `XAR` instruction for fixed-length
operations
Resolves #139229
In #137162, support for `v2i64` was implemented for vector rotate
transformation, although types like `v4i32`, `v8i16` and `v16i8`
do not have Neon SHA3, we can use SVE operations if sve2-sha3
is available.
---
.../Target/AArch64/AArch64ISelDAGToDAG.cpp | 24 +++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp b/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
index 96fa85179d023..bb059928e33a3 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp
@@ -4632,18 +4632,38 @@ bool AArch64DAGToDAGISel::trySelectXAR(SDNode *N) {
SDValue Imm = CurDAG->getTargetConstant(
ShAmt, DL, N0.getOperand(1).getValueType(), false);
- if (ShAmt + HsAmt != 64)
+ if (ShAmt + HsAmt != VT.getScalarSizeInBits())
return false;
+ bool UseSVE2Instr = false;
if (!IsXOROperand) {
+ if (VT.getVectorElementType() != MVT::i64 && Subtarget->hasSVE2())
+ UseSVE2Instr = true;
+
SDValue Zero = CurDAG->getTargetConstant(0, DL, MVT::i64);
SDNode *MOV = CurDAG->getMachineNode(AArch64::MOVIv2d_ns, DL, VT, Zero);
SDValue MOVIV = SDValue(MOV, 0);
+
R1 = N1->getOperand(0);
- R2 = MOVIV;
+ if (UseSVE2Instr) {
+ SDValue ZSub = CurDAG->getTargetConstant(AArch64::zsub, DL, MVT::i32);
+ SDNode *SubRegToReg = CurDAG->getMachineNode(AArch64::SUBREG_TO_REG, DL,
+ VT, Zero, MOVIV, ZSub);
+ R2 = SDValue(SubRegToReg, 0);
+ } else {
+ R2 = MOVIV;
+ }
}
SDValue Ops[] = {R1, R2, Imm};
+ if (UseSVE2Instr) {
+ if (auto Opc = SelectOpcodeFromVT<SelectTypeKind::Int>(
+ VT, {AArch64::XAR_ZZZI_B, AArch64::XAR_ZZZI_H, AArch64::XAR_ZZZI_S,
+ AArch64::XAR_ZZZI_D})) {
+ CurDAG->SelectNodeTo(N, Opc, VT, Ops);
+ return true;
+ }
+ }
CurDAG->SelectNodeTo(N, AArch64::XAR, N0.getValueType(), Ops);
return true;
More information about the llvm-commits
mailing list