| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/locations.h" | 5 #include "vm/locations.h" |
| 6 | 6 |
| 7 #include "vm/intermediate_language.h" | 7 #include "vm/intermediate_language.h" |
| 8 | 8 |
| 9 namespace dart { | 9 namespace dart { |
| 10 | 10 |
| 11 | 11 |
| 12 static Register AllocateFreeRegister( | 12 static Register AllocateFreeRegister( |
| 13 EmbeddedArray<bool, kNumberOfCpuRegisters>* blocked_registers) { | 13 EmbeddedArray<bool, kNumberOfCpuRegisters>* blocked_registers) { |
| 14 for (intptr_t regno = 0; regno < kNumberOfCpuRegisters; regno++) { | 14 for (intptr_t regno = 0; regno < kNumberOfCpuRegisters; regno++) { |
| 15 if (!blocked_registers->At(regno)) { | 15 if (!blocked_registers->At(regno)) { |
| 16 blocked_registers->SetAt(regno, true); | 16 blocked_registers->SetAt(regno, true); |
| 17 return static_cast<Register>(regno); | 17 return static_cast<Register>(regno); |
| 18 } | 18 } |
| 19 } | 19 } |
| 20 UNREACHABLE(); | 20 UNREACHABLE(); |
| 21 return kNoRegister; | 21 return kNoRegister; |
| 22 } | 22 } |
| 23 | 23 |
| 24 | 24 |
| 25 void LocationSummary::AllocateRegisters() { | 25 void LocationSummary::AllocateRegisters() { |
| 26 EmbeddedArray<bool, kNumberOfCpuRegisters> blocked_registers; | 26 EmbeddedArray<bool, kNumberOfCpuRegisters> blocked_registers; |
| 27 | 27 |
| 28 // Mark all registers free. | 28 // Mark all available registers free. |
| 29 for (intptr_t i = 0; i < kNumberOfCpuRegisters; i++) { | 29 for (intptr_t i = 0; i < kNumberOfCpuRegisters; i++) { |
| 30 blocked_registers[i] = false; | 30 blocked_registers[i] = false; |
| 31 } | 31 } |
| 32 | 32 |
| 33 // Mark all fixed registers as used. | 33 // Mark all fixed registers as used. |
| 34 for (intptr_t i = 0; i < count(); i++) { | 34 for (intptr_t i = 0; i < count(); i++) { |
| 35 Location loc = in(i); | 35 Location loc = in(i); |
| 36 if (loc.kind() == Location::kRegister) { | 36 if (loc.kind() == Location::kRegister) { |
| 37 ASSERT(!blocked_registers[loc.reg()]); | 37 ASSERT(!blocked_registers[loc.reg()]); |
| 38 blocked_registers[loc.reg()] = true; | 38 blocked_registers[loc.reg()] = true; |
| 39 } | 39 } |
| 40 } | 40 } |
| 41 | 41 |
| 42 // Do not allocate known registers. |
| 43 blocked_registers[CTX] = true; |
| 44 if (TMP != kNoRegister) { |
| 45 blocked_registers[TMP] = true; |
| 46 } |
| 47 |
| 42 // Allocate all unallocated input locations. | 48 // Allocate all unallocated input locations. |
| 43 for (intptr_t i = 0; i < count(); i++) { | 49 for (intptr_t i = 0; i < count(); i++) { |
| 44 Location loc = in(i); | 50 Location loc = in(i); |
| 45 if (loc.kind() == Location::kUnallocated) { | 51 if (loc.kind() == Location::kUnallocated) { |
| 46 ASSERT(loc.policy() == Location::kRequiresRegister); | 52 ASSERT(loc.policy() == Location::kRequiresRegister); |
| 47 set_in(i, Location::RegisterLocation( | 53 set_in(i, Location::RegisterLocation( |
| 48 AllocateFreeRegister(&blocked_registers))); | 54 AllocateFreeRegister(&blocked_registers))); |
| 49 } | 55 } |
| 50 } | 56 } |
| 51 | 57 |
| 52 Location result_location = out(); | 58 Location result_location = out(); |
| 53 if (result_location.kind() == Location::kUnallocated) { | 59 if (result_location.kind() == Location::kUnallocated) { |
| 54 switch (result_location.policy()) { | 60 switch (result_location.policy()) { |
| 55 case Location::kRequiresRegister: | 61 case Location::kRequiresRegister: |
| 56 result_location = Location::RegisterLocation( | 62 result_location = Location::RegisterLocation( |
| 57 AllocateFreeRegister(&blocked_registers)); | 63 AllocateFreeRegister(&blocked_registers)); |
| 58 break; | 64 break; |
| 59 case Location::kSameAsFirstInput: | 65 case Location::kSameAsFirstInput: |
| 60 result_location = in(0); | 66 result_location = in(0); |
| 61 break; | 67 break; |
| 62 } | 68 } |
| 63 set_out(result_location); | 69 set_out(result_location); |
| 64 } | 70 } |
| 65 } | 71 } |
| 66 | 72 |
| 67 | 73 |
| 68 } // namespace dart | 74 } // namespace dart |
| 69 | 75 |
| OLD | NEW |