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_IA32. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32. |
6 #if defined(TARGET_ARCH_IA32) | 6 #if defined(TARGET_ARCH_IA32) |
7 | 7 |
8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
9 | 9 |
10 #include "vm/flow_graph_compiler.h" | 10 #include "vm/flow_graph_compiler.h" |
(...skipping 629 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
640 } | 640 } |
641 | 641 |
642 | 642 |
643 void ExtractConstructorInstantiatorComp::EmitNativeCode( | 643 void ExtractConstructorInstantiatorComp::EmitNativeCode( |
644 FlowGraphCompiler* compiler) { | 644 FlowGraphCompiler* compiler) { |
645 UNIMPLEMENTED(); | 645 UNIMPLEMENTED(); |
646 } | 646 } |
647 | 647 |
648 | 648 |
649 LocationSummary* AllocateContextComp::MakeLocationSummary() const { | 649 LocationSummary* AllocateContextComp::MakeLocationSummary() const { |
650 return NULL; | 650 const intptr_t kNumInputs = 0; |
| 651 const intptr_t kNumTemps = 1; |
| 652 LocationSummary* locs = new LocationSummary(kNumInputs, kNumTemps); |
| 653 locs->set_temp(0, Location::RegisterLocation(EDX)); |
| 654 locs->set_out(Location::RegisterLocation(EAX)); |
| 655 return locs; |
651 } | 656 } |
652 | 657 |
653 | 658 |
654 void AllocateContextComp::EmitNativeCode(FlowGraphCompiler* compiler) { | 659 void AllocateContextComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
655 UNIMPLEMENTED(); | 660 ASSERT(locs()->temp(0).reg() == EDX); |
| 661 ASSERT(locs()->out().reg() == EAX); |
| 662 |
| 663 __ movl(EDX, Immediate(num_context_variables())); |
| 664 const ExternalLabel label("alloc_context", |
| 665 StubCode::AllocateContextEntryPoint()); |
| 666 compiler->GenerateCall(token_index(), |
| 667 try_index(), |
| 668 &label, |
| 669 PcDescriptors::kOther); |
656 } | 670 } |
657 | 671 |
658 | 672 |
659 LocationSummary* ChainContextComp::MakeLocationSummary() const { | 673 LocationSummary* ChainContextComp::MakeLocationSummary() const { |
660 return NULL; | 674 return LocationSummary::Make(1, Location::NoLocation()); |
661 } | 675 } |
662 | 676 |
663 | 677 |
664 void ChainContextComp::EmitNativeCode(FlowGraphCompiler* compiler) { | 678 void ChainContextComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
665 UNIMPLEMENTED(); | 679 Register context_value = locs()->in(0).reg(); |
| 680 |
| 681 // Chain the new context in context_value to its parent in CTX. |
| 682 __ StoreIntoObject(context_value, |
| 683 FieldAddress(context_value, Context::parent_offset()), |
| 684 CTX); |
| 685 // Set new context as current context. |
| 686 __ movl(CTX, context_value); |
666 } | 687 } |
667 | 688 |
668 | 689 |
669 LocationSummary* CloneContextComp::MakeLocationSummary() const { | 690 LocationSummary* CloneContextComp::MakeLocationSummary() const { |
670 return NULL; | 691 return LocationSummary::Make(1, Location::RequiresRegister()); |
671 } | 692 } |
672 | 693 |
673 | 694 |
674 void CloneContextComp::EmitNativeCode(FlowGraphCompiler* compiler) { | 695 void CloneContextComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
675 UNIMPLEMENTED(); | 696 Register context_value = locs()->in(0).reg(); |
| 697 Register result = locs()->out().reg(); |
| 698 |
| 699 __ PushObject(Object::ZoneHandle()); // Make room for the result. |
| 700 __ pushl(context_value); |
| 701 compiler->GenerateCallRuntime(cid(), |
| 702 token_index(), |
| 703 try_index(), |
| 704 kCloneContextRuntimeEntry); |
| 705 __ popl(result); // Remove argument. |
| 706 __ popl(result); // Get result (cloned context). |
676 } | 707 } |
677 | 708 |
678 | 709 |
679 LocationSummary* CatchEntryComp::MakeLocationSummary() const { | 710 LocationSummary* CatchEntryComp::MakeLocationSummary() const { |
680 return NULL; | 711 return NULL; |
681 } | 712 } |
682 | 713 |
683 | 714 |
684 void CatchEntryComp::EmitNativeCode(FlowGraphCompiler* compiler) { | 715 void CatchEntryComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
685 UNIMPLEMENTED(); | 716 UNIMPLEMENTED(); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
821 UNREACHABLE(); | 852 UNREACHABLE(); |
822 } | 853 } |
823 } | 854 } |
824 | 855 |
825 | 856 |
826 } // namespace dart | 857 } // namespace dart |
827 | 858 |
828 #undef __ | 859 #undef __ |
829 | 860 |
830 #endif // defined TARGET_ARCH_X64 | 861 #endif // defined TARGET_ARCH_X64 |
OLD | NEW |