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/cpu.h" | 10 #include "vm/cpu.h" |
(...skipping 1786 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1797 // R3: instance class id. | 1797 // R3: instance class id. |
1798 // R4: instance type arguments (null if none), used only if n > 1. | 1798 // R4: instance type arguments (null if none), used only if n > 1. |
1799 __ ldr(R2, FieldAddress(R2, SubtypeTestCache::cache_offset())); | 1799 __ ldr(R2, FieldAddress(R2, SubtypeTestCache::cache_offset())); |
1800 __ AddImmediate(R2, Array::data_offset() - kHeapObjectTag); | 1800 __ AddImmediate(R2, Array::data_offset() - kHeapObjectTag); |
1801 | 1801 |
1802 Label loop, found, not_found, next_iteration; | 1802 Label loop, found, not_found, next_iteration; |
1803 // R2: entry start. | 1803 // R2: entry start. |
1804 // R3: instance class id. | 1804 // R3: instance class id. |
1805 // R4: instance type arguments. | 1805 // R4: instance type arguments. |
1806 __ SmiTag(R3); | 1806 __ SmiTag(R3); |
| 1807 __ CompareImmediate(R3, Smi::RawValue(kClosureCid)); |
| 1808 __ ldr(R3, FieldAddress(R0, Closure::function_offset()), EQ); |
| 1809 // R3: instance class id as Smi or function. |
1807 __ Bind(&loop); | 1810 __ Bind(&loop); |
1808 __ ldr(R9, Address(R2, kWordSize * SubtypeTestCache::kInstanceClassId)); | 1811 __ ldr(R9, |
| 1812 Address(R2, kWordSize * SubtypeTestCache::kInstanceClassIdOrFunction)); |
1809 __ CompareObject(R9, Object::null_object()); | 1813 __ CompareObject(R9, Object::null_object()); |
1810 __ b(¬_found, EQ); | 1814 __ b(¬_found, EQ); |
1811 __ cmp(R9, Operand(R3)); | 1815 __ cmp(R9, Operand(R3)); |
1812 if (n == 1) { | 1816 if (n == 1) { |
1813 __ b(&found, EQ); | 1817 __ b(&found, EQ); |
1814 } else { | 1818 } else { |
1815 __ b(&next_iteration, NE); | 1819 __ b(&next_iteration, NE); |
1816 __ ldr(R9, | 1820 __ ldr(R9, |
1817 Address(R2, kWordSize * SubtypeTestCache::kInstanceTypeArguments)); | 1821 Address(R2, kWordSize * SubtypeTestCache::kInstanceTypeArguments)); |
1818 __ cmp(R9, Operand(R4)); | 1822 __ cmp(R9, Operand(R4)); |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2141 __ Bind(&miss); | 2145 __ Bind(&miss); |
2142 __ LoadIsolate(R2); | 2146 __ LoadIsolate(R2); |
2143 __ ldr(CODE_REG, Address(R2, Isolate::ic_miss_code_offset())); | 2147 __ ldr(CODE_REG, Address(R2, Isolate::ic_miss_code_offset())); |
2144 __ ldr(R1, FieldAddress(CODE_REG, Code::entry_point_offset())); | 2148 __ ldr(R1, FieldAddress(CODE_REG, Code::entry_point_offset())); |
2145 __ Ret(); | 2149 __ Ret(); |
2146 } | 2150 } |
2147 | 2151 |
2148 } // namespace dart | 2152 } // namespace dart |
2149 | 2153 |
2150 #endif // defined TARGET_ARCH_ARM | 2154 #endif // defined TARGET_ARCH_ARM |
OLD | NEW |