Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Side by Side Diff: runtime/vm/stub_code_ia32.cc

Issue 1263513002: VM: Load allocation-top and -end via Thread. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: fixed cc tests Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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_IA32) 6 #if defined(TARGET_ARCH_IA32)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/compiler.h" 9 #include "vm/compiler.h"
10 #include "vm/dart_entry.h" 10 #include "vm/dart_entry.h"
(...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after
590 __ leal(EBX, Address(EDX, TIMES_2, fixed_size)); // EDX is Smi. 590 __ leal(EBX, Address(EDX, TIMES_2, fixed_size)); // EDX is Smi.
591 ASSERT(kSmiTagShift == 1); 591 ASSERT(kSmiTagShift == 1);
592 __ andl(EBX, Immediate(-kObjectAlignment)); 592 __ andl(EBX, Immediate(-kObjectAlignment));
593 593
594 // ECX: array element type. 594 // ECX: array element type.
595 // EDX: array length as Smi. 595 // EDX: array length as Smi.
596 // EBX: allocation size. 596 // EBX: allocation size.
597 597
598 const intptr_t cid = kArrayCid; 598 const intptr_t cid = kArrayCid;
599 Heap::Space space = Heap::SpaceForAllocation(cid); 599 Heap::Space space = Heap::SpaceForAllocation(cid);
600 __ LoadIsolate(EDI); 600 __ movl(EDI, Address(THR, Thread::heap_offset()));
601 __ movl(EDI, Address(EDI, Isolate::heap_offset()));
602 __ movl(EAX, Address(EDI, Heap::TopOffset(space))); 601 __ movl(EAX, Address(EDI, Heap::TopOffset(space)));
603 __ addl(EBX, EAX); 602 __ addl(EBX, EAX);
604 __ j(CARRY, &slow_case); 603 __ j(CARRY, &slow_case);
605 604
606 // Check if the allocation fits into the remaining space. 605 // Check if the allocation fits into the remaining space.
607 // EAX: potential new object start. 606 // EAX: potential new object start.
608 // EBX: potential next object start. 607 // EBX: potential next object start.
609 // EDI: heap. 608 // EDI: heap.
610 // ECX: array element type. 609 // ECX: array element type.
611 // EDX: array length as Smi). 610 // EDX: array length as Smi).
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 // First compute the rounded instance size. 813 // First compute the rounded instance size.
815 // EDX: number of context variables. 814 // EDX: number of context variables.
816 intptr_t fixed_size = (sizeof(RawContext) + kObjectAlignment - 1); 815 intptr_t fixed_size = (sizeof(RawContext) + kObjectAlignment - 1);
817 __ leal(EBX, Address(EDX, TIMES_4, fixed_size)); 816 __ leal(EBX, Address(EDX, TIMES_4, fixed_size));
818 __ andl(EBX, Immediate(-kObjectAlignment)); 817 __ andl(EBX, Immediate(-kObjectAlignment));
819 818
820 // Now allocate the object. 819 // Now allocate the object.
821 // EDX: number of context variables. 820 // EDX: number of context variables.
822 const intptr_t cid = kContextCid; 821 const intptr_t cid = kContextCid;
823 Heap::Space space = Heap::SpaceForAllocation(cid); 822 Heap::Space space = Heap::SpaceForAllocation(cid);
824 __ LoadIsolate(ECX); 823 __ movl(ECX, Address(THR, Thread::heap_offset()));
825 __ movl(ECX, Address(ECX, Isolate::heap_offset()));
826 __ movl(EAX, Address(ECX, Heap::TopOffset(space))); 824 __ movl(EAX, Address(ECX, Heap::TopOffset(space)));
827 __ addl(EBX, EAX); 825 __ addl(EBX, EAX);
828 // Check if the allocation fits into the remaining space. 826 // Check if the allocation fits into the remaining space.
829 // EAX: potential new object. 827 // EAX: potential new object.
830 // EBX: potential next object start. 828 // EBX: potential next object start.
831 // EDX: number of context variables. 829 // EDX: number of context variables.
832 __ cmpl(EBX, Address(ECX, Heap::EndOffset(space))); 830 __ cmpl(EBX, Address(ECX, Heap::EndOffset(space)));
833 if (FLAG_use_slow_path) { 831 if (FLAG_use_slow_path) {
834 __ jmp(&slow_case); 832 __ jmp(&slow_case);
835 } else { 833 } else {
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
1029 if (is_cls_parameterized) { 1027 if (is_cls_parameterized) {
1030 __ movl(EDX, Address(ESP, kObjectTypeArgumentsOffset)); 1028 __ movl(EDX, Address(ESP, kObjectTypeArgumentsOffset));
1031 // EDX: instantiated type arguments. 1029 // EDX: instantiated type arguments.
1032 } 1030 }
1033 if (FLAG_inline_alloc && Heap::IsAllocatableInNewSpace(instance_size) && 1031 if (FLAG_inline_alloc && Heap::IsAllocatableInNewSpace(instance_size) &&
1034 !cls.trace_allocation()) { 1032 !cls.trace_allocation()) {
1035 Label slow_case; 1033 Label slow_case;
1036 // Allocate the object and update top to point to 1034 // Allocate the object and update top to point to
1037 // next object start and initialize the allocated object. 1035 // next object start and initialize the allocated object.
1038 // EDX: instantiated type arguments (if is_cls_parameterized). 1036 // EDX: instantiated type arguments (if is_cls_parameterized).
1039 Heap* heap = Isolate::Current()->heap();
1040 Heap::Space space = Heap::SpaceForAllocation(cls.id()); 1037 Heap::Space space = Heap::SpaceForAllocation(cls.id());
1041 __ movl(EAX, Address::Absolute(heap->TopAddress(space))); 1038 __ movl(EDI, Address(THR, Thread::heap_offset()));
1039 __ movl(EAX, Address(EDI, Heap::TopOffset(space)));
1042 __ leal(EBX, Address(EAX, instance_size)); 1040 __ leal(EBX, Address(EAX, instance_size));
1043 // Check if the allocation fits into the remaining space. 1041 // Check if the allocation fits into the remaining space.
1044 // EAX: potential new object start. 1042 // EAX: potential new object start.
1045 // EBX: potential next object start. 1043 // EBX: potential next object start.
1046 __ cmpl(EBX, Address::Absolute(heap->EndAddress(space))); 1044 // EDI: heap.
1045 __ cmpl(EBX, Address(EDI, Heap::EndOffset(space)));
1047 if (FLAG_use_slow_path) { 1046 if (FLAG_use_slow_path) {
1048 __ jmp(&slow_case); 1047 __ jmp(&slow_case);
1049 } else { 1048 } else {
1050 __ j(ABOVE_EQUAL, &slow_case); 1049 __ j(ABOVE_EQUAL, &slow_case);
1051 } 1050 }
1052 __ movl(Address::Absolute(heap->TopAddress(space)), EBX); 1051 __ movl(Address(EDI, Heap::TopOffset(space)), EBX);
1053 __ UpdateAllocationStats(cls.id(), ECX, space); 1052 __ UpdateAllocationStats(cls.id(), ECX, space,
1053 /* inline_isolate = */ false);
1054 1054
1055 // EAX: new object start (untagged). 1055 // EAX: new object start (untagged).
1056 // EBX: next object start. 1056 // EBX: next object start.
1057 // EDX: new object type arguments (if is_cls_parameterized). 1057 // EDX: new object type arguments (if is_cls_parameterized).
1058 // Set the tags. 1058 // Set the tags.
1059 uword tags = 0; 1059 uword tags = 0;
1060 tags = RawObject::SizeTag::update(instance_size, tags); 1060 tags = RawObject::SizeTag::update(instance_size, tags);
1061 ASSERT(cls.id() != kIllegalCid); 1061 ASSERT(cls.id() != kIllegalCid);
1062 tags = RawObject::ClassIdTag::update(cls.id(), tags); 1062 tags = RawObject::ClassIdTag::update(cls.id(), tags);
1063 __ movl(Address(EAX, Instance::tags_offset()), Immediate(tags)); 1063 __ movl(Address(EAX, Instance::tags_offset()), Immediate(tags));
(...skipping 1031 matching lines...) Expand 10 before | Expand all | Expand 10 after
2095 // EBX: entry point. 2095 // EBX: entry point.
2096 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) { 2096 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) {
2097 EmitMegamorphicLookup(assembler, EDI, EBX, EBX); 2097 EmitMegamorphicLookup(assembler, EDI, EBX, EBX);
2098 __ ret(); 2098 __ ret();
2099 } 2099 }
2100 2100
2101 2101
2102 } // namespace dart 2102 } // namespace dart
2103 2103
2104 #endif // defined TARGET_ARCH_IA32 2104 #endif // defined TARGET_ARCH_IA32
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698