Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(130)

Unified Diff: runtime/vm/flow_graph_compiler.h

Issue 10696151: Skeleton of a linear scan register allocator. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: address comments Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/flow_graph_compiler.h
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 4184ecdb1453a280dea64de6039dfc769532ca4a..d3a54bbc24dc7cd9dd8a1312372225b055a4eb07 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -32,11 +32,13 @@ class DeoptimizationStub;
class FrameRegisterAllocator : public ValueObject {
public:
FrameRegisterAllocator(FlowGraphCompiler* compiler,
- bool keep_values_in_registers)
+ bool keep_values_in_registers,
+ bool is_ssa)
: compiler_(compiler),
stack_(kNumberOfCpuRegisters),
registers_(),
- keep_values_in_registers_(keep_values_in_registers) {
+ keep_values_in_registers_(keep_values_in_registers && !is_ssa),
+ is_ssa_(is_ssa) {
for (int i = 0; i < kNumberOfCpuRegisters; i++) {
registers_[i] = NULL;
}
@@ -90,10 +92,80 @@ class FrameRegisterAllocator : public ValueObject {
BindInstr* registers_[kNumberOfCpuRegisters];
const bool keep_values_in_registers_;
+ const bool is_ssa_;
DISALLOW_COPY_AND_ASSIGN(FrameRegisterAllocator);
};
+
+class ParallelMoveResolver : public ValueObject {
+ public:
+ explicit ParallelMoveResolver(FlowGraphCompiler* compiler);
+
+ // Resolve a set of parallel moves, emitting assembler instructions.
+ void EmitNativeCode(ParallelMoveInstr* parallel_move);
+
+ private:
+ // Build the initial list of moves.
+ void BuildInitialMoveList(ParallelMoveInstr* parallel_move);
+
+ // Perform the move at the moves_ index in question (possibly requiring
+ // other moves to satisfy dependencies).
+ void PerformMove(int index);
+
+ // Emit a move and remove it from the move graph.
+ void EmitMove(int index);
+
+ // Execute a move by emitting a swap of two operands. The move from
+ // source to destination is removed from the move graph.
+ void EmitSwap(int index);
+
+ // Verify the move list before performing moves.
+ void Verify();
+
+ FlowGraphCompiler* compiler_;
+
+ // List of moves not yet resolved.
+ GrowableArray<MoveOperands> moves_;
+};
+
+
+class DeoptimizationStub : public ZoneAllocated {
+ public:
+ DeoptimizationStub(intptr_t deopt_id,
+ intptr_t deopt_token_pos,
+ intptr_t try_index,
+ DeoptReasonId reason)
+ : deopt_id_(deopt_id),
+ deopt_token_pos_(deopt_token_pos),
+ try_index_(try_index),
+ reason_(reason),
+ registers_(2),
+ deoptimization_env_(NULL),
+ entry_label_() {}
+
+ void Push(Register reg) { registers_.Add(reg); }
+ Label* entry_label() { return &entry_label_; }
+
+ // Implementation is in architecture specific file.
+ void GenerateCode(FlowGraphCompiler* compiler);
+
+ void set_deoptimization_env(Environment* env) {
+ deoptimization_env_ = env;
+ }
+
+ private:
+ const intptr_t deopt_id_;
+ const intptr_t deopt_token_pos_;
+ const intptr_t try_index_;
+ const DeoptReasonId reason_;
+ GrowableArray<Register> registers_;
+ const Environment* deoptimization_env_;
+ Label entry_label_;
+
+ DISALLOW_COPY_AND_ASSIGN(DeoptimizationStub);
+};
+
} // namespace dart
#if defined(TARGET_ARCH_IA32)

Powered by Google App Engine
This is Rietveld 408576698