https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102974

--- Comment #15 from cqwrteur <unlvsur at live dot com> ---
template<::std::unsigned_integral T>
inline constexpr T add_carry_no_carry_in(T a,T b,T& carryout) noexcept
{
    T res{a+b};
    carryout=res<a;
    return res;
}

template<::std::unsigned_integral T>
inline constexpr T add_carry(T a,T b,T carryin,T& carryout) noexcept
{
    assume(carryin==0||carryin==1);
    a=add_carry_no_carry_in(carryin,a,carryout);
    a=add_carry_no_carry_in(a,b,carryin);
    carryout+=carryin;
    assume(carryout==0||carryout==1);
    return a;
}

Reply via email to