Compacting some ecma_number_* helpers, allowing NaN in argument of ecma_number_negate, using ecma_number_negate instead of immediate unary minus in ecma_number_substract.
This commit is contained in:
@@ -359,14 +359,7 @@ opfunc_unary_minus (opcode_t opdata, /**< operation data */
|
|||||||
var_p = (ecma_number_t*) ECMA_GET_NON_NULL_POINTER (num_value.u.value.value);
|
var_p = (ecma_number_t*) ECMA_GET_NON_NULL_POINTER (num_value.u.value.value);
|
||||||
|
|
||||||
res_p = ecma_alloc_number ();
|
res_p = ecma_alloc_number ();
|
||||||
if (ecma_number_is_nan (*var_p))
|
*res_p = ecma_number_negate (*var_p);
|
||||||
{
|
|
||||||
*res_p = *var_p;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*res_p = ecma_number_negate (*var_p);
|
|
||||||
}
|
|
||||||
ret_value = set_variable_value (int_data,
|
ret_value = set_variable_value (int_data,
|
||||||
dst_var_idx,
|
dst_var_idx,
|
||||||
ecma_make_number_value (res_p));
|
ecma_make_number_value (res_p));
|
||||||
|
|||||||
@@ -299,13 +299,20 @@ ecma_number_get_sign_field (ecma_number_t num) /**< ecma-number */
|
|||||||
bool
|
bool
|
||||||
ecma_number_is_nan (ecma_number_t num) /**< ecma-number */
|
ecma_number_is_nan (ecma_number_t num) /**< ecma-number */
|
||||||
{
|
{
|
||||||
|
bool is_nan = (num != num);
|
||||||
|
|
||||||
|
#ifndef JERRY_NDEBUG
|
||||||
uint32_t biased_exp = ecma_number_get_biased_exponent_field (num);
|
uint32_t biased_exp = ecma_number_get_biased_exponent_field (num);
|
||||||
uint64_t fraction = ecma_number_get_fraction_field (num);
|
uint64_t fraction = ecma_number_get_fraction_field (num);
|
||||||
|
|
||||||
/* IEEE-754 2008, 3.4, a */
|
/* IEEE-754 2008, 3.4, a */
|
||||||
|
bool is_nan_ieee754 = ((biased_exp == (1u << ECMA_NUMBER_BIASED_EXP_WIDTH) - 1)
|
||||||
|
&& (fraction != 0));
|
||||||
|
|
||||||
return ((biased_exp == (1u << ECMA_NUMBER_BIASED_EXP_WIDTH) - 1)
|
JERRY_ASSERT (is_nan == is_nan_ieee754);
|
||||||
&& (fraction != 0));
|
#endif /* !JERRY_NDEBUG */
|
||||||
|
|
||||||
|
return is_nan;
|
||||||
} /* ecma_number_is_nan */
|
} /* ecma_number_is_nan */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -331,9 +338,20 @@ ecma_number_t
|
|||||||
ecma_number_make_infinity (bool sign) /**< true - for negative Infinity,
|
ecma_number_make_infinity (bool sign) /**< true - for negative Infinity,
|
||||||
false - for positive Infinity */
|
false - for positive Infinity */
|
||||||
{
|
{
|
||||||
return ecma_number_pack (sign,
|
const ecma_number_t positive_infinity = ECMA_NUMBER_ONE / ECMA_NUMBER_ZERO;
|
||||||
(1u << ECMA_NUMBER_BIASED_EXP_WIDTH) - 1u,
|
const ecma_number_t negative_infinity = ecma_number_negate (positive_infinity);
|
||||||
0u);
|
|
||||||
|
ecma_number_t sign_infinity = (sign ? negative_infinity : positive_infinity);
|
||||||
|
|
||||||
|
#ifndef JERRY_NDEBUG
|
||||||
|
ecma_number_t sign_infinity_ieee754 = ecma_number_pack (sign,
|
||||||
|
(1u << ECMA_NUMBER_BIASED_EXP_WIDTH) - 1u,
|
||||||
|
0u);
|
||||||
|
|
||||||
|
JERRY_ASSERT (sign_infinity == sign_infinity_ieee754);
|
||||||
|
#endif /* !JERRY_NDEBUG */
|
||||||
|
|
||||||
|
return sign_infinity;
|
||||||
} /* ecma_number_make_infinity */
|
} /* ecma_number_make_infinity */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -348,7 +366,6 @@ ecma_number_is_negative (ecma_number_t num) /**< ecma-number */
|
|||||||
JERRY_ASSERT (!ecma_number_is_nan (num));
|
JERRY_ASSERT (!ecma_number_is_nan (num));
|
||||||
|
|
||||||
/* IEEE-754 2008, 3.4 */
|
/* IEEE-754 2008, 3.4 */
|
||||||
|
|
||||||
return (ecma_number_get_sign_field (num) != 0);
|
return (ecma_number_get_sign_field (num) != 0);
|
||||||
} /* ecma_number_is_negative */
|
} /* ecma_number_is_negative */
|
||||||
|
|
||||||
@@ -363,10 +380,17 @@ ecma_number_is_zero (ecma_number_t num) /**< ecma-number */
|
|||||||
{
|
{
|
||||||
JERRY_ASSERT (!ecma_number_is_nan (num));
|
JERRY_ASSERT (!ecma_number_is_nan (num));
|
||||||
|
|
||||||
/* IEEE-754 2008, 3.4, e */
|
bool is_zero = (num == ECMA_NUMBER_ZERO);
|
||||||
|
|
||||||
return (ecma_number_get_fraction_field (num) == 0
|
#ifndef JERRY_NDEBUG
|
||||||
&& ecma_number_get_biased_exponent_field (num) == 0);
|
/* IEEE-754 2008, 3.4, e */
|
||||||
|
bool is_zero_ieee754 = (ecma_number_get_fraction_field (num) == 0
|
||||||
|
&& ecma_number_get_biased_exponent_field (num) == 0);
|
||||||
|
|
||||||
|
JERRY_ASSERT (is_zero == is_zero_ieee754);
|
||||||
|
#endif /* !JERRY_NDEBUG */
|
||||||
|
|
||||||
|
return is_zero;
|
||||||
} /* ecma_number_is_zero */
|
} /* ecma_number_is_zero */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -381,13 +405,24 @@ ecma_number_is_infinity (ecma_number_t num) /**< ecma-number */
|
|||||||
{
|
{
|
||||||
JERRY_ASSERT (!ecma_number_is_nan (num));
|
JERRY_ASSERT (!ecma_number_is_nan (num));
|
||||||
|
|
||||||
|
const ecma_number_t positive_infinity = ECMA_NUMBER_ONE / ECMA_NUMBER_ZERO;
|
||||||
|
const ecma_number_t negative_infinity = -positive_infinity;
|
||||||
|
|
||||||
|
bool is_infinity = (num == positive_infinity || num == negative_infinity);
|
||||||
|
|
||||||
|
#ifndef JERRY_NDEBUG
|
||||||
uint32_t biased_exp = ecma_number_get_biased_exponent_field (num);
|
uint32_t biased_exp = ecma_number_get_biased_exponent_field (num);
|
||||||
uint64_t fraction = ecma_number_get_fraction_field (num);
|
uint64_t fraction = ecma_number_get_fraction_field (num);
|
||||||
|
|
||||||
/* IEEE-754 2008, 3.4, b */
|
/* IEEE-754 2008, 3.4, b */
|
||||||
|
|
||||||
return ((biased_exp == (1u << ECMA_NUMBER_BIASED_EXP_WIDTH) - 1)
|
bool is_infinity_ieee754 = ((biased_exp == (1u << ECMA_NUMBER_BIASED_EXP_WIDTH) - 1)
|
||||||
&& (fraction == 0));
|
&& (fraction == 0));
|
||||||
|
|
||||||
|
JERRY_ASSERT (is_infinity == is_infinity_ieee754);
|
||||||
|
#endif /* !JERRY_NDEBUG */
|
||||||
|
|
||||||
|
return is_infinity;
|
||||||
} /* ecma_number_is_infinity */
|
} /* ecma_number_is_infinity */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -635,8 +670,9 @@ ecma_number_get_next (ecma_number_t num) /**< ecma-number */
|
|||||||
ecma_number_t
|
ecma_number_t
|
||||||
ecma_number_negate (ecma_number_t num) /**< ecma-number */
|
ecma_number_negate (ecma_number_t num) /**< ecma-number */
|
||||||
{
|
{
|
||||||
JERRY_ASSERT (!ecma_number_is_nan (num));
|
ecma_number_t negated = -num;
|
||||||
|
|
||||||
|
#ifndef JERRY_NDEBUG
|
||||||
bool sign;
|
bool sign;
|
||||||
uint32_t biased_exp;
|
uint32_t biased_exp;
|
||||||
uint64_t fraction;
|
uint64_t fraction;
|
||||||
@@ -645,7 +681,14 @@ ecma_number_negate (ecma_number_t num) /**< ecma-number */
|
|||||||
|
|
||||||
sign = !sign;
|
sign = !sign;
|
||||||
|
|
||||||
return ecma_number_pack (sign, biased_exp, fraction);
|
ecma_number_t negated_ieee754 = ecma_number_pack (sign, biased_exp, fraction);
|
||||||
|
|
||||||
|
JERRY_ASSERT (negated == negated_ieee754
|
||||||
|
|| (ecma_number_is_nan (negated)
|
||||||
|
&& ecma_number_is_nan (negated_ieee754)));
|
||||||
|
#endif /* !JERRY_NDEBUG */
|
||||||
|
|
||||||
|
return negated;
|
||||||
} /* ecma_number_negate */
|
} /* ecma_number_negate */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -707,7 +750,7 @@ ecma_number_t
|
|||||||
ecma_number_substract (ecma_number_t left_num, /**< left operand */
|
ecma_number_substract (ecma_number_t left_num, /**< left operand */
|
||||||
ecma_number_t right_num) /**< right operand */
|
ecma_number_t right_num) /**< right operand */
|
||||||
{
|
{
|
||||||
return ecma_number_add (left_num, -right_num);
|
return ecma_number_add (left_num, ecma_number_negate (right_num));
|
||||||
} /* ecma_number_substract */
|
} /* ecma_number_substract */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user