[llvm] [GlobalISel][AArch64] Combine Vector Reduction Add Long (PR #76241)
David Green via llvm-commits
llvm-commits at lists.llvm.org
Fri Jan 19 04:52:33 PST 2024
================
@@ -1445,6 +1445,58 @@ bool AArch64LegalizerInfo::legalizeIntrinsic(LegalizerHelper &Helper,
return true;
}
+ case Intrinsic::aarch64_neon_uaddlp:
+ case Intrinsic::aarch64_neon_saddlp: {
+ MachineIRBuilder MIB(MI);
+ MachineRegisterInfo &MRI = *MIB.getMRI();
+
+ unsigned Opc = IntrinsicID == Intrinsic::aarch64_neon_uaddlp
+ ? AArch64::G_UADDLP
+ : AArch64::G_SADDLP;
+ MIB.buildInstr(Opc, {MI.getOperand(0)}, {MI.getOperand(2)});
+ MI.eraseFromParent();
+
+ return true;
+ }
+ case Intrinsic::aarch64_neon_uaddlv:
+ case Intrinsic::aarch64_neon_saddlv: {
+ MachineIRBuilder MIB(MI);
+ MachineRegisterInfo &MRI = *MIB.getMRI();
+
+ unsigned Opc = IntrinsicID == Intrinsic::aarch64_neon_uaddlv
+ ? AArch64::G_UADDLV
+ : AArch64::G_SADDLV;
+ Register DstReg = MI.getOperand(0).getReg();
+ Register SrcReg = MI.getOperand(2).getReg();
+ LLT DstTy = MRI.getType(DstReg);
+
+ LLT MidTy, ExtTy;
+ if (DstTy.isScalar() && DstTy.getScalarSizeInBits() <= 32) {
+ MidTy = LLT::fixed_vector(4, 32);
+ ExtTy = LLT::scalar(32);
+ } else {
+ MidTy = LLT::fixed_vector(2, 64);
+ ExtTy = LLT::scalar(64);
+ }
+
+ Register MidReg =
+ MIB.buildInstr(Opc, {MidTy}, {SrcReg})->getOperand(0).getReg();
+ Register ZeroReg =
+ MIB.buildConstant(LLT::scalar(64), 0)->getOperand(0).getReg();
+ Register ExtReg = MIB.buildInstr(AArch64::G_EXTRACT_VECTOR_ELT, {ExtTy},
+ {MidReg, ZeroReg})
+ ->getOperand(0)
----------------
davemgreen wrote:
.getReg(0);
https://github.com/llvm/llvm-project/pull/76241
More information about the llvm-commits
mailing list