OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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" | 5 #include "vm/globals.h" |
6 #if defined(TARGET_ARCH_MIPS) | 6 #if defined(TARGET_ARCH_MIPS) |
7 | 7 |
8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
9 #include "vm/longjump.h" | 9 #include "vm/longjump.h" |
10 #include "vm/runtime_entry.h" | 10 #include "vm/runtime_entry.h" |
(...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
674 void Assembler::LeaveStubFrameAndReturn(Register ra) { | 674 void Assembler::LeaveStubFrameAndReturn(Register ra) { |
675 addiu(SP, FP, Immediate(-1 * kWordSize)); | 675 addiu(SP, FP, Immediate(-1 * kWordSize)); |
676 lw(RA, Address(SP, 2 * kWordSize)); | 676 lw(RA, Address(SP, 2 * kWordSize)); |
677 lw(FP, Address(SP, 1 * kWordSize)); | 677 lw(FP, Address(SP, 1 * kWordSize)); |
678 lw(PP, Address(SP, 0 * kWordSize)); | 678 lw(PP, Address(SP, 0 * kWordSize)); |
679 jr(ra); | 679 jr(ra); |
680 delay_slot()->addiu(SP, SP, Immediate(4 * kWordSize)); | 680 delay_slot()->addiu(SP, SP, Immediate(4 * kWordSize)); |
681 } | 681 } |
682 | 682 |
683 | 683 |
| 684 void Assembler::UpdateAllocationStats(intptr_t cid, |
| 685 Register temp_reg, |
| 686 Heap::Space space) { |
| 687 ASSERT(temp_reg != kNoRegister); |
| 688 ASSERT(temp_reg != TMP); |
| 689 ASSERT(cid > 0); |
| 690 Isolate* isolate = Isolate::Current(); |
| 691 ClassTable* class_table = isolate->class_table(); |
| 692 if (cid < kNumPredefinedCids) { |
| 693 const uword class_heap_stats_table_address = |
| 694 class_table->PredefinedClassHeapStatsTableAddress(); |
| 695 const uword class_offset = cid * sizeof(ClassHeapStats); // NOLINT |
| 696 const uword count_field_offset = (space == Heap::kNew) ? |
| 697 ClassHeapStats::allocated_since_gc_new_space_offset() : |
| 698 ClassHeapStats::allocated_since_gc_old_space_offset(); |
| 699 LoadImmediate(temp_reg, class_heap_stats_table_address + class_offset); |
| 700 const Address& count_address = Address(temp_reg, count_field_offset); |
| 701 lw(TMP, count_address); |
| 702 AddImmediate(TMP, 1); |
| 703 sw(TMP, count_address); |
| 704 } else { |
| 705 ASSERT(temp_reg != kNoRegister); |
| 706 const uword class_offset = cid * sizeof(ClassHeapStats); // NOLINT |
| 707 const uword count_field_offset = (space == Heap::kNew) ? |
| 708 ClassHeapStats::allocated_since_gc_new_space_offset() : |
| 709 ClassHeapStats::allocated_since_gc_old_space_offset(); |
| 710 LoadImmediate(temp_reg, class_table->ClassStatsTableAddress()); |
| 711 lw(temp_reg, Address(temp_reg, 0)); |
| 712 AddImmediate(temp_reg, class_offset); |
| 713 lw(TMP, Address(temp_reg, count_field_offset)); |
| 714 AddImmediate(TMP, 1); |
| 715 sw(TMP, Address(temp_reg, count_field_offset)); |
| 716 } |
| 717 } |
| 718 |
| 719 |
| 720 void Assembler::UpdateAllocationStatsWithSize(intptr_t cid, |
| 721 Register size_reg, |
| 722 Register temp_reg, |
| 723 Heap::Space space) { |
| 724 ASSERT(temp_reg != kNoRegister); |
| 725 ASSERT(cid > 0); |
| 726 ASSERT(temp_reg != TMP); |
| 727 Isolate* isolate = Isolate::Current(); |
| 728 ClassTable* class_table = isolate->class_table(); |
| 729 if (cid < kNumPredefinedCids) { |
| 730 const uword class_heap_stats_table_address = |
| 731 class_table->PredefinedClassHeapStatsTableAddress(); |
| 732 const uword class_offset = cid * sizeof(ClassHeapStats); // NOLINT |
| 733 const uword count_field_offset = (space == Heap::kNew) ? |
| 734 ClassHeapStats::allocated_since_gc_new_space_offset() : |
| 735 ClassHeapStats::allocated_since_gc_old_space_offset(); |
| 736 const uword size_field_offset = (space == Heap::kNew) ? |
| 737 ClassHeapStats::allocated_size_since_gc_new_space_offset() : |
| 738 ClassHeapStats::allocated_size_since_gc_old_space_offset(); |
| 739 LoadImmediate(temp_reg, class_heap_stats_table_address + class_offset); |
| 740 const Address& count_address = Address(temp_reg, count_field_offset); |
| 741 const Address& size_address = Address(temp_reg, size_field_offset); |
| 742 lw(TMP, count_address); |
| 743 AddImmediate(TMP, 1); |
| 744 sw(TMP, count_address); |
| 745 lw(TMP, size_address); |
| 746 addu(TMP, TMP, size_reg); |
| 747 sw(TMP, size_address); |
| 748 } else { |
| 749 ASSERT(temp_reg != kNoRegister); |
| 750 const uword class_offset = cid * sizeof(ClassHeapStats); // NOLINT |
| 751 const uword count_field_offset = (space == Heap::kNew) ? |
| 752 ClassHeapStats::allocated_since_gc_new_space_offset() : |
| 753 ClassHeapStats::allocated_since_gc_old_space_offset(); |
| 754 const uword size_field_offset = (space == Heap::kNew) ? |
| 755 ClassHeapStats::allocated_size_since_gc_new_space_offset() : |
| 756 ClassHeapStats::allocated_size_since_gc_old_space_offset(); |
| 757 LoadImmediate(temp_reg, class_table->ClassStatsTableAddress()); |
| 758 lw(temp_reg, Address(temp_reg, 0)); |
| 759 AddImmediate(temp_reg, class_offset); |
| 760 lw(TMP, Address(temp_reg, count_field_offset)); |
| 761 AddImmediate(TMP, 1); |
| 762 sw(TMP, Address(temp_reg, count_field_offset)); |
| 763 lw(TMP, Address(temp_reg, size_field_offset)); |
| 764 addu(TMP, TMP, size_reg); |
| 765 sw(TMP, Address(temp_reg, size_field_offset)); |
| 766 } |
| 767 } |
| 768 |
| 769 |
684 void Assembler::TryAllocate(const Class& cls, | 770 void Assembler::TryAllocate(const Class& cls, |
685 Label* failure, | 771 Label* failure, |
686 Register instance_reg) { | 772 Register instance_reg, |
| 773 Register temp_reg) { |
687 ASSERT(failure != NULL); | 774 ASSERT(failure != NULL); |
688 if (FLAG_inline_alloc) { | 775 if (FLAG_inline_alloc) { |
689 Heap* heap = Isolate::Current()->heap(); | 776 Heap* heap = Isolate::Current()->heap(); |
690 const intptr_t instance_size = cls.instance_size(); | 777 const intptr_t instance_size = cls.instance_size(); |
691 LoadImmediate(instance_reg, heap->TopAddress()); | 778 LoadImmediate(instance_reg, heap->TopAddress()); |
692 lw(instance_reg, Address(instance_reg, 0)); | 779 lw(instance_reg, Address(instance_reg, 0)); |
693 AddImmediate(instance_reg, instance_size); | 780 AddImmediate(instance_reg, instance_size); |
694 | 781 |
695 // instance_reg: potential next object start. | 782 // instance_reg: potential next object start. |
696 LoadImmediate(TMP, heap->EndAddress()); | 783 LoadImmediate(TMP, heap->EndAddress()); |
697 lw(TMP, Address(TMP, 0)); | 784 lw(TMP, Address(TMP, 0)); |
698 // Fail if heap end unsigned less than or equal to instance_reg. | 785 // Fail if heap end unsigned less than or equal to instance_reg. |
699 BranchUnsignedLessEqual(TMP, instance_reg, failure); | 786 BranchUnsignedLessEqual(TMP, instance_reg, failure); |
700 | 787 |
701 // Successfully allocated the object, now update top to point to | 788 // Successfully allocated the object, now update top to point to |
702 // next object start and store the class in the class field of object. | 789 // next object start and store the class in the class field of object. |
703 LoadImmediate(TMP, heap->TopAddress()); | 790 LoadImmediate(TMP, heap->TopAddress()); |
704 sw(instance_reg, Address(TMP, 0)); | 791 sw(instance_reg, Address(TMP, 0)); |
705 | 792 |
706 ASSERT(instance_size >= kHeapObjectTag); | 793 ASSERT(instance_size >= kHeapObjectTag); |
707 AddImmediate(instance_reg, -instance_size + kHeapObjectTag); | 794 AddImmediate(instance_reg, -instance_size + kHeapObjectTag); |
708 | 795 UpdateAllocationStats(cls.id(), temp_reg); |
709 uword tags = 0; | 796 uword tags = 0; |
710 tags = RawObject::SizeTag::update(instance_size, tags); | 797 tags = RawObject::SizeTag::update(instance_size, tags); |
711 ASSERT(cls.id() != kIllegalCid); | 798 ASSERT(cls.id() != kIllegalCid); |
712 tags = RawObject::ClassIdTag::update(cls.id(), tags); | 799 tags = RawObject::ClassIdTag::update(cls.id(), tags); |
713 LoadImmediate(TMP, tags); | 800 LoadImmediate(TMP, tags); |
714 sw(TMP, FieldAddress(instance_reg, Object::tags_offset())); | 801 sw(TMP, FieldAddress(instance_reg, Object::tags_offset())); |
715 } else { | 802 } else { |
716 b(failure); | 803 b(failure); |
717 } | 804 } |
718 } | 805 } |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
966 Emit(reinterpret_cast<int32_t>(message)); | 1053 Emit(reinterpret_cast<int32_t>(message)); |
967 Bind(&msg); | 1054 Bind(&msg); |
968 break_(Instr::kMsgMessageCode); | 1055 break_(Instr::kMsgMessageCode); |
969 } | 1056 } |
970 #endif | 1057 #endif |
971 } | 1058 } |
972 | 1059 |
973 } // namespace dart | 1060 } // namespace dart |
974 | 1061 |
975 #endif // defined TARGET_ARCH_MIPS | 1062 #endif // defined TARGET_ARCH_MIPS |
OLD | NEW |