Skip to content

Commit 11816eb

Browse files
committed
Optimize add operation.
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
1 parent 308bb3c commit 11816eb

File tree

2 files changed

+66
-30
lines changed

2 files changed

+66
-30
lines changed

jerry-core/vm/opcodes-ecma-arithmetics.c

Lines changed: 66 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "ecma-conversion.h"
1919
#include "ecma-helpers.h"
2020
#include "ecma-number-arithmetic.h"
21+
#include "ecma-objects.h"
2122
#include "ecma-try-catch-macro.h"
2223
#include "opcodes.h"
2324
#include "jrt-libc-includes.h"
@@ -59,12 +60,6 @@ do_number_arithmetic (number_arithmetic_op op, /**< number arithmetic operation
5960
{
6061
switch (op)
6162
{
62-
case NUMBER_ARITHMETIC_ADDITION:
63-
{
64-
ecma_integer_value_t left_integer = ecma_get_integer_from_value (left_value);
65-
ecma_integer_value_t right_integer = ecma_get_integer_from_value (right_value);
66-
return ecma_make_int32_value ((int32_t) (left_integer + right_integer));
67-
}
6863
case NUMBER_ARITHMETIC_SUBSTRACTION:
6964
{
7065
ecma_integer_value_t left_integer = ecma_get_integer_from_value (left_value);
@@ -117,11 +112,6 @@ do_number_arithmetic (number_arithmetic_op op, /**< number arithmetic operation
117112

118113
switch (op)
119114
{
120-
case NUMBER_ARITHMETIC_ADDITION:
121-
{
122-
result = ecma_number_add (num_left, num_right);
123-
break;
124-
}
125115
case NUMBER_ARITHMETIC_SUBSTRACTION:
126116
{
127117
result = ecma_number_substract (num_left, num_right);
@@ -164,22 +154,58 @@ ecma_value_t
164154
opfunc_addition (ecma_value_t left_value, /**< left value */
165155
ecma_value_t right_value) /**< right value */
166156
{
157+
if (ecma_are_values_integer_numbers (left_value, right_value))
158+
{
159+
ecma_integer_value_t left_integer = ecma_get_integer_from_value (left_value);
160+
ecma_integer_value_t right_integer = ecma_get_integer_from_value (right_value);
161+
return ecma_make_int32_value ((int32_t) (left_integer + right_integer));
162+
}
163+
164+
if (ecma_is_value_number (left_value) && ecma_is_value_number (right_value))
165+
{
166+
ecma_number_t num_left = ecma_get_number_from_value (left_value);
167+
ecma_number_t num_right = ecma_get_number_from_value (right_value);
168+
return ecma_make_number_value (ecma_number_add (num_left, num_right));
169+
}
170+
171+
bool free_left_value = false;
172+
bool free_right_value = false;
173+
174+
if (ecma_is_value_object (left_value))
175+
{
176+
ecma_object_t *obj_p = ecma_get_object_from_value (left_value);
177+
left_value = ecma_op_object_default_value (obj_p, ECMA_PREFERRED_TYPE_NO);
178+
free_left_value = true;
179+
180+
if (ecma_is_value_error (left_value))
181+
{
182+
return left_value;
183+
}
184+
}
185+
186+
if (ecma_is_value_object (right_value))
187+
{
188+
ecma_object_t *obj_p = ecma_get_object_from_value (right_value);
189+
right_value = ecma_op_object_default_value (obj_p, ECMA_PREFERRED_TYPE_NO);
190+
free_right_value = true;
191+
192+
if (ecma_is_value_error (right_value))
193+
{
194+
if (free_left_value)
195+
{
196+
ecma_free_value (left_value);
197+
}
198+
return right_value;
199+
}
200+
}
201+
167202
ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY);
168203

169-
ECMA_TRY_CATCH (prim_left_value,
170-
ecma_op_to_primitive (left_value,
171-
ECMA_PREFERRED_TYPE_NO),
172-
ret_value);
173-
ECMA_TRY_CATCH (prim_right_value,
174-
ecma_op_to_primitive (right_value,
175-
ECMA_PREFERRED_TYPE_NO),
176-
ret_value);
177-
178-
if (ecma_is_value_string (prim_left_value)
179-
|| ecma_is_value_string (prim_right_value))
204+
if (ecma_is_value_string (left_value)
205+
|| ecma_is_value_string (right_value))
180206
{
181-
ECMA_TRY_CATCH (str_left_value, ecma_op_to_string (prim_left_value), ret_value);
182-
ECMA_TRY_CATCH (str_right_value, ecma_op_to_string (prim_right_value), ret_value);
207+
ECMA_TRY_CATCH (str_left_value, ecma_op_to_string (left_value), ret_value);
208+
ECMA_TRY_CATCH (str_right_value, ecma_op_to_string (right_value), ret_value);
183209

184210
ecma_string_t *string1_p = ecma_get_string_from_value (str_left_value);
185211
ecma_string_t *string2_p = ecma_get_string_from_value (str_right_value);
@@ -193,13 +219,24 @@ opfunc_addition (ecma_value_t left_value, /**< left value */
193219
}
194220
else
195221
{
196-
ret_value = do_number_arithmetic (NUMBER_ARITHMETIC_ADDITION,
197-
left_value,
198-
right_value);
222+
ECMA_OP_TO_NUMBER_TRY_CATCH (num_left, left_value, ret_value);
223+
ECMA_OP_TO_NUMBER_TRY_CATCH (num_right, right_value, ret_value);
224+
225+
ret_value = ecma_make_number_value (ecma_number_add (num_left, num_right));
226+
227+
ECMA_OP_TO_NUMBER_FINALIZE (num_right);
228+
ECMA_OP_TO_NUMBER_FINALIZE (num_left);
199229
}
200230

201-
ECMA_FINALIZE (prim_right_value);
202-
ECMA_FINALIZE (prim_left_value);
231+
if (free_left_value)
232+
{
233+
ecma_free_value (left_value);
234+
}
235+
236+
if (free_right_value)
237+
{
238+
ecma_free_value (right_value);
239+
}
203240

204241
return ret_value;
205242
} /* opfunc_addition */

jerry-core/vm/opcodes.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
*/
3333
typedef enum
3434
{
35-
NUMBER_ARITHMETIC_ADDITION, /**< addition */
3635
NUMBER_ARITHMETIC_SUBSTRACTION, /**< substraction */
3736
NUMBER_ARITHMETIC_MULTIPLICATION, /**< multiplication */
3837
NUMBER_ARITHMETIC_DIVISION, /**< division */

0 commit comments

Comments
 (0)