[libc-commits] [libc] [llvm] [llvm] Add KnownBits implementations for avgFloor and avgCeil (PR #86445)
Jay Foad via libc-commits
libc-commits at lists.llvm.org
Fri May 17 06:57:08 PDT 2024
================
@@ -774,6 +774,32 @@ KnownBits KnownBits::usub_sat(const KnownBits &LHS, const KnownBits &RHS) {
return computeForSatAddSub(/*Add*/ false, /*Signed*/ false, LHS, RHS);
}
+static KnownBits avgCompute(KnownBits LHS, KnownBits RHS, bool IsCeil,
+ bool IsSigned) {
+ unsigned BitWidth = LHS.getBitWidth();
+ LHS = IsSigned ? LHS.sext(BitWidth + 1) : LHS.zext(BitWidth + 1);
+ RHS = IsSigned ? RHS.sext(BitWidth + 1) : RHS.zext(BitWidth + 1);
+ KnownBits Carry = KnownBits::makeConstant(APInt(1, IsCeil ? 1 : 0));
+ LHS = KnownBits::computeForAddCarry(LHS, RHS, Carry);
+ LHS = LHS.extractBits(BitWidth, 1);
+ return LHS;
+}
+
+KnownBits KnownBits::avgFloorS(const KnownBits &LHS, const KnownBits &RHS) {
+ return avgCompute(LHS, RHS, /* IsCeil */ false,
+ /* IsSigned */ true);
+}
+
+KnownBits KnownBits::avgFloorU(const KnownBits &LHS, const KnownBits &RHS) {
+ return avgCompute(LHS, RHS, /* IsCeil */ false,
+ /* IsSigned */ false);
+}
+
+KnownBits KnownBits::avgCeilS(const KnownBits &LHS, const KnownBits &RHS) {
+ return avgCompute(LHS, RHS, /* IsCeil */ true,
+ /* IsSigned */ true);
+}
+
----------------
jayfoad wrote:
Patch is missing `KnownBits::avgCeilU` now?
https://github.com/llvm/llvm-project/pull/86445
More information about the libc-commits
mailing list