Lines Matching refs:LHS

22     const KnownBits &LHS, const KnownBits &RHS,  in computeForAddCarry()  argument
27 APInt PossibleSumZero = LHS.getMaxValue() + RHS.getMaxValue() + !CarryZero; in computeForAddCarry()
28 APInt PossibleSumOne = LHS.getMinValue() + RHS.getMinValue() + CarryOne; in computeForAddCarry()
31 APInt CarryKnownZero = ~(PossibleSumZero ^ LHS.Zero ^ RHS.Zero); in computeForAddCarry()
32 APInt CarryKnownOne = PossibleSumOne ^ LHS.One ^ RHS.One; in computeForAddCarry()
35 APInt LHSKnownUnion = LHS.Zero | LHS.One; in computeForAddCarry()
51 const KnownBits &LHS, const KnownBits &RHS, const KnownBits &Carry) { in computeForAddCarry() argument
54 LHS, RHS, Carry.Zero.getBoolValue(), Carry.One.getBoolValue()); in computeForAddCarry()
58 const KnownBits &LHS, KnownBits RHS) { in computeForAddSub() argument
63 LHS, RHS, /*CarryZero*/true, /*CarryOne*/false); in computeForAddSub()
68 LHS, RHS, /*CarryZero*/false, /*CarryOne*/true); in computeForAddSub()
76 if (LHS.isNonNegative() && RHS.isNonNegative()) in computeForAddSub()
80 else if (LHS.isNegative() && RHS.isNegative()) in computeForAddSub()
88 KnownBits KnownBits::computeForSubBorrow(const KnownBits &LHS, KnownBits RHS, in computeForSubBorrow() argument
95 return ::computeForAddCarry(LHS, RHS, in computeForSubBorrow()
129 KnownBits KnownBits::umax(const KnownBits &LHS, const KnownBits &RHS) { in umax() argument
134 if (LHS.getMinValue().uge(RHS.getMaxValue())) in umax()
135 return LHS; in umax()
136 if (RHS.getMinValue().uge(LHS.getMaxValue())) in umax()
142 KnownBits L = LHS.makeGE(RHS.getMinValue()); in umax()
143 KnownBits R = RHS.makeGE(LHS.getMinValue()); in umax()
147 KnownBits KnownBits::umin(const KnownBits &LHS, const KnownBits &RHS) { in umin() argument
150 return Flip(umax(Flip(LHS), Flip(RHS))); in umin()
153 KnownBits KnownBits::smax(const KnownBits &LHS, const KnownBits &RHS) { in smax() argument
163 return Flip(umax(Flip(LHS), Flip(RHS))); in smax()
166 KnownBits KnownBits::smin(const KnownBits &LHS, const KnownBits &RHS) { in smin() argument
176 return Flip(umax(Flip(LHS), Flip(RHS))); in smin()
186 KnownBits KnownBits::shl(const KnownBits &LHS, const KnownBits &RHS, bool NUW, in shl() argument
188 unsigned BitWidth = LHS.getBitWidth(); in shl()
189 auto ShiftByConst = [&](const KnownBits &LHS, unsigned ShiftAmt) { in shl() argument
192 Known.Zero = LHS.Zero.ushl_ov(ShiftAmt, ShiftedOutZero); in shl()
194 Known.One = LHS.One.ushl_ov(ShiftAmt, ShiftedOutOne); in shl()
215 if (LHS.isUnknown()) { in shl()
226 MaxShiftAmount = std::min(MaxShiftAmount, LHS.countMaxLeadingZeros() - 1); in shl()
228 MaxShiftAmount = std::min(MaxShiftAmount, LHS.countMaxLeadingZeros()); in shl()
232 std::max(LHS.countMaxLeadingZeros(), LHS.countMaxLeadingOnes()) - 1); in shl()
237 Known.Zero.setLowBits(LHS.countMinTrailingZeros()); in shl()
238 if (LHS.isAllOnes()) in shl()
241 if (LHS.isNonNegative()) in shl()
243 if (LHS.isNegative()) in shl()
260 Known = Known.intersectWith(ShiftByConst(LHS, ShiftAmt)); in shl()
271 KnownBits KnownBits::lshr(const KnownBits &LHS, const KnownBits &RHS, in lshr() argument
273 unsigned BitWidth = LHS.getBitWidth(); in lshr()
274 auto ShiftByConst = [&](const KnownBits &LHS, unsigned ShiftAmt) { in lshr() argument
275 KnownBits Known = LHS; in lshr()
288 if (LHS.isUnknown()) { in lshr()
306 Known = Known.intersectWith(ShiftByConst(LHS, ShiftAmt)); in lshr()
317 KnownBits KnownBits::ashr(const KnownBits &LHS, const KnownBits &RHS, in ashr() argument
319 unsigned BitWidth = LHS.getBitWidth(); in ashr()
320 auto ShiftByConst = [&](const KnownBits &LHS, unsigned ShiftAmt) { in ashr() argument
321 KnownBits Known = LHS; in ashr()
332 if (LHS.isUnknown()) { in ashr()
354 Known = Known.intersectWith(ShiftByConst(LHS, ShiftAmt)); in ashr()
365 std::optional<bool> KnownBits::eq(const KnownBits &LHS, const KnownBits &RHS) { in eq() argument
366 if (LHS.isConstant() && RHS.isConstant()) in eq()
367 return std::optional<bool>(LHS.getConstant() == RHS.getConstant()); in eq()
368 if (LHS.One.intersects(RHS.Zero) || RHS.One.intersects(LHS.Zero)) in eq()
373 std::optional<bool> KnownBits::ne(const KnownBits &LHS, const KnownBits &RHS) { in ne() argument
374 if (std::optional<bool> KnownEQ = eq(LHS, RHS)) in ne()
379 std::optional<bool> KnownBits::ugt(const KnownBits &LHS, const KnownBits &RHS) { in ugt() argument
381 if (LHS.getMaxValue().ule(RHS.getMinValue())) in ugt()
384 if (LHS.getMinValue().ugt(RHS.getMaxValue())) in ugt()
389 std::optional<bool> KnownBits::uge(const KnownBits &LHS, const KnownBits &RHS) { in uge() argument
390 if (std::optional<bool> IsUGT = ugt(RHS, LHS)) in uge()
395 std::optional<bool> KnownBits::ult(const KnownBits &LHS, const KnownBits &RHS) { in ult() argument
396 return ugt(RHS, LHS); in ult()
399 std::optional<bool> KnownBits::ule(const KnownBits &LHS, const KnownBits &RHS) { in ule() argument
400 return uge(RHS, LHS); in ule()
403 std::optional<bool> KnownBits::sgt(const KnownBits &LHS, const KnownBits &RHS) { in sgt() argument
405 if (LHS.getSignedMaxValue().sle(RHS.getSignedMinValue())) in sgt()
408 if (LHS.getSignedMinValue().sgt(RHS.getSignedMaxValue())) in sgt()
413 std::optional<bool> KnownBits::sge(const KnownBits &LHS, const KnownBits &RHS) { in sge() argument
414 if (std::optional<bool> KnownSGT = sgt(RHS, LHS)) in sge()
419 std::optional<bool> KnownBits::slt(const KnownBits &LHS, const KnownBits &RHS) { in slt() argument
420 return sgt(RHS, LHS); in slt()
423 std::optional<bool> KnownBits::sle(const KnownBits &LHS, const KnownBits &RHS) { in sle() argument
424 return sge(RHS, LHS); in sle()
487 const KnownBits &LHS, in computeForSatAddSub() argument
489 assert(!LHS.hasConflict() && !RHS.hasConflict() && "Bad inputs"); in computeForSatAddSub()
492 KnownBits Res = KnownBits::computeForAddSub(Add, /*NSW*/ false, LHS, RHS); in computeForSatAddSub()
502 if (SignBitKnown(LHS) && SignBitKnown(RHS) && SignBitKnown(Res)) { in computeForSatAddSub()
505 Overflow = (LHS.isNonNegative() == RHS.isNonNegative() && in computeForSatAddSub()
506 Res.isNonNegative() != LHS.isNonNegative()); in computeForSatAddSub()
509 Overflow = (LHS.isNonNegative() != RHS.isNonNegative() && in computeForSatAddSub()
510 Res.isNonNegative() != LHS.isNonNegative()); in computeForSatAddSub()
516 (void)LHS.getMaxValue().uadd_ov(RHS.getMaxValue(), Of); in computeForSatAddSub()
520 (void)LHS.getMinValue().uadd_ov(RHS.getMinValue(), Of); in computeForSatAddSub()
527 (void)LHS.getMinValue().usub_ov(RHS.getMaxValue(), Of); in computeForSatAddSub()
531 (void)LHS.getMaxValue().usub_ov(RHS.getMinValue(), Of); in computeForSatAddSub()
539 if (LHS.isNonNegative() && RHS.isNonNegative()) { in computeForSatAddSub()
544 if (LHS.isNegative() && RHS.isNegative()) { in computeForSatAddSub()
550 if (LHS.isNegative() && RHS.isNonNegative()) { in computeForSatAddSub()
554 } else if (LHS.isNonNegative() && RHS.isNegative()) { in computeForSatAddSub()
567 std::max(LHS.countMinLeadingOnes(), RHS.countMinLeadingOnes()); in computeForSatAddSub()
570 std::max(LHS.countMinLeadingZeros(), RHS.countMinLeadingOnes()); in computeForSatAddSub()
596 assert(SignBitKnown(LHS) && in computeForSatAddSub()
598 C = LHS.isNegative() ? APInt::getSignedMinValue(BitWidth) in computeForSatAddSub()
634 KnownBits KnownBits::sadd_sat(const KnownBits &LHS, const KnownBits &RHS) { in sadd_sat() argument
635 return computeForSatAddSub(/*Add*/ true, /*Signed*/ true, LHS, RHS); in sadd_sat()
637 KnownBits KnownBits::ssub_sat(const KnownBits &LHS, const KnownBits &RHS) { in ssub_sat() argument
638 return computeForSatAddSub(/*Add*/ false, /*Signed*/ true, LHS, RHS); in ssub_sat()
640 KnownBits KnownBits::uadd_sat(const KnownBits &LHS, const KnownBits &RHS) { in uadd_sat() argument
641 return computeForSatAddSub(/*Add*/ true, /*Signed*/ false, LHS, RHS); in uadd_sat()
643 KnownBits KnownBits::usub_sat(const KnownBits &LHS, const KnownBits &RHS) { in usub_sat() argument
644 return computeForSatAddSub(/*Add*/ false, /*Signed*/ false, LHS, RHS); in usub_sat()
647 KnownBits KnownBits::mul(const KnownBits &LHS, const KnownBits &RHS, in mul() argument
649 unsigned BitWidth = LHS.getBitWidth(); in mul()
650 assert(BitWidth == RHS.getBitWidth() && !LHS.hasConflict() && in mul()
652 assert((!NoUndefSelfMultiply || LHS == RHS) && in mul()
660 APInt UMaxLHS = LHS.getMaxValue(); in mul()
711 const APInt &Bottom0 = LHS.One; in mul()
716 unsigned TrailBitsKnown0 = (LHS.Zero | LHS.One).countr_one(); in mul()
718 unsigned TrailZero0 = LHS.countMinTrailingZeros(); in mul()
745 KnownBits KnownBits::mulhs(const KnownBits &LHS, const KnownBits &RHS) { in mulhs() argument
746 unsigned BitWidth = LHS.getBitWidth(); in mulhs()
747 assert(BitWidth == RHS.getBitWidth() && !LHS.hasConflict() && in mulhs()
749 KnownBits WideLHS = LHS.sext(2 * BitWidth); in mulhs()
754 KnownBits KnownBits::mulhu(const KnownBits &LHS, const KnownBits &RHS) { in mulhu() argument
755 unsigned BitWidth = LHS.getBitWidth(); in mulhu()
756 assert(BitWidth == RHS.getBitWidth() && !LHS.hasConflict() && in mulhu()
758 KnownBits WideLHS = LHS.zext(2 * BitWidth); in mulhu()
763 static KnownBits divComputeLowBit(KnownBits Known, const KnownBits &LHS, in divComputeLowBit() argument
772 if (LHS.One[0]) in divComputeLowBit()
776 (int)LHS.countMinTrailingZeros() - (int)RHS.countMaxTrailingZeros(); in divComputeLowBit()
778 (int)LHS.countMaxTrailingZeros() - (int)RHS.countMinTrailingZeros(); in divComputeLowBit()
799 KnownBits KnownBits::sdiv(const KnownBits &LHS, const KnownBits &RHS, in sdiv() argument
802 if (LHS.isNonNegative() && RHS.isNonNegative()) in sdiv()
803 return udiv(LHS, RHS, Exact); in sdiv()
805 unsigned BitWidth = LHS.getBitWidth(); in sdiv()
806 assert(!LHS.hasConflict() && !RHS.hasConflict() && "Bad inputs"); in sdiv()
809 if (LHS.isZero() || RHS.isZero()) { in sdiv()
817 if (LHS.isNegative() && RHS.isNegative()) { in sdiv()
820 APInt Num = LHS.getSignedMinValue(); in sdiv()
826 } else if (LHS.isNegative() && RHS.isNonNegative()) { in sdiv()
828 if (Exact || (-LHS.getSignedMaxValue()).uge(RHS.getSignedMaxValue())) { in sdiv()
830 APInt Num = LHS.getSignedMinValue(); in sdiv()
833 } else if (LHS.isStrictlyPositive() && RHS.isNegative()) { in sdiv()
835 if (Exact || LHS.getSignedMinValue().uge(-RHS.getSignedMinValue())) { in sdiv()
837 APInt Num = LHS.getSignedMaxValue(); in sdiv()
852 Known = divComputeLowBit(Known, LHS, RHS, Exact); in sdiv()
858 KnownBits KnownBits::udiv(const KnownBits &LHS, const KnownBits &RHS, in udiv() argument
860 unsigned BitWidth = LHS.getBitWidth(); in udiv()
861 assert(!LHS.hasConflict() && !RHS.hasConflict()); in udiv()
864 if (LHS.isZero() || RHS.isZero()) { in udiv()
875 APInt MaxNum = LHS.getMaxValue(); in udiv()
881 Known = divComputeLowBit(Known, LHS, RHS, Exact); in udiv()
887 KnownBits KnownBits::remGetLowBits(const KnownBits &LHS, const KnownBits &RHS) { in remGetLowBits() argument
888 unsigned BitWidth = LHS.getBitWidth(); in remGetLowBits()
893 APInt OnesMask = LHS.One & Mask; in remGetLowBits()
894 APInt ZerosMask = LHS.Zero & Mask; in remGetLowBits()
900 KnownBits KnownBits::urem(const KnownBits &LHS, const KnownBits &RHS) { in urem() argument
901 assert(!LHS.hasConflict() && !RHS.hasConflict()); in urem()
903 KnownBits Known = remGetLowBits(LHS, RHS); in urem()
914 std::max(LHS.countMinLeadingZeros(), RHS.countMinLeadingZeros()); in urem()
919 KnownBits KnownBits::srem(const KnownBits &LHS, const KnownBits &RHS) { in srem() argument
920 assert(!LHS.hasConflict() && !RHS.hasConflict()); in srem()
922 KnownBits Known = remGetLowBits(LHS, RHS); in srem()
928 if (LHS.isNonNegative() || LowBits.isSubsetOf(LHS.Zero)) in srem()
933 if (LHS.isNegative() && LowBits.intersects(LHS.One)) in srem()
942 Known.Zero.setHighBits(LHS.countMinLeadingZeros()); in srem()