[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#792594: libqt5qml5 requires SSE2 on i386



Hi!

On Sun, 2015-10-11 at 14:10:20 -0300, Lisandro Damián Nicanor Pérez Meyer wrote:
> Uups! This kind of changes should now go to the 5.6 branch upstream. When I 
> tried to apply it to that branch I got:
> 
> $ patch -p1 < /tmp/qml-jit-on-sse2.patch 
> patching file src/qml/qml/v8/qv8engine.cpp
> Hunk #1 FAILED at 58.
> Hunk #2 succeeded at 123 (offset 2 lines).
> 1 out of 2 hunks FAILED -- saving rejects to file 
> src/qml/qml/v8/qv8engine.cpp.rej
> patching file src/qml/jit/qv4isel_masm.cpp
> Hunk #1 succeeded at 259 (offset 61 lines).
> patching file src/qml/jsruntime/qv4engine.cpp
> Hunk #1 succeeded at 218 (offset 35 lines).
> patching file tools/qmljs/qmljs.cpp
> patching file src/qml/jit/qv4isel_masm_p.h
> Hunk #1 succeeded at 53 (offset 11 lines).
> Hunk #2 succeeded at 66 (offset 11 lines).
> 
> I looked at src/qml/qml/v8/qv8engine.cpp and changed quite a lot.
> 
> I'm afraid I would need to take this into account to be able to upstream this 
> patch :-( Can you take a look at it?

It seems to me in the end it was a trivial reject, and I don't see
anything else obviously broken. Attached a new patch against the 5.6
branch, although I've not built nor tested it as I don't have an easy
way to do so. Sorry about that.

Thanks,
Guillem
From 0c66df34a5ca87fbb179fef53787f28afe1a71af Mon Sep 17 00:00:00 2001
From: Guillem Jover <guillem@hadrons.org>
Date: Mon, 12 Oct 2015 01:45:37 +0200
Subject: [PATCH] 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 private export
function to avoid duplicating the logic, and do so in a function
instead of a class member to avoid changing the class signatures.

Bug-Debian: https://bugs.debian.org/792594
---
 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(-)

diff --git a/src/qml/jit/qv4isel_masm.cpp b/src/qml/jit/qv4isel_masm.cpp
index 5dfd891..9e28b19 100644
--- a/src/qml/jit/qv4isel_masm.cpp
+++ b/src/qml/jit/qv4isel_masm.cpp
@@ -259,6 +259,9 @@ InstructionSelection::InstructionSelection(QQmlEnginePrivate *qmlEngine, QV4::Ex
     , 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());
 }
 
diff --git a/src/qml/jit/qv4isel_masm_p.h b/src/qml/jit/qv4isel_masm_p.h
index 29749f7..19b2d26 100644
--- a/src/qml/jit/qv4isel_masm_p.h
+++ b/src/qml/jit/qv4isel_masm_p.h
@@ -53,6 +53,7 @@
 
 #include <QtCore/QHash>
 #include <QtCore/QStack>
+#include <private/qsimd_p.h>
 #include <config.h>
 #include <wtf/Vector.h>
 
@@ -65,6 +66,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
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index 6fe14da..9354e36 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -218,8 +218,8 @@ ExecutionEngine::ExecutionEngine(EvalISelFactory *factory)
     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;
diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp
index dae932e..c6d3a81 100644
--- 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_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> >();
diff --git a/tools/qmljs/qmljs.cpp b/tools/qmljs/qmljs.cpp
index 132817f..dd7571a 100644
--- a/tools/qmljs/qmljs.cpp
+++ b/tools/qmljs/qmljs.cpp
@@ -140,11 +140,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;
-- 
2.6.1


Reply to: