diff --git a/jerry-core/vm/opcodes-ecma-relational.c b/jerry-core/vm/opcodes-ecma-relational.c index 67969e08a4..04112e4320 100644 --- a/jerry-core/vm/opcodes-ecma-relational.c +++ b/jerry-core/vm/opcodes-ecma-relational.c @@ -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)) diff --git a/jerry-core/vm/vm.c b/jerry-core/vm/vm.c index cf98cc725f..15a8e45b97 100644 --- a/jerry-core/vm/vm.c +++ b/jerry-core/vm/vm.c @@ -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))