Chromium Code Reviews| 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_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 570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 581 __ j(ABOVE_EQUAL, &slow_case); | 581 __ j(ABOVE_EQUAL, &slow_case); |
| 582 | 582 |
| 583 // Successfully allocated the object(s), now update top to point to | 583 // Successfully allocated the object(s), now update top to point to |
| 584 // next object start and initialize the object. | 584 // next object start and initialize the object. |
| 585 // EAX: potential new object start. | 585 // EAX: potential new object start. |
| 586 // EBX: potential next object start. | 586 // EBX: potential next object start. |
| 587 // EDX: Array length as Smi. | 587 // EDX: Array length as Smi. |
| 588 // EDI: Points to new space object. | 588 // EDI: Points to new space object. |
| 589 __ movl(Address(EDI, Scavenger::top_offset()), EBX); | 589 __ movl(Address(EDI, Scavenger::top_offset()), EBX); |
| 590 __ addl(EAX, Immediate(kHeapObjectTag)); | 590 __ addl(EAX, Immediate(kHeapObjectTag)); |
| 591 // EDI: Size of allocation in bytes. | |
|
Ivan Posva
2013/12/12 13:53:24
At this point EDI does not contain the size of the
| |
| 592 __ movl(EDI, EBX); | |
| 593 __ subl(EDI, EAX); | |
| 594 __ BumpAllocationCount(Heap::kNew, kArrayCid, EDI, kNoRegister); | |
| 591 | 595 |
| 592 // EAX: new object start as a tagged pointer. | 596 // EAX: new object start as a tagged pointer. |
| 593 // EBX: new object end address. | 597 // EBX: new object end address. |
| 594 // ECX: array element type. | 598 // ECX: array element type. |
| 595 // EDX: Array length as Smi. | 599 // EDX: Array length as Smi. |
| 596 | 600 |
| 597 // Store the type argument field. | 601 // Store the type argument field. |
| 598 __ StoreIntoObjectNoBarrier( | 602 __ StoreIntoObjectNoBarrier( |
| 599 EAX, | 603 EAX, |
| 600 FieldAddress(EAX, Array::type_arguments_offset()), | 604 FieldAddress(EAX, Array::type_arguments_offset()), |
| (...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 923 __ j(ABOVE_EQUAL, &slow_case, Assembler::kNearJump); | 927 __ j(ABOVE_EQUAL, &slow_case, Assembler::kNearJump); |
| 924 } | 928 } |
| 925 | 929 |
| 926 // Successfully allocated the object, now update top to point to | 930 // Successfully allocated the object, now update top to point to |
| 927 // next object start and initialize the object. | 931 // next object start and initialize the object. |
| 928 // EAX: new object. | 932 // EAX: new object. |
| 929 // EBX: next object start. | 933 // EBX: next object start. |
| 930 // EDX: number of context variables. | 934 // EDX: number of context variables. |
| 931 __ movl(Address::Absolute(heap->TopAddress()), EBX); | 935 __ movl(Address::Absolute(heap->TopAddress()), EBX); |
| 932 __ addl(EAX, Immediate(kHeapObjectTag)); | 936 __ addl(EAX, Immediate(kHeapObjectTag)); |
| 937 // EBX: Size of allocation in bytes. | |
|
Ivan Posva
2013/12/12 13:53:24
ditto
| |
| 938 __ subl(EBX, EAX); | |
| 939 __ BumpAllocationCount(Heap::kNew, context_class.id(), EBX, kNoRegister); | |
| 933 | 940 |
| 934 // Calculate the size tag. | 941 // Calculate the size tag. |
| 935 // EAX: new object. | 942 // EAX: new object. |
| 936 // EDX: number of context variables. | 943 // EDX: number of context variables. |
| 937 { | 944 { |
| 938 Label size_tag_overflow, done; | 945 Label size_tag_overflow, done; |
| 939 __ leal(EBX, Address(EDX, TIMES_4, fixed_size)); | 946 __ leal(EBX, Address(EDX, TIMES_4, fixed_size)); |
| 940 __ andl(EBX, Immediate(-kObjectAlignment)); | 947 __ andl(EBX, Immediate(-kObjectAlignment)); |
| 941 __ cmpl(EBX, Immediate(RawObject::SizeTag::kMaxSizeTag)); | 948 __ cmpl(EBX, Immediate(RawObject::SizeTag::kMaxSizeTag)); |
| 942 __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump); | 949 __ j(ABOVE, &size_tag_overflow, Assembler::kNearJump); |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1124 // ECX: potential new object end and, if ECX != EBX, potential new | 1131 // ECX: potential new object end and, if ECX != EBX, potential new |
| 1125 // InstantiatedTypeArguments object start. | 1132 // InstantiatedTypeArguments object start. |
| 1126 } | 1133 } |
| 1127 // Check if the allocation fits into the remaining space. | 1134 // Check if the allocation fits into the remaining space. |
| 1128 // EAX: potential new object start. | 1135 // EAX: potential new object start. |
| 1129 // EBX: potential next object start. | 1136 // EBX: potential next object start. |
| 1130 __ cmpl(EBX, Address::Absolute(heap->EndAddress())); | 1137 __ cmpl(EBX, Address::Absolute(heap->EndAddress())); |
| 1131 if (FLAG_use_slow_path) { | 1138 if (FLAG_use_slow_path) { |
| 1132 __ jmp(&slow_case); | 1139 __ jmp(&slow_case); |
| 1133 } else { | 1140 } else { |
| 1134 __ j(ABOVE_EQUAL, &slow_case, Assembler::kNearJump); | 1141 __ j(ABOVE_EQUAL, &slow_case); |
| 1135 } | 1142 } |
| 1136 | 1143 |
| 1137 // Successfully allocated the object(s), now update top to point to | 1144 // Successfully allocated the object(s), now update top to point to |
| 1138 // next object start and initialize the object. | 1145 // next object start and initialize the object. |
| 1139 __ movl(Address::Absolute(heap->TopAddress()), EBX); | 1146 __ movl(Address::Absolute(heap->TopAddress()), EBX); |
| 1147 __ BumpAllocationCount(Heap::kNew, cls.id(), EDI); | |
| 1140 | 1148 |
| 1141 if (is_cls_parameterized) { | 1149 if (is_cls_parameterized) { |
| 1142 // Initialize the type arguments field in the object. | 1150 // Initialize the type arguments field in the object. |
| 1143 // EAX: new object start. | 1151 // EAX: new object start. |
| 1144 // ECX: potential new object end and, if ECX != EBX, potential new | 1152 // ECX: potential new object end and, if ECX != EBX, potential new |
| 1145 // InstantiatedTypeArguments object start. | 1153 // InstantiatedTypeArguments object start. |
| 1146 // EBX: next object start. | 1154 // EBX: next object start. |
| 1147 Label type_arguments_ready; | 1155 Label type_arguments_ready; |
| 1148 __ movl(EDI, Address(ESP, kObjectTypeArgumentsOffset)); | 1156 __ movl(EDI, Address(ESP, kObjectTypeArgumentsOffset)); |
| 1149 __ cmpl(ECX, EBX); | 1157 __ cmpl(ECX, EBX); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1294 __ cmpl(EBX, Address::Absolute(heap->EndAddress())); | 1302 __ cmpl(EBX, Address::Absolute(heap->EndAddress())); |
| 1295 if (FLAG_use_slow_path) { | 1303 if (FLAG_use_slow_path) { |
| 1296 __ jmp(&slow_case); | 1304 __ jmp(&slow_case); |
| 1297 } else { | 1305 } else { |
| 1298 __ j(ABOVE_EQUAL, &slow_case, Assembler::kNearJump); | 1306 __ j(ABOVE_EQUAL, &slow_case, Assembler::kNearJump); |
| 1299 } | 1307 } |
| 1300 | 1308 |
| 1301 // Successfully allocated the object, now update top to point to | 1309 // Successfully allocated the object, now update top to point to |
| 1302 // next object start and initialize the object. | 1310 // next object start and initialize the object. |
| 1303 __ movl(Address::Absolute(heap->TopAddress()), EBX); | 1311 __ movl(Address::Absolute(heap->TopAddress()), EBX); |
| 1312 // EBX: Size of allocation in bytes. | |
| 1313 __ subl(EBX, EAX); | |
| 1314 // EDX: Clobbered. | |
|
Ivan Posva
2013/12/12 13:53:24
This should not be necessary if the list of live r
| |
| 1315 __ BumpAllocationCount(Heap::kNew, cls.id(), EBX, EDX); | |
| 1304 | 1316 |
| 1305 // EAX: new closure object. | 1317 // EAX: new closure object. |
| 1306 // ECX: new context object (only if is_implicit_closure). | 1318 // ECX: new context object (only if is_implicit_closure). |
| 1307 // Set the tags. | 1319 // Set the tags. |
| 1308 uword tags = 0; | 1320 uword tags = 0; |
| 1309 tags = RawObject::SizeTag::update(closure_size, tags); | 1321 tags = RawObject::SizeTag::update(closure_size, tags); |
| 1310 tags = RawObject::ClassIdTag::update(cls.id(), tags); | 1322 tags = RawObject::ClassIdTag::update(cls.id(), tags); |
| 1311 __ movl(Address(EAX, Instance::tags_offset()), Immediate(tags)); | 1323 __ movl(Address(EAX, Instance::tags_offset()), Immediate(tags)); |
| 1312 | 1324 |
| 1313 // Initialize the function field in the object. | 1325 // Initialize the function field in the object. |
| 1314 // EAX: new closure object. | 1326 // EAX: new closure object. |
| 1315 // ECX: new context object (only if is_implicit_closure). | 1327 // ECX: new context object (only if is_implicit_closure). |
| 1316 // EBX: next object start. | |
| 1317 __ LoadObject(EDX, func); // Load function of closure to be allocated. | 1328 __ LoadObject(EDX, func); // Load function of closure to be allocated. |
| 1318 __ movl(Address(EAX, Closure::function_offset()), EDX); | 1329 __ movl(Address(EAX, Closure::function_offset()), EDX); |
| 1319 | 1330 |
| 1320 // Setup the context for this closure. | 1331 // Setup the context for this closure. |
| 1321 if (is_implicit_instance_closure) { | 1332 if (is_implicit_instance_closure) { |
| 1322 // Initialize the new context capturing the receiver. | 1333 // Initialize the new context capturing the receiver. |
| 1323 const Class& context_class = Class::ZoneHandle(Object::context_class()); | 1334 const Class& context_class = Class::ZoneHandle(Object::context_class()); |
| 1324 // Set the tags. | 1335 // Set the tags. |
| 1325 uword tags = 0; | 1336 uword tags = 0; |
| 1326 tags = RawObject::SizeTag::update(context_size, tags); | 1337 tags = RawObject::SizeTag::update(context_size, tags); |
| (...skipping 873 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2200 const Register temp = ECX; | 2211 const Register temp = ECX; |
| 2201 __ movl(left, Address(ESP, 2 * kWordSize)); | 2212 __ movl(left, Address(ESP, 2 * kWordSize)); |
| 2202 __ movl(right, Address(ESP, 1 * kWordSize)); | 2213 __ movl(right, Address(ESP, 1 * kWordSize)); |
| 2203 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp); | 2214 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp); |
| 2204 __ ret(); | 2215 __ ret(); |
| 2205 } | 2216 } |
| 2206 | 2217 |
| 2207 } // namespace dart | 2218 } // namespace dart |
| 2208 | 2219 |
| 2209 #endif // defined TARGET_ARCH_IA32 | 2220 #endif // defined TARGET_ARCH_IA32 |
| OLD | NEW |