Prospective jump support
authorSimon Hausmann <simon.hausmann@digia.com>
Tue, 2 Oct 2012 04:49:49 +0000 (06:49 +0200)
committerSimon Hausmann <simon.hausmann@digia.com>
Tue, 2 Oct 2012 04:49:49 +0000 (06:49 +0200)
qv4isel_masm.cpp
qv4isel_masm_p.h

index 3157a21..12a2306 100644 (file)
@@ -51,7 +51,7 @@ void InstructionSelection::operator()(IR::Function *function)
 
     foreach (IR::BasicBlock *block, _function->basicBlocks) {
         _block = block;
-    //    _addrs[block] = _codePtr;
+        _addrs[block] = label();
         foreach (IR::Stmt *s, block->statements) {
             s->accept(this);
         }
@@ -64,6 +64,16 @@ void InstructionSelection::operator()(IR::Function *function)
     leaveStandardStackFrame();
     ret();
 
+    QHashIterator<IR::BasicBlock *, QVector<Jump> > it(_patches);
+    while (it.hasNext()) {
+        it.next();
+        IR::BasicBlock *block = it.key();
+        Label target = _addrs.value(block);
+        assert(target.isSet());
+        foreach (Jump jump, it.value())
+            jump.linkTo(target, this);
+    }
+
     JSC::JSGlobalData dummy;
     JSC::LinkBuffer linkBuffer(dummy, this, 0);
     foreach (CallToLink ctl, _callsToLink)
@@ -195,6 +205,8 @@ void InstructionSelection::visitMove(IR::Move *s)
 
 void InstructionSelection::visitJump(IR::Jump *s)
 {
+    if (_block->index + 1 != s->target->index)
+        _patches[s->target].append(jump());
 }
 
 void InstructionSelection::visitCJump(IR::CJump *s)
index 21138c1..4b16581 100644 (file)
@@ -143,8 +143,8 @@ private:
     uchar *_buffer;
     uchar *_code;
     uchar *_codePtr;
-    QHash<IR::BasicBlock *, QVector<uchar *> > _patches;
-    QHash<IR::BasicBlock *, uchar *> _addrs;
+    QHash<IR::BasicBlock *, QVector<Jump> > _patches;
+    QHash<IR::BasicBlock *, Label> _addrs;
     QList<CallToLink> _callsToLink;
 };