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:
@@ -53,25 +53,22 @@ opfunc_less_than (ecma_value_t left_value, /**< left value */
|
||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE);
|
||||
}
|
||||
|
||||
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
|
||||
ecma_value_t ret_value = ecma_op_abstract_relational_compare (left_value, right_value, true);
|
||||
|
||||
ECMA_TRY_CATCH (compare_result,
|
||||
ecma_op_abstract_relational_compare (left_value, right_value, true),
|
||||
ret_value);
|
||||
if (ecma_is_value_error (ret_value))
|
||||
{
|
||||
return ret_value;
|
||||
}
|
||||
|
||||
if (ecma_is_value_undefined (compare_result))
|
||||
if (ecma_is_value_undefined (ret_value))
|
||||
{
|
||||
ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
JERRY_ASSERT (ecma_is_value_boolean (compare_result));
|
||||
|
||||
ret_value = compare_result;
|
||||
JERRY_ASSERT (ecma_is_value_boolean (ret_value));
|
||||
}
|
||||
|
||||
ECMA_FINALIZE (compare_result);
|
||||
|
||||
return ret_value;
|
||||
} /* opfunc_less_than */
|
||||
|
||||
@@ -99,25 +96,22 @@ opfunc_greater_than (ecma_value_t left_value, /**< left value */
|
||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE);
|
||||
}
|
||||
|
||||
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
|
||||
ecma_value_t ret_value = ecma_op_abstract_relational_compare (left_value, right_value, false);
|
||||
|
||||
ECMA_TRY_CATCH (compare_result,
|
||||
ecma_op_abstract_relational_compare (right_value, left_value, false),
|
||||
ret_value);
|
||||
if (ecma_is_value_error (ret_value))
|
||||
{
|
||||
return ret_value;
|
||||
}
|
||||
|
||||
if (ecma_is_value_undefined (compare_result))
|
||||
if (ecma_is_value_undefined (ret_value))
|
||||
{
|
||||
ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
JERRY_ASSERT (ecma_is_value_boolean (compare_result));
|
||||
|
||||
ret_value = compare_result;
|
||||
JERRY_ASSERT (ecma_is_value_boolean (ret_value));
|
||||
}
|
||||
|
||||
ECMA_FINALIZE (compare_result);
|
||||
|
||||
return ret_value;
|
||||
} /* opfunc_greater_than */
|
||||
|
||||
@@ -145,32 +139,24 @@ opfunc_less_or_equal_than (ecma_value_t left_value, /**< left value */
|
||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE);
|
||||
}
|
||||
|
||||
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
|
||||
ecma_value_t ret_value = ecma_op_abstract_relational_compare (left_value, right_value, false);
|
||||
|
||||
ECMA_TRY_CATCH (compare_result,
|
||||
ecma_op_abstract_relational_compare (right_value, left_value, false),
|
||||
ret_value);
|
||||
if (ecma_is_value_error (ret_value))
|
||||
{
|
||||
return ret_value;
|
||||
}
|
||||
|
||||
if (ecma_is_value_undefined (compare_result))
|
||||
if (ecma_is_value_undefined (ret_value))
|
||||
{
|
||||
ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
JERRY_ASSERT (ecma_is_value_boolean (compare_result));
|
||||
JERRY_ASSERT (ecma_is_value_boolean (ret_value));
|
||||
|
||||
if (ecma_is_value_true (compare_result))
|
||||
{
|
||||
ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_TRUE);
|
||||
}
|
||||
ret_value = ecma_invert_boolean_value (ret_value);
|
||||
}
|
||||
|
||||
ECMA_FINALIZE (compare_result);
|
||||
|
||||
return ret_value;
|
||||
} /* opfunc_less_or_equal_than */
|
||||
|
||||
@@ -198,32 +184,24 @@ opfunc_greater_or_equal_than (ecma_value_t left_value, /**< left value */
|
||||
return ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE);
|
||||
}
|
||||
|
||||
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
|
||||
ecma_value_t ret_value = ecma_op_abstract_relational_compare (left_value, right_value, true);
|
||||
|
||||
ECMA_TRY_CATCH (compare_result,
|
||||
ecma_op_abstract_relational_compare (left_value, right_value, true),
|
||||
ret_value);
|
||||
if (ecma_is_value_error (ret_value))
|
||||
{
|
||||
return ret_value;
|
||||
}
|
||||
|
||||
if (ecma_is_value_undefined (compare_result))
|
||||
if (ecma_is_value_undefined (ret_value))
|
||||
{
|
||||
ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
JERRY_ASSERT (ecma_is_value_boolean (compare_result));
|
||||
JERRY_ASSERT (ecma_is_value_boolean (ret_value));
|
||||
|
||||
if (ecma_is_value_true (compare_result))
|
||||
{
|
||||
ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_TRUE);
|
||||
}
|
||||
ret_value = ecma_invert_boolean_value (ret_value);
|
||||
}
|
||||
|
||||
ECMA_FINALIZE (compare_result);
|
||||
|
||||
return ret_value;
|
||||
} /* opfunc_greater_or_equal_than */
|
||||
|
||||
|
||||
@@ -80,9 +80,8 @@ ecma_value_t
|
||||
opfunc_logical_not (ecma_value_t left_value) /**< left value */
|
||||
{
|
||||
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_TRUE);
|
||||
ecma_value_t to_bool_value = ecma_op_to_boolean (left_value);
|
||||
|
||||
if (ecma_is_value_true (to_bool_value))
|
||||
if (ecma_op_to_boolean (left_value))
|
||||
{
|
||||
ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE);
|
||||
}
|
||||
|
||||
+9
-9
@@ -1498,26 +1498,26 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
|
||||
{
|
||||
uint32_t opcode_flags = VM_OC_GROUP_GET_INDEX (opcode_data) - VM_OC_BRANCH_IF_TRUE;
|
||||
|
||||
last_completion_value = ecma_op_to_boolean (left_value);
|
||||
bool boolean_value = ecma_op_to_boolean (left_value);
|
||||
|
||||
if (ecma_is_value_error (last_completion_value))
|
||||
if (opcode_flags & VM_OC_BRANCH_IF_FALSE_FLAG)
|
||||
{
|
||||
goto error;
|
||||
boolean_value = !boolean_value;
|
||||
}
|
||||
|
||||
bool branch_if_false = (opcode_flags & VM_OC_BRANCH_IF_FALSE_FLAG);
|
||||
|
||||
if (last_completion_value == ecma_make_simple_value (branch_if_false ? ECMA_SIMPLE_VALUE_FALSE
|
||||
: ECMA_SIMPLE_VALUE_TRUE))
|
||||
if (boolean_value)
|
||||
{
|
||||
byte_code_p = byte_code_start_p + branch_offset;
|
||||
if (opcode_flags & VM_OC_LOGICAL_BRANCH_FLAG)
|
||||
{
|
||||
left_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED);
|
||||
/* "Push" the left_value back to the stack. */
|
||||
++stack_top_p;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
ecma_fast_free_value (left_value);
|
||||
continue;
|
||||
}
|
||||
case VM_OC_PLUS:
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user