Chromium Code Reviews| 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/globals.h" // Needed here to get TARGET_ARCH_XXX. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_XXX. |
| 6 | 6 |
| 7 #include "vm/flow_graph_compiler.h" | 7 #include "vm/flow_graph_compiler.h" |
| 8 | 8 |
| 9 #include "vm/dart_entry.h" | 9 #include "vm/dart_entry.h" |
| 10 #include "vm/debugger.h" | 10 #include "vm/debugger.h" |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 198 } | 198 } |
| 199 | 199 |
| 200 | 200 |
| 201 bool FlowGraphCompiler::IsNextBlock(BlockEntryInstr* block_entry) const { | 201 bool FlowGraphCompiler::IsNextBlock(BlockEntryInstr* block_entry) const { |
| 202 intptr_t current_index = reverse_index(current_block()->postorder_number()); | 202 intptr_t current_index = reverse_index(current_block()->postorder_number()); |
| 203 return (current_index < (block_order().length() - 1)) && | 203 return (current_index < (block_order().length() - 1)) && |
| 204 (block_order()[current_index + 1] == block_entry); | 204 (block_order()[current_index + 1] == block_entry); |
| 205 } | 205 } |
| 206 | 206 |
| 207 | 207 |
| 208 void FlowGraphCompiler::SaveLiveRegisters(LocationSummary* locs) { | |
| 209 // TODO(vegorov): consider saving only caller save (volatile) registers. | |
| 210 for (intptr_t reg_idx = 0; reg_idx < kNumberOfCpuRegisters; ++reg_idx) { | |
| 211 Register reg = static_cast<Register>(reg_idx); | |
| 212 if (locs->live_registers()->Contains(reg)) { | |
| 213 assembler()->PushRegister(reg); | |
|
srdjan
2012/08/15 00:12:03
How does GC work here, e.g., if a register contain
Kevin Millikin (Google)
2012/08/15 08:02:15
Exactly. It works now but needs to be changed whe
| |
| 214 } | |
| 215 } | |
| 216 } | |
| 217 | |
| 218 | |
| 219 void FlowGraphCompiler::RestoreLiveRegisters(LocationSummary* locs) { | |
| 220 for (intptr_t reg_idx = kNumberOfCpuRegisters - 1; reg_idx >= 0; --reg_idx) { | |
| 221 Register reg = static_cast<Register>(reg_idx); | |
| 222 if (locs->live_registers()->Contains(reg)) { | |
| 223 assembler()->PopRegister(reg); | |
| 224 } | |
| 225 } | |
| 226 } | |
| 227 | |
| 228 | |
| 229 void FlowGraphCompiler::AddSlowPathCode(SlowPathCode* code) { | |
| 230 slow_path_code_.Add(code); | |
| 231 } | |
| 232 | |
| 233 | |
| 208 void FlowGraphCompiler::GenerateDeferredCode() { | 234 void FlowGraphCompiler::GenerateDeferredCode() { |
| 235 for (intptr_t i = 0; i < slow_path_code_.length(); i++) { | |
| 236 slow_path_code_[i]->EmitNativeCode(this); | |
| 237 } | |
| 209 for (intptr_t i = 0; i < deopt_stubs_.length(); i++) { | 238 for (intptr_t i = 0; i < deopt_stubs_.length(); i++) { |
| 210 deopt_stubs_[i]->GenerateCode(this, i); | 239 deopt_stubs_[i]->GenerateCode(this, i); |
| 211 } | 240 } |
| 212 } | 241 } |
| 213 | 242 |
| 214 | 243 |
| 215 void FlowGraphCompiler::AddExceptionHandler(intptr_t try_index, | 244 void FlowGraphCompiler::AddExceptionHandler(intptr_t try_index, |
| 216 intptr_t pc_offset) { | 245 intptr_t pc_offset) { |
| 217 exception_handlers_list_->AddHandler(try_index, pc_offset); | 246 exception_handlers_list_->AddHandler(try_index, pc_offset); |
| 218 } | 247 } |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 671 locs->set_in(i, Location::RegisterLocation(reg)); | 700 locs->set_in(i, Location::RegisterLocation(reg)); |
| 672 } | 701 } |
| 673 | 702 |
| 674 // Inputs are consumed from the simulated frame. In case of a call argument | 703 // Inputs are consumed from the simulated frame. In case of a call argument |
| 675 // we leave it until the call instruction. | 704 // we leave it until the call instruction. |
| 676 if (!instr->IsPushArgument()) Pop(reg, instr->InputAt(i)); | 705 if (!instr->IsPushArgument()) Pop(reg, instr->InputAt(i)); |
| 677 } | 706 } |
| 678 | 707 |
| 679 // If this instruction is call spill everything that was not consumed by | 708 // If this instruction is call spill everything that was not consumed by |
| 680 // input locations. | 709 // input locations. |
| 681 if (locs->is_call() || instr->IsBranch() || instr->IsGoto()) { | 710 if (locs->contains_call() || instr->IsBranch() || instr->IsGoto()) { |
| 682 Spill(); | 711 Spill(); |
| 683 } | 712 } |
| 684 | 713 |
| 685 // Allocate all unallocated temp locations. | 714 // Allocate all unallocated temp locations. |
| 686 for (intptr_t i = 0; i < locs->temp_count(); i++) { | 715 for (intptr_t i = 0; i < locs->temp_count(); i++) { |
| 687 Location loc = locs->temp(i); | 716 Location loc = locs->temp(i); |
| 688 if (loc.IsUnallocated()) { | 717 if (loc.IsUnallocated()) { |
| 689 ASSERT(loc.policy() == Location::kRequiresRegister); | 718 ASSERT(loc.policy() == Location::kRequiresRegister); |
| 690 loc = Location::RegisterLocation( | 719 loc = Location::RegisterLocation( |
| 691 AllocateFreeRegister(blocked_registers)); | 720 AllocateFreeRegister(blocked_registers)); |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 868 return; | 897 return; |
| 869 } | 898 } |
| 870 } | 899 } |
| 871 | 900 |
| 872 // This move is not blocked. | 901 // This move is not blocked. |
| 873 EmitMove(index); | 902 EmitMove(index); |
| 874 } | 903 } |
| 875 | 904 |
| 876 | 905 |
| 877 } // namespace dart | 906 } // namespace dart |
| OLD | NEW |