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)
|
||||
&& !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);
|
||||
|
||||
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)
|
||||
&& !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);
|
||||
|
||||
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)
|
||||
&& !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);
|
||||
|
||||
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)
|
||||
&& !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);
|
||||
|
||||
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:
|
||||
{
|
||||
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);
|
||||
|
||||
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:
|
||||
{
|
||||
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);
|
||||
|
||||
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:
|
||||
{
|
||||
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);
|
||||
|
||||
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:
|
||||
{
|
||||
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);
|
||||
|
||||
if (ECMA_IS_VALUE_ERROR (result))
|
||||
|
||||
Reference in New Issue
Block a user