Optimize conditional jumps.
The ecma_op_to_boolean return value is changed to bool for faster evaluation, and no need to swap operandos of relational compare. JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
@@ -73,12 +73,12 @@ typedef enum
|
||||
* - immutable binding values
|
||||
* - special register or stack values for vm
|
||||
*/
|
||||
ECMA_SIMPLE_VALUE_EMPTY,
|
||||
ECMA_SIMPLE_VALUE_UNDEFINED, /**< undefined value */
|
||||
ECMA_SIMPLE_VALUE_NULL, /**< null value */
|
||||
ECMA_SIMPLE_VALUE_EMPTY, /**< uninitialized value */
|
||||
ECMA_SIMPLE_VALUE_ARRAY_HOLE, /**< array hole, used for initialization of an array literal */
|
||||
ECMA_SIMPLE_VALUE_FALSE, /**< boolean false */
|
||||
ECMA_SIMPLE_VALUE_TRUE, /**< boolean true */
|
||||
ECMA_SIMPLE_VALUE_ARRAY_HOLE, /**< array hole, used for initialization of an array literal */
|
||||
ECMA_SIMPLE_VALUE_UNDEFINED, /**< undefined value */
|
||||
ECMA_SIMPLE_VALUE_NULL, /**< null value */
|
||||
ECMA_SIMPLE_VALUE_REGISTER_REF, /**< register reference, a special "base" value for vm */
|
||||
ECMA_SIMPLE_VALUE__COUNT /** count of simple ecma values */
|
||||
} ecma_simple_value_t;
|
||||
|
||||
@@ -59,6 +59,10 @@ JERRY_STATIC_ASSERT (sizeof (uintptr_t) > sizeof (ecma_value_t),
|
||||
|
||||
#endif /* ECMA_VALUE_CAN_STORE_UINTPTR_VALUE_DIRECTLY */
|
||||
|
||||
JERRY_STATIC_ASSERT ((ECMA_SIMPLE_VALUE_FALSE | 0x1) == ECMA_SIMPLE_VALUE_TRUE
|
||||
&& ECMA_SIMPLE_VALUE_FALSE != ECMA_SIMPLE_VALUE_TRUE,
|
||||
only_the_lowest_bit_must_be_different_for_simple_value_true_and_false);
|
||||
|
||||
/**
|
||||
* Get type field of ecma value
|
||||
*
|
||||
@@ -109,6 +113,18 @@ ecma_get_pointer_from_ecma_value (ecma_value_t value) /**< value */
|
||||
#endif /* ECMA_VALUE_CAN_STORE_UINTPTR_VALUE_DIRECTLY */
|
||||
} /* ecma_get_pointer_from_ecma_value */
|
||||
|
||||
/**
|
||||
* Check if the value is simple ecma-value.
|
||||
*
|
||||
* @return true - if the value is a simple value,
|
||||
* false - otherwise.
|
||||
*/
|
||||
inline bool __attr_pure___ __attr_always_inline___
|
||||
ecma_is_value_simple (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
return (value & ECMA_DIRECT_TYPE_MASK) == ECMA_DIRECT_TYPE_SIMPLE_VALUE;
|
||||
} /* ecma_is_value_simple */
|
||||
|
||||
/**
|
||||
* Check whether the value is a given simple value.
|
||||
*
|
||||
@@ -167,7 +183,7 @@ ecma_is_value_null (ecma_value_t value) /**< ecma value */
|
||||
inline bool __attr_pure___ __attr_always_inline___
|
||||
ecma_is_value_boolean (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
return ecma_is_value_true (value) || ecma_is_value_false (value);
|
||||
return ecma_is_value_true (value | (1 << ECMA_DIRECT_SHIFT));
|
||||
} /* ecma_is_value_boolean */
|
||||
|
||||
/**
|
||||
@@ -500,6 +516,14 @@ ecma_get_integer_from_value (ecma_value_t value) /**< ecma value */
|
||||
return ((ecma_integer_value_t) value) >> ECMA_DIRECT_SHIFT;
|
||||
} /* ecma_get_integer_from_value */
|
||||
|
||||
inline ecma_number_t __attr_pure___ __attr_always_inline___
|
||||
ecma_get_float_from_value (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_FLOAT);
|
||||
|
||||
return *(ecma_number_t *) ecma_get_pointer_from_ecma_value (value);
|
||||
} /* ecma_get_float_from_value */
|
||||
|
||||
/**
|
||||
* Get floating point value from an ecma value
|
||||
*
|
||||
@@ -513,9 +537,7 @@ ecma_get_number_from_value (ecma_value_t value) /**< ecma value */
|
||||
return (ecma_number_t) ecma_get_integer_from_value (value);
|
||||
}
|
||||
|
||||
JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_FLOAT);
|
||||
|
||||
return *(ecma_number_t *) ecma_get_pointer_from_ecma_value (value);
|
||||
return ecma_get_float_from_value (value);
|
||||
} /* ecma_get_number_from_value */
|
||||
|
||||
/**
|
||||
@@ -563,6 +585,19 @@ ecma_get_object_from_value (ecma_value_t value) /**< ecma value */
|
||||
return (ecma_object_t *) ecma_get_pointer_from_ecma_value (value);
|
||||
} /* ecma_get_object_from_value */
|
||||
|
||||
/**
|
||||
* Invert a boolean value
|
||||
*
|
||||
* @return ecma value
|
||||
*/
|
||||
inline ecma_value_t __attr_pure___ __attr_always_inline___
|
||||
ecma_invert_boolean_value (ecma_value_t value) /**< ecma value */
|
||||
{
|
||||
JERRY_ASSERT (ecma_is_value_boolean (value));
|
||||
|
||||
return (value ^ (1 << ECMA_DIRECT_SHIFT));
|
||||
} /* ecma_invert_boolean_value */
|
||||
|
||||
/**
|
||||
* Get the value from an error ecma value
|
||||
*
|
||||
|
||||
@@ -114,26 +114,27 @@
|
||||
}
|
||||
|
||||
/* ecma-helpers-value.c */
|
||||
extern bool ecma_is_value_empty (ecma_value_t);
|
||||
extern bool ecma_is_value_undefined (ecma_value_t);
|
||||
extern bool ecma_is_value_null (ecma_value_t);
|
||||
extern bool ecma_is_value_boolean (ecma_value_t);
|
||||
extern bool ecma_is_value_true (ecma_value_t);
|
||||
extern bool ecma_is_value_false (ecma_value_t);
|
||||
extern bool ecma_is_value_array_hole (ecma_value_t);
|
||||
extern bool ecma_is_value_simple (ecma_value_t) __attr_pure___;
|
||||
extern bool ecma_is_value_empty (ecma_value_t) __attr_pure___;
|
||||
extern bool ecma_is_value_undefined (ecma_value_t) __attr_pure___;
|
||||
extern bool ecma_is_value_null (ecma_value_t) __attr_pure___;
|
||||
extern bool ecma_is_value_boolean (ecma_value_t) __attr_pure___;
|
||||
extern bool ecma_is_value_true (ecma_value_t) __attr_pure___;
|
||||
extern bool ecma_is_value_false (ecma_value_t) __attr_pure___;
|
||||
extern bool ecma_is_value_array_hole (ecma_value_t) __attr_pure___;
|
||||
|
||||
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);
|
||||
extern bool ecma_is_value_object (ecma_value_t);
|
||||
extern bool ecma_is_value_error (ecma_value_t);
|
||||
extern bool ecma_is_value_integer_number (ecma_value_t) __attr_pure___;
|
||||
extern bool ecma_are_values_integer_numbers (ecma_value_t, ecma_value_t) __attr_pure___;
|
||||
extern bool ecma_is_value_float_number (ecma_value_t) __attr_pure___;
|
||||
extern bool ecma_is_value_number (ecma_value_t) __attr_pure___;
|
||||
extern bool ecma_is_value_string (ecma_value_t) __attr_pure___;
|
||||
extern bool ecma_is_value_object (ecma_value_t) __attr_pure___;
|
||||
extern bool ecma_is_value_error (ecma_value_t) __attr_pure___;
|
||||
|
||||
extern void ecma_check_value_type_is_spec_defined (ecma_value_t);
|
||||
|
||||
extern ecma_value_t ecma_make_simple_value (const ecma_simple_value_t value);
|
||||
extern ecma_value_t ecma_make_integer_value (ecma_integer_value_t);
|
||||
extern ecma_value_t ecma_make_simple_value (const ecma_simple_value_t value) __attr_const___;
|
||||
extern ecma_value_t ecma_make_integer_value (ecma_integer_value_t) __attr_const___;
|
||||
extern ecma_value_t ecma_make_nan_value (void);
|
||||
extern ecma_value_t ecma_make_number_value (ecma_number_t);
|
||||
extern ecma_value_t ecma_make_int32_value (int32_t);
|
||||
@@ -142,12 +143,14 @@ 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_integer_value_t ecma_get_integer_from_value (ecma_value_t) __attr_pure___;
|
||||
extern ecma_number_t ecma_get_float_from_value (ecma_value_t value) __attr_pure___;
|
||||
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___;
|
||||
extern ecma_object_t *ecma_get_object_from_value (ecma_value_t) __attr_pure___;
|
||||
extern ecma_value_t ecma_get_value_from_error_value (ecma_value_t) __attr_pure___;
|
||||
extern ecma_value_t ecma_invert_boolean_value (ecma_value_t) __attr_pure___;
|
||||
extern ecma_value_t ecma_copy_value (ecma_value_t);
|
||||
extern ecma_value_t ecma_fast_copy_value (ecma_value_t);
|
||||
extern ecma_value_t ecma_copy_value_if_not_object (ecma_value_t);
|
||||
|
||||
Reference in New Issue
Block a user