blob: 44c8dff17d5e1d970f144b6851d0809d63f8d9b8 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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
11namespace v8 {
12namespace internal {
13
14const Register CallInterfaceDescriptor::ContextRegister() { return cp; }
15
16
17const Register LoadDescriptor::ReceiverRegister() { return a1; }
18const Register LoadDescriptor::NameRegister() { return a2; }
19
20
21const Register VectorLoadICTrampolineDescriptor::SlotRegister() { return a0; }
22
23
24const Register VectorLoadICDescriptor::VectorRegister() { return a3; }
25
26
27const Register StoreDescriptor::ReceiverRegister() { return a1; }
28const Register StoreDescriptor::NameRegister() { return a2; }
29const Register StoreDescriptor::ValueRegister() { return a0; }
30
31
Emily Bernierd0a1eb72015-03-24 16:35:39 -040032const Register StoreTransitionDescriptor::MapRegister() { return a3; }
33
34
Ben Murdochb8a8cc12014-11-26 15:28:44 +000035const Register ElementTransitionAndStoreDescriptor::MapRegister() { return a3; }
36
37
38const Register InstanceofDescriptor::left() { return a0; }
39const Register InstanceofDescriptor::right() { return a1; }
40
41
42const Register ArgumentsAccessReadDescriptor::index() { return a1; }
43const Register ArgumentsAccessReadDescriptor::parameter_count() { return a0; }
44
45
46const Register ApiGetterDescriptor::function_address() { return a2; }
47
48
49const Register MathPowTaggedDescriptor::exponent() { return a2; }
50
51
52const Register MathPowIntegerDescriptor::exponent() {
53 return MathPowTaggedDescriptor::exponent();
54}
55
56
57void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) {
58 Register registers[] = {cp, a2};
59 data->Initialize(arraysize(registers), registers, NULL);
60}
61
62
63void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) {
64 Register registers[] = {cp, a1};
65 data->Initialize(arraysize(registers), registers, NULL);
66}
67
68
69void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) {
70 Register registers[] = {cp, a0};
71 data->Initialize(arraysize(registers), registers, NULL);
72}
73
74
75void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) {
76 Register registers[] = {cp, a0};
77 data->Initialize(arraysize(registers), registers, NULL);
78}
79
80
81void 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
91void FastCloneShallowObjectDescriptor::Initialize(
92 CallInterfaceDescriptorData* data) {
93 Register registers[] = {cp, a3, a2, a1, a0};
94 data->Initialize(arraysize(registers), registers, NULL);
95}
96
97
98void CreateAllocationSiteDescriptor::Initialize(
99 CallInterfaceDescriptorData* data) {
100 Register registers[] = {cp, a2, a3};
101 data->Initialize(arraysize(registers), registers, NULL);
102}
103
104
105void StoreArrayLiteralElementDescriptor::Initialize(
106 CallInterfaceDescriptorData* data) {
107 Register registers[] = {cp, a3, a0};
108 data->Initialize(arraysize(registers), registers, NULL);
109}
110
111
112void 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
122void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
123 Register registers[] = {cp, a1};
124 data->Initialize(arraysize(registers), registers, NULL);
125}
126
127
128void 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
141void RegExpConstructResultDescriptor::Initialize(
142 CallInterfaceDescriptorData* data) {
143 Register registers[] = {cp, a2, a1, a0};
144 data->Initialize(arraysize(registers), registers, NULL);
145}
146
147
148void TransitionElementsKindDescriptor::Initialize(
149 CallInterfaceDescriptorData* data) {
150 Register registers[] = {cp, a0, a1};
151 data->Initialize(arraysize(registers), registers, NULL);
152}
153
154
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400155void 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
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000164void 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
176void 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
186void 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
197void 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
208void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) {
209 Register registers[] = {cp, a0};
210 data->Initialize(arraysize(registers), registers, NULL);
211}
212
213
214void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) {
215 Register registers[] = {cp, a0};
216 data->Initialize(arraysize(registers), registers, NULL);
217}
218
219
220void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) {
221 Register registers[] = {cp, a1, a0};
222 data->Initialize(arraysize(registers), registers, NULL);
223}
224
225
226void BinaryOpWithAllocationSiteDescriptor::Initialize(
227 CallInterfaceDescriptorData* data) {
228 Register registers[] = {cp, a2, a1, a0};
229 data->Initialize(arraysize(registers), registers, NULL);
230}
231
232
233void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) {
234 Register registers[] = {cp, a1, a0};
235 data->Initialize(arraysize(registers), registers, NULL);
236}
237
238
239void 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
252void 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
265void 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
278void 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
295void 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