diff --git a/runtime/base/number_helper.cpp b/runtime/base/number_helper.cpp index 0ac85a0b10c024395b3f3acea5e6647c6b67671b..581d378cb30af6bc4bcb26beebb85e3e245e727c 100644 --- a/runtime/base/number_helper.cpp +++ b/runtime/base/number_helper.cpp @@ -661,27 +661,7 @@ double NumberHelper::Strtod(const char *str, int exponent, uint8_t radix) int32_t NumberHelper::DoubleToInt(double d, size_t bits) { - int32_t ret = 0; - auto u64 = bit_cast(d); - int exp = static_cast((u64 & DOUBLE_EXPONENT_MASK) >> DOUBLE_SIGNIFICAND_SIZE) - DOUBLE_EXPONENT_BIAS; - if (exp < static_cast(bits - 1)) { - // smaller than INT_MAX, fast conversion - ret = static_cast(d); - } else if (exp < static_cast(bits + DOUBLE_SIGNIFICAND_SIZE)) { - // Still has significand bits after mod 2^ - // Get low bits by shift left <64 - bits> and shift right <64 - bits> - uint64_t value = (((u64 & DOUBLE_SIGNIFICAND_MASK) | DOUBLE_HIDDEN_BIT) - << (exp - DOUBLE_SIGNIFICAND_SIZE + INT64_BITS - bits)) >> - (INT64_BITS - bits); - ret = static_cast(value); - if ((u64 & DOUBLE_SIGN_MASK) == DOUBLE_SIGN_MASK && ret != INT32_MIN) { - ret = -ret; - } - } else { - // No significand bits after mod 2^, contains NaN and INF - ret = 0; - } - return ret; + return coretypes::JsCastDoubleToInt(d, bits); } int32_t NumberHelper::DoubleInRangeInt32(double d) diff --git a/runtime/base/number_helper.h b/runtime/base/number_helper.h index f997bbe7ac83b2ba3bfd69c617656f3365ded415..f64fd569232407a53614bb693af3f21111d7338a 100644 --- a/runtime/base/number_helper.h +++ b/runtime/base/number_helper.h @@ -55,18 +55,18 @@ static constexpr double POSITIVE_INFINITY = coretypes::TaggedValue::VALUE_INFINI static constexpr double NAN_VALUE = coretypes::TaggedValue::VALUE_NAN; // Helper defines for double -static constexpr int DOUBLE_MAX_PRECISION = 15; -static constexpr int DOUBLE_EXPONENT_BIAS = 0x3FF; -static constexpr size_t DOUBLE_SIGNIFICAND_SIZE = 52; -static constexpr uint64_t DOUBLE_SIGN_MASK = 0x8000000000000000ULL; -static constexpr uint64_t DOUBLE_EXPONENT_MASK = 0x7FFULL << DOUBLE_SIGNIFICAND_SIZE; -static constexpr uint64_t DOUBLE_SIGNIFICAND_MASK = 0x000FFFFFFFFFFFFFULL; -static constexpr uint64_t DOUBLE_HIDDEN_BIT = 1ULL << DOUBLE_SIGNIFICAND_SIZE; +using coretypes::DOUBLE_EXPONENT_BIAS; +using coretypes::DOUBLE_EXPONENT_MASK; +using coretypes::DOUBLE_HIDDEN_BIT; +using coretypes::DOUBLE_MAX_PRECISION; +using coretypes::DOUBLE_SIGN_MASK; +using coretypes::DOUBLE_SIGNIFICAND_MASK; +using coretypes::DOUBLE_SIGNIFICAND_SIZE; -static constexpr size_t INT64_BITS = 64; -static constexpr size_t INT32_BITS = 32; -static constexpr size_t INT16_BITS = 16; -static constexpr size_t INT8_BITS = 8; +using coretypes::INT16_BITS; +using coretypes::INT32_BITS; +using coretypes::INT64_BITS; +using coretypes::INT8_BITS; class NumberHelper { public: