Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / v8 / src / mips64 / interface-descriptors-mips64.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_MIPS64
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   data->Initialize(arraysize(registers), registers, NULL);
102 }
103
104
105 void StoreArrayLiteralElementDescriptor::Initialize(
106     CallInterfaceDescriptorData* data) {
107   Register registers[] = {cp, a3, a0};
108   data->Initialize(arraysize(registers), registers, NULL);
109 }
110
111
112 void CallFunctionWithFeedbackDescriptor::Initialize(
113     CallInterfaceDescriptorData* data) {
114   Register registers[] = {cp, a1, a3};
115   Representation representations[] = {Representation::Tagged(),
116                                       Representation::Tagged(),
117                                       Representation::Smi()};
118   data->Initialize(arraysize(registers), registers, representations);
119 }
120
121
122 void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
123   Register registers[] = {cp, a1};
124   data->Initialize(arraysize(registers), registers, NULL);
125 }
126
127
128 void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) {
129   // a0 : number of arguments
130   // a1 : the function to call
131   // a2 : feedback vector
132   // a3 : (only if a2 is not the megamorphic symbol) slot in feedback
133   //      vector (Smi)
134   // TODO(turbofan): So far we don't gather type feedback and hence skip the
135   // slot parameter, but ArrayConstructStub needs the vector to be undefined.
136   Register registers[] = {cp, a0, a1, a2};
137   data->Initialize(arraysize(registers), registers, NULL);
138 }
139
140
141 void RegExpConstructResultDescriptor::Initialize(
142     CallInterfaceDescriptorData* data) {
143   Register registers[] = {cp, a2, a1, a0};
144   data->Initialize(arraysize(registers), registers, NULL);
145 }
146
147
148 void TransitionElementsKindDescriptor::Initialize(
149     CallInterfaceDescriptorData* data) {
150   Register registers[] = {cp, a0, a1};
151   data->Initialize(arraysize(registers), registers, NULL);
152 }
153
154
155 void AllocateHeapNumberDescriptor::Initialize(
156     CallInterfaceDescriptorData* data) {
157   // register state
158   // cp -- context
159   Register registers[] = {cp};
160   data->Initialize(arraysize(registers), registers, nullptr);
161 }
162
163
164 void ArrayConstructorConstantArgCountDescriptor::Initialize(
165     CallInterfaceDescriptorData* data) {
166   // register state
167   // cp -- context
168   // a0 -- number of arguments
169   // a1 -- function
170   // a2 -- allocation site with elements kind
171   Register registers[] = {cp, a1, a2};
172   data->Initialize(arraysize(registers), registers, NULL);
173 }
174
175
176 void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
177   // stack param count needs (constructor pointer, and single argument)
178   Register registers[] = {cp, a1, a2, a0};
179   Representation representations[] = {
180       Representation::Tagged(), Representation::Tagged(),
181       Representation::Tagged(), Representation::Integer32()};
182   data->Initialize(arraysize(registers), registers, representations);
183 }
184
185
186 void InternalArrayConstructorConstantArgCountDescriptor::Initialize(
187     CallInterfaceDescriptorData* data) {
188   // register state
189   // cp -- context
190   // a0 -- number of arguments
191   // a1 -- constructor function
192   Register registers[] = {cp, a1};
193   data->Initialize(arraysize(registers), registers, NULL);
194 }
195
196
197 void InternalArrayConstructorDescriptor::Initialize(
198     CallInterfaceDescriptorData* data) {
199   // stack param count needs (constructor pointer, and single argument)
200   Register registers[] = {cp, a1, a0};
201   Representation representations[] = {Representation::Tagged(),
202                                       Representation::Tagged(),
203                                       Representation::Integer32()};
204   data->Initialize(arraysize(registers), registers, representations);
205 }
206
207
208 void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) {
209   Register registers[] = {cp, a0};
210   data->Initialize(arraysize(registers), registers, NULL);
211 }
212
213
214 void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) {
215   Register registers[] = {cp, a0};
216   data->Initialize(arraysize(registers), registers, NULL);
217 }
218
219
220 void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) {
221   Register registers[] = {cp, a1, a0};
222   data->Initialize(arraysize(registers), registers, NULL);
223 }
224
225
226 void BinaryOpWithAllocationSiteDescriptor::Initialize(
227     CallInterfaceDescriptorData* data) {
228   Register registers[] = {cp, a2, a1, a0};
229   data->Initialize(arraysize(registers), registers, NULL);
230 }
231
232
233 void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) {
234   Register registers[] = {cp, a1, a0};
235   data->Initialize(arraysize(registers), registers, NULL);
236 }
237
238
239 void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
240   Register registers[] = {
241       cp,  // context
242       a2,  // key
243   };
244   Representation representations[] = {
245       Representation::Tagged(),  // context
246       Representation::Tagged(),  // key
247   };
248   data->Initialize(arraysize(registers), registers, representations);
249 }
250
251
252 void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
253   Register registers[] = {
254       cp,  // context
255       a2,  // name
256   };
257   Representation representations[] = {
258       Representation::Tagged(),  // context
259       Representation::Tagged(),  // name
260   };
261   data->Initialize(arraysize(registers), registers, representations);
262 }
263
264
265 void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) {
266   Register registers[] = {
267       cp,  // context
268       a0,  // receiver
269   };
270   Representation representations[] = {
271       Representation::Tagged(),  // context
272       Representation::Tagged(),  // receiver
273   };
274   data->Initialize(arraysize(registers), registers, representations);
275 }
276
277
278 void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
279   Register registers[] = {
280       cp,  // context
281       a1,  // JSFunction
282       a0,  // actual number of arguments
283       a2,  // expected number of arguments
284   };
285   Representation representations[] = {
286       Representation::Tagged(),     // context
287       Representation::Tagged(),     // JSFunction
288       Representation::Integer32(),  // actual number of arguments
289       Representation::Integer32(),  // expected number of arguments
290   };
291   data->Initialize(arraysize(registers), registers, representations);
292 }
293
294
295 void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
296   Register registers[] = {
297       cp,  // context
298       a0,  // callee
299       a4,  // call_data
300       a2,  // holder
301       a1,  // api_function_address
302   };
303   Representation representations[] = {
304       Representation::Tagged(),    // context
305       Representation::Tagged(),    // callee
306       Representation::Tagged(),    // call_data
307       Representation::Tagged(),    // holder
308       Representation::External(),  // api_function_address
309   };
310   data->Initialize(arraysize(registers), registers, representations);
311 }
312 }
313 }  // namespace v8::internal
314
315 #endif  // V8_TARGET_ARCH_MIPS64