Author: [email protected]
Date: Fri Dec 12 02:45:08 2008
New Revision: 972

Added:
    changes/
    changes/[email protected]/
    changes/[email protected]/b2v6/
    changes/[email protected]/b2v6/toiger/
       - copied from r971, /branches/experimental/toiger/
Modified:
    changes/[email protected]/b2v6/toiger/src/virtual-frame-ia32.cc
    changes/[email protected]/b2v6/toiger/src/virtual-frame-ia32.h

Log:
Mergee virtual frames by copying registers to registers.


Modified:  
changes/[email protected]/b2v6/toiger/src/virtual-frame-ia32.cc
==============================================================================
--- /branches/experimental/toiger/src/virtual-frame-ia32.cc     (original)
+++ changes/[email protected]/b2v6/toiger/src/virtual-frame-ia32.cc        
 
Fri Dec 12 02:45:08 2008
@@ -434,12 +434,7 @@
      }
    }

-  // Then register-to-register moves, not yet implemented.
-  for (int i = 0; i < elements_.length(); i++) {
-    FrameElement source = elements_[i];
-    FrameElement target = expected->elements_[i];
-    ASSERT(!source.is_register() || !target.is_register());
-  }
+  MergeMoveRegistersToRegisters(expected);

    // Finally, constant-to-register and memory-to-register.  We do these  
from
    // the top down so we can use pop for memory-to-register moves above the
@@ -502,6 +497,61 @@
      }
    }
  #endif
+}
+
+
+void VirtualFrame::MergeMoveRegistersToRegisters(VirtualFrame *expected) {
+  int start = 0;
+  int end = elements_.length() - 1;
+  bool any_moves_blocked; // Did we fail to make some moves this iteration?
+  bool should_break_cycles = false;
+  bool any_moves_made; // Did we make any progress this iteration?
+  do {
+    any_moves_blocked = false;
+    any_moves_made = false;
+    int first_move_blocked = kIllegalIndex;
+    int last_move_blocked = kIllegalIndex;
+    for (int i = start; i <= end; i++) {
+      FrameElement source = elements_[i];
+      FrameElement target = expected->elements_[i];
+      if (source.is_register() && target.is_register() &&
+          !target.reg().is(source.reg())) {
+        // We need to move source to target.
+        if (frame_registers_.is_used(target.reg().code())) {
+          // The move is blocked because the target contains valid data.
+          // If we are stuck with only cycles remaining, then we spill  
source.
+          // Otherwise, we just need more iterations.
+          if (should_break_cycles) {
+            SpillElementAt(i);
+            should_break_cycles = false;
+          } else {  // Record a blocked move.
+            if (!any_moves_blocked) {
+              first_move_blocked = i;
+            }
+            last_move_blocked = i;
+            any_moves_blocked = true;
+          }
+        } else {
+          // The move is not blocked.  This frame element can be moved from
+          // its source register to its target register.
+          Use(target.reg());
+          Unuse(source.reg());
+          if (target.is_synced() && !source.is_synced()) {
+            SyncElementAt(i);
+          }
+          elements_[i] = target;
+          __ mov(target.reg(), source.reg());
+          any_moves_made = true;
+        }
+      }
+    }
+    // Update control flags for next iteration.
+    should_break_cycles = (any_moves_blocked && !any_moves_made);
+    if (any_moves_blocked) {
+      start = first_move_blocked;
+      end = last_move_blocked;
+    }
+  } while (any_moves_blocked);
  }



Modified:  
changes/[email protected]/b2v6/toiger/src/virtual-frame-ia32.h
==============================================================================
--- /branches/experimental/toiger/src/virtual-frame-ia32.h      (original)
+++ changes/[email protected]/b2v6/toiger/src/virtual-frame-ia32.h Fri  
Dec 12 02:45:08 2008
@@ -460,6 +460,15 @@
    // Spill the topmost elements of the frame to memory (eg, they are the
    // arguments to a call) and all registers.
    void PrepareForCall(int count);
+
+  // Make the register-to-register moves necessary to
+  // merge this frame with the expected frame.
+  // Register to memory moves must already have been made,
+  // and memory to register moves must follow this call.
+  // This is because some new memory-to-register moves are
+  // created in order to break cycles of register moves.
+  // Used in the implementation of MergeTo().
+  void MergeMoveRegistersToRegisters(VirtualFrame *expected);
  };



--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to