sp[-2] = JS_NewInt32(ctx, r);
}
sp--;
- } else if (JS_VALUE_IS_BOTH_FLOAT(op1, op2)) {
- sp[-2] = __JS_NewFloat64(ctx, JS_VALUE_GET_FLOAT64(op1) +
- JS_VALUE_GET_FLOAT64(op2));
+ } else if (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op1)) ||
+ JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op2))) {
+ double d1, d2;
+ if (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op1))) {
+ d1 = JS_VALUE_GET_FLOAT64(op1);
+ } else if (JS_VALUE_GET_TAG(op1) == JS_TAG_INT) {
+ d1 = JS_VALUE_GET_INT(op1);
+ } else {
+ goto add_slow_case;
+ }
+ if (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op2))) {
+ d2 = JS_VALUE_GET_FLOAT64(op2);
+ } else if (JS_VALUE_GET_TAG(op2) == JS_TAG_INT) {
+ d2 = JS_VALUE_GET_INT(op2);
+ } else {
+ goto add_slow_case;
+ }
+ sp[-2] = __JS_NewFloat64(ctx, d1 + d2);
sp--;
} else if (JS_IsString(op1) && JS_IsString(op2)) {
sp[-2] = JS_ConcatString(ctx, op1, op2);
if (JS_IsException(sp[-1]))
goto exception;
} else {
+ add_slow_case:
sf->cur_pc = pc;
if (js_add_slow(ctx, sp))
goto exception;
sp[-2] = JS_NewInt32(ctx, r);
}
sp--;
- } else if (JS_VALUE_IS_BOTH_FLOAT(op1, op2)) {
- sp[-2] = __JS_NewFloat64(ctx, JS_VALUE_GET_FLOAT64(op1) -
- JS_VALUE_GET_FLOAT64(op2));
+ } else if (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op1)) ||
+ JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op2))) {
+ double d1, d2;
+ if (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op1))) {
+ d1 = JS_VALUE_GET_FLOAT64(op1);
+ } else if (JS_VALUE_GET_TAG(op1) == JS_TAG_INT) {
+ d1 = JS_VALUE_GET_INT(op1);
+ } else {
+ goto binary_arith_slow;
+ }
+ if (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op2))) {
+ d2 = JS_VALUE_GET_FLOAT64(op2);
+ } else if (JS_VALUE_GET_TAG(op2) == JS_TAG_INT) {
+ d2 = JS_VALUE_GET_INT(op2);
+ } else {
+ goto binary_arith_slow;
+ }
+ sp[-2] = __JS_NewFloat64(ctx, d1 - d2);
sp--;
} else {
goto binary_arith_slow;
}
sp[-2] = JS_NewInt32(ctx, r);
sp--;
- } else if (JS_VALUE_IS_BOTH_FLOAT(op1, op2)) {
- d = JS_VALUE_GET_FLOAT64(op1) * JS_VALUE_GET_FLOAT64(op2);
+ } else if (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op1)) ||
+ JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op2))) {
+ double d1, d2;
+ if (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op1))) {
+ d1 = JS_VALUE_GET_FLOAT64(op1);
+ } else if (JS_VALUE_GET_TAG(op1) == JS_TAG_INT) {
+ d1 = JS_VALUE_GET_INT(op1);
+ } else {
+ goto binary_arith_slow;
+ }
+ if (JS_TAG_IS_FLOAT64(JS_VALUE_GET_TAG(op2))) {
+ d2 = JS_VALUE_GET_FLOAT64(op2);
+ } else if (JS_VALUE_GET_TAG(op2) == JS_TAG_INT) {
+ d2 = JS_VALUE_GET_INT(op2);
+ } else {
+ goto binary_arith_slow;
+ }
+ d = d1 * d2;
mul_fp_res:
sp[-2] = __JS_NewFloat64(ctx, d);
sp--;