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 1704 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1715 __ movl(EDX, FieldAddress(EDX, SubtypeTestCache::cache_offset())); | 1715 __ movl(EDX, FieldAddress(EDX, SubtypeTestCache::cache_offset())); |
1716 __ addl(EDX, Immediate(Array::data_offset() - kHeapObjectTag)); | 1716 __ addl(EDX, Immediate(Array::data_offset() - kHeapObjectTag)); |
1717 | 1717 |
1718 Label loop, found, not_found, next_iteration; | 1718 Label loop, found, not_found, next_iteration; |
1719 // EDX: Entry start. | 1719 // EDX: Entry start. |
1720 // ECX: instance class id. | 1720 // ECX: instance class id. |
1721 // EBX: instance type arguments (still null if closure). | 1721 // EBX: instance type arguments (still null if closure). |
1722 __ SmiTag(ECX); | 1722 __ SmiTag(ECX); |
1723 __ cmpl(ECX, Immediate(Smi::RawValue(kClosureCid))); | 1723 __ cmpl(ECX, Immediate(Smi::RawValue(kClosureCid))); |
1724 __ j(NOT_EQUAL, &loop, Assembler::kNearJump); | 1724 __ j(NOT_EQUAL, &loop, Assembler::kNearJump); |
1725 __ movl(EBX, FieldAddress(EAX, Closure::instantiator_offset())); | 1725 __ movl(EBX, FieldAddress(EAX, Closure::function_type_arguments_offset())); |
| 1726 __ cmpl(EBX, raw_null); // Cache cannot be used for generic closures. |
| 1727 __ j(NOT_EQUAL, ¬_found, Assembler::kNearJump); |
| 1728 __ movl(EBX, |
| 1729 FieldAddress(EAX, Closure::instantiator_type_arguments_offset())); |
1726 __ movl(ECX, FieldAddress(EAX, Closure::function_offset())); | 1730 __ movl(ECX, FieldAddress(EAX, Closure::function_offset())); |
1727 // ECX: instance class id as Smi or function. | 1731 // ECX: instance class id as Smi or function. |
1728 __ Bind(&loop); | 1732 __ Bind(&loop); |
1729 __ movl(EDI, Address(EDX, kWordSize * | 1733 __ movl(EDI, Address(EDX, kWordSize * |
1730 SubtypeTestCache::kInstanceClassIdOrFunction)); | 1734 SubtypeTestCache::kInstanceClassIdOrFunction)); |
1731 __ cmpl(EDI, raw_null); | 1735 __ cmpl(EDI, raw_null); |
1732 __ j(EQUAL, ¬_found, Assembler::kNearJump); | 1736 __ j(EQUAL, ¬_found, Assembler::kNearJump); |
1733 __ cmpl(EDI, ECX); | 1737 __ cmpl(EDI, ECX); |
1734 if (n == 1) { | 1738 if (n == 1) { |
1735 __ j(EQUAL, &found, Assembler::kNearJump); | 1739 __ j(EQUAL, &found, Assembler::kNearJump); |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2111 } | 2115 } |
2112 | 2116 |
2113 | 2117 |
2114 void StubCode::GenerateAsynchronousGapMarkerStub(Assembler* assembler) { | 2118 void StubCode::GenerateAsynchronousGapMarkerStub(Assembler* assembler) { |
2115 __ int3(); | 2119 __ int3(); |
2116 } | 2120 } |
2117 | 2121 |
2118 } // namespace dart | 2122 } // namespace dart |
2119 | 2123 |
2120 #endif // defined TARGET_ARCH_IA32 | 2124 #endif // defined TARGET_ARCH_IA32 |
OLD | NEW |