blob: 06e3b77aea1df1140b05a0f5fbf80baf6d31f9e6 [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_MIPS
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 t0; }
29
30
31const Register VectorStoreICDescriptor::VectorRegister() { return a3; }
32
33
34const Register VectorStoreTransitionDescriptor::SlotRegister() { return t0; }
35const Register VectorStoreTransitionDescriptor::VectorRegister() { return a3; }
36const Register VectorStoreTransitionDescriptor::MapRegister() { return t1; }
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);
126}
127
128
129void 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 CallFunctionDescriptor::InitializePlatformSpecific(
158 CallInterfaceDescriptorData* data) {
159 Register registers[] = {a1};
160 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
161}
162
163
164void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
165 CallInterfaceDescriptorData* data) {
166 Register registers[] = {a1, a3};
167 data->InitializePlatformSpecific(arraysize(registers), registers);
168}
169
170
171void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
172 CallInterfaceDescriptorData* data) {
173 Register registers[] = {a1, a3, a2};
174 data->InitializePlatformSpecific(arraysize(registers), registers);
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 // t0 : 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, t0, 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 Murdochb8a8cc12014-11-26 15:28:44 +0000299
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000300void CompareDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000301 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000302 Register registers[] = {a1, a0};
303 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000304}
305
306
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000307void BinaryOpDescriptor::InitializePlatformSpecific(
308 CallInterfaceDescriptorData* data) {
309 Register registers[] = {a1, a0};
310 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
311}
312
313
314void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
315 CallInterfaceDescriptorData* data) {
316 Register registers[] = {a2, a1, a0};
317 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
318}
319
320
321void StringAddDescriptor::InitializePlatformSpecific(
322 CallInterfaceDescriptorData* data) {
323 Register registers[] = {a1, a0};
324 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
325}
326
327
328void KeyedDescriptor::InitializePlatformSpecific(
329 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000330 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000331 a2, // key
332 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000333 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000334}
335
336
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000337void NamedDescriptor::InitializePlatformSpecific(
338 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000339 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000340 a2, // name
341 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000342 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000343}
344
345
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000346void CallHandlerDescriptor::InitializePlatformSpecific(
347 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000348 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000349 a0, // receiver
350 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000351 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000352}
353
354
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000355void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
356 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000357 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000358 a1, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000359 a3, // the new target
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000360 a0, // actual number of arguments
361 a2, // expected number of arguments
362 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000363 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000364}
365
Ben Murdochda12d292016-06-02 14:46:10 +0100366void ApiCallbackDescriptorBase::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000367 CallInterfaceDescriptorData* data) {
368 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000369 a0, // callee
370 t0, // call_data
371 a2, // holder
372 a1, // api_function_address
373 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000374 data->InitializePlatformSpecific(arraysize(registers), registers);
375}
376
Ben Murdoch097c5b22016-05-18 11:27:45 +0100377void InterpreterDispatchDescriptor::InitializePlatformSpecific(
378 CallInterfaceDescriptorData* data) {
379 Register registers[] = {
380 kInterpreterAccumulatorRegister, kInterpreterRegisterFileRegister,
381 kInterpreterBytecodeOffsetRegister, kInterpreterBytecodeArrayRegister,
382 kInterpreterDispatchTableRegister};
383 data->InitializePlatformSpecific(arraysize(registers), registers);
384}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000385
386void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
387 CallInterfaceDescriptorData* data) {
388 Register registers[] = {
389 a0, // argument count (not including receiver)
390 a2, // address of first argument
391 a1 // the target callable to be call
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000392 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000393 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000394}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000395
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000396void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
397 CallInterfaceDescriptorData* data) {
398 Register registers[] = {
399 a0, // argument count (not including receiver)
400 a3, // new target
401 a1, // constructor to call
402 a2 // address of the first argument
403 };
404 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000405}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000406
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000407void InterpreterCEntryDescriptor::InitializePlatformSpecific(
408 CallInterfaceDescriptorData* data) {
409 Register registers[] = {
410 a0, // argument count (argc)
411 a2, // address of first argument (argv)
412 a1 // the runtime function to call
413 };
414 data->InitializePlatformSpecific(arraysize(registers), registers);
415}
416
417} // namespace internal
418} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000419
420#endif // V8_TARGET_ARCH_MIPS