aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib
diff options
context:
space:
mode:
authorDavid Green <david.green@arm.com>2021-01-27 10:38:32 +0000
committerDavid Green <david.green@arm.com>2021-01-27 10:38:32 +0000
commit0175cd00a1af35aa90e49bf008a0d4d4cbc7fb89 (patch)
treea2efb5ff08776a00da2d86617f8b06ce6e78164b /llvm/lib
parent9a75a808c27f2d7a3ef4880be5f3febc97d5dcd2 (diff)
downloadllvm-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.cpp16
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, [&LT](MVT M) { return M == LT.second; }))
+ return LT.first * Instrs;
+ break;
+ }
default:
break;
}