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
+30 -52
View File
@@ -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 */