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

Side by Side Diff: runtime/vm/stub_code_mips.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 7 years, 1 month 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
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_MIPS) 6 #if defined(TARGET_ARCH_MIPS)
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 659 matching lines...) Expand 10 before | Expand all | Expand 10 after
670 __ lw(CMPRES1, Address(T0, Scavenger::end_offset())); 670 __ lw(CMPRES1, Address(T0, Scavenger::end_offset()));
671 __ BranchUnsignedGreaterEqual(T2, CMPRES1, &slow_case); 671 __ BranchUnsignedGreaterEqual(T2, CMPRES1, &slow_case);
672 672
673 // Successfully allocated the object(s), now update top to point to 673 // Successfully allocated the object(s), now update top to point to
674 // next object start and initialize the object. 674 // next object start and initialize the object.
675 // V0: potential new object start. 675 // V0: potential new object start.
676 // T2: potential next object start. 676 // T2: potential next object start.
677 // T0: Points to new space object. 677 // T0: Points to new space object.
678 __ sw(T2, Address(T0, Scavenger::top_offset())); 678 __ sw(T2, Address(T0, Scavenger::top_offset()));
679 __ addiu(V0, V0, Immediate(kHeapObjectTag)); 679 __ addiu(V0, V0, Immediate(kHeapObjectTag));
680 // T1: Size of allocation in bytes.
681 __ subu(T1, T2, V0);
682 __ BumpAllocationCount(Heap::kNew, kArrayCid, T1, T5);
680 683
681 // V0: new object start as a tagged pointer. 684 // V0: new object start as a tagged pointer.
682 // A0: array element type. 685 // A0: array element type.
683 // A1: Array length as Smi. 686 // A1: Array length as Smi.
684 // T2: new object end address. 687 // T2: new object end address.
685 688
686 // Store the type argument field. 689 // Store the type argument field.
687 __ StoreIntoObjectNoBarrier( 690 __ StoreIntoObjectNoBarrier(
688 V0, 691 V0,
689 FieldAddress(V0, Array::type_arguments_offset()), 692 FieldAddress(V0, Array::type_arguments_offset()),
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
1072 } 1075 }
1073 1076
1074 // Successfully allocated the object, now update top to point to 1077 // Successfully allocated the object, now update top to point to
1075 // next object start and initialize the object. 1078 // next object start and initialize the object.
1076 // V0: new object. 1079 // V0: new object.
1077 // T1: number of context variables. 1080 // T1: number of context variables.
1078 // T2: object size. 1081 // T2: object size.
1079 // T3: next object start. 1082 // T3: next object start.
1080 __ sw(T3, Address(T5, 0)); 1083 __ sw(T3, Address(T5, 0));
1081 __ addiu(V0, V0, Immediate(kHeapObjectTag)); 1084 __ addiu(V0, V0, Immediate(kHeapObjectTag));
1085 __ BumpAllocationCount(Heap::kNew, context_class.id(), T2, T5);
1082 1086
1083 // Calculate the size tag. 1087 // Calculate the size tag.
1084 // V0: new object. 1088 // V0: new object.
1085 // T1: number of context variables. 1089 // T1: number of context variables.
1086 // T2: object size. 1090 // T2: object size.
1087 const intptr_t shift = RawObject::kSizeTagBit - kObjectAlignmentLog2; 1091 const intptr_t shift = RawObject::kSizeTagBit - kObjectAlignmentLog2;
1088 __ LoadImmediate(TMP, RawObject::SizeTag::kMaxSizeTag); 1092 __ LoadImmediate(TMP, RawObject::SizeTag::kMaxSizeTag);
1089 __ sltu(CMPRES1, TMP, T2); // CMPRES1 = T2 > TMP ? 1 : 0. 1093 __ sltu(CMPRES1, TMP, T2); // CMPRES1 = T2 > TMP ? 1 : 0.
1090 __ movn(T2, ZR, CMPRES1); // T2 = CMPRES1 != 0 ? 0 : T2. 1094 __ movn(T2, ZR, CMPRES1); // T2 = CMPRES1 != 0 ? 0 : T2.
1091 __ sll(TMP, T2, shift); // TMP = T2 << shift. 1095 __ sll(TMP, T2, shift); // TMP = T2 << shift.
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
1354 __ addiu(T4, T4, Immediate(kWordSize)); 1358 __ addiu(T4, T4, Immediate(kWordSize));
1355 __ bne(T4, T3, &loop); 1359 __ bne(T4, T3, &loop);
1356 __ delay_slot()->sw(T7, Address(T4, -kWordSize)); 1360 __ delay_slot()->sw(T7, Address(T4, -kWordSize));
1357 __ Bind(&loop_exit); 1361 __ Bind(&loop_exit);
1358 } 1362 }
1359 if (is_cls_parameterized) { 1363 if (is_cls_parameterized) {
1360 // R1: new object type arguments. 1364 // R1: new object type arguments.
1361 // Set the type arguments in the new object. 1365 // Set the type arguments in the new object.
1362 __ sw(T1, Address(T2, cls.type_arguments_field_offset())); 1366 __ sw(T1, Address(T2, cls.type_arguments_field_offset()));
1363 } 1367 }
1368 __ BumpAllocationCount(Heap::kNew, cls.id(), T5);
1364 // Done allocating and initializing the instance. 1369 // Done allocating and initializing the instance.
1365 // T2: new object still missing its heap tag. 1370 // T2: new object still missing its heap tag.
1366 __ Ret(); 1371 __ Ret();
1367 __ delay_slot()->addiu(V0, T2, Immediate(kHeapObjectTag)); 1372 __ delay_slot()->addiu(V0, T2, Immediate(kHeapObjectTag));
1368 1373
1369 __ Bind(&slow_case); 1374 __ Bind(&slow_case);
1370 } 1375 }
1371 if (is_cls_parameterized) { 1376 if (is_cls_parameterized) {
1372 __ lw(T1, Address(SP, 1 * kWordSize)); 1377 __ lw(T1, Address(SP, 1 * kWordSize));
1373 __ lw(T0, Address(SP, 0 * kWordSize)); 1378 __ lw(T0, Address(SP, 0 * kWordSize));
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1443 __ lw(CMPRES1, Address(TMP)); 1448 __ lw(CMPRES1, Address(TMP));
1444 if (FLAG_use_slow_path) { 1449 if (FLAG_use_slow_path) {
1445 __ b(&slow_case); 1450 __ b(&slow_case);
1446 } else { 1451 } else {
1447 __ BranchUnsignedGreaterEqual(T3, CMPRES1, &slow_case); 1452 __ BranchUnsignedGreaterEqual(T3, CMPRES1, &slow_case);
1448 } 1453 }
1449 1454
1450 // Successfully allocated the object, now update top to point to 1455 // Successfully allocated the object, now update top to point to
1451 // next object start and initialize the object. 1456 // next object start and initialize the object.
1452 __ sw(T3, Address(T5)); 1457 __ sw(T3, Address(T5));
1458 // T3: Size of allocation in bytes.
1459 __ subu(T3, T3, T2);
1460 __ BumpAllocationCount(Heap::kNew, cls.id(), T3, T5);
1453 1461
1454 // T2: new closure object. 1462 // T2: new closure object.
1455 // T4: new context object (only if is_implicit_closure). 1463 // T4: new context object (only if is_implicit_closure).
1456 // Set the tags. 1464 // Set the tags.
1457 uword tags = 0; 1465 uword tags = 0;
1458 tags = RawObject::SizeTag::update(closure_size, tags); 1466 tags = RawObject::SizeTag::update(closure_size, tags);
1459 tags = RawObject::ClassIdTag::update(cls.id(), tags); 1467 tags = RawObject::ClassIdTag::update(cls.id(), tags);
1460 __ LoadImmediate(T0, tags); 1468 __ LoadImmediate(T0, tags);
1461 __ sw(T0, Address(T2, Instance::tags_offset())); 1469 __ sw(T0, Address(T2, Instance::tags_offset()));
1462 1470
(...skipping 948 matching lines...) Expand 10 before | Expand all | Expand 10 after
2411 const Register right = T0; 2419 const Register right = T0;
2412 __ lw(left, Address(SP, 1 * kWordSize)); 2420 __ lw(left, Address(SP, 1 * kWordSize));
2413 __ lw(right, Address(SP, 0 * kWordSize)); 2421 __ lw(right, Address(SP, 0 * kWordSize));
2414 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp1, temp2); 2422 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp1, temp2);
2415 __ Ret(); 2423 __ Ret();
2416 } 2424 }
2417 2425
2418 } // namespace dart 2426 } // namespace dart
2419 2427
2420 #endif // defined TARGET_ARCH_MIPS 2428 #endif // defined TARGET_ARCH_MIPS
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698