Optimize comparison in VM.
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
@@ -44,15 +44,6 @@ opfunc_less_than (ecma_value_t left_value, /**< left value */
|
|||||||
JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (left_value)
|
JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (left_value)
|
||||||
&& !ECMA_IS_VALUE_ERROR (right_value));
|
&& !ECMA_IS_VALUE_ERROR (right_value));
|
||||||
|
|
||||||
if (ecma_are_values_integer_numbers (left_value, right_value))
|
|
||||||
{
|
|
||||||
if ((ecma_integer_value_t) left_value < (ecma_integer_value_t) right_value)
|
|
||||||
{
|
|
||||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_TRUE);
|
|
||||||
}
|
|
||||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
ecma_value_t ret_value = ecma_op_abstract_relational_compare (left_value, right_value, true);
|
ecma_value_t ret_value = ecma_op_abstract_relational_compare (left_value, right_value, true);
|
||||||
|
|
||||||
if (ECMA_IS_VALUE_ERROR (ret_value))
|
if (ECMA_IS_VALUE_ERROR (ret_value))
|
||||||
@@ -87,15 +78,6 @@ opfunc_greater_than (ecma_value_t left_value, /**< left value */
|
|||||||
JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (left_value)
|
JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (left_value)
|
||||||
&& !ECMA_IS_VALUE_ERROR (right_value));
|
&& !ECMA_IS_VALUE_ERROR (right_value));
|
||||||
|
|
||||||
if (ecma_are_values_integer_numbers (left_value, right_value))
|
|
||||||
{
|
|
||||||
if ((ecma_integer_value_t) left_value > (ecma_integer_value_t) right_value)
|
|
||||||
{
|
|
||||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_TRUE);
|
|
||||||
}
|
|
||||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
ecma_value_t ret_value = ecma_op_abstract_relational_compare (left_value, right_value, false);
|
ecma_value_t ret_value = ecma_op_abstract_relational_compare (left_value, right_value, false);
|
||||||
|
|
||||||
if (ECMA_IS_VALUE_ERROR (ret_value))
|
if (ECMA_IS_VALUE_ERROR (ret_value))
|
||||||
@@ -130,15 +112,6 @@ opfunc_less_or_equal_than (ecma_value_t left_value, /**< left value */
|
|||||||
JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (left_value)
|
JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (left_value)
|
||||||
&& !ECMA_IS_VALUE_ERROR (right_value));
|
&& !ECMA_IS_VALUE_ERROR (right_value));
|
||||||
|
|
||||||
if (ecma_are_values_integer_numbers (left_value, right_value))
|
|
||||||
{
|
|
||||||
if ((ecma_integer_value_t) left_value <= (ecma_integer_value_t) right_value)
|
|
||||||
{
|
|
||||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_TRUE);
|
|
||||||
}
|
|
||||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
ecma_value_t ret_value = ecma_op_abstract_relational_compare (left_value, right_value, false);
|
ecma_value_t ret_value = ecma_op_abstract_relational_compare (left_value, right_value, false);
|
||||||
|
|
||||||
if (ECMA_IS_VALUE_ERROR (ret_value))
|
if (ECMA_IS_VALUE_ERROR (ret_value))
|
||||||
@@ -175,15 +148,6 @@ opfunc_greater_or_equal_than (ecma_value_t left_value, /**< left value */
|
|||||||
JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (left_value)
|
JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (left_value)
|
||||||
&& !ECMA_IS_VALUE_ERROR (right_value));
|
&& !ECMA_IS_VALUE_ERROR (right_value));
|
||||||
|
|
||||||
if (ecma_are_values_integer_numbers (left_value, right_value))
|
|
||||||
{
|
|
||||||
if ((ecma_integer_value_t) left_value >= (ecma_integer_value_t) right_value)
|
|
||||||
{
|
|
||||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_TRUE);
|
|
||||||
}
|
|
||||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
ecma_value_t ret_value = ecma_op_abstract_relational_compare (left_value, right_value, true);
|
ecma_value_t ret_value = ecma_op_abstract_relational_compare (left_value, right_value, true);
|
||||||
|
|
||||||
if (ECMA_IS_VALUE_ERROR (ret_value))
|
if (ECMA_IS_VALUE_ERROR (ret_value))
|
||||||
|
|||||||
@@ -1968,6 +1968,24 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
|
|||||||
}
|
}
|
||||||
case VM_OC_LESS:
|
case VM_OC_LESS:
|
||||||
{
|
{
|
||||||
|
if (ecma_are_values_integer_numbers (left_value, right_value))
|
||||||
|
{
|
||||||
|
ecma_integer_value_t left_integer = (ecma_integer_value_t) left_value;
|
||||||
|
ecma_integer_value_t right_integer = (ecma_integer_value_t) right_value;
|
||||||
|
|
||||||
|
*stack_top_p++ = ecma_make_boolean_value (left_integer < right_integer);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ecma_is_value_number (left_value) && ecma_is_value_number (right_value))
|
||||||
|
{
|
||||||
|
ecma_number_t left_number = ecma_get_number_from_value (left_value);
|
||||||
|
ecma_number_t right_number = ecma_get_number_from_value (right_value);
|
||||||
|
|
||||||
|
*stack_top_p++ = ecma_make_boolean_value (left_number < right_number);
|
||||||
|
goto free_both_values;
|
||||||
|
}
|
||||||
|
|
||||||
result = opfunc_less_than (left_value, right_value);
|
result = opfunc_less_than (left_value, right_value);
|
||||||
|
|
||||||
if (ECMA_IS_VALUE_ERROR (result))
|
if (ECMA_IS_VALUE_ERROR (result))
|
||||||
@@ -1980,6 +1998,24 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
|
|||||||
}
|
}
|
||||||
case VM_OC_GREATER:
|
case VM_OC_GREATER:
|
||||||
{
|
{
|
||||||
|
if (ecma_are_values_integer_numbers (left_value, right_value))
|
||||||
|
{
|
||||||
|
ecma_integer_value_t left_integer = (ecma_integer_value_t) left_value;
|
||||||
|
ecma_integer_value_t right_integer = (ecma_integer_value_t) right_value;
|
||||||
|
|
||||||
|
*stack_top_p++ = ecma_make_boolean_value (left_integer > right_integer);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ecma_is_value_number (left_value) && ecma_is_value_number (right_value))
|
||||||
|
{
|
||||||
|
ecma_number_t left_number = ecma_get_number_from_value (left_value);
|
||||||
|
ecma_number_t right_number = ecma_get_number_from_value (right_value);
|
||||||
|
|
||||||
|
*stack_top_p++ = ecma_make_boolean_value (left_number > right_number);
|
||||||
|
goto free_both_values;
|
||||||
|
}
|
||||||
|
|
||||||
result = opfunc_greater_than (left_value, right_value);
|
result = opfunc_greater_than (left_value, right_value);
|
||||||
|
|
||||||
if (ECMA_IS_VALUE_ERROR (result))
|
if (ECMA_IS_VALUE_ERROR (result))
|
||||||
@@ -1992,6 +2028,24 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
|
|||||||
}
|
}
|
||||||
case VM_OC_LESS_EQUAL:
|
case VM_OC_LESS_EQUAL:
|
||||||
{
|
{
|
||||||
|
if (ecma_are_values_integer_numbers (left_value, right_value))
|
||||||
|
{
|
||||||
|
ecma_integer_value_t left_integer = (ecma_integer_value_t) left_value;
|
||||||
|
ecma_integer_value_t right_integer = (ecma_integer_value_t) right_value;
|
||||||
|
|
||||||
|
*stack_top_p++ = ecma_make_boolean_value (left_integer <= right_integer);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ecma_is_value_number (left_value) && ecma_is_value_number (right_value))
|
||||||
|
{
|
||||||
|
ecma_number_t left_number = ecma_get_number_from_value (left_value);
|
||||||
|
ecma_number_t right_number = ecma_get_number_from_value (right_value);
|
||||||
|
|
||||||
|
*stack_top_p++ = ecma_make_boolean_value (left_number <= right_number);
|
||||||
|
goto free_both_values;
|
||||||
|
}
|
||||||
|
|
||||||
result = opfunc_less_or_equal_than (left_value, right_value);
|
result = opfunc_less_or_equal_than (left_value, right_value);
|
||||||
|
|
||||||
if (ECMA_IS_VALUE_ERROR (result))
|
if (ECMA_IS_VALUE_ERROR (result))
|
||||||
@@ -2004,6 +2058,24 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
|
|||||||
}
|
}
|
||||||
case VM_OC_GREATER_EQUAL:
|
case VM_OC_GREATER_EQUAL:
|
||||||
{
|
{
|
||||||
|
if (ecma_are_values_integer_numbers (left_value, right_value))
|
||||||
|
{
|
||||||
|
ecma_integer_value_t left_integer = (ecma_integer_value_t) left_value;
|
||||||
|
ecma_integer_value_t right_integer = (ecma_integer_value_t) right_value;
|
||||||
|
|
||||||
|
*stack_top_p++ = ecma_make_boolean_value (left_integer >= right_integer);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ecma_is_value_number (left_value) && ecma_is_value_number (right_value))
|
||||||
|
{
|
||||||
|
ecma_number_t left_number = ecma_get_number_from_value (left_value);
|
||||||
|
ecma_number_t right_number = ecma_get_number_from_value (right_value);
|
||||||
|
|
||||||
|
*stack_top_p++ = ecma_make_boolean_value (left_number >= right_number);
|
||||||
|
goto free_both_values;
|
||||||
|
}
|
||||||
|
|
||||||
result = opfunc_greater_or_equal_than (left_value, right_value);
|
result = opfunc_greater_or_equal_than (left_value, right_value);
|
||||||
|
|
||||||
if (ECMA_IS_VALUE_ERROR (result))
|
if (ECMA_IS_VALUE_ERROR (result))
|
||||||
|
|||||||
Reference in New Issue
Block a user