OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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_ARM64) | 6 #if defined(TARGET_ARCH_ARM64) |
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 1847 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1858 // R3: instance class id. | 1858 // R3: instance class id. |
1859 // R4: instance type arguments (null if none), used only if n > 1. | 1859 // R4: instance type arguments (null if none), used only if n > 1. |
1860 __ LoadFieldFromOffset(R2, R2, SubtypeTestCache::cache_offset()); | 1860 __ LoadFieldFromOffset(R2, R2, SubtypeTestCache::cache_offset()); |
1861 __ AddImmediate(R2, R2, Array::data_offset() - kHeapObjectTag); | 1861 __ AddImmediate(R2, R2, Array::data_offset() - kHeapObjectTag); |
1862 | 1862 |
1863 Label loop, found, not_found, next_iteration; | 1863 Label loop, found, not_found, next_iteration; |
1864 // R2: entry start. | 1864 // R2: entry start. |
1865 // R3: instance class id. | 1865 // R3: instance class id. |
1866 // R4: instance type arguments. | 1866 // R4: instance type arguments. |
1867 __ SmiTag(R3); | 1867 __ SmiTag(R3); |
| 1868 __ CompareImmediate(R3, Smi::RawValue(kClosureCid)); |
| 1869 __ b(&loop, NE); |
| 1870 __ LoadFieldFromOffset(R3, R0, Closure::function_offset()); |
| 1871 // R3: instance class id as Smi or function. |
1868 __ Bind(&loop); | 1872 __ Bind(&loop); |
1869 __ LoadFromOffset( | 1873 __ LoadFromOffset( |
1870 R5, R2, kWordSize * SubtypeTestCache::kInstanceClassId); | 1874 R5, R2, kWordSize * SubtypeTestCache::kInstanceClassIdOrFunction); |
1871 __ CompareObject(R5, Object::null_object()); | 1875 __ CompareObject(R5, Object::null_object()); |
1872 __ b(¬_found, EQ); | 1876 __ b(¬_found, EQ); |
1873 __ CompareRegisters(R5, R3); | 1877 __ CompareRegisters(R5, R3); |
1874 if (n == 1) { | 1878 if (n == 1) { |
1875 __ b(&found, EQ); | 1879 __ b(&found, EQ); |
1876 } else { | 1880 } else { |
1877 __ b(&next_iteration, NE); | 1881 __ b(&next_iteration, NE); |
1878 __ LoadFromOffset( | 1882 __ LoadFromOffset( |
1879 R5, R2, kWordSize * SubtypeTestCache::kInstanceTypeArguments); | 1883 R5, R2, kWordSize * SubtypeTestCache::kInstanceTypeArguments); |
1880 __ CompareRegisters(R5, R4); | 1884 __ CompareRegisters(R5, R4); |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2189 __ Bind(&miss); | 2193 __ Bind(&miss); |
2190 __ LoadIsolate(R2); | 2194 __ LoadIsolate(R2); |
2191 __ ldr(CODE_REG, Address(R2, Isolate::ic_miss_code_offset())); | 2195 __ ldr(CODE_REG, Address(R2, Isolate::ic_miss_code_offset())); |
2192 __ ldr(R1, FieldAddress(CODE_REG, Code::entry_point_offset())); | 2196 __ ldr(R1, FieldAddress(CODE_REG, Code::entry_point_offset())); |
2193 __ ret(); | 2197 __ ret(); |
2194 } | 2198 } |
2195 | 2199 |
2196 } // namespace dart | 2200 } // namespace dart |
2197 | 2201 |
2198 #endif // defined TARGET_ARCH_ARM64 | 2202 #endif // defined TARGET_ARCH_ARM64 |
OLD | NEW |