deps: update v8 to 4.3.61.21
[platform/upstream/nodejs.git] / deps / v8 / src / mips / interface-descriptors-mips.cc
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
3 // found in the LICENSE file.
4
5 #include "src/v8.h"
6
7 #if V8_TARGET_ARCH_MIPS
8
9 #include "src/interface-descriptors.h"
10
11 namespace v8 {
12 namespace internal {
13
14 const Register CallInterfaceDescriptor::ContextRegister() { return cp; }
15
16
17 const Register LoadDescriptor::ReceiverRegister() { return a1; }
18 const Register LoadDescriptor::NameRegister() { return a2; }
19
20
21 const Register VectorLoadICTrampolineDescriptor::SlotRegister() { return a0; }
22
23
24 const Register VectorLoadICDescriptor::VectorRegister() { return a3; }
25
26
27 const Register StoreDescriptor::ReceiverRegister() { return a1; }
28 const Register StoreDescriptor::NameRegister() { return a2; }
29 const Register StoreDescriptor::ValueRegister() { return a0; }
30
31
32 const Register StoreTransitionDescriptor::MapRegister() { return a3; }
33
34
35 const Register ElementTransitionAndStoreDescriptor::MapRegister() { return a3; }
36
37
38 const Register InstanceofDescriptor::left() { return a0; }
39 const Register InstanceofDescriptor::right() { return a1; }
40
41
42 const Register ArgumentsAccessReadDescriptor::index() { return a1; }
43 const Register ArgumentsAccessReadDescriptor::parameter_count() { return a0; }
44
45
46 const Register ApiGetterDescriptor::function_address() { return a2; }
47
48
49 const Register MathPowTaggedDescriptor::exponent() { return a2; }
50
51
52 const Register MathPowIntegerDescriptor::exponent() {
53   return MathPowTaggedDescriptor::exponent();
54 }
55
56
57 void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) {
58   Register registers[] = {cp, a2};
59   data->Initialize(arraysize(registers), registers, NULL);
60 }
61
62
63 void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) {
64   Register registers[] = {cp, a1};
65   data->Initialize(arraysize(registers), registers, NULL);
66 }
67
68
69 void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) {
70   Register registers[] = {cp, a0};
71   data->Initialize(arraysize(registers), registers, NULL);
72 }
73
74
75 void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) {
76   Register registers[] = {cp, a0};
77   data->Initialize(arraysize(registers), registers, NULL);
78 }
79
80
81 void FastCloneShallowArrayDescriptor::Initialize(
82     CallInterfaceDescriptorData* data) {
83   Register registers[] = {cp, a3, a2, a1};
84   Representation representations[] = {
85       Representation::Tagged(), Representation::Tagged(), Representation::Smi(),
86       Representation::Tagged()};
87   data->Initialize(arraysize(registers), registers, representations);
88 }
89
90
91 void FastCloneShallowObjectDescriptor::Initialize(
92     CallInterfaceDescriptorData* data) {
93   Register registers[] = {cp, a3, a2, a1, a0};
94   data->Initialize(arraysize(registers), registers, NULL);
95 }
96
97
98 void CreateAllocationSiteDescriptor::Initialize(
99     CallInterfaceDescriptorData* data) {
100   Register registers[] = {cp, a2, a3};
101   Representation representations[] = {Representation::Tagged(),
102                                       Representation::Tagged(),
103                                       Representation::Smi()};
104   data->Initialize(arraysize(registers), registers, representations);
105 }
106
107
108 void CreateWeakCellDescriptor::Initialize(CallInterfaceDescriptorData* data) {
109   Register registers[] = {cp, a2, a3, a1};
110   Representation representations[] = {
111       Representation::Tagged(), Representation::Tagged(), Representation::Smi(),
112       Representation::Tagged()};
113   data->Initialize(arraysize(registers), registers, representations);
114 }
115
116
117 void StoreArrayLiteralElementDescriptor::Initialize(
118     CallInterfaceDescriptorData* data) {
119   Register registers[] = {cp, a3, a0};
120   data->Initialize(arraysize(registers), registers, NULL);
121 }
122
123
124 void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
125   Register registers[] = {cp, a1};
126   data->Initialize(arraysize(registers), registers, NULL);
127 }
128
129
130 void CallFunctionWithFeedbackDescriptor::Initialize(
131     CallInterfaceDescriptorData* data) {
132   Register registers[] = {cp, a1, a3};
133   Representation representations[] = {Representation::Tagged(),
134                                       Representation::Tagged(),
135                                       Representation::Smi()};
136   data->Initialize(arraysize(registers), registers, representations);
137 }
138
139
140 void CallFunctionWithFeedbackAndVectorDescriptor::Initialize(
141     CallInterfaceDescriptorData* data) {
142   Register registers[] = {cp, a1, a3, a2};
143   Representation representations[] = {
144       Representation::Tagged(), Representation::Tagged(), Representation::Smi(),
145       Representation::Tagged()};
146   data->Initialize(arraysize(registers), registers, representations);
147 }
148
149
150 void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) {
151   // a0 : number of arguments
152   // a1 : the function to call
153   // a2 : feedback vector
154   // a3 : (only if a2 is not the megamorphic symbol) slot in feedback
155   //      vector (Smi)
156   // TODO(turbofan): So far we don't gather type feedback and hence skip the
157   // slot parameter, but ArrayConstructStub needs the vector to be undefined.
158   Register registers[] = {cp, a0, a1, a2};
159   data->Initialize(arraysize(registers), registers, NULL);
160 }
161
162
163 void RegExpConstructResultDescriptor::Initialize(
164     CallInterfaceDescriptorData* data) {
165   Register registers[] = {cp, a2, a1, a0};
166   data->Initialize(arraysize(registers), registers, NULL);
167 }
168
169
170 void TransitionElementsKindDescriptor::Initialize(
171     CallInterfaceDescriptorData* data) {
172   Register registers[] = {cp, a0, a1};
173   data->Initialize(arraysize(registers), registers, NULL);
174 }
175
176
177 void AllocateHeapNumberDescriptor::Initialize(
178     CallInterfaceDescriptorData* data) {
179   // register state
180   // cp -- context
181   Register registers[] = {cp};
182   data->Initialize(arraysize(registers), registers, nullptr);
183 }
184
185
186 void ArrayConstructorConstantArgCountDescriptor::Initialize(
187     CallInterfaceDescriptorData* data) {
188   // register state
189   // cp -- context
190   // a0 -- number of arguments
191   // a1 -- function
192   // a2 -- allocation site with elements kind
193   Register registers[] = {cp, a1, a2};
194   data->Initialize(arraysize(registers), registers, NULL);
195 }
196
197
198 void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
199   // stack param count needs (constructor pointer, and single argument)
200   Register registers[] = {cp, a1, a2, a0};
201   Representation representations[] = {
202       Representation::Tagged(), Representation::Tagged(),
203       Representation::Tagged(), Representation::Integer32()};
204   data->Initialize(arraysize(registers), registers, representations);
205 }
206
207
208 void InternalArrayConstructorConstantArgCountDescriptor::Initialize(
209     CallInterfaceDescriptorData* data) {
210   // register state
211   // cp -- context
212   // a0 -- number of arguments
213   // a1 -- constructor function
214   Register registers[] = {cp, a1};
215   data->Initialize(arraysize(registers), registers, NULL);
216 }
217
218
219 void InternalArrayConstructorDescriptor::Initialize(
220     CallInterfaceDescriptorData* data) {
221   // stack param count needs (constructor pointer, and single argument)
222   Register registers[] = {cp, a1, a0};
223   Representation representations[] = {Representation::Tagged(),
224                                       Representation::Tagged(),
225                                       Representation::Integer32()};
226   data->Initialize(arraysize(registers), registers, representations);
227 }
228
229
230 void CompareDescriptor::Initialize(CallInterfaceDescriptorData* data) {
231   Register registers[] = {cp, a1, a0};
232   data->Initialize(arraysize(registers), registers, NULL);
233 }
234
235
236 void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) {
237   Register registers[] = {cp, a0};
238   data->Initialize(arraysize(registers), registers, NULL);
239 }
240
241
242 void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) {
243   Register registers[] = {cp, a0};
244   data->Initialize(arraysize(registers), registers, NULL);
245 }
246
247
248 void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) {
249   Register registers[] = {cp, a1, a0};
250   data->Initialize(arraysize(registers), registers, NULL);
251 }
252
253
254 void BinaryOpWithAllocationSiteDescriptor::Initialize(
255     CallInterfaceDescriptorData* data) {
256   Register registers[] = {cp, a2, a1, a0};
257   data->Initialize(arraysize(registers), registers, NULL);
258 }
259
260
261 void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) {
262   Register registers[] = {cp, a1, a0};
263   data->Initialize(arraysize(registers), registers, NULL);
264 }
265
266
267 void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
268   Register registers[] = {
269       cp,  // context
270       a2,  // key
271   };
272   Representation representations[] = {
273       Representation::Tagged(),  // context
274       Representation::Tagged(),  // key
275   };
276   data->Initialize(arraysize(registers), registers, representations);
277 }
278
279
280 void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
281   Register registers[] = {
282       cp,  // context
283       a2,  // name
284   };
285   Representation representations[] = {
286       Representation::Tagged(),  // context
287       Representation::Tagged(),  // name
288   };
289   data->Initialize(arraysize(registers), registers, representations);
290 }
291
292
293 void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) {
294   Register registers[] = {
295       cp,  // context
296       a0,  // receiver
297   };
298   Representation representations[] = {
299       Representation::Tagged(),  // context
300       Representation::Tagged(),  // receiver
301   };
302   data->Initialize(arraysize(registers), registers, representations);
303 }
304
305
306 void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
307   Register registers[] = {
308       cp,  // context
309       a1,  // JSFunction
310       a0,  // actual number of arguments
311       a2,  // expected number of arguments
312   };
313   Representation representations[] = {
314       Representation::Tagged(),     // context
315       Representation::Tagged(),     // JSFunction
316       Representation::Integer32(),  // actual number of arguments
317       Representation::Integer32(),  // expected number of arguments
318   };
319   data->Initialize(arraysize(registers), registers, representations);
320 }
321
322
323 void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
324   Register registers[] = {
325       cp,  // context
326       a0,  // callee
327       t0,  // call_data
328       a2,  // holder
329       a1,  // api_function_address
330       a3,  // actual number of arguments
331   };
332   Representation representations[] = {
333       Representation::Tagged(),     // context
334       Representation::Tagged(),     // callee
335       Representation::Tagged(),     // call_data
336       Representation::Tagged(),     // holder
337       Representation::External(),   // api_function_address
338       Representation::Integer32(),  // actual number of arguments
339   };
340   data->Initialize(arraysize(registers), registers, representations);
341 }
342
343
344 void ApiAccessorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
345   Register registers[] = {
346       cp,  // context
347       a0,  // callee
348       t0,  // call_data
349       a2,  // holder
350       a1,  // api_function_address
351   };
352   Representation representations[] = {
353       Representation::Tagged(),    // context
354       Representation::Tagged(),    // callee
355       Representation::Tagged(),    // call_data
356       Representation::Tagged(),    // holder
357       Representation::External(),  // api_function_address
358   };
359   data->Initialize(arraysize(registers), registers, representations);
360 }
361 }
362 }  // namespace v8::internal
363
364 #endif  // V8_TARGET_ARCH_MIPS