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_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 Loading... |
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 Loading... |
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 Loading... |
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 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1300 if (FLAG_use_slow_path) { | 1308 if (FLAG_use_slow_path) { |
1301 __ jmp(&slow_case); | 1309 __ jmp(&slow_case); |
1302 } else { | 1310 } else { |
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); |
| 1318 __ subq(RDI, RAX); |
| 1319 __ UpdateAllocationStatsWithSize(cls.id(), RDI); |
1310 | 1320 |
1311 // RAX: new closure object. | 1321 // RAX: new closure object. |
1312 // RBX: new context object (only if is_implicit_closure). | 1322 // RBX: new context object (only if is_implicit_closure). |
1313 // Set the tags. | 1323 // Set the tags. |
1314 uword tags = 0; | 1324 uword tags = 0; |
1315 tags = RawObject::SizeTag::update(closure_size, tags); | 1325 tags = RawObject::SizeTag::update(closure_size, tags); |
1316 tags = RawObject::ClassIdTag::update(cls.id(), tags); | 1326 tags = RawObject::ClassIdTag::update(cls.id(), tags); |
1317 __ movq(Address(RAX, Instance::tags_offset()), Immediate(tags)); | 1327 __ movq(Address(RAX, Instance::tags_offset()), Immediate(tags)); |
1318 | 1328 |
1319 // Initialize the function field in the object. | 1329 // Initialize the function field in the object. |
(...skipping 855 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2175 | 2185 |
2176 __ movq(left, Address(RSP, 2 * kWordSize)); | 2186 __ movq(left, Address(RSP, 2 * kWordSize)); |
2177 __ movq(right, Address(RSP, 1 * kWordSize)); | 2187 __ movq(right, Address(RSP, 1 * kWordSize)); |
2178 GenerateIdenticalWithNumberCheckStub(assembler, left, right); | 2188 GenerateIdenticalWithNumberCheckStub(assembler, left, right); |
2179 __ ret(); | 2189 __ ret(); |
2180 } | 2190 } |
2181 | 2191 |
2182 } // namespace dart | 2192 } // namespace dart |
2183 | 2193 |
2184 #endif // defined TARGET_ARCH_X64 | 2194 #endif // defined TARGET_ARCH_X64 |
OLD | NEW |