aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@digia.com>2014-03-28 13:08:23 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-28 13:34:51 +0100
commit3f3fbbe42651141fffd6124a5998ff072035adb1 (patch)
tree1416b32586d37d6825c13d0269dcc4e810d83ba9
parenta0f82509e47ca2b8bf625cd40b83f6582a714dce (diff)
Fix interpreter math routines.
This: qint64 result = a + b; is not equal to: qint64 result = static_cast<qint64>(a) + b; So checking if the former will overflow, and then doing the "double case", will get thrown out by an optimizing compiler. While we're in the area, optimize the X86 case a bit too. Change-Id: Idfb69b16dbaaa0ae9f013a430ff060ca789526ba Reviewed-by: Simon Hausmann <simon.hausmann@digia.com> Reviewed-by: Lars Knoll <lars.knoll@digia.com>
-rw-r--r--src/qml/jsruntime/qv4math_p.h15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/qml/jsruntime/qv4math_p.h b/src/qml/jsruntime/qv4math_p.h
index 9ddb57eaaf..a868e70c9a 100644
--- a/src/qml/jsruntime/qv4math_p.h
+++ b/src/qml/jsruntime/qv4math_p.h
@@ -73,7 +73,8 @@ static inline QMLJS_READONLY Value add_int32(int a, int b)
);
if (!overflow)
return Primitive::fromInt32(aa);
- return Primitive::fromDouble((double)a + (double)b);
+ qint64 result = static_cast<qint64>(a) + b;
+ return Primitive::fromDouble(result);
}
static inline QMLJS_READONLY Value sub_int32(int a, int b)
@@ -89,7 +90,8 @@ static inline QMLJS_READONLY Value sub_int32(int a, int b)
);
if (!overflow)
return Primitive::fromInt32(aa);
- return Primitive::fromDouble((double)a - (double)b);
+ qint64 result = static_cast<qint64>(a) - b;
+ return Primitive::fromDouble(result);
}
static inline QMLJS_READONLY Value mul_int32(int a, int b)
@@ -105,14 +107,15 @@ static inline QMLJS_READONLY Value mul_int32(int a, int b)
);
if (!overflow)
return Primitive::fromInt32(aa);
- return Primitive::fromDouble((double)a * (double)b);
+ qint64 result = static_cast<qint64>(a) * b;
+ return Primitive::fromDouble(result);
}
#else
static inline QMLJS_READONLY Value add_int32(int a, int b)
{
- qint64 result = a + b;
+ qint64 result = static_cast<qint64>(a) + b;
if (result > INT_MAX || result < INT_MIN)
return Primitive::fromDouble(result);
return Primitive::fromInt32(static_cast<int>(result));
@@ -120,7 +123,7 @@ static inline QMLJS_READONLY Value add_int32(int a, int b)
static inline QMLJS_READONLY Value sub_int32(int a, int b)
{
- qint64 result = a - b;
+ qint64 result = static_cast<qint64>(a) - b;
if (result > INT_MAX || result < INT_MIN)
return Primitive::fromDouble(result);
return Primitive::fromInt32(static_cast<int>(result));
@@ -128,7 +131,7 @@ static inline QMLJS_READONLY Value sub_int32(int a, int b)
static inline QMLJS_READONLY Value mul_int32(int a, int b)
{
- qint64 result = a * b;
+ qint64 result = static_cast<qint64>(a) * b;
if (result > INT_MAX || result < INT_MIN)
return Primitive::fromDouble(result);
return Primitive::fromInt32(static_cast<int>(result));