1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "src/builtins/builtins-utils-gen.h"
6 #include "src/builtins/builtins.h"
7 #include "src/code-stub-assembler.h"
8 #include "src/ic/ic.h"
9 #include "src/ic/keyed-store-generic.h"
10 #include "src/objects-inl.h"
11
12 namespace v8 {
13 namespace internal {
14
TF_BUILTIN(LoadIC_StringLength,CodeStubAssembler)15 TF_BUILTIN(LoadIC_StringLength, CodeStubAssembler) {
16 Node* string = Parameter(Descriptor::kReceiver);
17 Return(LoadStringLengthAsSmi(string));
18 }
19
TF_BUILTIN(LoadIC_StringWrapperLength,CodeStubAssembler)20 TF_BUILTIN(LoadIC_StringWrapperLength, CodeStubAssembler) {
21 Node* value = Parameter(Descriptor::kReceiver);
22 Node* string = LoadJSValueValue(value);
23 Return(LoadStringLengthAsSmi(string));
24 }
25
TF_BUILTIN(KeyedLoadIC_Slow,CodeStubAssembler)26 TF_BUILTIN(KeyedLoadIC_Slow, CodeStubAssembler) {
27 Node* receiver = Parameter(Descriptor::kReceiver);
28 Node* name = Parameter(Descriptor::kName);
29 Node* context = Parameter(Descriptor::kContext);
30
31 TailCallRuntime(Runtime::kKeyedGetProperty, context, receiver, name);
32 }
33
Generate_KeyedStoreIC_Megamorphic(compiler::CodeAssemblerState * state)34 void Builtins::Generate_KeyedStoreIC_Megamorphic(
35 compiler::CodeAssemblerState* state) {
36 KeyedStoreGenericGenerator::Generate(state);
37 }
38
Generate_StoreIC_Uninitialized(compiler::CodeAssemblerState * state)39 void Builtins::Generate_StoreIC_Uninitialized(
40 compiler::CodeAssemblerState* state) {
41 StoreICUninitializedGenerator::Generate(state);
42 }
43
TF_BUILTIN(KeyedStoreIC_Slow,CodeStubAssembler)44 TF_BUILTIN(KeyedStoreIC_Slow, CodeStubAssembler) {
45 Node* receiver = Parameter(Descriptor::kReceiver);
46 Node* name = Parameter(Descriptor::kName);
47 Node* value = Parameter(Descriptor::kValue);
48 Node* slot = Parameter(Descriptor::kSlot);
49 Node* vector = Parameter(Descriptor::kVector);
50 Node* context = Parameter(Descriptor::kContext);
51
52 // The slow case calls into the runtime to complete the store without causing
53 // an IC miss that would otherwise cause a transition to the generic stub.
54 TailCallRuntime(Runtime::kKeyedStoreIC_Slow, context, value, slot, vector,
55 receiver, name);
56 }
57
TF_BUILTIN(StoreInArrayLiteralIC_Slow,CodeStubAssembler)58 TF_BUILTIN(StoreInArrayLiteralIC_Slow, CodeStubAssembler) {
59 Node* array = Parameter(Descriptor::kReceiver);
60 Node* index = Parameter(Descriptor::kName);
61 Node* value = Parameter(Descriptor::kValue);
62 Node* context = Parameter(Descriptor::kContext);
63 TailCallRuntime(Runtime::kStoreInArrayLiteralIC_Slow, context, value, array,
64 index);
65 }
66
TF_BUILTIN(LoadGlobalIC_Slow,CodeStubAssembler)67 TF_BUILTIN(LoadGlobalIC_Slow, CodeStubAssembler) {
68 Node* name = Parameter(Descriptor::kName);
69 Node* slot = Parameter(Descriptor::kSlot);
70 Node* vector = Parameter(Descriptor::kVector);
71 Node* context = Parameter(Descriptor::kContext);
72
73 TailCallRuntime(Runtime::kLoadGlobalIC_Slow, context, name, slot, vector);
74 }
75
TF_BUILTIN(LoadIC_FunctionPrototype,CodeStubAssembler)76 TF_BUILTIN(LoadIC_FunctionPrototype, CodeStubAssembler) {
77 Node* receiver = Parameter(Descriptor::kReceiver);
78 Node* name = Parameter(Descriptor::kName);
79 Node* slot = Parameter(Descriptor::kSlot);
80 Node* vector = Parameter(Descriptor::kVector);
81 Node* context = Parameter(Descriptor::kContext);
82
83 Label miss(this, Label::kDeferred);
84 Return(LoadJSFunctionPrototype(receiver, &miss));
85
86 BIND(&miss);
87 TailCallRuntime(Runtime::kLoadIC_Miss, context, receiver, name, slot, vector);
88 }
89
TF_BUILTIN(LoadIC_Slow,CodeStubAssembler)90 TF_BUILTIN(LoadIC_Slow, CodeStubAssembler) {
91 Node* receiver = Parameter(Descriptor::kReceiver);
92 Node* name = Parameter(Descriptor::kName);
93 Node* context = Parameter(Descriptor::kContext);
94
95 TailCallRuntime(Runtime::kGetProperty, context, receiver, name);
96 }
97
TF_BUILTIN(StoreGlobalIC_Slow,CodeStubAssembler)98 TF_BUILTIN(StoreGlobalIC_Slow, CodeStubAssembler) {
99 Node* receiver = Parameter(Descriptor::kReceiver);
100 Node* name = Parameter(Descriptor::kName);
101 Node* value = Parameter(Descriptor::kValue);
102 Node* slot = Parameter(Descriptor::kSlot);
103 Node* vector = Parameter(Descriptor::kVector);
104 Node* context = Parameter(Descriptor::kContext);
105
106 // The slow case calls into the runtime to complete the store without causing
107 // an IC miss that would otherwise cause a transition to the generic stub.
108 TailCallRuntime(Runtime::kStoreGlobalIC_Slow, context, value, slot, vector,
109 receiver, name);
110 }
111
112 } // namespace internal
113 } // namespace v8
114