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

Unified Diff: runtime/vm/locations.cc

Issue 10559035: Implement a simple register allocator that tries to keep instruction results in registers. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 6 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
« runtime/vm/locations.h ('K') | « runtime/vm/locations.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/locations.cc
diff --git a/runtime/vm/locations.cc b/runtime/vm/locations.cc
index 96e7a990d761917af534ba562ac36cfb904646de..7447760c5b180d9c02cd4e3dbc27b961adf6ebf5 100644
--- a/runtime/vm/locations.cc
+++ b/runtime/vm/locations.cc
@@ -5,100 +5,18 @@
#include "vm/locations.h"
#include "vm/intermediate_language.h"
+#include "vm/flow_graph_compiler.h"
namespace dart {
-
-static Register AllocateFreeRegister(
- EmbeddedArray<bool, kNumberOfCpuRegisters>* blocked_registers) {
- for (intptr_t regno = 0; regno < kNumberOfCpuRegisters; regno++) {
- if (!blocked_registers->At(regno)) {
- blocked_registers->SetAt(regno, true);
- return static_cast<Register>(regno);
- }
- }
- UNREACHABLE();
- return kNoRegister;
-}
-
-
-void LocationSummary::AllocateRegisters() {
- EmbeddedArray<bool, kNumberOfCpuRegisters> blocked_registers;
-
- // Mark all available registers free.
- for (intptr_t i = 0; i < kNumberOfCpuRegisters; i++) {
- blocked_registers[i] = false;
- }
-
- // Mark all fixed input, temp and output registers as used.
- for (intptr_t i = 0; i < input_count(); i++) {
- Location loc = in(i);
- if (loc.kind() == Location::kRegister) {
- ASSERT(!blocked_registers[loc.reg()]);
- blocked_registers[loc.reg()] = true;
- }
- }
-
- for (intptr_t i = 0; i < temp_count(); i++) {
- Location loc = temp(i);
- if (loc.kind() == Location::kRegister) {
- ASSERT(!blocked_registers[loc.reg()]);
- blocked_registers[loc.reg()] = true;
- }
- }
-
- if (out().kind() == Location::kRegister) {
- // Fixed output registers are allowed to overlap with
- // temps and inputs.
- blocked_registers[out().reg()] = true;
- }
-
- // Do not allocate known registers.
- blocked_registers[CTX] = true;
- blocked_registers[SPREG] = true;
- blocked_registers[FPREG] = true;
- if (TMP != kNoRegister) {
- blocked_registers[TMP] = true;
- }
-
- // Allocate all unallocated input locations.
- for (intptr_t i = 0; i < input_count(); i++) {
- Location loc = in(i);
- if (loc.kind() == Location::kUnallocated) {
- ASSERT(loc.policy() == Location::kRequiresRegister);
- set_in(i, Location::RegisterLocation(
- AllocateFreeRegister(&blocked_registers)));
- }
- }
-
- // Allocate all unallocated temp locations.
- for (intptr_t i = 0; i < temp_count(); i++) {
- Location loc = temp(i);
- if (loc.kind() == Location::kUnallocated) {
- ASSERT(loc.policy() == Location::kRequiresRegister);
- set_temp(i, Location::RegisterLocation(
- AllocateFreeRegister(&blocked_registers)));
- }
- }
-
- Location result_location = out();
- if (result_location.kind() == Location::kUnallocated) {
- switch (result_location.policy()) {
- case Location::kRequiresRegister:
- result_location = Location::RegisterLocation(
- AllocateFreeRegister(&blocked_registers));
- break;
- case Location::kSameAsFirstInput:
- result_location = in(0);
- break;
- }
- set_out(result_location);
- }
-}
-
-
-LocationSummary* LocationSummary::Make(intptr_t input_count, Location out) {
- LocationSummary* summary = new LocationSummary(input_count, 0);
+LocationSummary* LocationSummary::Make(intptr_t input_count,
+ Location out,
+ ContainsCall contains_call,
+ ContainsBranch contains_branch) {
+ LocationSummary* summary = new LocationSummary(input_count,
+ 0,
+ contains_call,
+ contains_branch);
for (intptr_t i = 0; i < input_count; i++) {
summary->set_in(i, Location::RequiresRegister());
}
« runtime/vm/locations.h ('K') | « runtime/vm/locations.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698