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

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

Issue 51653006: Track live instance and allocation counts for classes (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 11 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 | Annotate | Revision Log
« no previous file with comments | « runtime/vm/stub_code_mips.cc ('k') | runtime/vm/symbols.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_X64) 6 #if defined(TARGET_ARCH_X64)
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 573 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 __ cmpq(R12, Address(R13, Scavenger::end_offset())); 584 __ cmpq(R12, Address(R13, Scavenger::end_offset()));
585 __ j(ABOVE_EQUAL, &slow_case); 585 __ j(ABOVE_EQUAL, &slow_case);
586 586
587 // Successfully allocated the object(s), now update top to point to 587 // Successfully allocated the object(s), now update top to point to
588 // next object start and initialize the object. 588 // next object start and initialize the object.
589 // RAX: potential new object start. 589 // RAX: potential new object start.
590 // R12: potential next object start. 590 // R12: potential next object start.
591 // R13: Points to new space object. 591 // R13: Points to new space object.
592 __ movq(Address(R13, Scavenger::top_offset()), R12); 592 __ movq(Address(R13, Scavenger::top_offset()), R12);
593 __ addq(RAX, Immediate(kHeapObjectTag)); 593 __ addq(RAX, Immediate(kHeapObjectTag));
594 // R13: Size of allocation in bytes.
595 __ movq(R13, R12);
596 __ subq(R13, RAX);
597 __ UpdateAllocationStatsWithSize(kArrayCid, R13);
594 598
595 // RAX: new object start as a tagged pointer. 599 // RAX: new object start as a tagged pointer.
596 // R12: new object end address. 600 // R12: new object end address.
597 // RBX: array element type. 601 // RBX: array element type.
598 // R10: Array length as Smi. 602 // R10: Array length as Smi.
599 603
600 // Store the type argument field. 604 // Store the type argument field.
601 __ StoreIntoObjectNoBarrier( 605 __ StoreIntoObjectNoBarrier(
602 RAX, FieldAddress(RAX, Array::type_arguments_offset()), RBX); 606 RAX, FieldAddress(RAX, Array::type_arguments_offset()), RBX);
603 607
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
938 } 942 }
939 943
940 // Successfully allocated the object, now update top to point to 944 // Successfully allocated the object, now update top to point to
941 // next object start and initialize the object. 945 // next object start and initialize the object.
942 // RAX: new object. 946 // RAX: new object.
943 // R13: next object start. 947 // R13: next object start.
944 // R10: number of context variables. 948 // R10: number of context variables.
945 __ movq(RDI, Immediate(heap->TopAddress())); 949 __ movq(RDI, Immediate(heap->TopAddress()));
946 __ movq(Address(RDI, 0), R13); 950 __ movq(Address(RDI, 0), R13);
947 __ addq(RAX, Immediate(kHeapObjectTag)); 951 __ addq(RAX, Immediate(kHeapObjectTag));
952 // R13: Size of allocation in bytes.
953 __ subq(R13, RAX);
954 __ UpdateAllocationStatsWithSize(context_class.id(), R13);
948 955
949 // Calculate the size tag. 956 // Calculate the size tag.
950 // RAX: new object. 957 // RAX: new object.
951 // R10: number of context variables. 958 // R10: number of context variables.
952 { 959 {
953 Label size_tag_overflow, done; 960 Label size_tag_overflow, done;
954 __ leaq(R13, Address(R10, TIMES_8, fixed_size)); 961 __ leaq(R13, Address(R10, TIMES_8, fixed_size));
955 __ andq(R13, Immediate(-kObjectAlignment)); 962 __ andq(R13, Immediate(-kObjectAlignment));
956 __ cmpq(R13, Immediate(RawObject::SizeTag::kMaxSizeTag)); 963 __ cmpq(R13, Immediate(RawObject::SizeTag::kMaxSizeTag));
957 __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump); 964 __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump);
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
1137 if (FLAG_use_slow_path) { 1144 if (FLAG_use_slow_path) {
1138 __ jmp(&slow_case); 1145 __ jmp(&slow_case);
1139 } else { 1146 } else {
1140 __ j(ABOVE_EQUAL, &slow_case); 1147 __ j(ABOVE_EQUAL, &slow_case);
1141 } 1148 }
1142 1149
1143 // Successfully allocated the object(s), now update top to point to 1150 // Successfully allocated the object(s), now update top to point to
1144 // next object start and initialize the object. 1151 // next object start and initialize the object.
1145 __ movq(RDI, Immediate(heap->TopAddress())); 1152 __ movq(RDI, Immediate(heap->TopAddress()));
1146 __ movq(Address(RDI, 0), RBX); 1153 __ movq(Address(RDI, 0), RBX);
1154 __ UpdateAllocationStats(cls.id());
1147 1155
1148 if (is_cls_parameterized) { 1156 if (is_cls_parameterized) {
1149 // Initialize the type arguments field in the object. 1157 // Initialize the type arguments field in the object.
1150 // RAX: new object start. 1158 // RAX: new object start.
1151 // RCX: potential new object end and, if RCX != RBX, potential new 1159 // RCX: potential new object end and, if RCX != RBX, potential new
1152 // InstantiatedTypeArguments object start. 1160 // InstantiatedTypeArguments object start.
1153 // RBX: next object start. 1161 // RBX: next object start.
1154 Label type_arguments_ready; 1162 Label type_arguments_ready;
1155 __ movq(RDI, Address(RSP, kObjectTypeArgumentsOffset)); 1163 __ movq(RDI, Address(RSP, kObjectTypeArgumentsOffset));
1156 __ cmpq(RCX, RBX); 1164 __ cmpq(RCX, RBX);
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
1303 __ j(ABOVE_EQUAL, &slow_case); 1311 __ j(ABOVE_EQUAL, &slow_case);
1304 } 1312 }
1305 1313
1306 // Successfully allocated the object, now update top to point to 1314 // Successfully allocated the object, now update top to point to
1307 // next object start and initialize the object. 1315 // next object start and initialize the object.
1308 __ movq(RDI, Immediate(heap->TopAddress())); 1316 __ movq(RDI, Immediate(heap->TopAddress()));
1309 __ movq(Address(RDI, 0), R13); 1317 __ movq(Address(RDI, 0), R13);
1310 1318
1311 // RAX: new closure object. 1319 // RAX: new closure object.
1312 // RBX: new context object (only if is_implicit_closure). 1320 // RBX: new context object (only if is_implicit_closure).
1321 if (is_implicit_instance_closure) {
1322 // This closure allocates a context, update allocation stats.
1323 // RDI: context size.
1324 __ movq(RDI, Immediate(context_size));
1325 __ UpdateAllocationStatsWithSize(kContextCid, RDI);
1326 }
1327 // The closure allocation is attributed to the signature class.
1328 __ UpdateAllocationStats(cls.id());
1329
1330 // RAX: new closure object.
1331 // RBX: new context object (only if is_implicit_closure).
1313 // Set the tags. 1332 // Set the tags.
1314 uword tags = 0; 1333 uword tags = 0;
1315 tags = RawObject::SizeTag::update(closure_size, tags); 1334 tags = RawObject::SizeTag::update(closure_size, tags);
1316 tags = RawObject::ClassIdTag::update(cls.id(), tags); 1335 tags = RawObject::ClassIdTag::update(cls.id(), tags);
1317 __ movq(Address(RAX, Instance::tags_offset()), Immediate(tags)); 1336 __ movq(Address(RAX, Instance::tags_offset()), Immediate(tags));
1318 1337
1319 // Initialize the function field in the object. 1338 // Initialize the function field in the object.
1320 // RAX: new closure object. 1339 // RAX: new closure object.
1321 // RBX: new context object (only if is_implicit_closure). 1340 // RBX: new context object (only if is_implicit_closure).
1322 // R13: next object start. 1341 // R13: next object start.
(...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after
2129 2148
2130 __ movq(left, Address(RSP, 2 * kWordSize)); 2149 __ movq(left, Address(RSP, 2 * kWordSize));
2131 __ movq(right, Address(RSP, 1 * kWordSize)); 2150 __ movq(right, Address(RSP, 1 * kWordSize));
2132 GenerateIdenticalWithNumberCheckStub(assembler, left, right); 2151 GenerateIdenticalWithNumberCheckStub(assembler, left, right);
2133 __ ret(); 2152 __ ret();
2134 } 2153 }
2135 2154
2136 } // namespace dart 2155 } // namespace dart
2137 2156
2138 #endif // defined TARGET_ARCH_X64 2157 #endif // defined TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « runtime/vm/stub_code_mips.cc ('k') | runtime/vm/symbols.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698