From b663993067ffb5800632ad41ea7f2f92caab1093 Mon Sep 17 00:00:00 2001 From: "Mikhail R. Gadelha" Date: Tue, 16 May 2023 12:53:07 -0300 Subject: [PATCH] [libc] Add explicit constructor calls to fix compilation when using UInt This patch is similar to 86fe88c8d9 and adds several explicit constructor calls (bool(...), uint64_t(...), uint8_t(...)) that are needed when we use UInt (in my case UInt<128> in riscv32). This patch also adds two operators to UInt: * operator/= required by printf_core/float_hex_converter.h:148 * operator-- required by FPUtil/ManipulationFunctions.h:166 Reviewed By: sivachandra, lntue Differential Revision: https://reviews.llvm.org/D149594 --- libc/src/__support/FPUtil/generic/sqrt.h | 2 +- libc/src/__support/UInt.h | 13 ++++++++++-- libc/src/__support/float_to_string.h | 4 ++-- libc/src/__support/str_to_float.h | 14 +++++++------ libc/src/stdio/printf_core/char_converter.h | 2 +- libc/src/stdio/printf_core/float_dec_converter.h | 24 ++++++++++++++-------- libc/src/stdio/printf_core/float_hex_converter.h | 8 +++++--- .../stdio/printf_core/float_inf_nan_converter.h | 3 ++- libc/src/stdio/printf_core/int_converter.h | 2 +- 9 files changed, 46 insertions(+), 26 deletions(-) diff --git a/libc/src/__support/FPUtil/generic/sqrt.h b/libc/src/__support/FPUtil/generic/sqrt.h index 1464056..529f528 100644 --- a/libc/src/__support/FPUtil/generic/sqrt.h +++ b/libc/src/__support/FPUtil/generic/sqrt.h @@ -136,7 +136,7 @@ LIBC_INLINE cpp::enable_if_t, T> sqrt(T x) { } // We compute one more iteration in order to round correctly. - bool lsb = y & 1; // Least significant bit + bool lsb = static_cast(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 index a702aaa..1ac7534 100644 --- a/libc/src/__support/UInt.h +++ b/libc/src/__support/UInt.h @@ -468,6 +468,11 @@ template struct UInt { 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); @@ -714,8 +719,12 @@ template struct UInt { } constexpr UInt &operator++() { - UInt one(1); - add(one); + *this = *this + 1; + return *this; + } + + constexpr UInt &operator--() { + *this = *this - 1; return *this; } diff --git a/libc/src/__support/float_to_string.h b/libc/src/__support/float_to_string.h index 0937014..43f4903 100644 --- a/libc/src/__support/float_to_string.h +++ b/libc/src/__support/float_to_string.h @@ -202,8 +202,8 @@ LIBC_INLINE uint32_t mul_shift_mod_1e9(const MantissaInt mantissa, 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] = static_cast(mantissa & (uint64_t(-1))); + wide_mant[1] = static_cast(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 index 0697cf0..33c394e 100644 --- a/libc/src/__support/str_to_float.h +++ b/libc/src/__support/str_to_float.h @@ -298,9 +298,11 @@ eisel_lemire(ExpandedFloat init_num, 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 + static_cast( + msb + BITS_IN_MANTISSA - + (fputil::FloatProperties::MANTISSA_WIDTH + 3)); + exp2 -= + static_cast(1ULL ^ static_cast(msb)); // same as !msb if (round == RoundDirection::Nearest) { // Half-way ambiguity @@ -565,7 +567,7 @@ clinger_fast_path(ExpandedFloat init_num, } fputil::FPBits result; - T float_mantissa = static_cast(mantissa); + T float_mantissa = static_cast(static_cast(mantissa)); if (exp10 == 0) { result = fputil::FPBits(float_mantissa); @@ -800,7 +802,7 @@ LIBC_INLINE FloatConvertReturn binary_exp_to_float(ExpandedFloat init_num, 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 = static_cast(mantissa & round_bit_mask); bool sticky_bit = static_cast(mantissa & sticky_mask) || truncated; if (amount_to_shift_right < NUMBITS) { @@ -810,7 +812,7 @@ LIBC_INLINE FloatConvertReturn binary_exp_to_float(ExpandedFloat init_num, } else { mantissa = 0; } - bool least_significant_bit = mantissa & BitsType(1); + bool least_significant_bit = static_cast(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 index 23a85eb..93d2111 100644 --- a/libc/src/stdio/printf_core/char_converter.h +++ b/libc/src/stdio/printf_core/char_converter.h @@ -19,7 +19,7 @@ namespace __llvm_libc { namespace printf_core { LIBC_INLINE int convert_char(Writer *writer, const FormatSection &to_conv) { - char c = to_conv.conv_val_raw; + char c = static_cast(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 index 8d220ce..dabeb91 100644 --- a/libc/src/stdio/printf_core/float_dec_converter.h +++ b/libc/src/stdio/printf_core/float_dec_converter.h @@ -598,8 +598,9 @@ LIBC_INLINE int convert_float_decimal_typed(Writer *writer, 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( + static_cast(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,8 +773,9 @@ LIBC_INLINE int convert_float_dec_exp_typed(Writer *writer, 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( + static_cast(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. @@ -1020,8 +1022,9 @@ LIBC_INLINE int convert_float_dec_auto_typed(Writer *writer, 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( + static_cast(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. @@ -1147,7 +1150,8 @@ LIBC_INLINE int convert_float_decimal(Writer *writer, float_bits); } } else { - fputil::FPBits::UIntType float_raw = to_conv.conv_val_raw; + fputil::FPBits::UIntType float_raw = + static_cast(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 +1171,8 @@ LIBC_INLINE int convert_float_dec_exp(Writer *writer, float_bits); } } else { - fputil::FPBits::UIntType float_raw = to_conv.conv_val_raw; + fputil::FPBits::UIntType float_raw = + static_cast(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 +1192,8 @@ LIBC_INLINE int convert_float_dec_auto(Writer *writer, float_bits); } } else { - fputil::FPBits::UIntType float_raw = to_conv.conv_val_raw; + fputil::FPBits::UIntType float_raw = + static_cast(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 index a26a3e7..b3d7b22 100644 --- a/libc/src/stdio/printf_core/float_hex_converter.h +++ b/libc/src/stdio/printf_core/float_hex_converter.h @@ -51,7 +51,8 @@ LIBC_INLINE int convert_float_hex_exp(Writer *writer, } 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 = + static_cast(to_conv.conv_val_raw); fputil::FPBits float_bits(float_raw); is_negative = float_bits.get_sign(); exponent = float_bits.get_exponent(); @@ -146,8 +147,9 @@ LIBC_INLINE int convert_float_hex_exp(Writer *writer, 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 = + static_cast(((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 index b7dcf86..1883b47 100644 --- 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,8 @@ LIBC_INLINE int convert_inf_nan(Writer *writer, const FormatSection &to_conv) { 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 = + static_cast(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 index f5c849c..b4775a6 100644 --- a/libc/src/stdio/printf_core/int_converter.h +++ b/libc/src/stdio/printf_core/int_converter.h @@ -43,7 +43,7 @@ LIBC_INLINE int convert_int(Writer *writer, const FormatSection &to_conv) { 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 = static_cast(to_conv.conv_val_raw); bool is_negative = false; FormatFlags flags = to_conv.flags; -- 2.7.4