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:
Zoltan Herczeg
2016-05-30 05:56:22 -07:00
parent 08c312bc55
commit f24be95f89
12 changed files with 149 additions and 193 deletions
@@ -41,12 +41,7 @@
ecma_value_t
ecma_op_create_boolean_object (ecma_value_t arg) /**< argument passed to the Boolean constructor */
{
ecma_value_t conv_to_boolean_completion = ecma_op_to_boolean (arg);
if (ecma_is_value_error (conv_to_boolean_completion))
{
return conv_to_boolean_completion;
}
bool boolean_value = ecma_op_to_boolean (arg);
#ifndef CONFIG_ECMA_COMPACT_PROFILE_DISABLE_BOOLEAN_BUILTIN
ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_BOOLEAN_PROTOTYPE);
@@ -64,7 +59,11 @@ ecma_op_create_boolean_object (ecma_value_t arg) /**< argument passed to the Boo
ecma_property_t *prim_value_prop_p = ecma_create_internal_property (obj_p,
ECMA_INTERNAL_PROPERTY_ECMA_VALUE);
ecma_set_internal_property_value (prim_value_prop_p, conv_to_boolean_completion);
ecma_value_t prim_value = ecma_make_simple_value (boolean_value ? ECMA_SIMPLE_VALUE_TRUE
: ECMA_SIMPLE_VALUE_FALSE);
ecma_set_internal_property_value (prim_value_prop_p, prim_value);
return ecma_make_object_value (obj_p);
} /* ecma_op_create_boolean_object */
+2 -5
View File
@@ -334,15 +334,12 @@ ecma_op_abstract_relational_compare (ecma_value_t x, /**< first operand */
{
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
ecma_value_t first_converted_value = left_first ? x : y;
ecma_value_t second_converted_value = left_first ? y : x;
// 1., 2.
ECMA_TRY_CATCH (prim_first_converted_value,
ecma_op_to_primitive (first_converted_value, ECMA_PREFERRED_TYPE_NUMBER),
ecma_op_to_primitive (x, ECMA_PREFERRED_TYPE_NUMBER),
ret_value);
ECMA_TRY_CATCH (prim_second_converted_value,
ecma_op_to_primitive (second_converted_value, ECMA_PREFERRED_TYPE_NUMBER),
ecma_op_to_primitive (y, ECMA_PREFERRED_TYPE_NUMBER),
ret_value);
const ecma_value_t px = left_first ? prim_first_converted_value : prim_second_converted_value;
+29 -85
View File
@@ -184,67 +184,50 @@ ecma_op_to_primitive (ecma_value_t value, /**< ecma value */
} /* ecma_op_to_primitive */
/**
* ToBoolean operation.
* ToBoolean operation. Cannot throw an exception.
*
* See also:
* ECMA-262 v5, 9.2
*
* @return ecma value
* Returned value is simple and so need not be freed.
* However, ecma_free_value may be called for it, but it is a no-op.
* @return true if the logical value is true
* false otherwise
*/
ecma_value_t
bool
ecma_op_to_boolean (ecma_value_t value) /**< ecma value */
{
ecma_check_value_type_is_spec_defined (value);
ecma_simple_value_t ret_value;
if (ecma_is_value_simple (value))
{
JERRY_ASSERT (ecma_is_value_boolean (value)
|| ecma_is_value_undefined (value)
|| ecma_is_value_null (value));
if (ecma_is_value_boolean (value))
{
ret_value = (ecma_is_value_true (value) ?
ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
return ecma_is_value_true (value);
}
else if (ecma_is_value_undefined (value)
|| ecma_is_value_null (value))
{
ret_value = ECMA_SIMPLE_VALUE_FALSE;
}
else if (ecma_is_value_number (value))
{
ecma_number_t num = ecma_get_number_from_value (value);
if (ecma_number_is_nan (num)
|| ecma_number_is_zero (num))
{
ret_value = ECMA_SIMPLE_VALUE_FALSE;
}
else
{
ret_value = ECMA_SIMPLE_VALUE_TRUE;
}
if (ecma_is_value_integer_number (value))
{
return (value != ecma_make_integer_value (0));
}
else if (ecma_is_value_string (value))
if (ecma_is_value_float_number (value))
{
ecma_number_t num = ecma_get_float_from_value (value);
return (!ecma_number_is_nan (num) && !ecma_number_is_zero (num));
}
if (ecma_is_value_string (value))
{
ecma_string_t *str_p = ecma_get_string_from_value (value);
if (ecma_string_get_length (str_p) == 0)
{
ret_value = ECMA_SIMPLE_VALUE_FALSE;
}
else
{
ret_value = ECMA_SIMPLE_VALUE_TRUE;
}
}
else
{
JERRY_ASSERT (ecma_is_value_object (value));
ret_value = ECMA_SIMPLE_VALUE_TRUE;
return ecma_string_get_length (str_p) != 0;
}
return ecma_make_simple_value (ret_value);
JERRY_ASSERT (ecma_is_value_object (value));
return true;
} /* ecma_op_to_boolean */
/**
@@ -607,23 +590,10 @@ ecma_op_to_property_descriptor (ecma_value_t obj_value, /**< object value */
ECMA_TRY_CATCH (enumerable_prop_value,
ecma_op_object_get (obj_p, enumerable_magic_string_p),
ret_value);
ECMA_TRY_CATCH (boolean_enumerable_prop_value,
ecma_op_to_boolean (enumerable_prop_value),
ret_value);
prop_desc.is_enumerable_defined = true;
if (ecma_is_value_true (boolean_enumerable_prop_value))
{
prop_desc.is_enumerable = true;
}
else
{
JERRY_ASSERT (ecma_is_value_boolean (boolean_enumerable_prop_value));
prop_desc.is_enumerable = ecma_op_to_boolean (enumerable_prop_value);
prop_desc.is_enumerable = false;
}
ECMA_FINALIZE (boolean_enumerable_prop_value);
ECMA_FINALIZE (enumerable_prop_value);
}
@@ -641,23 +611,10 @@ ecma_op_to_property_descriptor (ecma_value_t obj_value, /**< object value */
ECMA_TRY_CATCH (configurable_prop_value,
ecma_op_object_get (obj_p, configurable_magic_string_p),
ret_value);
ECMA_TRY_CATCH (boolean_configurable_prop_value,
ecma_op_to_boolean (configurable_prop_value),
ret_value);
prop_desc.is_configurable_defined = true;
if (ecma_is_value_true (boolean_configurable_prop_value))
{
prop_desc.is_configurable = true;
}
else
{
JERRY_ASSERT (ecma_is_value_boolean (boolean_configurable_prop_value));
prop_desc.is_configurable = ecma_op_to_boolean (configurable_prop_value);
prop_desc.is_configurable = false;
}
ECMA_FINALIZE (boolean_configurable_prop_value);
ECMA_FINALIZE (configurable_prop_value);
}
@@ -698,23 +655,10 @@ ecma_op_to_property_descriptor (ecma_value_t obj_value, /**< object value */
ECMA_TRY_CATCH (writable_prop_value,
ecma_op_object_get (obj_p, writable_magic_string_p),
ret_value);
ECMA_TRY_CATCH (boolean_writable_prop_value,
ecma_op_to_boolean (writable_prop_value),
ret_value);
prop_desc.is_writable_defined = true;
if (ecma_is_value_true (boolean_writable_prop_value))
{
prop_desc.is_writable = true;
}
else
{
JERRY_ASSERT (ecma_is_value_boolean (boolean_writable_prop_value));
prop_desc.is_writable = ecma_op_to_boolean (writable_prop_value);
prop_desc.is_writable = false;
}
ECMA_FINALIZE (boolean_writable_prop_value);
ECMA_FINALIZE (writable_prop_value);
}
+1 -1
View File
@@ -40,7 +40,7 @@ typedef enum
extern ecma_value_t ecma_op_check_object_coercible (ecma_value_t);
extern bool ecma_op_same_value (ecma_value_t, ecma_value_t);
extern ecma_value_t ecma_op_to_primitive (ecma_value_t, ecma_preferred_type_hint_t);
extern ecma_value_t ecma_op_to_boolean (ecma_value_t);
extern bool ecma_op_to_boolean (ecma_value_t);
extern ecma_value_t ecma_op_to_number (ecma_value_t);
extern ecma_value_t ecma_op_to_string (ecma_value_t);
extern ecma_value_t ecma_op_to_object (ecma_value_t);