| 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_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 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 591 // R3: array size. | 591 // R3: array size. |
| 592 // R7: potential next object start. | 592 // R7: potential next object start. |
| 593 // R8: points to new space object. | 593 // R8: points to new space object. |
| 594 __ LoadFromOffset(kWord, IP, R8, Scavenger::end_offset()); | 594 __ LoadFromOffset(kWord, IP, R8, Scavenger::end_offset()); |
| 595 __ cmp(R7, ShifterOperand(IP)); | 595 __ cmp(R7, ShifterOperand(IP)); |
| 596 __ b(&slow_case, CS); // Branch if unsigned higher or equal. | 596 __ b(&slow_case, CS); // Branch if unsigned higher or equal. |
| 597 | 597 |
| 598 // Successfully allocated the object(s), now update top to point to | 598 // Successfully allocated the object(s), now update top to point to |
| 599 // next object start and initialize the object. | 599 // next object start and initialize the object. |
| 600 // R0: potential new object start. | 600 // R0: potential new object start. |
| 601 // R3: array size. |
| 601 // R7: potential next object start. | 602 // R7: potential next object start. |
| 602 // R8: Points to new space object. | 603 // R8: Points to new space object. |
| 603 __ StoreToOffset(kWord, R7, R8, Scavenger::top_offset()); | 604 __ StoreToOffset(kWord, R7, R8, Scavenger::top_offset()); |
| 604 __ add(R0, R0, ShifterOperand(kHeapObjectTag)); | 605 __ add(R0, R0, ShifterOperand(kHeapObjectTag)); |
| 606 __ BumpAllocationCount(Heap::kNew, kArrayCid, R3, R8); |
| 605 | 607 |
| 606 // R0: new object start as a tagged pointer. | 608 // R0: new object start as a tagged pointer. |
| 607 // R1: array element type. | 609 // R1: array element type. |
| 608 // R2: array length as Smi. | 610 // R2: array length as Smi. |
| 609 // R3: array size. | 611 // R3: array size. |
| 610 // R7: new object end address. | 612 // R7: new object end address. |
| 611 | 613 |
| 612 // Store the type argument field. | 614 // Store the type argument field. |
| 613 __ StoreIntoObjectNoBarrier( | 615 __ StoreIntoObjectNoBarrier( |
| 614 R0, | 616 R0, |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 927 } | 929 } |
| 928 | 930 |
| 929 // Successfully allocated the object, now update top to point to | 931 // Successfully allocated the object, now update top to point to |
| 930 // next object start and initialize the object. | 932 // next object start and initialize the object. |
| 931 // R0: new object. | 933 // R0: new object. |
| 932 // R1: number of context variables. | 934 // R1: number of context variables. |
| 933 // R2: object size. | 935 // R2: object size. |
| 934 // R3: next object start. | 936 // R3: next object start. |
| 935 __ str(R3, Address(R5, 0)); | 937 __ str(R3, Address(R5, 0)); |
| 936 __ add(R0, R0, ShifterOperand(kHeapObjectTag)); | 938 __ add(R0, R0, ShifterOperand(kHeapObjectTag)); |
| 939 __ BumpAllocationCount(Heap::kNew, context_class.id(), R2, R5); |
| 937 | 940 |
| 938 // Calculate the size tag. | 941 // Calculate the size tag. |
| 939 // R0: new object. | 942 // R0: new object. |
| 940 // R1: number of context variables. | 943 // R1: number of context variables. |
| 941 // R2: object size. | 944 // R2: object size. |
| 942 const intptr_t shift = RawObject::kSizeTagBit - kObjectAlignmentLog2; | 945 const intptr_t shift = RawObject::kSizeTagBit - kObjectAlignmentLog2; |
| 943 __ CompareImmediate(R2, RawObject::SizeTag::kMaxSizeTag); | 946 __ CompareImmediate(R2, RawObject::SizeTag::kMaxSizeTag); |
| 944 // If no size tag overflow, shift R2 left, else set R2 to zero. | 947 // If no size tag overflow, shift R2 left, else set R2 to zero. |
| 945 __ mov(R2, ShifterOperand(R2, LSL, shift), LS); | 948 __ mov(R2, ShifterOperand(R2, LSL, shift), LS); |
| 946 __ mov(R2, ShifterOperand(0), HI); | 949 __ mov(R2, ShifterOperand(0), HI); |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1109 __ cmp(R3, ShifterOperand(IP)); | 1112 __ cmp(R3, ShifterOperand(IP)); |
| 1110 if (FLAG_use_slow_path) { | 1113 if (FLAG_use_slow_path) { |
| 1111 __ b(&slow_case); | 1114 __ b(&slow_case); |
| 1112 } else { | 1115 } else { |
| 1113 __ b(&slow_case, CS); // Branch if unsigned higher or equal. | 1116 __ b(&slow_case, CS); // Branch if unsigned higher or equal. |
| 1114 } | 1117 } |
| 1115 | 1118 |
| 1116 // Successfully allocated the object(s), now update top to point to | 1119 // Successfully allocated the object(s), now update top to point to |
| 1117 // next object start and initialize the object. | 1120 // next object start and initialize the object. |
| 1118 __ str(R3, Address(R5, 0)); | 1121 __ str(R3, Address(R5, 0)); |
| 1122 __ BumpAllocationCount(Heap::kNew, cls.id(), R5); |
| 1119 | 1123 |
| 1120 if (is_cls_parameterized) { | 1124 if (is_cls_parameterized) { |
| 1121 // Initialize the type arguments field in the object. | 1125 // Initialize the type arguments field in the object. |
| 1122 // R2: new object start. | 1126 // R2: new object start. |
| 1123 // R4: potential new object end and, if R4 != R3, potential new | 1127 // R4: potential new object end and, if R4 != R3, potential new |
| 1124 // InstantiatedTypeArguments object start. | 1128 // InstantiatedTypeArguments object start. |
| 1125 // R3: next object start. | 1129 // R3: next object start. |
| 1126 Label type_arguments_ready; | 1130 Label type_arguments_ready; |
| 1127 __ cmp(R4, ShifterOperand(R3)); | 1131 __ cmp(R4, ShifterOperand(R3)); |
| 1128 __ b(&type_arguments_ready, EQ); | 1132 __ b(&type_arguments_ready, EQ); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1273 __ cmp(R3, ShifterOperand(IP)); | 1277 __ cmp(R3, ShifterOperand(IP)); |
| 1274 if (FLAG_use_slow_path) { | 1278 if (FLAG_use_slow_path) { |
| 1275 __ b(&slow_case); | 1279 __ b(&slow_case); |
| 1276 } else { | 1280 } else { |
| 1277 __ b(&slow_case, CS); // Branch if unsigned higher or equal. | 1281 __ b(&slow_case, CS); // Branch if unsigned higher or equal. |
| 1278 } | 1282 } |
| 1279 | 1283 |
| 1280 // Successfully allocated the object, now update top to point to | 1284 // Successfully allocated the object, now update top to point to |
| 1281 // next object start and initialize the object. | 1285 // next object start and initialize the object. |
| 1282 __ str(R3, Address(R5, 0)); | 1286 __ str(R3, Address(R5, 0)); |
| 1283 | 1287 // R3: Size of allocation in bytes. |
| 1288 __ sub(R3, R3, ShifterOperand(R2)); |
| 1289 __ BumpAllocationCount(Heap::kNew, cls.id(), R3, R5); |
| 1284 // R2: new closure object. | 1290 // R2: new closure object. |
| 1285 // R4: new context object (only if is_implicit_closure). | 1291 // R4: new context object (only if is_implicit_closure). |
| 1286 // Set the tags. | 1292 // Set the tags. |
| 1287 uword tags = 0; | 1293 uword tags = 0; |
| 1288 tags = RawObject::SizeTag::update(closure_size, tags); | 1294 tags = RawObject::SizeTag::update(closure_size, tags); |
| 1289 tags = RawObject::ClassIdTag::update(cls.id(), tags); | 1295 tags = RawObject::ClassIdTag::update(cls.id(), tags); |
| 1290 __ LoadImmediate(R0, tags); | 1296 __ LoadImmediate(R0, tags); |
| 1291 __ str(R0, Address(R2, Instance::tags_offset())); | 1297 __ str(R0, Address(R2, Instance::tags_offset())); |
| 1292 | 1298 |
| 1293 // Initialize the function field in the object. | 1299 // Initialize the function field in the object. |
| (...skipping 848 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2142 const Register right = R0; | 2148 const Register right = R0; |
| 2143 __ ldr(left, Address(SP, 1 * kWordSize)); | 2149 __ ldr(left, Address(SP, 1 * kWordSize)); |
| 2144 __ ldr(right, Address(SP, 0 * kWordSize)); | 2150 __ ldr(right, Address(SP, 0 * kWordSize)); |
| 2145 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp); | 2151 GenerateIdenticalWithNumberCheckStub(assembler, left, right, temp); |
| 2146 __ Ret(); | 2152 __ Ret(); |
| 2147 } | 2153 } |
| 2148 | 2154 |
| 2149 } // namespace dart | 2155 } // namespace dart |
| 2150 | 2156 |
| 2151 #endif // defined TARGET_ARCH_ARM | 2157 #endif // defined TARGET_ARCH_ARM |
| OLD | NEW |