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
-~----------~----~----~----~------~----~------~--~---