mirror of
https://github.com/bellard/quickjs.git
synced 2026-06-07 06:32:08 +00:00
faster add, sub and mul for mixed integer floating point operands
This commit is contained in:
parent
594f965146
commit
8e97f24044
63
quickjs.c
63
quickjs.c
@ -19733,9 +19733,24 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
|
||||
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);
|
||||
@ -19743,6 +19758,7 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
|
||||
if (JS_IsException(sp[-1]))
|
||||
goto exception;
|
||||
} else {
|
||||
add_slow_case:
|
||||
sf->cur_pc = pc;
|
||||
if (js_add_slow(ctx, sp))
|
||||
goto exception;
|
||||
@ -19813,9 +19829,24 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
|
||||
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;
|
||||
@ -19845,8 +19876,24 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
|
||||
}
|
||||
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--;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user