blob: 7695d0b694e2c8dafa3196045b0625d4f501157f [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 +0000112// static
Ben Murdochda12d292016-06-02 14:46:10 +0100113const Register TypeConversionDescriptor::ArgumentRegister() { return a0; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000114
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000115void TypeofDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000116 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000117 Register registers[] = {a3};
118 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000119}
120
121
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000122void FastCloneRegExpDescriptor::InitializePlatformSpecific(
123 CallInterfaceDescriptorData* data) {
124 Register registers[] = {a3, a2, a1, a0};
125 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000126}
127
128
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000129void FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
130 CallInterfaceDescriptorData* data) {
131 Register registers[] = {a3, a2, a1};
132 data->InitializePlatformSpecific(arraysize(registers), registers);
133}
134
135
136void FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
137 CallInterfaceDescriptorData* data) {
138 Register registers[] = {a3, a2, a1, a0};
139 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
140}
141
142
143void CreateAllocationSiteDescriptor::InitializePlatformSpecific(
144 CallInterfaceDescriptorData* data) {
145 Register registers[] = {a2, a3};
146 data->InitializePlatformSpecific(arraysize(registers), registers);
147}
148
149
150void CreateWeakCellDescriptor::InitializePlatformSpecific(
151 CallInterfaceDescriptorData* data) {
152 Register registers[] = {a2, a3, a1};
153 data->InitializePlatformSpecific(arraysize(registers), registers);
154}
155
156
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000157void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
158 CallInterfaceDescriptorData* data) {
159 Register registers[] = {a1, a3};
160 data->InitializePlatformSpecific(arraysize(registers), registers);
161}
162
163
164void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
165 CallInterfaceDescriptorData* data) {
166 Register registers[] = {a1, a3, a2};
167 data->InitializePlatformSpecific(arraysize(registers), registers);
168}
169
170
171void CallFunctionDescriptor::InitializePlatformSpecific(
172 CallInterfaceDescriptorData* data) {
173 Register registers[] = {a1};
174 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
175}
176
177
178void CallConstructDescriptor::InitializePlatformSpecific(
179 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000180 // a0 : number of arguments
181 // a1 : the function to call
182 // a2 : feedback vector
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000183 // a3 : slot in feedback vector (Smi, for RecordCallTarget)
184 // a4 : new target (for IsSuperConstructorCall)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000185 // TODO(turbofan): So far we don't gather type feedback and hence skip the
186 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000187 Register registers[] = {a0, a1, a4, a2};
188 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000189}
190
191
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000192void CallTrampolineDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000193 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000194 // a1: target
195 // a0: number of arguments
196 Register registers[] = {a1, a0};
197 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000198}
199
200
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000201void ConstructStubDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000202 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000203 // a1: target
204 // a3: new target
205 // a0: number of arguments
206 // a2: allocation site or undefined
207 Register registers[] = {a1, a3, a0, a2};
208 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000209}
210
211
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000212void ConstructTrampolineDescriptor::InitializePlatformSpecific(
213 CallInterfaceDescriptorData* data) {
214 // a1: target
215 // a3: new target
216 // a0: number of arguments
217 Register registers[] = {a1, a3, a0};
218 data->InitializePlatformSpecific(arraysize(registers), registers);
219}
220
221
222void RegExpConstructResultDescriptor::InitializePlatformSpecific(
223 CallInterfaceDescriptorData* data) {
224 Register registers[] = {a2, a1, a0};
225 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
226}
227
228
229void TransitionElementsKindDescriptor::InitializePlatformSpecific(
230 CallInterfaceDescriptorData* data) {
231 Register registers[] = {a0, a1};
232 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
233}
234
235
236void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400237 CallInterfaceDescriptorData* data) {
238 // register state
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000239 data->InitializePlatformSpecific(0, nullptr, nullptr);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400240}
241
Ben Murdochda12d292016-06-02 14:46:10 +0100242#define SIMD128_ALLOC_DESC(TYPE, Type, type, lane_count, lane_type) \
243 void Allocate##Type##Descriptor::InitializePlatformSpecific( \
244 CallInterfaceDescriptorData* data) { \
245 data->InitializePlatformSpecific(0, nullptr, nullptr); \
246 }
247SIMD128_TYPES(SIMD128_ALLOC_DESC)
248#undef SIMD128_ALLOC_DESC
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400249
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000250void AllocateInNewSpaceDescriptor::InitializePlatformSpecific(
251 CallInterfaceDescriptorData* data) {
252 Register registers[] = {a0};
253 data->InitializePlatformSpecific(arraysize(registers), registers);
254}
255
256
257void ArrayConstructorConstantArgCountDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000258 CallInterfaceDescriptorData* data) {
259 // register state
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000260 // a0 -- number of arguments
261 // a1 -- function
262 // a2 -- allocation site with elements kind
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000263 Register registers[] = {a1, a2};
264 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000265}
266
267
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000268void ArrayConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000269 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000270 // stack param count needs (constructor pointer, and single argument)
271 Register registers[] = {a1, a2, a0};
272 data->InitializePlatformSpecific(arraysize(registers), registers);
273}
274
275
276void InternalArrayConstructorConstantArgCountDescriptor::
277 InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000278 // register state
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000279 // a0 -- number of arguments
280 // a1 -- constructor function
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000281 Register registers[] = {a1};
282 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000283}
284
285
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000286void InternalArrayConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000287 CallInterfaceDescriptorData* data) {
288 // stack param count needs (constructor pointer, and single argument)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000289 Register registers[] = {a1, a0};
290 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000291}
292
Ben Murdochda12d292016-06-02 14:46:10 +0100293void FastArrayPushDescriptor::InitializePlatformSpecific(
294 CallInterfaceDescriptorData* data) {
295 // stack param count needs (arg count)
296 Register registers[] = {a0};
297 data->InitializePlatformSpecific(arraysize(registers), registers);
298}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000299void CompareDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000300 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000301 Register registers[] = {a1, a0};
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 BinaryOpDescriptor::InitializePlatformSpecific(
307 CallInterfaceDescriptorData* data) {
308 Register registers[] = {a1, a0};
309 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
310}
311
312
313void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
314 CallInterfaceDescriptorData* data) {
315 Register registers[] = {a2, a1, a0};
316 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
317}
318
319
320void StringAddDescriptor::InitializePlatformSpecific(
321 CallInterfaceDescriptorData* data) {
322 Register registers[] = {a1, a0};
323 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
324}
325
326
327void KeyedDescriptor::InitializePlatformSpecific(
328 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000329 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000330 a2, // key
331 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000332 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000333}
334
335
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000336void NamedDescriptor::InitializePlatformSpecific(
337 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000338 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000339 a2, // name
340 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000341 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000342}
343
344
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000345void CallHandlerDescriptor::InitializePlatformSpecific(
346 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000347 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000348 a0, // receiver
349 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000350 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000351}
352
353
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000354void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
355 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000356 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000357 a1, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000358 a3, // the new target
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000359 a0, // actual number of arguments
360 a2, // expected number of arguments
361 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000362 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000363}
364
Ben Murdochda12d292016-06-02 14:46:10 +0100365void ApiCallbackDescriptorBase::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000366 CallInterfaceDescriptorData* data) {
367 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000368 a0, // callee
369 a4, // call_data
370 a2, // holder
371 a1, // api_function_address
372 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000373 data->InitializePlatformSpecific(arraysize(registers), registers);
374}
375
Ben Murdoch097c5b22016-05-18 11:27:45 +0100376void InterpreterDispatchDescriptor::InitializePlatformSpecific(
377 CallInterfaceDescriptorData* data) {
378 Register registers[] = {
379 kInterpreterAccumulatorRegister, kInterpreterRegisterFileRegister,
380 kInterpreterBytecodeOffsetRegister, kInterpreterBytecodeArrayRegister,
381 kInterpreterDispatchTableRegister};
382 data->InitializePlatformSpecific(arraysize(registers), registers);
383}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000384
385void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
386 CallInterfaceDescriptorData* data) {
387 Register registers[] = {
388 a0, // argument count (not including receiver)
389 a2, // address of first argument
390 a1 // the target callable to be call
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000391 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000392 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000393}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000394
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000395void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
396 CallInterfaceDescriptorData* data) {
397 Register registers[] = {
398 a0, // argument count (not including receiver)
399 a3, // new target
400 a1, // constructor to call
401 a2 // address of the first argument
402 };
403 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000404}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000405
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000406void InterpreterCEntryDescriptor::InitializePlatformSpecific(
407 CallInterfaceDescriptorData* data) {
408 Register registers[] = {
409 a0, // argument count (argc)
410 a2, // address of first argument (argv)
411 a1 // the runtime function to call
412 };
413 data->InitializePlatformSpecific(arraysize(registers), registers);
414}
415
416} // namespace internal
417} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000418
419#endif // V8_TARGET_ARCH_MIPS64