From 518fcf2c6ad7dd628198fa456554738272af4def Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csaba=20Osztrogon=C3=A1c?= Date: Fri, 20 Dec 2019 12:37:02 +0100 Subject: [PATCH] Optimize ecma_number_to_uint32 (#3470) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The ecma_number_to_uint32 function is called many times, we can merge ecma_number_is_nan and ecma_number_is_infinity checks to !ecma_number_is_finite to let the compiler generate more optimal code for it. JerryScript-DCO-1.0-Signed-off-by: Csaba Osztrogonác oszi@inf.u-szeged.hu --- jerry-core/ecma/base/ecma-helpers-conversion.c | 4 +--- jerry-core/ecma/base/ecma-helpers-number.c | 18 ++++++++++++++++++ jerry-core/ecma/base/ecma-helpers.h | 1 + 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/jerry-core/ecma/base/ecma-helpers-conversion.c b/jerry-core/ecma/base/ecma-helpers-conversion.c index c97d621cf..756973d30 100644 --- a/jerry-core/ecma/base/ecma-helpers-conversion.c +++ b/jerry-core/ecma/base/ecma-helpers-conversion.c @@ -703,9 +703,7 @@ ecma_uint32_to_utf8_string (uint32_t value, /**< value to convert */ uint32_t ecma_number_to_uint32 (ecma_number_t num) /**< ecma-number */ { - if (ecma_number_is_nan (num) - || ecma_number_is_zero (num) - || ecma_number_is_infinity (num)) + if (JERRY_UNLIKELY (ecma_number_is_zero (num) || !ecma_number_is_finite (num))) { return 0; } diff --git a/jerry-core/ecma/base/ecma-helpers-number.c b/jerry-core/ecma/base/ecma-helpers-number.c index ea326e7cb..eb0f224fa 100644 --- a/jerry-core/ecma/base/ecma-helpers-number.c +++ b/jerry-core/ecma/base/ecma-helpers-number.c @@ -329,6 +329,24 @@ ecma_number_is_infinity (ecma_number_t num) /**< ecma-number */ && (fraction == 0)); } /* ecma_number_is_infinity */ +/** + * Check if number is finite + * + * @return true - if number is finite + * false - if number is NaN or infinity + */ +extern inline bool JERRY_ATTR_ALWAYS_INLINE +ecma_number_is_finite (ecma_number_t num) /**< ecma-number */ +{ +#if defined (__GNUC__) || defined (__clang__) + return __builtin_isfinite (num); +#elif defined (WIN32) + return isfinite (num); +#else + return !ecma_number_is_nan (num) && !ecma_number_is_infinity (num); +#endif /* defined (__GNUC__) || defined (__clang__) */ +} /* ecma_number_is_finite */ + /** * Get fraction and exponent of the number * diff --git a/jerry-core/ecma/base/ecma-helpers.h b/jerry-core/ecma/base/ecma-helpers.h index 4306b1f98..682051e36 100644 --- a/jerry-core/ecma/base/ecma-helpers.h +++ b/jerry-core/ecma/base/ecma-helpers.h @@ -340,6 +340,7 @@ bool ecma_number_is_nan (ecma_number_t num); bool ecma_number_is_negative (ecma_number_t num); bool ecma_number_is_zero (ecma_number_t num); bool ecma_number_is_infinity (ecma_number_t num); +bool ecma_number_is_finite (ecma_number_t num); ecma_number_t ecma_number_make_from_sign_mantissa_and_exponent (bool sign, uint64_t mantissa, int32_t exponent); ecma_number_t ecma_number_get_prev (ecma_number_t num);