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 blocked_registers[CTX] = true; |
| 33 if (TMP != kNoRegister) { |
| 34 blocked_registers[TMP] = true; |
| 35 } |
32 | 36 |
33 // Mark all fixed registers as used. | 37 // Mark all fixed registers as used. |
34 for (intptr_t i = 0; i < count(); i++) { | 38 for (intptr_t i = 0; i < count(); i++) { |
35 Location loc = in(i); | 39 Location loc = in(i); |
36 if (loc.kind() == Location::kRegister) { | 40 if (loc.kind() == Location::kRegister) { |
37 ASSERT(!blocked_registers[loc.reg()]); | 41 ASSERT(!blocked_registers[loc.reg()]); |
38 blocked_registers[loc.reg()] = true; | 42 blocked_registers[loc.reg()] = true; |
39 } | 43 } |
40 } | 44 } |
41 | 45 |
(...skipping 18 matching lines...) Expand all Loading... |
60 result_location = in(0); | 64 result_location = in(0); |
61 break; | 65 break; |
62 } | 66 } |
63 set_out(result_location); | 67 set_out(result_location); |
64 } | 68 } |
65 } | 69 } |
66 | 70 |
67 | 71 |
68 } // namespace dart | 72 } // namespace dart |
69 | 73 |
OLD | NEW |