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

Side by Side Diff: runtime/vm/stub_code_arm.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/snapshot.cc ('k') | runtime/vm/stub_code_ia32.cc » ('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_ARM) 6 #if defined(TARGET_ARCH_ARM)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/code_generator.h" 9 #include "vm/code_generator.h"
10 #include "vm/compiler.h" 10 #include "vm/compiler.h"
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after
616 // R3: array size. 616 // R3: array size.
617 // R7: potential next object start. 617 // R7: potential next object start.
618 // R8: points to new space object. 618 // R8: points to new space object.
619 __ LoadFromOffset(kWord, IP, R8, Scavenger::end_offset()); 619 __ LoadFromOffset(kWord, IP, R8, Scavenger::end_offset());
620 __ cmp(R7, ShifterOperand(IP)); 620 __ cmp(R7, ShifterOperand(IP));
621 __ b(&slow_case, CS); // Branch if unsigned higher or equal. 621 __ b(&slow_case, CS); // Branch if unsigned higher or equal.
622 622
623 // Successfully allocated the object(s), now update top to point to 623 // Successfully allocated the object(s), now update top to point to
624 // next object start and initialize the object. 624 // next object start and initialize the object.
625 // R0: potential new object start. 625 // R0: potential new object start.
626 // R3: array size.
626 // R7: potential next object start. 627 // R7: potential next object start.
627 // R8: Points to new space object. 628 // R8: Points to new space object.
628 __ StoreToOffset(kWord, R7, R8, Scavenger::top_offset()); 629 __ StoreToOffset(kWord, R7, R8, Scavenger::top_offset());
629 __ add(R0, R0, ShifterOperand(kHeapObjectTag)); 630 __ add(R0, R0, ShifterOperand(kHeapObjectTag));
631 __ UpdateAllocationStatsWithSize(kArrayCid, R3, R8);
630 632
631 // R0: new object start as a tagged pointer. 633 // R0: new object start as a tagged pointer.
632 // R1: array element type. 634 // R1: array element type.
633 // R2: array length as Smi. 635 // R2: array length as Smi.
634 // R3: array size. 636 // R3: array size.
635 // R7: new object end address. 637 // R7: new object end address.
636 638
637 // Store the type argument field. 639 // Store the type argument field.
638 __ StoreIntoObjectNoBarrier( 640 __ StoreIntoObjectNoBarrier(
639 R0, 641 R0,
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
952 } 954 }
953 955
954 // Successfully allocated the object, now update top to point to 956 // Successfully allocated the object, now update top to point to
955 // next object start and initialize the object. 957 // next object start and initialize the object.
956 // R0: new object. 958 // R0: new object.
957 // R1: number of context variables. 959 // R1: number of context variables.
958 // R2: object size. 960 // R2: object size.
959 // R3: next object start. 961 // R3: next object start.
960 __ str(R3, Address(R5, 0)); 962 __ str(R3, Address(R5, 0));
961 __ add(R0, R0, ShifterOperand(kHeapObjectTag)); 963 __ add(R0, R0, ShifterOperand(kHeapObjectTag));
964 __ UpdateAllocationStatsWithSize(context_class.id(), R2, R5);
962 965
963 // Calculate the size tag. 966 // Calculate the size tag.
964 // R0: new object. 967 // R0: new object.
965 // R1: number of context variables. 968 // R1: number of context variables.
966 // R2: object size. 969 // R2: object size.
967 const intptr_t shift = RawObject::kSizeTagBit - kObjectAlignmentLog2; 970 const intptr_t shift = RawObject::kSizeTagBit - kObjectAlignmentLog2;
968 __ CompareImmediate(R2, RawObject::SizeTag::kMaxSizeTag); 971 __ CompareImmediate(R2, RawObject::SizeTag::kMaxSizeTag);
969 // If no size tag overflow, shift R2 left, else set R2 to zero. 972 // If no size tag overflow, shift R2 left, else set R2 to zero.
970 __ mov(R2, ShifterOperand(R2, LSL, shift), LS); 973 __ mov(R2, ShifterOperand(R2, LSL, shift), LS);
971 __ mov(R2, ShifterOperand(0), HI); 974 __ mov(R2, ShifterOperand(0), HI);
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
1134 __ cmp(R3, ShifterOperand(IP)); 1137 __ cmp(R3, ShifterOperand(IP));
1135 if (FLAG_use_slow_path) { 1138 if (FLAG_use_slow_path) {
1136 __ b(&slow_case); 1139 __ b(&slow_case);
1137 } else { 1140 } else {
1138 __ b(&slow_case, CS); // Branch if unsigned higher or equal. 1141 __ b(&slow_case, CS); // Branch if unsigned higher or equal.
1139 } 1142 }
1140 1143
1141 // Successfully allocated the object(s), now update top to point to 1144 // Successfully allocated the object(s), now update top to point to
1142 // next object start and initialize the object. 1145 // next object start and initialize the object.
1143 __ str(R3, Address(R5, 0)); 1146 __ str(R3, Address(R5, 0));
1147 __ UpdateAllocationStats(cls.id(), R5);
1144 1148
1145 if (is_cls_parameterized) { 1149 if (is_cls_parameterized) {
1146 // Initialize the type arguments field in the object. 1150 // Initialize the type arguments field in the object.
1147 // R2: new object start. 1151 // R2: new object start.
1148 // R4: potential new object end and, if R4 != R3, potential new 1152 // R4: potential new object end and, if R4 != R3, potential new
1149 // InstantiatedTypeArguments object start. 1153 // InstantiatedTypeArguments object start.
1150 // R3: next object start. 1154 // R3: next object start.
1151 Label type_arguments_ready; 1155 Label type_arguments_ready;
1152 __ cmp(R4, ShifterOperand(R3)); 1156 __ cmp(R4, ShifterOperand(R3));
1153 __ b(&type_arguments_ready, EQ); 1157 __ b(&type_arguments_ready, EQ);
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
1299 if (FLAG_use_slow_path) { 1303 if (FLAG_use_slow_path) {
1300 __ b(&slow_case); 1304 __ b(&slow_case);
1301 } else { 1305 } else {
1302 __ b(&slow_case, CS); // Branch if unsigned higher or equal. 1306 __ b(&slow_case, CS); // Branch if unsigned higher or equal.
1303 } 1307 }
1304 1308
1305 // Successfully allocated the object, now update top to point to 1309 // Successfully allocated the object, now update top to point to
1306 // next object start and initialize the object. 1310 // next object start and initialize the object.
1307 __ str(R3, Address(R5, 0)); 1311 __ str(R3, Address(R5, 0));
1308 1312
1313 if (is_implicit_instance_closure) {
1314 // This closure allocates a context, update allocation stats.
1315 // R3: context size.
1316 __ LoadImmediate(R3, context_size);
1317 // R5: Clobbered.
1318 __ UpdateAllocationStatsWithSize(kContextCid, R3, R5);
1319 }
1320 // The closure allocation is attributed to the signature class.
1321 // R5: Will be clobbered.
1322 __ UpdateAllocationStats(cls.id(), R5);
1323
1309 // R2: new closure object. 1324 // R2: new closure object.
1310 // R4: new context object (only if is_implicit_closure). 1325 // R4: new context object (only if is_implicit_closure).
1311 // Set the tags. 1326 // Set the tags.
1312 uword tags = 0; 1327 uword tags = 0;
1313 tags = RawObject::SizeTag::update(closure_size, tags); 1328 tags = RawObject::SizeTag::update(closure_size, tags);
1314 tags = RawObject::ClassIdTag::update(cls.id(), tags); 1329 tags = RawObject::ClassIdTag::update(cls.id(), tags);
1315 __ LoadImmediate(R0, tags); 1330 __ LoadImmediate(R0, tags);
1316 __ str(R0, Address(R2, Instance::tags_offset())); 1331 __ str(R0, Address(R2, Instance::tags_offset()));
1317 1332
1318 // Initialize the function field in the object. 1333 // Initialize the function field in the object.
(...skipping 801 matching lines...) Expand 10 before | Expand all | Expand 10 after
2120 const Register right = R0; 2135 const Register right = R0;
2121 __ ldr(left, Address(SP, 1 * kWordSize)); 2136 __ ldr(left, Address(SP, 1 * kWordSize));
2122 __ ldr(right, Address(SP, 0 * kWordSize)); 2137 __ ldr(right, Address(SP, 0 * kWordSize));
2123 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp); 2138 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp);
2124 __ Ret(); 2139 __ Ret();
2125 } 2140 }
2126 2141
2127 } // namespace dart 2142 } // namespace dart
2128 2143
2129 #endif // defined TARGET_ARCH_ARM 2144 #endif // defined TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « runtime/vm/snapshot.cc ('k') | runtime/vm/stub_code_ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698