mirror of
https://github.com/bellard/quickjs.git
synced 2025-11-17 11:05:26 +03:00
optimized add/sub int32 overflow
This commit is contained in:
32
quickjs.c
32
quickjs.c
@@ -19197,9 +19197,11 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
|
|||||||
if (likely(JS_VALUE_IS_BOTH_INT(op1, op2))) {
|
if (likely(JS_VALUE_IS_BOTH_INT(op1, op2))) {
|
||||||
int64_t r;
|
int64_t r;
|
||||||
r = (int64_t)JS_VALUE_GET_INT(op1) + JS_VALUE_GET_INT(op2);
|
r = (int64_t)JS_VALUE_GET_INT(op1) + JS_VALUE_GET_INT(op2);
|
||||||
if (unlikely((int)r != r))
|
if (unlikely((int)r != r)) {
|
||||||
goto add_slow;
|
sp[-2] = __JS_NewFloat64(ctx, (double)r);
|
||||||
sp[-2] = JS_NewInt32(ctx, r);
|
} else {
|
||||||
|
sp[-2] = JS_NewInt32(ctx, r);
|
||||||
|
}
|
||||||
sp--;
|
sp--;
|
||||||
} else if (JS_VALUE_IS_BOTH_FLOAT(op1, op2)) {
|
} else if (JS_VALUE_IS_BOTH_FLOAT(op1, op2)) {
|
||||||
sp[-2] = __JS_NewFloat64(ctx, JS_VALUE_GET_FLOAT64(op1) +
|
sp[-2] = __JS_NewFloat64(ctx, JS_VALUE_GET_FLOAT64(op1) +
|
||||||
@@ -19211,7 +19213,6 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
|
|||||||
if (JS_IsException(sp[-1]))
|
if (JS_IsException(sp[-1]))
|
||||||
goto exception;
|
goto exception;
|
||||||
} else {
|
} else {
|
||||||
add_slow:
|
|
||||||
sf->cur_pc = pc;
|
sf->cur_pc = pc;
|
||||||
if (js_add_slow(ctx, sp))
|
if (js_add_slow(ctx, sp))
|
||||||
goto exception;
|
goto exception;
|
||||||
@@ -19232,9 +19233,11 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
|
|||||||
if (likely(JS_VALUE_IS_BOTH_INT(*pv, op2))) {
|
if (likely(JS_VALUE_IS_BOTH_INT(*pv, op2))) {
|
||||||
int64_t r;
|
int64_t r;
|
||||||
r = (int64_t)JS_VALUE_GET_INT(*pv) + JS_VALUE_GET_INT(op2);
|
r = (int64_t)JS_VALUE_GET_INT(*pv) + JS_VALUE_GET_INT(op2);
|
||||||
if (unlikely((int)r != r))
|
if (unlikely((int)r != r)) {
|
||||||
goto add_loc_slow;
|
*pv = __JS_NewFloat64(ctx, (double)r);
|
||||||
*pv = JS_NewInt32(ctx, r);
|
} else {
|
||||||
|
*pv = JS_NewInt32(ctx, r);
|
||||||
|
}
|
||||||
sp--;
|
sp--;
|
||||||
} else if (JS_VALUE_IS_BOTH_FLOAT(*pv, op2)) {
|
} else if (JS_VALUE_IS_BOTH_FLOAT(*pv, op2)) {
|
||||||
*pv = __JS_NewFloat64(ctx, JS_VALUE_GET_FLOAT64(*pv) +
|
*pv = __JS_NewFloat64(ctx, JS_VALUE_GET_FLOAT64(*pv) +
|
||||||
@@ -19254,7 +19257,6 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
JSValue ops[2];
|
JSValue ops[2];
|
||||||
add_loc_slow:
|
|
||||||
/* In case of exception, js_add_slow frees ops[0]
|
/* In case of exception, js_add_slow frees ops[0]
|
||||||
and ops[1], so we must duplicate *pv */
|
and ops[1], so we must duplicate *pv */
|
||||||
sf->cur_pc = pc;
|
sf->cur_pc = pc;
|
||||||
@@ -19275,9 +19277,11 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
|
|||||||
if (likely(JS_VALUE_IS_BOTH_INT(op1, op2))) {
|
if (likely(JS_VALUE_IS_BOTH_INT(op1, op2))) {
|
||||||
int64_t r;
|
int64_t r;
|
||||||
r = (int64_t)JS_VALUE_GET_INT(op1) - JS_VALUE_GET_INT(op2);
|
r = (int64_t)JS_VALUE_GET_INT(op1) - JS_VALUE_GET_INT(op2);
|
||||||
if (unlikely((int)r != r))
|
if (unlikely((int)r != r)) {
|
||||||
goto binary_arith_slow;
|
sp[-2] = __JS_NewFloat64(ctx, (double)r);
|
||||||
sp[-2] = JS_NewInt32(ctx, r);
|
} else {
|
||||||
|
sp[-2] = JS_NewInt32(ctx, r);
|
||||||
|
}
|
||||||
sp--;
|
sp--;
|
||||||
} else if (JS_VALUE_IS_BOTH_FLOAT(op1, op2)) {
|
} else if (JS_VALUE_IS_BOTH_FLOAT(op1, op2)) {
|
||||||
sp[-2] = __JS_NewFloat64(ctx, JS_VALUE_GET_FLOAT64(op1) -
|
sp[-2] = __JS_NewFloat64(ctx, JS_VALUE_GET_FLOAT64(op1) -
|
||||||
@@ -19373,6 +19377,8 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
|
|||||||
op1 = sp[-1];
|
op1 = sp[-1];
|
||||||
tag = JS_VALUE_GET_TAG(op1);
|
tag = JS_VALUE_GET_TAG(op1);
|
||||||
if (tag == JS_TAG_INT || JS_TAG_IS_FLOAT64(tag)) {
|
if (tag == JS_TAG_INT || JS_TAG_IS_FLOAT64(tag)) {
|
||||||
|
} else if (tag == JS_TAG_NULL || tag == JS_TAG_BOOL) {
|
||||||
|
sp[-1] = JS_NewInt32(ctx, JS_VALUE_GET_INT(op1));
|
||||||
} else {
|
} else {
|
||||||
sf->cur_pc = pc;
|
sf->cur_pc = pc;
|
||||||
if (js_unary_arith_slow(ctx, sp, opcode))
|
if (js_unary_arith_slow(ctx, sp, opcode))
|
||||||
@@ -19388,7 +19394,9 @@ static JSValue JS_CallInternal(JSContext *caller_ctx, JSValueConst func_obj,
|
|||||||
double d;
|
double d;
|
||||||
op1 = sp[-1];
|
op1 = sp[-1];
|
||||||
tag = JS_VALUE_GET_TAG(op1);
|
tag = JS_VALUE_GET_TAG(op1);
|
||||||
if (tag == JS_TAG_INT) {
|
if (tag == JS_TAG_INT ||
|
||||||
|
tag == JS_TAG_BOOL ||
|
||||||
|
tag == JS_TAG_NULL) {
|
||||||
val = JS_VALUE_GET_INT(op1);
|
val = JS_VALUE_GET_INT(op1);
|
||||||
/* Note: -0 cannot be expressed as integer */
|
/* Note: -0 cannot be expressed as integer */
|
||||||
if (unlikely(val == 0)) {
|
if (unlikely(val == 0)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user