Description: Do not make lack of SSE2 support on x86-32 fatal
 When an x86-32 CPU does not have SSE2 support (which is the case for
 all AMD CPUs, and older Intel CPUs), fallback to use the interpreter,
 otherwise use the JIT engine.
 .
 Even then, make the lack of SSE2 support on x86-32 fatal when trying
 to instantiate a JIT engine, which does require it.
 .
 Refactor the required CPU support check into a new privately exported
 function to avoid duplicating the logic, and do so in a function
 instead of a class member to avoid changing the class signatures.
Author: Guillem Jover <guillem@hadrons.org>
Origin: vendor
Version: 5.5.x
Bug-Debian: https://bugs.debian.org/792594
Last-Update: 2015-10-09

---
 src/qml/jit/qv4isel_masm.cpp    |    3 +++
 src/qml/jit/qv4isel_masm_p.h    |   10 ++++++++++
 src/qml/jsruntime/qv4engine.cpp |    4 ++--
 src/qml/qml/v8/qv8engine.cpp    |    7 -------
 tools/qmljs/qmljs.cpp           |    7 +++----
 5 files changed, 18 insertions(+), 13 deletions(-)

--- a/src/qml/qml/v8/qv8engine.cpp
+++ b/src/qml/qml/v8/qv8engine.cpp
@@ -59,7 +59,6 @@
 #include <QtCore/qjsonvalue.h>
 #include <QtCore/qdatetime.h>
 #include <QtCore/qdatastream.h>
-#include <private/qsimd_p.h>
 
 #include <private/qv4value_inl_p.h>
 #include <private/qv4dateobject_p.h>
@@ -123,12 +122,6 @@ QV8Engine::QV8Engine(QJSEngine* qq)
     , m_xmlHttpRequestData(0)
     , m_listModelData(0)
 {
-#ifdef Q_PROCESSOR_X86_32
-    if (!qCpuHasFeature(SSE2)) {
-        qFatal("This program requires an X86 processor that supports SSE2 extension, at least a Pentium 4 or newer");
-    }
-#endif
-
     QML_MEMORY_SCOPE_STRING("QV8Engine::QV8Engine");
     qMetaTypeId<QJSValue>();
     qMetaTypeId<QList<int> >();
--- a/src/qml/jit/qv4isel_masm.cpp
+++ b/src/qml/jit/qv4isel_masm.cpp
@@ -199,6 +199,9 @@ InstructionSelection::InstructionSelecti
     , compilationUnit(new CompilationUnit)
     , qmlEngine(qmlEngine)
 {
+    if (!hasRequiredCpuSupport())
+        qFatal("This program requires an X86 processor that supports SSE2 extension, at least a Pentium 4 or newer");
+
     compilationUnit->codeRefs.resize(module->functions.size());
 }
 
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -221,8 +221,8 @@ ExecutionEngine::ExecutionEngine(EvalISe
     if (!factory) {
 
 #ifdef V4_ENABLE_JIT
-        static const bool forceMoth = !qgetenv("QV4_FORCE_INTERPRETER").isEmpty();
-        if (forceMoth)
+        static const bool useMoth = !qgetenv("QV4_FORCE_INTERPRETER").isEmpty() || !JIT::hasRequiredCpuSupport();
+        if (useMoth)
             factory = new Moth::ISelFactory;
         else
             factory = new JIT::ISelFactory;
--- a/tools/qmljs/qmljs.cpp
+++ b/tools/qmljs/qmljs.cpp
@@ -139,11 +139,10 @@ int main(int argc, char *argv[])
     enum {
         use_masm,
         use_moth
-    } mode;
+    } mode = use_moth;
 #ifdef V4_ENABLE_JIT
-    mode = use_masm;
-#else
-    mode = use_moth;
+    if (QV4::JIT::hasRequiredCpuSupport())
+        mode = use_masm;
 #endif
 
     bool runAsQml = false;
--- a/src/qml/jit/qv4isel_masm_p.h
+++ b/src/qml/jit/qv4isel_masm_p.h
@@ -42,6 +42,7 @@
 
 #include <QtCore/QHash>
 #include <QtCore/QStack>
+#include <private/qsimd_p.h>
 #include <config.h>
 #include <wtf/Vector.h>
 
@@ -54,6 +55,15 @@ QT_BEGIN_NAMESPACE
 namespace QV4 {
 namespace JIT {
 
+inline bool Q_QML_PRIVATE_EXPORT hasRequiredCpuSupport()
+{
+#ifdef Q_PROCESSOR_X86_32
+    return qCpuHasFeature(SSE2);
+#else
+    return true;
+#endif
+}
+
 class Q_QML_EXPORT InstructionSelection:
         protected IR::IRDecoder,
         public EvalInstructionSelection
