V4 IR: fix printing with register information.
authorErik Verbruggen <erik.verbruggen@digia.com>
Fri, 27 Jun 2014 13:10:39 +0000 (15:10 +0200)
committerErik Verbruggen <erik.verbruggen@digia.com>
Thu, 24 Jul 2014 09:13:32 +0000 (11:13 +0200)
The register numbers for non-FP registers overlap with the FP ones. So
when keying a single mapping on number, this resulted in the FP ones
overwriting the non-FP ones. This patch splits the mapping in two.

Change-Id: I95042b52a423eaaa96ed55d6c8ef12a2eb99f191
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/qml/jit/qv4regalloc.cpp

index 8dfd24c..52c2936 100644 (file)
@@ -99,7 +99,8 @@ protected:
 class IRPrinterWithRegisters: public IRPrinterWithPositions
 {
     const RegisterInformation &_registerInformation;
-    QHash<int, const RegisterInfo *> _infoForRegister;
+    QHash<int, const RegisterInfo *> _infoForRegularRegister;
+    QHash<int, const RegisterInfo *> _infoForFPRegister;
 
 public:
     IRPrinterWithRegisters(QTextStream *out, const LifeTimeIntervals::Ptr &intervals,
@@ -108,8 +109,12 @@ public:
         , _registerInformation(registerInformation)
     {
         for (int i = 0, ei = _registerInformation.size(); i != ei; ++i)
-            _infoForRegister.insert(_registerInformation.at(i).reg<int>(),
-                                    &_registerInformation.at(i));
+            if (_registerInformation.at(i).isRegularRegister())
+                _infoForRegularRegister.insert(_registerInformation.at(i).reg<int>(),
+                                               &_registerInformation.at(i));
+            else
+                _infoForFPRegister.insert(_registerInformation.at(i).reg<int>(),
+                                          &_registerInformation.at(i));
     }
 
 protected:
@@ -117,7 +122,8 @@ protected:
     {
         switch (e->kind) {
         case Temp::PhysicalRegister: {
-            const RegisterInfo *ri = _infoForRegister.value(e->index, 0);
+            const RegisterInfo *ri = e->type == DoubleType ? _infoForFPRegister.value(e->index, 0)
+                                                           : _infoForRegularRegister.value(e->index, 0);
             if (ri) {
                 *out << dumpStart(e);
                 *out << ri->prettyName();