OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/code-stubs.h" | 5 #include "src/code-stubs.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/ast/ast.h" | 9 #include "src/ast/ast.h" |
10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
11 #include "src/code-factory.h" | 11 #include "src/code-factory.h" |
12 #include "src/code-stub-assembler.h" | 12 #include "src/code-stub-assembler.h" |
13 #include "src/factory.h" | 13 #include "src/factory.h" |
14 #include "src/gdb-jit.h" | 14 #include "src/gdb-jit.h" |
15 #include "src/ic/handler-compiler.h" | 15 #include "src/ic/handler-compiler.h" |
16 #include "src/ic/ic.h" | 16 #include "src/ic/ic.h" |
17 #include "src/macro-assembler.h" | 17 #include "src/macro-assembler.h" |
18 | 18 |
19 namespace v8 { | 19 namespace v8 { |
20 namespace internal { | 20 namespace internal { |
21 | 21 |
22 | 22 |
23 RUNTIME_FUNCTION(UnexpectedStubMiss) { | 23 RUNTIME_FUNCTION(UnexpectedStubMiss) { |
24 FATAL("Unexpected deopt of a stub"); | 24 FATAL("Unexpected deopt of a stub"); |
25 return Smi::kZero; | 25 return Smi::FromInt(0); |
26 } | 26 } |
27 | 27 |
28 CodeStubDescriptor::CodeStubDescriptor(CodeStub* stub) | 28 CodeStubDescriptor::CodeStubDescriptor(CodeStub* stub) |
29 : isolate_(stub->isolate()), | 29 : isolate_(stub->isolate()), |
30 call_descriptor_(stub->GetCallInterfaceDescriptor()), | 30 call_descriptor_(stub->GetCallInterfaceDescriptor()), |
31 stack_parameter_count_(no_reg), | 31 stack_parameter_count_(no_reg), |
32 hint_stack_parameter_count_(-1), | 32 hint_stack_parameter_count_(-1), |
33 function_mode_(NOT_JS_FUNCTION_STUB_MODE), | 33 function_mode_(NOT_JS_FUNCTION_STUB_MODE), |
34 deoptimization_handler_(NULL), | 34 deoptimization_handler_(NULL), |
35 miss_handler_(), | 35 miss_handler_(), |
(...skipping 2484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2520 CodeStubAssembler::SMI_PARAMETERS); | 2520 CodeStubAssembler::SMI_PARAMETERS); |
2521 | 2521 |
2522 Node* boilerplate = assembler->LoadObjectField( | 2522 Node* boilerplate = assembler->LoadObjectField( |
2523 allocation_site, AllocationSite::kTransitionInfoOffset); | 2523 allocation_site, AllocationSite::kTransitionInfoOffset); |
2524 Node* boilerplate_map = assembler->LoadMap(boilerplate); | 2524 Node* boilerplate_map = assembler->LoadMap(boilerplate); |
2525 Node* boilerplate_elements = assembler->LoadElements(boilerplate); | 2525 Node* boilerplate_elements = assembler->LoadElements(boilerplate); |
2526 Node* capacity = assembler->LoadFixedArrayBaseLength(boilerplate_elements); | 2526 Node* capacity = assembler->LoadFixedArrayBaseLength(boilerplate_elements); |
2527 allocation_site = | 2527 allocation_site = |
2528 allocation_site_mode == TRACK_ALLOCATION_SITE ? allocation_site : nullptr; | 2528 allocation_site_mode == TRACK_ALLOCATION_SITE ? allocation_site : nullptr; |
2529 | 2529 |
2530 Node* zero = assembler->SmiConstant(Smi::kZero); | 2530 Node* zero = assembler->SmiConstant(Smi::FromInt(0)); |
2531 assembler->GotoIf(assembler->SmiEqual(capacity, zero), &zero_capacity); | 2531 assembler->GotoIf(assembler->SmiEqual(capacity, zero), &zero_capacity); |
2532 | 2532 |
2533 Node* elements_map = assembler->LoadMap(boilerplate_elements); | 2533 Node* elements_map = assembler->LoadMap(boilerplate_elements); |
2534 assembler->GotoIf(assembler->IsFixedCOWArrayMap(elements_map), &cow_elements); | 2534 assembler->GotoIf(assembler->IsFixedCOWArrayMap(elements_map), &cow_elements); |
2535 | 2535 |
2536 assembler->GotoIf(assembler->IsFixedArrayMap(elements_map), &fast_elements); | 2536 assembler->GotoIf(assembler->IsFixedArrayMap(elements_map), &fast_elements); |
2537 { | 2537 { |
2538 assembler->Comment("fast double elements path"); | 2538 assembler->Comment("fast double elements path"); |
2539 if (FLAG_debug_code) { | 2539 if (FLAG_debug_code) { |
2540 Label correct_elements_map(assembler), abort(assembler, Label::kDeferred); | 2540 Label correct_elements_map(assembler), abort(assembler, Label::kDeferred); |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2827 AllocationSite::GetMode(elements_kind()) == TRACK_ALLOCATION_SITE && | 2827 AllocationSite::GetMode(elements_kind()) == TRACK_ALLOCATION_SITE && |
2828 override_mode() != DISABLE_ALLOCATION_SITES; | 2828 override_mode() != DISABLE_ALLOCATION_SITES; |
2829 Node* allocation_site = | 2829 Node* allocation_site = |
2830 track_allocation_site ? assembler->Parameter(Descriptor::kAllocationSite) | 2830 track_allocation_site ? assembler->Parameter(Descriptor::kAllocationSite) |
2831 : nullptr; | 2831 : nullptr; |
2832 Node* array_map = | 2832 Node* array_map = |
2833 assembler->LoadJSArrayElementsMap(elements_kind(), native_context); | 2833 assembler->LoadJSArrayElementsMap(elements_kind(), native_context); |
2834 Node* array = assembler->AllocateJSArray( | 2834 Node* array = assembler->AllocateJSArray( |
2835 elements_kind(), array_map, | 2835 elements_kind(), array_map, |
2836 assembler->IntPtrConstant(JSArray::kPreallocatedArrayElements), | 2836 assembler->IntPtrConstant(JSArray::kPreallocatedArrayElements), |
2837 assembler->SmiConstant(Smi::kZero), allocation_site); | 2837 assembler->SmiConstant(Smi::FromInt(0)), allocation_site); |
2838 assembler->Return(array); | 2838 assembler->Return(array); |
2839 } | 2839 } |
2840 | 2840 |
2841 void InternalArrayNoArgumentConstructorStub::GenerateAssembly( | 2841 void InternalArrayNoArgumentConstructorStub::GenerateAssembly( |
2842 CodeStubAssembler* assembler) const { | 2842 CodeStubAssembler* assembler) const { |
2843 typedef compiler::Node Node; | 2843 typedef compiler::Node Node; |
2844 Node* array_map = | 2844 Node* array_map = |
2845 assembler->LoadObjectField(assembler->Parameter(Descriptor::kFunction), | 2845 assembler->LoadObjectField(assembler->Parameter(Descriptor::kFunction), |
2846 JSFunction::kPrototypeOrInitialMapOffset); | 2846 JSFunction::kPrototypeOrInitialMapOffset); |
2847 Node* array = assembler->AllocateJSArray( | 2847 Node* array = assembler->AllocateJSArray( |
2848 elements_kind(), array_map, | 2848 elements_kind(), array_map, |
2849 assembler->IntPtrConstant(JSArray::kPreallocatedArrayElements), | 2849 assembler->IntPtrConstant(JSArray::kPreallocatedArrayElements), |
2850 assembler->SmiConstant(Smi::kZero), nullptr); | 2850 assembler->SmiConstant(Smi::FromInt(0)), nullptr); |
2851 assembler->Return(array); | 2851 assembler->Return(array); |
2852 } | 2852 } |
2853 | 2853 |
2854 namespace { | 2854 namespace { |
2855 | 2855 |
2856 template <typename Descriptor> | 2856 template <typename Descriptor> |
2857 void SingleArgumentConstructorCommon(CodeStubAssembler* assembler, | 2857 void SingleArgumentConstructorCommon(CodeStubAssembler* assembler, |
2858 ElementsKind elements_kind, | 2858 ElementsKind elements_kind, |
2859 compiler::Node* array_map, | 2859 compiler::Node* array_map, |
2860 compiler::Node* allocation_site, | 2860 compiler::Node* allocation_site, |
2861 AllocationSiteMode mode) { | 2861 AllocationSiteMode mode) { |
2862 typedef compiler::Node Node; | 2862 typedef compiler::Node Node; |
2863 typedef CodeStubAssembler::Label Label; | 2863 typedef CodeStubAssembler::Label Label; |
2864 | 2864 |
2865 Label ok(assembler); | 2865 Label ok(assembler); |
2866 Label smi_size(assembler); | 2866 Label smi_size(assembler); |
2867 Label small_smi_size(assembler); | 2867 Label small_smi_size(assembler); |
2868 Label call_runtime(assembler, Label::kDeferred); | 2868 Label call_runtime(assembler, Label::kDeferred); |
2869 | 2869 |
2870 Node* size = assembler->Parameter(Descriptor::kArraySizeSmiParameter); | 2870 Node* size = assembler->Parameter(Descriptor::kArraySizeSmiParameter); |
2871 assembler->Branch(assembler->WordIsSmi(size), &smi_size, &call_runtime); | 2871 assembler->Branch(assembler->WordIsSmi(size), &smi_size, &call_runtime); |
2872 | 2872 |
2873 assembler->Bind(&smi_size); | 2873 assembler->Bind(&smi_size); |
2874 | 2874 |
2875 if (IsFastPackedElementsKind(elements_kind)) { | 2875 if (IsFastPackedElementsKind(elements_kind)) { |
2876 Label abort(assembler, Label::kDeferred); | 2876 Label abort(assembler, Label::kDeferred); |
2877 assembler->Branch( | 2877 assembler->Branch( |
2878 assembler->SmiEqual(size, assembler->SmiConstant(Smi::kZero)), | 2878 assembler->SmiEqual(size, assembler->SmiConstant(Smi::FromInt(0))), |
2879 &small_smi_size, &abort); | 2879 &small_smi_size, &abort); |
2880 | 2880 |
2881 assembler->Bind(&abort); | 2881 assembler->Bind(&abort); |
2882 Node* reason = | 2882 Node* reason = |
2883 assembler->SmiConstant(Smi::FromInt(kAllocatingNonEmptyPackedArray)); | 2883 assembler->SmiConstant(Smi::FromInt(kAllocatingNonEmptyPackedArray)); |
2884 Node* context = assembler->Parameter(Descriptor::kContext); | 2884 Node* context = assembler->Parameter(Descriptor::kContext); |
2885 assembler->TailCallRuntime(Runtime::kAbort, context, reason); | 2885 assembler->TailCallRuntime(Runtime::kAbort, context, reason); |
2886 } else { | 2886 } else { |
2887 int element_size = | 2887 int element_size = |
2888 IsFastDoubleElementsKind(elements_kind) ? kDoubleSize : kPointerSize; | 2888 IsFastDoubleElementsKind(elements_kind) ? kDoubleSize : kPointerSize; |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3007 | 3007 |
3008 if (type == MachineType::Pointer()) { | 3008 if (type == MachineType::Pointer()) { |
3009 return Representation::External(); | 3009 return Representation::External(); |
3010 } | 3010 } |
3011 | 3011 |
3012 return Representation::Tagged(); | 3012 return Representation::Tagged(); |
3013 } | 3013 } |
3014 | 3014 |
3015 } // namespace internal | 3015 } // namespace internal |
3016 } // namespace v8 | 3016 } // namespace v8 |
OLD | NEW |