1- /* Copyright 2014 Samsung Electronics Co., Ltd.
2- * Copyright 2015 University of Szeged.
1+ /* Copyright 2014-2016 Samsung Electronics Co., Ltd.
2+ * Copyright 2015-2016 University of Szeged.
33 *
44 * Licensed under the Apache License, Version 2.0 (the "License");
55 * you may not use this file except in compliance with the License.
2424#include "ecma-globals.h"
2525#include "ecma-helpers.h"
2626
27+ #define ECMA_NUMBER_SIGN_POS (ECMA_NUMBER_FRACTION_WIDTH + \
28+ ECMA_NUMBER_BIASED_EXP_WIDTH)
29+
2730#if CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32
2831JERRY_STATIC_ASSERT (sizeof (ecma_number_t ) == sizeof (uint32_t ),
2932 size_of_ecma_number_t_must_be_equal_to_4_bytes );
@@ -38,16 +41,12 @@ ecma_number_pack (bool sign, /**< sign */
3841 uint32_t biased_exp , /**< biased exponent */
3942 uint64_t fraction ) /**< fraction */
4043{
41- const uint32_t fraction_pos = 0 ;
42- const uint32_t biased_exp_pos = fraction_pos + ECMA_NUMBER_FRACTION_WIDTH ;
43- const uint32_t sign_pos = biased_exp_pos + ECMA_NUMBER_BIASED_EXP_WIDTH ;
44-
4544 JERRY_ASSERT ((biased_exp & ~((1u << ECMA_NUMBER_BIASED_EXP_WIDTH ) - 1 )) == 0 );
4645 JERRY_ASSERT ((fraction & ~((1ull << ECMA_NUMBER_FRACTION_WIDTH ) - 1 )) == 0 );
4746
48- uint32_t packed_value = (((sign ? 1u : 0u ) << sign_pos ) |
49- (biased_exp << biased_exp_pos ) |
50- ((( uint32_t ) fraction ) << fraction_pos ));
47+ uint32_t packed_value = (((sign ? 1u : 0u ) << ECMA_NUMBER_SIGN_POS ) |
48+ (biased_exp << ECMA_NUMBER_FRACTION_WIDTH ) |
49+ ((uint32_t ) fraction ));
5150
5251 union
5352 {
@@ -69,10 +68,6 @@ ecma_number_unpack (ecma_number_t num, /**< ecma-number */
6968 uint32_t * biased_exp_p , /**< optional out: biased exponent */
7069 uint64_t * fraction_p ) /**< optional out: fraction */
7170{
72- const uint32_t fraction_pos = 0 ;
73- const uint32_t biased_exp_pos = fraction_pos + ECMA_NUMBER_FRACTION_WIDTH ;
74- const uint32_t sign_pos = biased_exp_pos + ECMA_NUMBER_BIASED_EXP_WIDTH ;
75-
7671 union
7772 {
7873 uint32_t u32_value ;
@@ -85,12 +80,12 @@ ecma_number_unpack (ecma_number_t num, /**< ecma-number */
8580
8681 if (sign_p != NULL )
8782 {
88- * sign_p = ((packed_value >> sign_pos ) != 0 );
83+ * sign_p = ((packed_value >> ECMA_NUMBER_SIGN_POS ) != 0 );
8984 }
9085
9186 if (biased_exp_p != NULL )
9287 {
93- * biased_exp_p = (((packed_value ) & ~(1u << sign_pos )) >> biased_exp_pos );
88+ * biased_exp_p = (((packed_value ) & ~(1u << ECMA_NUMBER_SIGN_POS )) >> ECMA_NUMBER_FRACTION_WIDTH );
9489 }
9590
9691 if (fraction_p != NULL )
@@ -107,10 +102,6 @@ ecma_number_unpack (ecma_number_t num, /**< ecma-number */
107102 */
108103const int32_t ecma_number_exponent_bias = 127 ;
109104
110- /**
111- * Relative precision used in calculation with ecma-numbers
112- */
113- const ecma_number_t ecma_number_relative_eps = 1.0e-10f ;
114105#elif CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT64
115106JERRY_STATIC_ASSERT (sizeof (ecma_number_t ) == sizeof (uint64_t ),
116107 size_of_ecma_number_t_must_be_equal_to_8_bytes );
@@ -125,13 +116,9 @@ ecma_number_pack (bool sign, /**< sign */
125116 uint32_t biased_exp , /**< biased exponent */
126117 uint64_t fraction ) /**< fraction */
127118{
128- const uint32_t fraction_pos = 0 ;
129- const uint32_t biased_exp_pos = fraction_pos + ECMA_NUMBER_FRACTION_WIDTH ;
130- const uint32_t sign_pos = biased_exp_pos + ECMA_NUMBER_BIASED_EXP_WIDTH ;
131-
132- uint64_t packed_value = (((sign ? 1ull : 0ull ) << sign_pos ) |
133- (((uint64_t ) biased_exp ) << biased_exp_pos ) |
134- (fraction << fraction_pos ));
119+ uint64_t packed_value = (((sign ? 1ull : 0ull ) << ECMA_NUMBER_SIGN_POS ) |
120+ (((uint64_t ) biased_exp ) << ECMA_NUMBER_FRACTION_WIDTH ) |
121+ fraction );
135122
136123 JERRY_ASSERT ((biased_exp & ~((1u << ECMA_NUMBER_BIASED_EXP_WIDTH ) - 1 )) == 0 );
137124 JERRY_ASSERT ((fraction & ~((1ull << ECMA_NUMBER_FRACTION_WIDTH ) - 1 )) == 0 );
@@ -156,10 +143,6 @@ ecma_number_unpack (ecma_number_t num, /**< ecma-number */
156143 uint32_t * biased_exp_p , /**< optional out: biased exponent */
157144 uint64_t * fraction_p ) /**< optional out: fraction */
158145{
159- const uint32_t fraction_pos = 0 ;
160- const uint32_t biased_exp_pos = fraction_pos + ECMA_NUMBER_FRACTION_WIDTH ;
161- const uint32_t sign_pos = biased_exp_pos + ECMA_NUMBER_BIASED_EXP_WIDTH ;
162-
163146 union
164147 {
165148 uint64_t u64_value ;
@@ -171,12 +154,12 @@ ecma_number_unpack (ecma_number_t num, /**< ecma-number */
171154
172155 if (sign_p != NULL )
173156 {
174- * sign_p = ((packed_value >> sign_pos ) != 0 );
157+ * sign_p = ((packed_value >> ECMA_NUMBER_SIGN_POS ) != 0 );
175158 }
176159
177160 if (biased_exp_p != NULL )
178161 {
179- * biased_exp_p = (uint32_t ) (((packed_value ) & ~(1ull << sign_pos )) >> biased_exp_pos );
162+ * biased_exp_p = (uint32_t ) (((packed_value ) & ~(1ull << ECMA_NUMBER_SIGN_POS )) >> ECMA_NUMBER_FRACTION_WIDTH );
180163 }
181164
182165 if (fraction_p != NULL )
@@ -193,10 +176,6 @@ ecma_number_unpack (ecma_number_t num, /**< ecma-number */
193176 */
194177const int32_t ecma_number_exponent_bias = 1023 ;
195178
196- /**
197- * Relative precision used in calculation with ecma-numbers
198- */
199- const ecma_number_t ecma_number_relative_eps = 1.0e-16 ;
200179#endif /* CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT64 */
201180
202181/**
@@ -638,7 +617,7 @@ ecma_number_trunc (ecma_number_t num) /**< ecma-number */
638617
639618 if (exponent < 0 )
640619 {
641- return 0 ;
620+ return ECMA_NUMBER_ZERO ;
642621 }
643622 else if (exponent < dot_shift )
644623 {
@@ -674,21 +653,18 @@ ecma_number_t
674653ecma_number_calc_remainder (ecma_number_t left_num , /**< left operand */
675654 ecma_number_t right_num ) /**< right operand */
676655{
677- ecma_number_t n = left_num , d = right_num ;
678-
679- JERRY_ASSERT (!ecma_number_is_nan (n )
680- && !ecma_number_is_zero (n )
681- && !ecma_number_is_infinity (n ));
682- JERRY_ASSERT (!ecma_number_is_nan (d )
683- && !ecma_number_is_zero (d )
684- && !ecma_number_is_infinity (d ));
685-
686- ecma_number_t q = ecma_number_trunc (ecma_number_divide (n , d ));
656+ JERRY_ASSERT (!ecma_number_is_nan (left_num )
657+ && !ecma_number_is_zero (left_num )
658+ && !ecma_number_is_infinity (left_num ));
659+ JERRY_ASSERT (!ecma_number_is_nan (right_num )
660+ && !ecma_number_is_zero (right_num )
661+ && !ecma_number_is_infinity (right_num ));
687662
688- ecma_number_t r = ecma_number_substract (n , ecma_number_multiply (d , q ));
663+ const ecma_number_t q = ecma_number_trunc (ecma_number_divide (left_num , right_num ));
664+ ecma_number_t r = ecma_number_substract (left_num , ecma_number_multiply (right_num , q ));
689665
690666 if (ecma_number_is_zero (r )
691- && ecma_number_is_negative (n ))
667+ && ecma_number_is_negative (left_num ))
692668 {
693669 r = ecma_number_negate (r );
694670 }
0 commit comments