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.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
24
24
#include "ecma-globals.h"
25
25
#include "ecma-helpers.h"
26
26
27
+ #define ECMA_NUMBER_SIGN_POS (ECMA_NUMBER_FRACTION_WIDTH + \
28
+ ECMA_NUMBER_BIASED_EXP_WIDTH)
29
+
27
30
#if CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32
28
31
JERRY_STATIC_ASSERT (sizeof (ecma_number_t ) == sizeof (uint32_t ),
29
32
size_of_ecma_number_t_must_be_equal_to_4_bytes );
@@ -38,16 +41,12 @@ ecma_number_pack (bool sign, /**< sign */
38
41
uint32_t biased_exp , /**< biased exponent */
39
42
uint64_t fraction ) /**< fraction */
40
43
{
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
-
45
44
JERRY_ASSERT ((biased_exp & ~((1u << ECMA_NUMBER_BIASED_EXP_WIDTH ) - 1 )) == 0 );
46
45
JERRY_ASSERT ((fraction & ~((1ull << ECMA_NUMBER_FRACTION_WIDTH ) - 1 )) == 0 );
47
46
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 ));
51
50
52
51
union
53
52
{
@@ -69,10 +68,6 @@ ecma_number_unpack (ecma_number_t num, /**< ecma-number */
69
68
uint32_t * biased_exp_p , /**< optional out: biased exponent */
70
69
uint64_t * fraction_p ) /**< optional out: fraction */
71
70
{
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
-
76
71
union
77
72
{
78
73
uint32_t u32_value ;
@@ -85,12 +80,12 @@ ecma_number_unpack (ecma_number_t num, /**< ecma-number */
85
80
86
81
if (sign_p != NULL )
87
82
{
88
- * sign_p = ((packed_value >> sign_pos ) != 0 );
83
+ * sign_p = ((packed_value >> ECMA_NUMBER_SIGN_POS ) != 0 );
89
84
}
90
85
91
86
if (biased_exp_p != NULL )
92
87
{
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 );
94
89
}
95
90
96
91
if (fraction_p != NULL )
@@ -107,10 +102,6 @@ ecma_number_unpack (ecma_number_t num, /**< ecma-number */
107
102
*/
108
103
const int32_t ecma_number_exponent_bias = 127 ;
109
104
110
- /**
111
- * Relative precision used in calculation with ecma-numbers
112
- */
113
- const ecma_number_t ecma_number_relative_eps = 1.0e-10f ;
114
105
#elif CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT64
115
106
JERRY_STATIC_ASSERT (sizeof (ecma_number_t ) == sizeof (uint64_t ),
116
107
size_of_ecma_number_t_must_be_equal_to_8_bytes );
@@ -125,13 +116,9 @@ ecma_number_pack (bool sign, /**< sign */
125
116
uint32_t biased_exp , /**< biased exponent */
126
117
uint64_t fraction ) /**< fraction */
127
118
{
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 );
135
122
136
123
JERRY_ASSERT ((biased_exp & ~((1u << ECMA_NUMBER_BIASED_EXP_WIDTH ) - 1 )) == 0 );
137
124
JERRY_ASSERT ((fraction & ~((1ull << ECMA_NUMBER_FRACTION_WIDTH ) - 1 )) == 0 );
@@ -156,10 +143,6 @@ ecma_number_unpack (ecma_number_t num, /**< ecma-number */
156
143
uint32_t * biased_exp_p , /**< optional out: biased exponent */
157
144
uint64_t * fraction_p ) /**< optional out: fraction */
158
145
{
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
-
163
146
union
164
147
{
165
148
uint64_t u64_value ;
@@ -171,12 +154,12 @@ ecma_number_unpack (ecma_number_t num, /**< ecma-number */
171
154
172
155
if (sign_p != NULL )
173
156
{
174
- * sign_p = ((packed_value >> sign_pos ) != 0 );
157
+ * sign_p = ((packed_value >> ECMA_NUMBER_SIGN_POS ) != 0 );
175
158
}
176
159
177
160
if (biased_exp_p != NULL )
178
161
{
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 );
180
163
}
181
164
182
165
if (fraction_p != NULL )
@@ -193,10 +176,6 @@ ecma_number_unpack (ecma_number_t num, /**< ecma-number */
193
176
*/
194
177
const int32_t ecma_number_exponent_bias = 1023 ;
195
178
196
- /**
197
- * Relative precision used in calculation with ecma-numbers
198
- */
199
- const ecma_number_t ecma_number_relative_eps = 1.0e-16 ;
200
179
#endif /* CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT64 */
201
180
202
181
/**
@@ -638,7 +617,7 @@ ecma_number_trunc (ecma_number_t num) /**< ecma-number */
638
617
639
618
if (exponent < 0 )
640
619
{
641
- return 0 ;
620
+ return ECMA_NUMBER_ZERO ;
642
621
}
643
622
else if (exponent < dot_shift )
644
623
{
@@ -674,21 +653,18 @@ ecma_number_t
674
653
ecma_number_calc_remainder (ecma_number_t left_num , /**< left operand */
675
654
ecma_number_t right_num ) /**< right operand */
676
655
{
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 ));
687
662
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 ));
689
665
690
666
if (ecma_number_is_zero (r )
691
- && ecma_number_is_negative (n ))
667
+ && ecma_number_is_negative (left_num ))
692
668
{
693
669
r = ecma_number_negate (r );
694
670
}
0 commit comments