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 650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 | 661 |
662 // Get the class index and insert it into the tags. | 662 // Get the class index and insert it into the tags. |
663 __ orl(EDI, Immediate(RawObject::ClassIdTag::encode(cid))); | 663 __ orl(EDI, Immediate(RawObject::ClassIdTag::encode(cid))); |
664 __ movl(FieldAddress(EAX, Array::tags_offset()), EDI); // Tags. | 664 __ movl(FieldAddress(EAX, Array::tags_offset()), EDI); // Tags. |
665 } | 665 } |
666 // EAX: new object start as a tagged pointer. | 666 // EAX: new object start as a tagged pointer. |
667 // EBX: allocation size. | 667 // EBX: allocation size. |
668 // ECX: array element type. | 668 // ECX: array element type. |
669 // EDX: Array length as Smi (preserved). | 669 // EDX: Array length as Smi (preserved). |
670 // Store the type argument field. | 670 // Store the type argument field. |
671 // No generetional barrier needed, since we store into a new object. | 671 // No generational barrier needed, since we store into a new object. |
672 __ StoreIntoObjectNoBarrier( | 672 __ StoreIntoObjectNoBarrier( |
673 EAX, FieldAddress(EAX, Array::type_arguments_offset()), ECX); | 673 EAX, FieldAddress(EAX, Array::type_arguments_offset()), ECX); |
674 | 674 |
675 // Set the length field. | 675 // Set the length field. |
676 __ StoreIntoObjectNoBarrier(EAX, FieldAddress(EAX, Array::length_offset()), | 676 __ StoreIntoObjectNoBarrier(EAX, FieldAddress(EAX, Array::length_offset()), |
677 EDX); | 677 EDX); |
678 | 678 |
679 // Initialize all array elements to raw_null. | 679 // Initialize all array elements to raw_null. |
680 // EAX: new object start as a tagged pointer. | 680 // EAX: new object start as a tagged pointer. |
681 // EBX: allocation size. | 681 // EBX: allocation size. |
(...skipping 1402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2084 __ movl(EDX, | 2084 __ movl(EDX, |
2085 FieldAddress(ECX, MegamorphicCache::arguments_descriptor_offset())); | 2085 FieldAddress(ECX, MegamorphicCache::arguments_descriptor_offset())); |
2086 __ movl(EBX, FieldAddress(EAX, Function::entry_point_offset())); | 2086 __ movl(EBX, FieldAddress(EAX, Function::entry_point_offset())); |
2087 __ ret(); | 2087 __ ret(); |
2088 | 2088 |
2089 __ Bind(&probe_failed); | 2089 __ Bind(&probe_failed); |
2090 // Probe failed, check if it is a miss. | 2090 // Probe failed, check if it is a miss. |
2091 __ cmpl(FieldAddress(EDI, EDX, TIMES_4, base), Immediate(kIllegalCid)); | 2091 __ cmpl(FieldAddress(EDI, EDX, TIMES_4, base), Immediate(kIllegalCid)); |
2092 __ j(ZERO, &load_target, Assembler::kNearJump); | 2092 __ j(ZERO, &load_target, Assembler::kNearJump); |
2093 | 2093 |
2094 // Try next extry in the table. | 2094 // Try next entry in the table. |
2095 __ AddImmediate(EDX, Immediate(Smi::RawValue(1))); | 2095 __ AddImmediate(EDX, Immediate(Smi::RawValue(1))); |
2096 __ jmp(&loop); | 2096 __ jmp(&loop); |
2097 | 2097 |
2098 // Load cid for the Smi case. | 2098 // Load cid for the Smi case. |
2099 __ Bind(&smi_case); | 2099 __ Bind(&smi_case); |
2100 __ movl(EAX, Immediate(kSmiCid)); | 2100 __ movl(EAX, Immediate(kSmiCid)); |
2101 __ jmp(&cid_loaded); | 2101 __ jmp(&cid_loaded); |
2102 } | 2102 } |
2103 | 2103 |
2104 // Called from switchable IC calls. | 2104 // Called from switchable IC calls. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2136 } | 2136 } |
2137 | 2137 |
2138 | 2138 |
2139 void StubCode::GenerateAsynchronousGapMarkerStub(Assembler* assembler) { | 2139 void StubCode::GenerateAsynchronousGapMarkerStub(Assembler* assembler) { |
2140 __ int3(); | 2140 __ int3(); |
2141 } | 2141 } |
2142 | 2142 |
2143 } // namespace dart | 2143 } // namespace dart |
2144 | 2144 |
2145 #endif // defined TARGET_ARCH_IA32 | 2145 #endif // defined TARGET_ARCH_IA32 |
OLD | NEW |