| 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 637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 648 } | 648 } |
| 649 | 649 |
| 650 // Allocate all unallocated input locations. | 650 // Allocate all unallocated input locations. |
| 651 const bool should_pop = !instr->IsPushArgument(); | 651 const bool should_pop = !instr->IsPushArgument(); |
| 652 for (intptr_t i = locs->input_count() - 1; i >= 0; i--) { | 652 for (intptr_t i = locs->input_count() - 1; i >= 0; i--) { |
| 653 Location loc = locs->in(i); | 653 Location loc = locs->in(i); |
| 654 Register reg = kNoRegister; | 654 Register reg = kNoRegister; |
| 655 if (loc.IsRegister()) { | 655 if (loc.IsRegister()) { |
| 656 reg = loc.reg(); | 656 reg = loc.reg(); |
| 657 } else if (loc.IsUnallocated()) { | 657 } else if (loc.IsUnallocated()) { |
| 658 ASSERT(loc.policy() == Location::kRequiresRegister); | 658 ASSERT((loc.policy() == Location::kRequiresRegister) || |
| 659 (loc.policy() == Location::kWritableRegister)); |
| 659 reg = AllocateFreeRegister(blocked_registers); | 660 reg = AllocateFreeRegister(blocked_registers); |
| 660 locs->set_in(i, Location::RegisterLocation(reg)); | 661 locs->set_in(i, Location::RegisterLocation(reg)); |
| 661 } | 662 } |
| 662 | 663 |
| 663 // Inputs are consumed from the simulated frame. In case of a call argument | 664 // Inputs are consumed from the simulated frame. In case of a call argument |
| 664 // we leave it until the call instruction. | 665 // we leave it until the call instruction. |
| 665 if (should_pop) { | 666 if (should_pop) { |
| 666 assembler()->PopRegister(reg); | 667 assembler()->PopRegister(reg); |
| 667 } | 668 } |
| 668 } | 669 } |
| 669 | 670 |
| 670 // Allocate all unallocated temp locations. | 671 // Allocate all unallocated temp locations. |
| 671 for (intptr_t i = 0; i < locs->temp_count(); i++) { | 672 for (intptr_t i = 0; i < locs->temp_count(); i++) { |
| 672 Location loc = locs->temp(i); | 673 Location loc = locs->temp(i); |
| 673 if (loc.IsUnallocated()) { | 674 if (loc.IsUnallocated()) { |
| 674 ASSERT(loc.policy() == Location::kRequiresRegister); | 675 ASSERT(loc.policy() == Location::kRequiresRegister); |
| 675 loc = Location::RegisterLocation( | 676 loc = Location::RegisterLocation( |
| 676 AllocateFreeRegister(blocked_registers)); | 677 AllocateFreeRegister(blocked_registers)); |
| 677 locs->set_temp(i, loc); | 678 locs->set_temp(i, loc); |
| 678 } | 679 } |
| 679 } | 680 } |
| 680 | 681 |
| 681 Location result_location = locs->out(); | 682 Location result_location = locs->out(); |
| 682 if (result_location.IsUnallocated()) { | 683 if (result_location.IsUnallocated()) { |
| 683 switch (result_location.policy()) { | 684 switch (result_location.policy()) { |
| 684 case Location::kAny: | 685 case Location::kAny: |
| 685 case Location::kPrefersRegister: | 686 case Location::kPrefersRegister: |
| 686 case Location::kRequiresRegister: | 687 case Location::kRequiresRegister: |
| 688 case Location::kWritableRegister: |
| 687 result_location = Location::RegisterLocation( | 689 result_location = Location::RegisterLocation( |
| 688 AllocateFreeRegister(blocked_registers)); | 690 AllocateFreeRegister(blocked_registers)); |
| 689 break; | 691 break; |
| 690 case Location::kSameAsFirstInput: | 692 case Location::kSameAsFirstInput: |
| 691 result_location = locs->in(0); | 693 result_location = locs->in(0); |
| 692 break; | 694 break; |
| 693 case Location::kRequiresXmmRegister: | 695 case Location::kRequiresXmmRegister: |
| 694 UNREACHABLE(); | 696 UNREACHABLE(); |
| 695 break; | 697 break; |
| 696 } | 698 } |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 843 case ABOVE: return unsigned_left > unsigned_right; | 845 case ABOVE: return unsigned_left > unsigned_right; |
| 844 case ABOVE_EQUAL: return unsigned_left >= unsigned_right; | 846 case ABOVE_EQUAL: return unsigned_left >= unsigned_right; |
| 845 default: | 847 default: |
| 846 UNIMPLEMENTED(); | 848 UNIMPLEMENTED(); |
| 847 return false; | 849 return false; |
| 848 } | 850 } |
| 849 } | 851 } |
| 850 | 852 |
| 851 | 853 |
| 852 } // namespace dart | 854 } // namespace dart |
| OLD | NEW |