OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_ARM64 | 7 #if V8_TARGET_ARCH_ARM64 |
8 | 8 |
9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
(...skipping 3798 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3809 } | 3809 } |
3810 | 3810 |
3811 | 3811 |
3812 void MacroAssembler::TryGetFunctionPrototype(Register function, | 3812 void MacroAssembler::TryGetFunctionPrototype(Register function, |
3813 Register result, | 3813 Register result, |
3814 Register scratch, | 3814 Register scratch, |
3815 Label* miss, | 3815 Label* miss, |
3816 BoundFunctionAction action) { | 3816 BoundFunctionAction action) { |
3817 ASSERT(!AreAliased(function, result, scratch)); | 3817 ASSERT(!AreAliased(function, result, scratch)); |
3818 | 3818 |
3819 // Check that the receiver isn't a smi. | 3819 Label non_instance; |
3820 JumpIfSmi(function, miss); | 3820 if (action == kMissOnBoundFunction) { |
| 3821 // Check that the receiver isn't a smi. |
| 3822 JumpIfSmi(function, miss); |
3821 | 3823 |
3822 // Check that the function really is a function. Load map into result reg. | 3824 // Check that the function really is a function. Load map into result reg. |
3823 JumpIfNotObjectType(function, result, scratch, JS_FUNCTION_TYPE, miss); | 3825 JumpIfNotObjectType(function, result, scratch, JS_FUNCTION_TYPE, miss); |
3824 | 3826 |
3825 if (action == kMissOnBoundFunction) { | |
3826 Register scratch_w = scratch.W(); | 3827 Register scratch_w = scratch.W(); |
3827 Ldr(scratch, | 3828 Ldr(scratch, |
3828 FieldMemOperand(function, JSFunction::kSharedFunctionInfoOffset)); | 3829 FieldMemOperand(function, JSFunction::kSharedFunctionInfoOffset)); |
3829 // On 64-bit platforms, compiler hints field is not a smi. See definition of | 3830 // On 64-bit platforms, compiler hints field is not a smi. See definition of |
3830 // kCompilerHintsOffset in src/objects.h. | 3831 // kCompilerHintsOffset in src/objects.h. |
3831 Ldr(scratch_w, | 3832 Ldr(scratch_w, |
3832 FieldMemOperand(scratch, SharedFunctionInfo::kCompilerHintsOffset)); | 3833 FieldMemOperand(scratch, SharedFunctionInfo::kCompilerHintsOffset)); |
3833 Tbnz(scratch, SharedFunctionInfo::kBoundFunction, miss); | 3834 Tbnz(scratch, SharedFunctionInfo::kBoundFunction, miss); |
| 3835 |
| 3836 // Make sure that the function has an instance prototype. |
| 3837 Ldrb(scratch, FieldMemOperand(result, Map::kBitFieldOffset)); |
| 3838 Tbnz(scratch, Map::kHasNonInstancePrototype, &non_instance); |
3834 } | 3839 } |
3835 | 3840 |
3836 // Make sure that the function has an instance prototype. | |
3837 Label non_instance; | |
3838 Ldrb(scratch, FieldMemOperand(result, Map::kBitFieldOffset)); | |
3839 Tbnz(scratch, Map::kHasNonInstancePrototype, &non_instance); | |
3840 | |
3841 // Get the prototype or initial map from the function. | 3841 // Get the prototype or initial map from the function. |
3842 Ldr(result, | 3842 Ldr(result, |
3843 FieldMemOperand(function, JSFunction::kPrototypeOrInitialMapOffset)); | 3843 FieldMemOperand(function, JSFunction::kPrototypeOrInitialMapOffset)); |
3844 | 3844 |
3845 // If the prototype or initial map is the hole, don't return it and simply | 3845 // If the prototype or initial map is the hole, don't return it and simply |
3846 // miss the cache instead. This will allow us to allocate a prototype object | 3846 // miss the cache instead. This will allow us to allocate a prototype object |
3847 // on-demand in the runtime system. | 3847 // on-demand in the runtime system. |
3848 JumpIfRoot(result, Heap::kTheHoleValueRootIndex, miss); | 3848 JumpIfRoot(result, Heap::kTheHoleValueRootIndex, miss); |
3849 | 3849 |
3850 // If the function does not have an initial map, we're done. | 3850 // If the function does not have an initial map, we're done. |
3851 Label done; | 3851 Label done; |
3852 JumpIfNotObjectType(result, scratch, scratch, MAP_TYPE, &done); | 3852 JumpIfNotObjectType(result, scratch, scratch, MAP_TYPE, &done); |
3853 | 3853 |
3854 // Get the prototype from the initial map. | 3854 // Get the prototype from the initial map. |
3855 Ldr(result, FieldMemOperand(result, Map::kPrototypeOffset)); | 3855 Ldr(result, FieldMemOperand(result, Map::kPrototypeOffset)); |
3856 B(&done); | |
3857 | 3856 |
3858 // Non-instance prototype: fetch prototype from constructor field in initial | 3857 if (action == kMissOnBoundFunction) { |
3859 // map. | 3858 B(&done); |
3860 Bind(&non_instance); | 3859 |
3861 Ldr(result, FieldMemOperand(result, Map::kConstructorOffset)); | 3860 // Non-instance prototype: fetch prototype from constructor field in initial |
| 3861 // map. |
| 3862 Bind(&non_instance); |
| 3863 Ldr(result, FieldMemOperand(result, Map::kConstructorOffset)); |
| 3864 } |
3862 | 3865 |
3863 // All done. | 3866 // All done. |
3864 Bind(&done); | 3867 Bind(&done); |
3865 } | 3868 } |
3866 | 3869 |
3867 | 3870 |
3868 void MacroAssembler::CompareRoot(const Register& obj, | 3871 void MacroAssembler::CompareRoot(const Register& obj, |
3869 Heap::RootListIndex index) { | 3872 Heap::RootListIndex index) { |
3870 UseScratchRegisterScope temps(this); | 3873 UseScratchRegisterScope temps(this); |
3871 Register temp = temps.AcquireX(); | 3874 Register temp = temps.AcquireX(); |
(...skipping 1498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5370 } | 5373 } |
5371 } | 5374 } |
5372 | 5375 |
5373 | 5376 |
5374 #undef __ | 5377 #undef __ |
5375 | 5378 |
5376 | 5379 |
5377 } } // namespace v8::internal | 5380 } } // namespace v8::internal |
5378 | 5381 |
5379 #endif // V8_TARGET_ARCH_ARM64 | 5382 #endif // V8_TARGET_ARCH_ARM64 |
OLD | NEW |