[llvm] [RISCV][TTI] Split costing of [u/s]int_to_fp from fp_to_[u/s]int [nfc] (PR #101029)
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 29 08:25:20 PDT 2024
https://github.com/preames created https://github.com/llvm/llvm-project/pull/101029
The amount of code sharing between them is fairly small, and the split version is much easier to read.
>From f7d90ec2e9deb0e8a8b7957b41fa9cba14004bc0 Mon Sep 17 00:00:00 2001
From: Philip Reames <preames at rivosinc.com>
Date: Mon, 29 Jul 2024 08:21:33 -0700
Subject: [PATCH] [RISCV][TTI] Split costing of *int_to_fp from fp_to_*int
[nfc]
The amount of code sharing between them is fairly small, and the
split version is much easier to read.
---
.../Target/RISCV/RISCVTargetTransformInfo.cpp | 37 ++++++++++---------
1 file changed, 20 insertions(+), 17 deletions(-)
diff --git a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
index 0fcaac060569c..a61a9f10be86c 100644
--- a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
+++ b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp
@@ -1100,30 +1100,33 @@ InstructionCost RISCVTTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst,
}
case ISD::FP_TO_SINT:
case ISD::FP_TO_UINT:
+ // For fp vector to mask, we use:
+ // vfncvt.rtz.x.f.w v9, v8
+ // vand.vi v8, v9, 1
+ // vmsne.vi v0, v8, 0
+ if (Dst->getScalarSizeInBits() == 1)
+ return 3;
+
+ if (std::abs(PowDiff) <= 1)
+ return 1;
+
+ // Counts of narrow/widen instructions.
+ return std::abs(PowDiff);
+
case ISD::SINT_TO_FP:
case ISD::UINT_TO_FP:
- if (Src->getScalarSizeInBits() == 1 || Dst->getScalarSizeInBits() == 1) {
- // The cost of convert from or to mask vector is different from other
- // cases. We could not use PowDiff to calculate it.
- // For mask vector to fp, we should use the following instructions:
- // vmv.v.i v8, 0
- // vmerge.vim v8, v8, -1, v0
- // vfcvt.f.x.v v8, v8
-
- // And for fp vector to mask, we use:
- // vfncvt.rtz.x.f.w v9, v8
- // vand.vi v8, v9, 1
- // vmsne.vi v0, v8, 0
+ // For mask vector to fp, we should use the following instructions:
+ // vmv.v.i v8, 0
+ // vmerge.vim v8, v8, -1, v0
+ // vfcvt.f.x.v v8, v8
+ if (Src->getScalarSizeInBits() == 1)
return 3;
- }
+
if (std::abs(PowDiff) <= 1)
return 1;
// Backend could lower (v[sz]ext i8 to double) to vfcvt(v[sz]ext.f8 i8),
// so it only need two conversion.
- if (Src->isIntOrIntVectorTy())
- return 2;
- // Counts of narrow/widen instructions.
- return std::abs(PowDiff);
+ return 2;
}
return BaseT::getCastInstrCost(Opcode, Dst, Src, CCH, CostKind, I);
}
More information about the llvm-commits
mailing list