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.h"
6#include "src/builtins/builtins.h"
7#include "src/ic/handler-compiler.h"
8#include "src/ic/ic.h"
9#include "src/ic/keyed-store-generic.h"
10
11namespace v8 {
12namespace internal {
13
14void Builtins::Generate_KeyedLoadIC_Megamorphic_TF(
15    CodeStubAssembler* assembler) {
16  typedef compiler::Node Node;
17  typedef LoadWithVectorDescriptor Descriptor;
18
19  Node* receiver = assembler->Parameter(Descriptor::kReceiver);
20  Node* name = assembler->Parameter(Descriptor::kName);
21  Node* slot = assembler->Parameter(Descriptor::kSlot);
22  Node* vector = assembler->Parameter(Descriptor::kVector);
23  Node* context = assembler->Parameter(Descriptor::kContext);
24
25  CodeStubAssembler::LoadICParameters p(context, receiver, name, slot, vector);
26  assembler->KeyedLoadICGeneric(&p);
27}
28
29void Builtins::Generate_KeyedLoadIC_Miss(MacroAssembler* masm) {
30  KeyedLoadIC::GenerateMiss(masm);
31}
32void Builtins::Generate_KeyedLoadIC_Slow(MacroAssembler* masm) {
33  KeyedLoadIC::GenerateRuntimeGetProperty(masm);
34}
35
36void Builtins::Generate_KeyedStoreIC_Megamorphic(MacroAssembler* masm) {
37  KeyedStoreIC::GenerateMegamorphic(masm, SLOPPY);
38}
39
40void Builtins::Generate_KeyedStoreIC_Megamorphic_Strict(MacroAssembler* masm) {
41  KeyedStoreIC::GenerateMegamorphic(masm, STRICT);
42}
43
44void KeyedStoreICMegamorphic(CodeStubAssembler* assembler, LanguageMode mode) {
45  typedef compiler::Node Node;
46  typedef StoreWithVectorDescriptor Descriptor;
47
48  Node* receiver = assembler->Parameter(Descriptor::kReceiver);
49  Node* name = assembler->Parameter(Descriptor::kName);
50  Node* value = assembler->Parameter(Descriptor::kValue);
51  Node* slot = assembler->Parameter(Descriptor::kSlot);
52  Node* vector = assembler->Parameter(Descriptor::kVector);
53  Node* context = assembler->Parameter(Descriptor::kContext);
54
55  CodeStubAssembler::StoreICParameters p(context, receiver, name, value, slot,
56                                         vector);
57  KeyedStoreGenericGenerator::Generate(assembler, &p, mode);
58}
59
60void Builtins::Generate_KeyedStoreIC_Megamorphic_TF(
61    CodeStubAssembler* assembler) {
62  KeyedStoreICMegamorphic(assembler, SLOPPY);
63}
64
65void Builtins::Generate_KeyedStoreIC_Megamorphic_Strict_TF(
66    CodeStubAssembler* assembler) {
67  KeyedStoreICMegamorphic(assembler, STRICT);
68}
69
70void Builtins::Generate_KeyedStoreIC_Miss(MacroAssembler* masm) {
71  KeyedStoreIC::GenerateMiss(masm);
72}
73
74void Builtins::Generate_KeyedStoreIC_Slow(MacroAssembler* masm) {
75  KeyedStoreIC::GenerateSlow(masm);
76}
77
78void Builtins::Generate_LoadGlobalIC_Miss(CodeStubAssembler* assembler) {
79  typedef compiler::Node Node;
80  typedef LoadGlobalWithVectorDescriptor Descriptor;
81
82  Node* slot = assembler->Parameter(Descriptor::kSlot);
83  Node* vector = assembler->Parameter(Descriptor::kVector);
84  Node* context = assembler->Parameter(Descriptor::kContext);
85
86  assembler->TailCallRuntime(Runtime::kLoadGlobalIC_Miss, context, slot,
87                             vector);
88}
89
90void Builtins::Generate_LoadGlobalIC_Slow(CodeStubAssembler* assembler) {
91  typedef compiler::Node Node;
92  typedef LoadGlobalWithVectorDescriptor Descriptor;
93
94  Node* slot = assembler->Parameter(Descriptor::kSlot);
95  Node* vector = assembler->Parameter(Descriptor::kVector);
96  Node* context = assembler->Parameter(Descriptor::kContext);
97
98  assembler->TailCallRuntime(Runtime::kLoadGlobalIC_Slow, context, slot,
99                             vector);
100}
101
102void Builtins::Generate_LoadIC_Getter_ForDeopt(MacroAssembler* masm) {
103  NamedLoadHandlerCompiler::GenerateLoadViaGetterForDeopt(masm);
104}
105
106void Builtins::Generate_LoadIC_Miss(CodeStubAssembler* assembler) {
107  typedef compiler::Node Node;
108  typedef LoadWithVectorDescriptor Descriptor;
109
110  Node* receiver = assembler->Parameter(Descriptor::kReceiver);
111  Node* name = assembler->Parameter(Descriptor::kName);
112  Node* slot = assembler->Parameter(Descriptor::kSlot);
113  Node* vector = assembler->Parameter(Descriptor::kVector);
114  Node* context = assembler->Parameter(Descriptor::kContext);
115
116  assembler->TailCallRuntime(Runtime::kLoadIC_Miss, context, receiver, name,
117                             slot, vector);
118}
119
120void Builtins::Generate_LoadIC_Normal(MacroAssembler* masm) {
121  LoadIC::GenerateNormal(masm);
122}
123
124void Builtins::Generate_LoadIC_Slow(CodeStubAssembler* assembler) {
125  typedef compiler::Node Node;
126  typedef LoadWithVectorDescriptor Descriptor;
127
128  Node* receiver = assembler->Parameter(Descriptor::kReceiver);
129  Node* name = assembler->Parameter(Descriptor::kName);
130  Node* context = assembler->Parameter(Descriptor::kContext);
131
132  assembler->TailCallRuntime(Runtime::kGetProperty, context, receiver, name);
133}
134
135void Builtins::Generate_StoreIC_Miss(CodeStubAssembler* assembler) {
136  typedef compiler::Node Node;
137  typedef StoreWithVectorDescriptor Descriptor;
138
139  Node* receiver = assembler->Parameter(Descriptor::kReceiver);
140  Node* name = assembler->Parameter(Descriptor::kName);
141  Node* value = assembler->Parameter(Descriptor::kValue);
142  Node* slot = assembler->Parameter(Descriptor::kSlot);
143  Node* vector = assembler->Parameter(Descriptor::kVector);
144  Node* context = assembler->Parameter(Descriptor::kContext);
145
146  assembler->TailCallRuntime(Runtime::kStoreIC_Miss, context, value, slot,
147                             vector, receiver, name);
148}
149
150void Builtins::Generate_StoreIC_Normal(MacroAssembler* masm) {
151  StoreIC::GenerateNormal(masm);
152}
153
154void Builtins::Generate_StoreIC_Setter_ForDeopt(MacroAssembler* masm) {
155  NamedStoreHandlerCompiler::GenerateStoreViaSetterForDeopt(masm);
156}
157
158namespace {
159void Generate_StoreIC_Slow(CodeStubAssembler* assembler,
160                           LanguageMode language_mode) {
161  typedef compiler::Node Node;
162  typedef StoreWithVectorDescriptor Descriptor;
163
164  Node* receiver = assembler->Parameter(Descriptor::kReceiver);
165  Node* name = assembler->Parameter(Descriptor::kName);
166  Node* value = assembler->Parameter(Descriptor::kValue);
167  Node* context = assembler->Parameter(Descriptor::kContext);
168  Node* lang_mode = assembler->SmiConstant(Smi::FromInt(language_mode));
169
170  // The slow case calls into the runtime to complete the store without causing
171  // an IC miss that would otherwise cause a transition to the generic stub.
172  assembler->TailCallRuntime(Runtime::kSetProperty, context, receiver, name,
173                             value, lang_mode);
174}
175}  // anonymous namespace
176
177void Builtins::Generate_StoreIC_SlowSloppy(CodeStubAssembler* assembler) {
178  Generate_StoreIC_Slow(assembler, SLOPPY);
179}
180
181void Builtins::Generate_StoreIC_SlowStrict(CodeStubAssembler* assembler) {
182  Generate_StoreIC_Slow(assembler, STRICT);
183}
184
185}  // namespace internal
186}  // namespace v8
187