[llvm] [AArch64] Extend usage of `XAR` instruction for fixed-length operations (PR #139460)
David Green via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 5 04:50:01 PDT 2025
================
@@ -4632,41 +4661,68 @@ bool AArch64DAGToDAGISel::trySelectXAR(SDNode *N) {
SDValue Imm = CurDAG->getTargetConstant(
ShAmt, DL, N0.getOperand(1).getValueType(), false);
- if (ShAmt + HsAmt != 64)
+ unsigned VTSizeInBits = VT.getScalarSizeInBits();
+ if (ShAmt + HsAmt != VTSizeInBits)
return false;
if (!IsXOROperand) {
SDValue Zero = CurDAG->getTargetConstant(0, DL, MVT::i64);
- SDNode *MOV =
- CurDAG->getMachineNode(AArch64::MOVIv2d_ns, DL, MVT::v2i64, Zero);
+ SDNode *MOV = CurDAG->getMachineNode(AArch64::MOVIv2d_ns, DL, SVT, Zero);
SDValue MOVIV = SDValue(MOV, 0);
+
R1 = N1->getOperand(0);
R2 = MOVIV;
}
- // If the input is a v1i64, widen to a v2i64 to use XAR.
- assert((VT == MVT::v1i64 || VT == MVT::v2i64) && "Unexpected XAR type!");
- if (VT == MVT::v1i64) {
- EVT SVT = MVT::v2i64;
+ if (SVT.isScalableVector()) {
+ SDValue Undef =
+ SDValue(CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF, DL, SVT), 0);
+ SDValue ZSub = CurDAG->getTargetConstant(AArch64::zsub, DL, MVT::i32);
+
+ R1 = SDValue(CurDAG->getMachineNode(AArch64::INSERT_SUBREG, DL, SVT, Undef,
+ R1, ZSub),
+ 0);
+ R2 = SDValue(CurDAG->getMachineNode(AArch64::INSERT_SUBREG, DL, SVT, Undef,
+ R2, ZSub),
+ 0);
+ }
+
+ if (!SVT.isScalableVector() && SVT != VT) {
----------------
davemgreen wrote:
You might be able to fold this block with the `if (SVT.isScalableVector())` one above if the zsub/dsub was chosen conditionally.
https://github.com/llvm/llvm-project/pull/139460
More information about the llvm-commits
mailing list