Integer acceleration for basic arithmetic and comparison.
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
@@ -163,6 +163,15 @@ typedef int32_t ecma_integer_value_t;
|
||||
#define ECMA_IS_INTEGER_NUMBER(num) \
|
||||
(ECMA_INTEGER_NUMBER_MIN <= (num) && (num) <= ECMA_INTEGER_NUMBER_MAX)
|
||||
|
||||
/**
|
||||
* Maximum integer number, which if squared, still fits in ecma_integer_value_t
|
||||
*/
|
||||
#if CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32
|
||||
#define ECMA_INTEGER_MULTIPLY_MAX 0xb50
|
||||
#else /* CONFIG_ECMA_NUMBER_TYPE != CONFIG_ECMA_NUMBER_FLOAT32 */
|
||||
#define ECMA_INTEGER_MULTIPLY_MAX 0x2d41
|
||||
#endif /* CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32 */
|
||||
|
||||
/**
|
||||
* Internal properties' identifiers.
|
||||
*/
|
||||
|
||||
@@ -218,6 +218,22 @@ ecma_is_value_integer_number (ecma_value_t value) /**< ecma value */
|
||||
return (value & ECMA_DIRECT_TYPE_MASK) == ECMA_DIRECT_TYPE_INTEGER_VALUE;
|
||||
} /* ecma_is_value_integer_number */
|
||||
|
||||
/**
|
||||
* Check if both values are integer ecma-numbers.
|
||||
*
|
||||
* @return true - if both values contain integer ecma-number values,
|
||||
* false - otherwise.
|
||||
*/
|
||||
inline bool __attr_pure___ __attr_always_inline___
|
||||
ecma_are_values_integer_numbers (ecma_value_t first_value, /**< first ecma value */
|
||||
ecma_value_t second_value) /**< second ecma value */
|
||||
{
|
||||
JERRY_STATIC_ASSERT (ECMA_DIRECT_TYPE_INTEGER_VALUE == 0,
|
||||
ecma_direct_type_integer_value_must_be_zero);
|
||||
|
||||
return ((first_value | second_value) & ECMA_DIRECT_TYPE_MASK) == ECMA_DIRECT_TYPE_INTEGER_VALUE;
|
||||
} /* ecma_are_values_integer_numbers */
|
||||
|
||||
/**
|
||||
* Check if the value is floating-point ecma-number.
|
||||
*
|
||||
@@ -471,6 +487,19 @@ ecma_make_error_obj_value (const ecma_object_t *object_p) /**< object to referen
|
||||
return ecma_make_error_value (ecma_make_object_value (object_p));
|
||||
} /* ecma_make_error_obj_value */
|
||||
|
||||
/**
|
||||
* Get integer value from an integer ecma value
|
||||
*
|
||||
* @return floating point value
|
||||
*/
|
||||
inline ecma_integer_value_t __attr_pure___ __attr_always_inline___
|
||||
ecma_get_integer_from_value (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
JERRY_ASSERT (ecma_is_value_integer_number (value));
|
||||
|
||||
return ((ecma_integer_value_t) value) >> ECMA_DIRECT_SHIFT;
|
||||
} /* ecma_get_integer_from_value */
|
||||
|
||||
/**
|
||||
* Get floating point value from an ecma value
|
||||
*
|
||||
@@ -481,7 +510,7 @@ ecma_get_number_from_value (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
if (ecma_is_value_integer_number (value))
|
||||
{
|
||||
return (ecma_number_t) (((ecma_integer_value_t) value) >> ECMA_DIRECT_SHIFT);
|
||||
return (ecma_number_t) ecma_get_integer_from_value (value);
|
||||
}
|
||||
|
||||
JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_FLOAT);
|
||||
|
||||
@@ -123,6 +123,7 @@ extern bool ecma_is_value_false (ecma_value_t);
|
||||
extern bool ecma_is_value_array_hole (ecma_value_t);
|
||||
|
||||
extern bool ecma_is_value_integer_number (ecma_value_t);
|
||||
extern bool ecma_are_values_integer_numbers (ecma_value_t, ecma_value_t);
|
||||
extern bool ecma_is_value_float_number (ecma_value_t);
|
||||
extern bool ecma_is_value_number (ecma_value_t);
|
||||
extern bool ecma_is_value_string (ecma_value_t);
|
||||
@@ -141,6 +142,7 @@ extern ecma_value_t ecma_make_string_value (const ecma_string_t *);
|
||||
extern ecma_value_t ecma_make_object_value (const ecma_object_t *);
|
||||
extern ecma_value_t ecma_make_error_value (ecma_value_t);
|
||||
extern ecma_value_t ecma_make_error_obj_value (const ecma_object_t *);
|
||||
extern ecma_integer_value_t ecma_get_integer_from_value (ecma_value_t);
|
||||
extern ecma_number_t ecma_get_number_from_value (ecma_value_t) __attr_pure___;
|
||||
extern uint32_t ecma_get_uint32_from_value (ecma_value_t) __attr_pure___;
|
||||
extern ecma_string_t *ecma_get_string_from_value (ecma_value_t) __attr_pure___;
|
||||
|
||||
Reference in New Issue
Block a user