From 8a0de11ea6d2bacfd3ddba67fd10513dadbd46b9 Mon Sep 17 00:00:00 2001 From: Aleksei Sidorov Date: Mon, 15 Aug 2022 18:13:02 +0300 Subject: [PATCH] [Compiler] Move impl of NumberHelper::DoubleToInt cast to Core module Signed-off-by: Aleksei Sidorov --- runtime/base/number_helper.cpp | 22 +--------------------- runtime/base/number_helper.h | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 32 deletions(-) diff --git a/runtime/base/number_helper.cpp b/runtime/base/number_helper.cpp index 0ac85a0b1..581d378cb 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 f997bbe7a..f64fd5692 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: -- Gitee