diff --git a/libc/src/__support/FPUtil/generic/sqrt.h b/libc/src/__support/FPUtil/generic/sqrt.h --- a/libc/src/__support/FPUtil/generic/sqrt.h +++ b/libc/src/__support/FPUtil/generic/sqrt.h @@ -136,7 +136,7 @@ } // We compute one more iteration in order to round correctly. - bool lsb = y & 1; // Least significant bit + bool lsb = bool(y & 1); // Least significant bit bool rb = false; // Round bit r <<= 2; UIntType tmp = (y << 2) + 1; diff --git a/libc/src/__support/UInt.h b/libc/src/__support/UInt.h --- a/libc/src/__support/UInt.h +++ b/libc/src/__support/UInt.h @@ -348,6 +348,11 @@ return result; } + constexpr UInt operator/=(const UInt &other) { + *this = *this / other; + return *this; + } + constexpr UInt operator%(const UInt &other) const { UInt result(*this); return *result.div(other); @@ -599,6 +604,12 @@ return *this; } + constexpr UInt &operator--() { + UInt one(1); + sub(one); + return *this; + } + // Return the i-th 64-bit word of the number. constexpr const uint64_t &operator[](size_t i) const { return val[i]; } diff --git a/libc/src/__support/float_to_string.h b/libc/src/__support/float_to_string.h --- a/libc/src/__support/float_to_string.h +++ b/libc/src/__support/float_to_string.h @@ -202,8 +202,8 @@ cpp::UInt val(large); // TODO: Find a better way to force __uint128_t to be UInt<128> cpp::UInt wide_mant(0); - wide_mant[0] = mantissa & (uint64_t(-1)); - wide_mant[1] = mantissa >> 64; + wide_mant[0] = uint64_t(mantissa & (uint64_t(-1))); + wide_mant[1] = uint64_t(mantissa >> 64); val = (val * wide_mant) >> shift_amount; return fast_uint_mod_1e9(val); } diff --git a/libc/src/__support/str_to_float.h b/libc/src/__support/str_to_float.h --- a/libc/src/__support/str_to_float.h +++ b/libc/src/__support/str_to_float.h @@ -298,9 +298,9 @@ BitsType msb = final_approx_upper >> (BITS_IN_MANTISSA - 1); BitsType final_mantissa = final_approx_upper >> - (msb + BITS_IN_MANTISSA - - (fputil::FloatProperties::MANTISSA_WIDTH + 3)); - exp2 -= static_cast(1 ^ msb); // same as !msb + uint64_t(msb + BITS_IN_MANTISSA - + (fputil::FloatProperties::MANTISSA_WIDTH + 3)); + exp2 -= static_cast(1ULL ^ uint64_t(msb)); // same as !msb if (round == RoundDirection::Nearest) { // Half-way ambiguity @@ -565,7 +565,7 @@ } fputil::FPBits result; - T float_mantissa = static_cast(mantissa); + T float_mantissa = static_cast(uint64_t(mantissa)); if (exp10 == 0) { result = fputil::FPBits(float_mantissa); @@ -800,7 +800,7 @@ BitsType round_bit_mask = BitsType(1) << (amount_to_shift_right - 1); BitsType sticky_mask = round_bit_mask - 1; - bool round_bit = mantissa & round_bit_mask; + bool round_bit = bool(mantissa & round_bit_mask); bool sticky_bit = static_cast(mantissa & sticky_mask) || truncated; if (amount_to_shift_right < NUMBITS) { @@ -810,7 +810,7 @@ } else { mantissa = 0; } - bool least_significant_bit = mantissa & BitsType(1); + bool least_significant_bit = bool(mantissa & BitsType(1)); // TODO: check that this rounding behavior is correct. diff --git a/libc/src/stdio/printf_core/char_converter.h b/libc/src/stdio/printf_core/char_converter.h --- a/libc/src/stdio/printf_core/char_converter.h +++ b/libc/src/stdio/printf_core/char_converter.h @@ -19,7 +19,7 @@ namespace printf_core { LIBC_INLINE int convert_char(Writer *writer, const FormatSection &to_conv) { - char c = to_conv.conv_val_raw; + char c = uint8_t(to_conv.conv_val_raw); constexpr int string_len = 1; diff --git a/libc/src/stdio/printf_core/float_dec_converter.h b/libc/src/stdio/printf_core/float_dec_converter.h --- a/libc/src/stdio/printf_core/float_dec_converter.h +++ b/libc/src/stdio/printf_core/float_dec_converter.h @@ -598,8 +598,9 @@ const bool trailingZeros = requiredTwos <= 0 || (requiredTwos < 60 && - multiple_of_power_of_2(float_bits.get_explicit_mantissa(), - static_cast(requiredTwos))); + multiple_of_power_of_2( + uint64_t(float_bits.get_explicit_mantissa()), + static_cast(requiredTwos))); switch (fputil::get_round()) { case FE_TONEAREST: // Round to nearest, if it's exactly halfway then round to even. @@ -772,7 +773,7 @@ const bool trailingZeros = requiredTwos <= 0 || (requiredTwos < 60 && - multiple_of_power_of_2(float_bits.get_explicit_mantissa(), + multiple_of_power_of_2(uint64_t(float_bits.get_explicit_mantissa()), static_cast(requiredTwos))); switch (fputil::get_round()) { case FE_TONEAREST: @@ -1020,7 +1021,7 @@ const bool trailingZeros = requiredTwos <= 0 || (requiredTwos < 60 && - multiple_of_power_of_2(float_bits.get_explicit_mantissa(), + multiple_of_power_of_2(uint64_t(float_bits.get_explicit_mantissa()), static_cast(requiredTwos))); switch (fputil::get_round()) { case FE_TONEAREST: @@ -1147,7 +1148,7 @@ float_bits); } } else { - fputil::FPBits::UIntType float_raw = to_conv.conv_val_raw; + fputil::FPBits::UIntType float_raw = uint64_t(to_conv.conv_val_raw); fputil::FPBits float_bits(float_raw); if (!float_bits.is_inf_or_nan()) { return convert_float_decimal_typed(writer, to_conv, float_bits); @@ -1167,7 +1168,7 @@ float_bits); } } else { - fputil::FPBits::UIntType float_raw = to_conv.conv_val_raw; + fputil::FPBits::UIntType float_raw = uint64_t(to_conv.conv_val_raw); fputil::FPBits float_bits(float_raw); if (!float_bits.is_inf_or_nan()) { return convert_float_dec_exp_typed(writer, to_conv, float_bits); @@ -1187,7 +1188,7 @@ float_bits); } } else { - fputil::FPBits::UIntType float_raw = to_conv.conv_val_raw; + fputil::FPBits::UIntType float_raw = uint64_t(to_conv.conv_val_raw); fputil::FPBits float_bits(float_raw); if (!float_bits.is_inf_or_nan()) { return convert_float_dec_auto_typed(writer, to_conv, float_bits); diff --git a/libc/src/stdio/printf_core/float_hex_converter.h b/libc/src/stdio/printf_core/float_hex_converter.h --- a/libc/src/stdio/printf_core/float_hex_converter.h +++ b/libc/src/stdio/printf_core/float_hex_converter.h @@ -51,7 +51,7 @@ } else { mantissa_width = fputil::MantissaWidth::VALUE; exponent_bias = fputil::FPBits::EXPONENT_BIAS; - fputil::FPBits::UIntType float_raw = to_conv.conv_val_raw; + fputil::FPBits::UIntType float_raw = uint64_t(to_conv.conv_val_raw); fputil::FPBits float_bits(float_raw); is_negative = float_bits.get_sign(); exponent = float_bits.get_exponent(); @@ -146,8 +146,8 @@ size_t mant_cur = mant_len; size_t first_non_zero = 1; for (; mant_cur > 0; --mant_cur, mantissa /= 16) { - char new_digit = ((mantissa % 16) > 9) ? ((mantissa % 16) - 10 + a) - : ((mantissa % 16) + '0'); + char new_digit = uint8_t(((mantissa % 16) > 9) ? ((mantissa % 16) - 10 + a) + : ((mantissa % 16) + '0')); mant_buffer[mant_cur - 1] = new_digit; if (new_digit != '0' && first_non_zero < mant_cur) first_non_zero = mant_cur; diff --git a/libc/src/stdio/printf_core/float_inf_nan_converter.h b/libc/src/stdio/printf_core/float_inf_nan_converter.h --- a/libc/src/stdio/printf_core/float_inf_nan_converter.h +++ b/libc/src/stdio/printf_core/float_inf_nan_converter.h @@ -36,7 +36,7 @@ is_negative = float_bits.get_sign(); mantissa = float_bits.get_explicit_mantissa(); } else { - fputil::FPBits::UIntType float_raw = to_conv.conv_val_raw; + fputil::FPBits::UIntType float_raw = uint64_t(to_conv.conv_val_raw); fputil::FPBits float_bits(float_raw); is_negative = float_bits.get_sign(); mantissa = float_bits.get_explicit_mantissa(); diff --git a/libc/src/stdio/printf_core/int_converter.h b/libc/src/stdio/printf_core/int_converter.h --- a/libc/src/stdio/printf_core/int_converter.h +++ b/libc/src/stdio/printf_core/int_converter.h @@ -43,7 +43,7 @@ static constexpr size_t BITS_IN_BYTE = 8; static constexpr size_t BITS_IN_NUM = sizeof(uintmax_t) * BITS_IN_BYTE; - uintmax_t num = to_conv.conv_val_raw; + uintmax_t num = uint64_t(to_conv.conv_val_raw); bool is_negative = false; FormatFlags flags = to_conv.flags;