[llvm] [AArch64][GlobalISel] Improve lowering of vector fp16 fptrunc (PR #163398)
David Green via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 27 06:49:05 PST 2025
================
@@ -2416,3 +2430,81 @@ bool AArch64LegalizerInfo::legalizePrefetch(MachineInstr &MI,
MI.eraseFromParent();
return true;
}
+
+bool AArch64LegalizerInfo::legalizeFptrunc(MachineInstr &MI,
+ MachineIRBuilder &MIRBuilder,
+ MachineRegisterInfo &MRI) const {
+ auto [Dst, DstTy, Src, SrcTy] = MI.getFirst2RegLLTs();
+ assert(SrcTy.isFixedVector() && isPowerOf2_32(SrcTy.getNumElements()) &&
+ "Expected a power of 2 elements");
+
+ LLT s16 = LLT::scalar(16);
+ LLT s32 = LLT::scalar(32);
+ LLT s64 = LLT::scalar(64);
+ LLT v2s16 = LLT::fixed_vector(2, s16);
+ LLT v4s16 = LLT::fixed_vector(4, s16);
+ LLT v2s32 = LLT::fixed_vector(2, s32);
+ LLT v4s32 = LLT::fixed_vector(4, s32);
+ LLT v2s64 = LLT::fixed_vector(2, s64);
+
+ SmallVector<Register> RegsToUnmergeTo;
+ SmallVector<Register> TruncOddDstRegs;
+ SmallVector<Register> RegsToMerge;
+
+ unsigned ElemCount = SrcTy.getNumElements();
+
+ // Find the biggest size chunks we can work with
+ int StepSize = ElemCount % 4 ? 2 : 4;
+
+ // If we have a power of 2 greater than 2, we need to first unmerge into
+ // enough pieces
+ if (ElemCount <= 2)
+ RegsToUnmergeTo.push_back(Src);
+ else {
+ for (unsigned i = 0; i < ElemCount / 2; ++i) {
----------------
davemgreen wrote:
Can remove {} brackets.
https://github.com/llvm/llvm-project/pull/163398
More information about the llvm-commits
mailing list