b8cae81e0dd23ac9d1c44ddea70fcc86299ba037
[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 CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) {
231   Register registers[] = {cp, a0};
232   data->Initialize(arraysize(registers), registers, NULL);
233 }
234
235
236 void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) {
237   Register registers[] = {cp, a0};
238   data->Initialize(arraysize(registers), registers, NULL);
239 }
240
241
242 void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) {
243   Register registers[] = {cp, a1, a0};
244   data->Initialize(arraysize(registers), registers, NULL);
245 }
246
247
248 void BinaryOpWithAllocationSiteDescriptor::Initialize(
249     CallInterfaceDescriptorData* data) {
250   Register registers[] = {cp, a2, a1, a0};
251   data->Initialize(arraysize(registers), registers, NULL);
252 }
253
254
255 void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) {
256   Register registers[] = {cp, a1, a0};
257   data->Initialize(arraysize(registers), registers, NULL);
258 }
259
260
261 void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
262   Register registers[] = {
263       cp,  // context
264       a2,  // key
265   };
266   Representation representations[] = {
267       Representation::Tagged(),  // context
268       Representation::Tagged(),  // key
269   };
270   data->Initialize(arraysize(registers), registers, representations);
271 }
272
273
274 void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
275   Register registers[] = {
276       cp,  // context
277       a2,  // name
278   };
279   Representation representations[] = {
280       Representation::Tagged(),  // context
281       Representation::Tagged(),  // name
282   };
283   data->Initialize(arraysize(registers), registers, representations);
284 }
285
286
287 void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) {
288   Register registers[] = {
289       cp,  // context
290       a0,  // receiver
291   };
292   Representation representations[] = {
293       Representation::Tagged(),  // context
294       Representation::Tagged(),  // receiver
295   };
296   data->Initialize(arraysize(registers), registers, representations);
297 }
298
299
300 void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
301   Register registers[] = {
302       cp,  // context
303       a1,  // JSFunction
304       a0,  // actual number of arguments
305       a2,  // expected number of arguments
306   };
307   Representation representations[] = {
308       Representation::Tagged(),     // context
309       Representation::Tagged(),     // JSFunction
310       Representation::Integer32(),  // actual number of arguments
311       Representation::Integer32(),  // expected number of arguments
312   };
313   data->Initialize(arraysize(registers), registers, representations);
314 }
315
316
317 void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
318   Register registers[] = {
319       cp,  // context
320       a0,  // callee
321       t0,  // call_data
322       a2,  // holder
323       a1,  // api_function_address
324       a3,  // actual number of arguments
325   };
326   Representation representations[] = {
327       Representation::Tagged(),     // context
328       Representation::Tagged(),     // callee
329       Representation::Tagged(),     // call_data
330       Representation::Tagged(),     // holder
331       Representation::External(),   // api_function_address
332       Representation::Integer32(),  // actual number of arguments
333   };
334   data->Initialize(arraysize(registers), registers, representations);
335 }
336
337
338 void ApiAccessorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
339   Register registers[] = {
340       cp,  // context
341       a0,  // callee
342       t0,  // call_data
343       a2,  // holder
344       a1,  // api_function_address
345   };
346   Representation representations[] = {
347       Representation::Tagged(),    // context
348       Representation::Tagged(),    // callee
349       Representation::Tagged(),    // call_data
350       Representation::Tagged(),    // holder
351       Representation::External(),  // api_function_address
352   };
353   data->Initialize(arraysize(registers), registers, representations);
354 }
355 }
356 }  // namespace v8::internal
357
358 #endif  // V8_TARGET_ARCH_MIPS