diff options
author | David Green <david.green@arm.com> | 2021-01-27 10:38:32 +0000 |
---|---|---|
committer | David Green <david.green@arm.com> | 2021-01-27 10:38:32 +0000 |
commit | 0175cd00a1af35aa90e49bf008a0d4d4cbc7fb89 (patch) | |
tree | a2efb5ff08776a00da2d86617f8b06ce6e78164b /llvm/lib | |
parent | 9a75a808c27f2d7a3ef4880be5f3febc97d5dcd2 (diff) | |
download | llvm-0175cd00a1af35aa90e49bf008a0d4d4cbc7fb89.zip llvm-0175cd00a1af35aa90e49bf008a0d4d4cbc7fb89.tar.gz llvm-0175cd00a1af35aa90e49bf008a0d4d4cbc7fb89.tar.bz2 |
[AArch64] Add vector saturating add intrinsic costs
This adds sadd.sat, uadd.sat, ssub.sat and usub.sat costs for AArch64,
similar to how they were recently added for ARM.
Differential Revision: https://reviews.llvm.org/D95292
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp index 7fda6b8..dc62fa4 100644 --- a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp @@ -235,6 +235,22 @@ AArch64TTIImpl::getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, return LT.first; break; } + case Intrinsic::sadd_sat: + case Intrinsic::ssub_sat: + case Intrinsic::uadd_sat: + case Intrinsic::usub_sat: { + static const auto ValidSatTys = {MVT::v8i8, MVT::v16i8, MVT::v4i16, + MVT::v8i16, MVT::v2i32, MVT::v4i32, + MVT::v2i64}; + auto LT = TLI->getTypeLegalizationCost(DL, RetTy); + // This is a base cost of 1 for the vadd, plus 3 extract shifts if we + // need to extend the type, as it uses shr(qadd(shl, shl)). + unsigned Instrs = + LT.second.getScalarSizeInBits() == RetTy->getScalarSizeInBits() ? 1 : 4; + if (any_of(ValidSatTys, [<](MVT M) { return M == LT.second; })) + return LT.first * Instrs; + break; + } default: break; } |