blob: a8e6e57f516a454c3fa4ac232f73cee512abb5af [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
Ben Murdoch61f157c2016-09-16 13:49:30 +010014void CallInterfaceDescriptor::DefaultInitializePlatformSpecific(
15 CallInterfaceDescriptorData* data, int register_parameter_count) {
16 const Register default_stub_registers[] = {a0, a1, a2, a3, t0};
17 CHECK_LE(static_cast<size_t>(register_parameter_count),
18 arraysize(default_stub_registers));
19 data->InitializePlatformSpecific(register_parameter_count,
20 default_stub_registers);
21}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000022
23const Register LoadDescriptor::ReceiverRegister() { return a1; }
24const Register LoadDescriptor::NameRegister() { return a2; }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000025const Register LoadDescriptor::SlotRegister() { return a0; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000026
27
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000028const Register LoadWithVectorDescriptor::VectorRegister() { return a3; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000029
30
31const Register StoreDescriptor::ReceiverRegister() { return a1; }
32const Register StoreDescriptor::NameRegister() { return a2; }
33const Register StoreDescriptor::ValueRegister() { return a0; }
34
35
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000036const Register VectorStoreICTrampolineDescriptor::SlotRegister() { return t0; }
37
38
39const Register VectorStoreICDescriptor::VectorRegister() { return a3; }
40
41
42const Register VectorStoreTransitionDescriptor::SlotRegister() { return t0; }
43const Register VectorStoreTransitionDescriptor::VectorRegister() { return a3; }
44const Register VectorStoreTransitionDescriptor::MapRegister() { return t1; }
45
46
Emily Bernierd0a1eb72015-03-24 16:35:39 -040047const Register StoreTransitionDescriptor::MapRegister() { return a3; }
48
49
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000050const Register StoreGlobalViaContextDescriptor::SlotRegister() { return a2; }
51const Register StoreGlobalViaContextDescriptor::ValueRegister() { return a0; }
52
53
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000054const Register StringCompareDescriptor::LeftRegister() { return a1; }
55const Register StringCompareDescriptor::RightRegister() { return a0; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000056
Ben Murdochc5610432016-08-08 18:44:38 +010057const Register ApiGetterDescriptor::HolderRegister() { return a0; }
58const Register ApiGetterDescriptor::CallbackRegister() { return a3; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000059
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 Murdochc5610432016-08-08 18:44:38 +0100250void ArrayNoArgumentConstructorDescriptor::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000251 CallInterfaceDescriptorData* data) {
Ben Murdochc5610432016-08-08 18:44:38 +0100252 // register state
253 // a0 -- number of arguments
254 // a1 -- function
255 // a2 -- allocation site with elements kind
256 Register registers[] = {a1, a2, a0};
257 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000258}
259
Ben Murdoch61f157c2016-09-16 13:49:30 +0100260void ArraySingleArgumentConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000261 CallInterfaceDescriptorData* data) {
262 // register state
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000263 // a0 -- number of arguments
264 // a1 -- function
265 // a2 -- allocation site with elements kind
Ben Murdoch61f157c2016-09-16 13:49:30 +0100266 Register registers[] = {a1, a2, a0};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000267 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000268}
269
Ben Murdoch61f157c2016-09-16 13:49:30 +0100270void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000271 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000272 // stack param count needs (constructor pointer, and single argument)
273 Register registers[] = {a1, a2, a0};
274 data->InitializePlatformSpecific(arraysize(registers), registers);
275}
276
Ben Murdoch61f157c2016-09-16 13:49:30 +0100277void VarArgFunctionDescriptor::InitializePlatformSpecific(
Ben Murdochda12d292016-06-02 14:46:10 +0100278 CallInterfaceDescriptorData* data) {
279 // stack param count needs (arg count)
280 Register registers[] = {a0};
281 data->InitializePlatformSpecific(arraysize(registers), registers);
282}
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000283
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000284void CompareDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000285 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000286 Register registers[] = {a1, a0};
287 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000288}
289
290
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000291void BinaryOpDescriptor::InitializePlatformSpecific(
292 CallInterfaceDescriptorData* data) {
293 Register registers[] = {a1, a0};
294 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
295}
296
297
298void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
299 CallInterfaceDescriptorData* data) {
300 Register registers[] = {a2, a1, a0};
301 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
302}
303
Ben Murdochc5610432016-08-08 18:44:38 +0100304void CountOpDescriptor::InitializePlatformSpecific(
305 CallInterfaceDescriptorData* data) {
306 Register registers[] = {a1};
307 data->InitializePlatformSpecific(arraysize(registers), registers);
308}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000309
310void StringAddDescriptor::InitializePlatformSpecific(
311 CallInterfaceDescriptorData* data) {
312 Register registers[] = {a1, a0};
313 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
314}
315
316
317void KeyedDescriptor::InitializePlatformSpecific(
318 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000319 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000320 a2, // key
321 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000322 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000323}
324
325
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000326void NamedDescriptor::InitializePlatformSpecific(
327 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000328 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000329 a2, // name
330 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000331 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000332}
333
334
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000335void CallHandlerDescriptor::InitializePlatformSpecific(
336 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000337 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000338 a0, // receiver
339 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000340 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000341}
342
343
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000344void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
345 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000346 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000347 a1, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000348 a3, // the new target
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000349 a0, // actual number of arguments
350 a2, // expected number of arguments
351 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000352 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000353}
354
Ben Murdochda12d292016-06-02 14:46:10 +0100355void ApiCallbackDescriptorBase::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000356 CallInterfaceDescriptorData* data) {
357 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000358 a0, // callee
359 t0, // call_data
360 a2, // holder
361 a1, // api_function_address
362 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000363 data->InitializePlatformSpecific(arraysize(registers), registers);
364}
365
Ben Murdoch097c5b22016-05-18 11:27:45 +0100366void InterpreterDispatchDescriptor::InitializePlatformSpecific(
367 CallInterfaceDescriptorData* data) {
368 Register registers[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100369 kInterpreterAccumulatorRegister, kInterpreterBytecodeOffsetRegister,
370 kInterpreterBytecodeArrayRegister, kInterpreterDispatchTableRegister};
Ben Murdoch097c5b22016-05-18 11:27:45 +0100371 data->InitializePlatformSpecific(arraysize(registers), registers);
372}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000373
374void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
375 CallInterfaceDescriptorData* data) {
376 Register registers[] = {
377 a0, // argument count (not including receiver)
378 a2, // address of first argument
379 a1 // the target callable to be call
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000380 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000381 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000382}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000383
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000384void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
385 CallInterfaceDescriptorData* data) {
386 Register registers[] = {
387 a0, // argument count (not including receiver)
388 a3, // new target
389 a1, // constructor to call
390 a2 // address of the first argument
391 };
392 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 InterpreterCEntryDescriptor::InitializePlatformSpecific(
396 CallInterfaceDescriptorData* data) {
397 Register registers[] = {
398 a0, // argument count (argc)
399 a2, // address of first argument (argv)
400 a1 // the runtime function to call
401 };
402 data->InitializePlatformSpecific(arraysize(registers), registers);
403}
404
Ben Murdochc5610432016-08-08 18:44:38 +0100405void ResumeGeneratorDescriptor::InitializePlatformSpecific(
406 CallInterfaceDescriptorData* data) {
407 Register registers[] = {
408 v0, // the value to pass to the generator
409 a1, // the JSGeneratorObject to resume
410 a2 // the resume mode (tagged)
411 };
412 data->InitializePlatformSpecific(arraysize(registers), registers);
413}
414
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000415} // namespace internal
416} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000417
418#endif // V8_TARGET_ARCH_MIPS