Extracting ecma_number_trunc helper from ecma_op_number_remainder.

This commit is contained in:
Ruben Ayrapetyan 2014-10-20 20:34:19 +04:00
parent 42abd7d63a
commit 2d032a30dc
3 changed files with 47 additions and 28 deletions

View File

@ -409,6 +409,44 @@ ecma_number_negate (ecma_number_t num) /**< ecma-number */
return u.value;
} /* ecma_number_negate */
/**
* Truncate fractional part of the number
*
* @return integer part of the number
*/
ecma_number_t
ecma_number_trunc (ecma_number_t num) /**< ecma-number */
{
uint64_t fraction;
int32_t exponent;
const int32_t dot_shift = ecma_number_get_fraction_and_exponent (num, &fraction, &exponent);
const bool sign = ecma_number_is_negative (num);
if (exponent < 0)
{
return 0;
}
else if (exponent < dot_shift)
{
fraction &= ~((1ull << (dot_shift - exponent)) - 1);
ecma_number_t tmp = ecma_number_make_normal_positive_from_fraction_and_exponent (fraction,
exponent);
if (sign)
{
return ecma_number_negate (tmp);
}
else
{
return tmp;
}
}
else
{
return num;
}
} /* ecma_number_trunc */
/**
* ECMA-number addition.
*

View File

@ -137,12 +137,15 @@ extern bool ecma_number_is_nan (ecma_number_t num);
extern bool ecma_number_is_negative (ecma_number_t num);
extern bool ecma_number_is_zero (ecma_number_t num);
extern bool ecma_number_is_infinity (ecma_number_t num);
extern int32_t ecma_number_get_fraction_and_exponent (ecma_number_t num,
uint64_t *out_fraction_p,
int32_t *out_exponent_p);
extern ecma_number_t ecma_number_make_normal_positive_from_fraction_and_exponent (uint64_t fraction,
int32_t exponent);
extern int32_t
ecma_number_get_fraction_and_exponent (ecma_number_t num,
uint64_t *out_fraction_p,
int32_t *out_exponent_p);
extern ecma_number_t
ecma_number_make_normal_positive_from_fraction_and_exponent (uint64_t fraction,
int32_t exponent);
extern ecma_number_t ecma_number_negate (ecma_number_t num);
extern ecma_number_t ecma_number_trunc (ecma_number_t num);
extern ecma_number_t ecma_number_add (ecma_number_t left_num, ecma_number_t right_num);
extern ecma_number_t ecma_number_substract (ecma_number_t left_num, ecma_number_t right_num);
extern ecma_number_t ecma_number_multiply (ecma_number_t left_num, ecma_number_t right_num);

View File

@ -63,29 +63,7 @@ ecma_op_number_remainder (ecma_number_t left_num, /**< left operand */
&& !ecma_number_is_zero (d)
&& !ecma_number_is_infinity (d));
ecma_number_t q = ecma_number_divide (n, d);
uint64_t fraction;
int32_t exponent;
const int32_t dot_shift = ecma_number_get_fraction_and_exponent (q, &fraction, &exponent);
const bool sign = ecma_number_is_negative (q);
if (exponent < 0)
{
return n;
}
if (exponent < dot_shift)
{
fraction &= ~((1ull << (dot_shift - exponent)) - 1);
q = ecma_number_make_normal_positive_from_fraction_and_exponent (fraction,
exponent);
if (sign)
{
q = ecma_number_negate (q);
}
}
ecma_number_t q = ecma_number_trunc (ecma_number_divide (n, d));
return ecma_number_substract (n, ecma_number_multiply (d, q));
} /* ecma_op_number_remainder */