blob: 73df66ea8e56fa7fdd8e483c7b3ee8d7d649c1a7 [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
Ben Murdochb8a8cc12014-11-26 15:28:44 +000057const Register ApiGetterDescriptor::function_address() { return a2; }
58
59
60const Register MathPowTaggedDescriptor::exponent() { return a2; }
61
62
63const Register MathPowIntegerDescriptor::exponent() {
64 return MathPowTaggedDescriptor::exponent();
65}
66
67
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000068const Register GrowArrayElementsDescriptor::ObjectRegister() { return a0; }
69const Register GrowArrayElementsDescriptor::KeyRegister() { return a3; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000070
71
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000072void FastNewClosureDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +000073 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000074 Register registers[] = {a2};
75 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000076}
77
78
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000079void FastNewContextDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +000080 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000081 Register registers[] = {a1};
82 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000083}
84
Ben Murdoch097c5b22016-05-18 11:27:45 +010085void FastNewObjectDescriptor::InitializePlatformSpecific(
86 CallInterfaceDescriptorData* data) {
87 Register registers[] = {a1, a3};
88 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
89}
90
91void FastNewRestParameterDescriptor::InitializePlatformSpecific(
92 CallInterfaceDescriptorData* data) {
93 Register registers[] = {a1};
94 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
95}
96
97
98void FastNewSloppyArgumentsDescriptor::InitializePlatformSpecific(
99 CallInterfaceDescriptorData* data) {
100 Register registers[] = {a1};
101 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
102}
103
104
105void FastNewStrictArgumentsDescriptor::InitializePlatformSpecific(
106 CallInterfaceDescriptorData* data) {
107 Register registers[] = {a1};
108 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
109}
110
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000111
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000112void ToNumberDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000113 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000114 Register registers[] = {a0};
115 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000116}
117
118
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000119// static
120const Register ToLengthDescriptor::ReceiverRegister() { return a0; }
121
122
123// static
124const Register ToStringDescriptor::ReceiverRegister() { return a0; }
125
126
127// static
Ben Murdoch097c5b22016-05-18 11:27:45 +0100128const Register ToNameDescriptor::ReceiverRegister() { return a0; }
129
130
131// static
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000132const Register ToObjectDescriptor::ReceiverRegister() { return a0; }
133
134
135void NumberToStringDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000136 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000137 Register registers[] = {a0};
138 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000139}
140
141
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000142void TypeofDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000143 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000144 Register registers[] = {a3};
145 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000146}
147
148
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000149void FastCloneRegExpDescriptor::InitializePlatformSpecific(
150 CallInterfaceDescriptorData* data) {
151 Register registers[] = {a3, a2, a1, a0};
152 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000153}
154
155
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000156void FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
157 CallInterfaceDescriptorData* data) {
158 Register registers[] = {a3, a2, a1};
159 data->InitializePlatformSpecific(arraysize(registers), registers);
160}
161
162
163void FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
164 CallInterfaceDescriptorData* data) {
165 Register registers[] = {a3, a2, a1, a0};
166 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
167}
168
169
170void CreateAllocationSiteDescriptor::InitializePlatformSpecific(
171 CallInterfaceDescriptorData* data) {
172 Register registers[] = {a2, a3};
173 data->InitializePlatformSpecific(arraysize(registers), registers);
174}
175
176
177void CreateWeakCellDescriptor::InitializePlatformSpecific(
178 CallInterfaceDescriptorData* data) {
179 Register registers[] = {a2, a3, a1};
180 data->InitializePlatformSpecific(arraysize(registers), registers);
181}
182
183
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000184void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
185 CallInterfaceDescriptorData* data) {
186 Register registers[] = {a1, a3};
187 data->InitializePlatformSpecific(arraysize(registers), registers);
188}
189
190
191void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
192 CallInterfaceDescriptorData* data) {
193 Register registers[] = {a1, a3, a2};
194 data->InitializePlatformSpecific(arraysize(registers), registers);
195}
196
197
198void CallFunctionDescriptor::InitializePlatformSpecific(
199 CallInterfaceDescriptorData* data) {
200 Register registers[] = {a1};
201 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
202}
203
204
205void CallConstructDescriptor::InitializePlatformSpecific(
206 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000207 // a0 : number of arguments
208 // a1 : the function to call
209 // a2 : feedback vector
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000210 // a3 : slot in feedback vector (Smi, for RecordCallTarget)
211 // a4 : new target (for IsSuperConstructorCall)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000212 // TODO(turbofan): So far we don't gather type feedback and hence skip the
213 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000214 Register registers[] = {a0, a1, a4, a2};
215 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000216}
217
218
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000219void CallTrampolineDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000220 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000221 // a1: target
222 // a0: number of arguments
223 Register registers[] = {a1, a0};
224 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000225}
226
227
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000228void ConstructStubDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000229 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000230 // a1: target
231 // a3: new target
232 // a0: number of arguments
233 // a2: allocation site or undefined
234 Register registers[] = {a1, a3, a0, a2};
235 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000236}
237
238
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000239void ConstructTrampolineDescriptor::InitializePlatformSpecific(
240 CallInterfaceDescriptorData* data) {
241 // a1: target
242 // a3: new target
243 // a0: number of arguments
244 Register registers[] = {a1, a3, a0};
245 data->InitializePlatformSpecific(arraysize(registers), registers);
246}
247
248
249void RegExpConstructResultDescriptor::InitializePlatformSpecific(
250 CallInterfaceDescriptorData* data) {
251 Register registers[] = {a2, a1, a0};
252 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
253}
254
255
256void TransitionElementsKindDescriptor::InitializePlatformSpecific(
257 CallInterfaceDescriptorData* data) {
258 Register registers[] = {a0, a1};
259 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
260}
261
262
263void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400264 CallInterfaceDescriptorData* data) {
265 // register state
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000266 data->InitializePlatformSpecific(0, nullptr, nullptr);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400267}
268
269
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000270void AllocateInNewSpaceDescriptor::InitializePlatformSpecific(
271 CallInterfaceDescriptorData* data) {
272 Register registers[] = {a0};
273 data->InitializePlatformSpecific(arraysize(registers), registers);
274}
275
276
277void ArrayConstructorConstantArgCountDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000278 CallInterfaceDescriptorData* data) {
279 // register state
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000280 // a0 -- number of arguments
281 // a1 -- function
282 // a2 -- allocation site with elements kind
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000283 Register registers[] = {a1, a2};
284 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000285}
286
287
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000288void ArrayConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000289 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000290 // stack param count needs (constructor pointer, and single argument)
291 Register registers[] = {a1, a2, a0};
292 data->InitializePlatformSpecific(arraysize(registers), registers);
293}
294
295
296void InternalArrayConstructorConstantArgCountDescriptor::
297 InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000298 // register state
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000299 // a0 -- number of arguments
300 // a1 -- constructor function
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000301 Register registers[] = {a1};
302 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000303}
304
305
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000306void InternalArrayConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000307 CallInterfaceDescriptorData* data) {
308 // stack param count needs (constructor pointer, and single argument)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000309 Register registers[] = {a1, a0};
310 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000311}
312
313
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000314void CompareDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000315 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000316 Register registers[] = {a1, a0};
317 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000318}
319
320
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000321void CompareNilDescriptor::InitializePlatformSpecific(
322 CallInterfaceDescriptorData* data) {
323 Register registers[] = {a0};
324 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000325}
326
327
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000328void ToBooleanDescriptor::InitializePlatformSpecific(
329 CallInterfaceDescriptorData* data) {
330 Register registers[] = {a0};
331 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
332}
333
334
335void BinaryOpDescriptor::InitializePlatformSpecific(
336 CallInterfaceDescriptorData* data) {
337 Register registers[] = {a1, a0};
338 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
339}
340
341
342void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
343 CallInterfaceDescriptorData* data) {
344 Register registers[] = {a2, a1, a0};
345 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
346}
347
348
349void StringAddDescriptor::InitializePlatformSpecific(
350 CallInterfaceDescriptorData* data) {
351 Register registers[] = {a1, a0};
352 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
353}
354
355
356void KeyedDescriptor::InitializePlatformSpecific(
357 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000358 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000359 a2, // key
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 NamedDescriptor::InitializePlatformSpecific(
366 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000367 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000368 a2, // name
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 CallHandlerDescriptor::InitializePlatformSpecific(
375 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000376 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000377 a0, // receiver
378 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000379 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000380}
381
382
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000383void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
384 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000385 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000386 a1, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000387 a3, // the new target
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000388 a0, // actual number of arguments
389 a2, // expected number of arguments
390 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000391 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000392}
393
394
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000395void ApiFunctionDescriptor::InitializePlatformSpecific(
396 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000397 Register registers[] = {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000398 a0, // callee
399 a4, // call_data
400 a2, // holder
401 a1, // api_function_address
402 a3, // actual number of arguments
403 };
404 data->InitializePlatformSpecific(arraysize(registers), registers);
405}
406
407
408void ApiAccessorDescriptor::InitializePlatformSpecific(
409 CallInterfaceDescriptorData* data) {
410 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000411 a0, // callee
412 a4, // call_data
413 a2, // holder
414 a1, // api_function_address
415 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000416 data->InitializePlatformSpecific(arraysize(registers), registers);
417}
418
Ben Murdoch097c5b22016-05-18 11:27:45 +0100419void InterpreterDispatchDescriptor::InitializePlatformSpecific(
420 CallInterfaceDescriptorData* data) {
421 Register registers[] = {
422 kInterpreterAccumulatorRegister, kInterpreterRegisterFileRegister,
423 kInterpreterBytecodeOffsetRegister, kInterpreterBytecodeArrayRegister,
424 kInterpreterDispatchTableRegister};
425 data->InitializePlatformSpecific(arraysize(registers), registers);
426}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000427
428void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
429 CallInterfaceDescriptorData* data) {
430 Register registers[] = {
431 a0, // argument count (not including receiver)
432 a2, // address of first argument
433 a1 // the target callable to be call
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000434 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000435 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000436}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000437
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000438void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
439 CallInterfaceDescriptorData* data) {
440 Register registers[] = {
441 a0, // argument count (not including receiver)
442 a3, // new target
443 a1, // constructor to call
444 a2 // address of the first argument
445 };
446 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000447}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000448
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000449void InterpreterCEntryDescriptor::InitializePlatformSpecific(
450 CallInterfaceDescriptorData* data) {
451 Register registers[] = {
452 a0, // argument count (argc)
453 a2, // address of first argument (argv)
454 a1 // the runtime function to call
455 };
456 data->InitializePlatformSpecific(arraysize(registers), registers);
457}
458
459} // namespace internal
460} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000461
462#endif // V8_TARGET_ARCH_MIPS64