blob: c5c1311d94f32c0771410a71785fca205125031c [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
Ben Murdochb8a8cc12014-11-26 15:28:44 +00005#if V8_TARGET_ARCH_MIPS64
6
7#include "src/interface-descriptors.h"
8
9namespace v8 {
10namespace internal {
11
12const Register CallInterfaceDescriptor::ContextRegister() { return cp; }
13
14
15const Register LoadDescriptor::ReceiverRegister() { return a1; }
16const Register LoadDescriptor::NameRegister() { return a2; }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000017const Register LoadDescriptor::SlotRegister() { return a0; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000018
19
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000020const Register LoadWithVectorDescriptor::VectorRegister() { return a3; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000021
22
23const Register StoreDescriptor::ReceiverRegister() { return a1; }
24const Register StoreDescriptor::NameRegister() { return a2; }
25const Register StoreDescriptor::ValueRegister() { return a0; }
26
27
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000028const Register VectorStoreICTrampolineDescriptor::SlotRegister() { return a4; }
29
30
31const Register VectorStoreICDescriptor::VectorRegister() { return a3; }
32
33
34const Register VectorStoreTransitionDescriptor::SlotRegister() { return a4; }
35const Register VectorStoreTransitionDescriptor::VectorRegister() { return a3; }
36const Register VectorStoreTransitionDescriptor::MapRegister() { return a5; }
37
38
Emily Bernierd0a1eb72015-03-24 16:35:39 -040039const Register StoreTransitionDescriptor::MapRegister() { return a3; }
40
41
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000042const Register LoadGlobalViaContextDescriptor::SlotRegister() { return a2; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000043
44
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000045const Register StoreGlobalViaContextDescriptor::SlotRegister() { return a2; }
46const Register StoreGlobalViaContextDescriptor::ValueRegister() { return a0; }
47
48
49const Register InstanceOfDescriptor::LeftRegister() { return a1; }
50const Register InstanceOfDescriptor::RightRegister() { return a0; }
51
52
53const Register StringCompareDescriptor::LeftRegister() { return a1; }
54const Register StringCompareDescriptor::RightRegister() { return a0; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000055
56
57const Register ArgumentsAccessReadDescriptor::index() { return a1; }
58const Register ArgumentsAccessReadDescriptor::parameter_count() { return a0; }
59
60
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000061const Register ArgumentsAccessNewDescriptor::function() { return a1; }
62const Register ArgumentsAccessNewDescriptor::parameter_count() { return a2; }
63const Register ArgumentsAccessNewDescriptor::parameter_pointer() { return a3; }
64
65
66const Register RestParamAccessDescriptor::parameter_count() { return a2; }
67const Register RestParamAccessDescriptor::parameter_pointer() { return a3; }
68const Register RestParamAccessDescriptor::rest_parameter_index() { return a4; }
69
70
Ben Murdochb8a8cc12014-11-26 15:28:44 +000071const Register ApiGetterDescriptor::function_address() { return a2; }
72
73
74const Register MathPowTaggedDescriptor::exponent() { return a2; }
75
76
77const Register MathPowIntegerDescriptor::exponent() {
78 return MathPowTaggedDescriptor::exponent();
79}
80
81
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000082const Register GrowArrayElementsDescriptor::ObjectRegister() { return a0; }
83const Register GrowArrayElementsDescriptor::KeyRegister() { return a3; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000084
85
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000086void FastNewClosureDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +000087 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000088 Register registers[] = {a2};
89 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000090}
91
92
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000093void FastNewContextDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +000094 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000095 Register registers[] = {a1};
96 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000097}
98
99
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000100void ToNumberDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000101 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000102 Register registers[] = {a0};
103 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000104}
105
106
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000107// static
108const Register ToLengthDescriptor::ReceiverRegister() { return a0; }
109
110
111// static
112const Register ToStringDescriptor::ReceiverRegister() { return a0; }
113
114
115// static
116const Register ToObjectDescriptor::ReceiverRegister() { return a0; }
117
118
119void NumberToStringDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000120 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000121 Register registers[] = {a0};
122 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000123}
124
125
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000126void TypeofDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000127 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000128 Register registers[] = {a3};
129 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000130}
131
132
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000133void FastCloneRegExpDescriptor::InitializePlatformSpecific(
134 CallInterfaceDescriptorData* data) {
135 Register registers[] = {a3, a2, a1, a0};
136 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000137}
138
139
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000140void FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
141 CallInterfaceDescriptorData* data) {
142 Register registers[] = {a3, a2, a1};
143 data->InitializePlatformSpecific(arraysize(registers), registers);
144}
145
146
147void FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
148 CallInterfaceDescriptorData* data) {
149 Register registers[] = {a3, a2, a1, a0};
150 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
151}
152
153
154void CreateAllocationSiteDescriptor::InitializePlatformSpecific(
155 CallInterfaceDescriptorData* data) {
156 Register registers[] = {a2, a3};
157 data->InitializePlatformSpecific(arraysize(registers), registers);
158}
159
160
161void CreateWeakCellDescriptor::InitializePlatformSpecific(
162 CallInterfaceDescriptorData* data) {
163 Register registers[] = {a2, a3, a1};
164 data->InitializePlatformSpecific(arraysize(registers), registers);
165}
166
167
168void StoreArrayLiteralElementDescriptor::InitializePlatformSpecific(
169 CallInterfaceDescriptorData* data) {
170 Register registers[] = {a3, a0};
171 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
172}
173
174
175void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
176 CallInterfaceDescriptorData* data) {
177 Register registers[] = {a1, a3};
178 data->InitializePlatformSpecific(arraysize(registers), registers);
179}
180
181
182void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
183 CallInterfaceDescriptorData* data) {
184 Register registers[] = {a1, a3, a2};
185 data->InitializePlatformSpecific(arraysize(registers), registers);
186}
187
188
189void CallFunctionDescriptor::InitializePlatformSpecific(
190 CallInterfaceDescriptorData* data) {
191 Register registers[] = {a1};
192 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
193}
194
195
196void CallConstructDescriptor::InitializePlatformSpecific(
197 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000198 // a0 : number of arguments
199 // a1 : the function to call
200 // a2 : feedback vector
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000201 // a3 : slot in feedback vector (Smi, for RecordCallTarget)
202 // a4 : new target (for IsSuperConstructorCall)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000203 // TODO(turbofan): So far we don't gather type feedback and hence skip the
204 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000205 Register registers[] = {a0, a1, a4, a2};
206 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000207}
208
209
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000210void CallTrampolineDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000211 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000212 // a1: target
213 // a0: number of arguments
214 Register registers[] = {a1, a0};
215 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000216}
217
218
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000219void ConstructStubDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000220 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000221 // a1: target
222 // a3: new target
223 // a0: number of arguments
224 // a2: allocation site or undefined
225 Register registers[] = {a1, a3, a0, a2};
226 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000227}
228
229
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000230void ConstructTrampolineDescriptor::InitializePlatformSpecific(
231 CallInterfaceDescriptorData* data) {
232 // a1: target
233 // a3: new target
234 // a0: number of arguments
235 Register registers[] = {a1, a3, a0};
236 data->InitializePlatformSpecific(arraysize(registers), registers);
237}
238
239
240void RegExpConstructResultDescriptor::InitializePlatformSpecific(
241 CallInterfaceDescriptorData* data) {
242 Register registers[] = {a2, a1, a0};
243 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
244}
245
246
247void TransitionElementsKindDescriptor::InitializePlatformSpecific(
248 CallInterfaceDescriptorData* data) {
249 Register registers[] = {a0, a1};
250 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
251}
252
253
254void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400255 CallInterfaceDescriptorData* data) {
256 // register state
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000257 data->InitializePlatformSpecific(0, nullptr, nullptr);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400258}
259
260
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000261void AllocateInNewSpaceDescriptor::InitializePlatformSpecific(
262 CallInterfaceDescriptorData* data) {
263 Register registers[] = {a0};
264 data->InitializePlatformSpecific(arraysize(registers), registers);
265}
266
267
268void ArrayConstructorConstantArgCountDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000269 CallInterfaceDescriptorData* data) {
270 // register state
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000271 // a0 -- number of arguments
272 // a1 -- function
273 // a2 -- allocation site with elements kind
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000274 Register registers[] = {a1, a2};
275 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000276}
277
278
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000279void ArrayConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000280 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000281 // stack param count needs (constructor pointer, and single argument)
282 Register registers[] = {a1, a2, a0};
283 data->InitializePlatformSpecific(arraysize(registers), registers);
284}
285
286
287void InternalArrayConstructorConstantArgCountDescriptor::
288 InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000289 // register state
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000290 // a0 -- number of arguments
291 // a1 -- constructor function
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000292 Register registers[] = {a1};
293 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000294}
295
296
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000297void InternalArrayConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000298 CallInterfaceDescriptorData* data) {
299 // stack param count needs (constructor pointer, and single argument)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000300 Register registers[] = {a1, a0};
301 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000302}
303
304
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000305void CompareDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000306 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000307 Register registers[] = {a1, a0};
308 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000309}
310
311
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000312void CompareNilDescriptor::InitializePlatformSpecific(
313 CallInterfaceDescriptorData* data) {
314 Register registers[] = {a0};
315 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000316}
317
318
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000319void ToBooleanDescriptor::InitializePlatformSpecific(
320 CallInterfaceDescriptorData* data) {
321 Register registers[] = {a0};
322 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
323}
324
325
326void BinaryOpDescriptor::InitializePlatformSpecific(
327 CallInterfaceDescriptorData* data) {
328 Register registers[] = {a1, a0};
329 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
330}
331
332
333void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
334 CallInterfaceDescriptorData* data) {
335 Register registers[] = {a2, a1, a0};
336 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
337}
338
339
340void StringAddDescriptor::InitializePlatformSpecific(
341 CallInterfaceDescriptorData* data) {
342 Register registers[] = {a1, a0};
343 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
344}
345
346
347void KeyedDescriptor::InitializePlatformSpecific(
348 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000349 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000350 a2, // key
351 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000352 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000353}
354
355
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000356void NamedDescriptor::InitializePlatformSpecific(
357 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000358 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000359 a2, // name
360 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000361 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000362}
363
364
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000365void CallHandlerDescriptor::InitializePlatformSpecific(
366 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000367 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000368 a0, // receiver
369 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000370 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000371}
372
373
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000374void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
375 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000376 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000377 a1, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000378 a3, // the new target
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000379 a0, // actual number of arguments
380 a2, // expected number of arguments
381 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000382 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000383}
384
385
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000386void ApiFunctionDescriptor::InitializePlatformSpecific(
387 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000388 Register registers[] = {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000389 a0, // callee
390 a4, // call_data
391 a2, // holder
392 a1, // api_function_address
393 a3, // actual number of arguments
394 };
395 data->InitializePlatformSpecific(arraysize(registers), registers);
396}
397
398
399void ApiAccessorDescriptor::InitializePlatformSpecific(
400 CallInterfaceDescriptorData* data) {
401 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000402 a0, // callee
403 a4, // call_data
404 a2, // holder
405 a1, // api_function_address
406 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000407 data->InitializePlatformSpecific(arraysize(registers), registers);
408}
409
410
411void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
412 CallInterfaceDescriptorData* data) {
413 Register registers[] = {
414 a0, // argument count (not including receiver)
415 a2, // address of first argument
416 a1 // the target callable to be call
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000417 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000418 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000419}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000420
421
422void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
423 CallInterfaceDescriptorData* data) {
424 Register registers[] = {
425 a0, // argument count (not including receiver)
426 a3, // new target
427 a1, // constructor to call
428 a2 // address of the first argument
429 };
430 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000431}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000432
433
434void InterpreterCEntryDescriptor::InitializePlatformSpecific(
435 CallInterfaceDescriptorData* data) {
436 Register registers[] = {
437 a0, // argument count (argc)
438 a2, // address of first argument (argv)
439 a1 // the runtime function to call
440 };
441 data->InitializePlatformSpecific(arraysize(registers), registers);
442}
443
444} // namespace internal
445} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000446
447#endif // V8_TARGET_ARCH_MIPS64