diff options
author | Erik Verbruggen <erik.verbruggen@digia.com> | 2014-03-28 13:08:23 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-28 13:34:51 +0100 |
commit | 3f3fbbe42651141fffd6124a5998ff072035adb1 (patch) | |
tree | 1416b32586d37d6825c13d0269dcc4e810d83ba9 | |
parent | a0f82509e47ca2b8bf625cd40b83f6582a714dce (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.h | 15 |
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)); |