blob: 684dca557994bd5f4032e3a03a8519e95bd2b132 [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
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, a4};
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 a4; }
37
38
39const Register VectorStoreICDescriptor::VectorRegister() { return a3; }
40
41
42const Register VectorStoreTransitionDescriptor::SlotRegister() { return a4; }
43const Register VectorStoreTransitionDescriptor::VectorRegister() { return a3; }
44const Register VectorStoreTransitionDescriptor::MapRegister() { return a5; }
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);
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 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 Murdoch4a90d5f2016-03-22 12:00:34 +0000283void CompareDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000284 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000285 Register registers[] = {a1, a0};
286 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000287}
288
289
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000290void BinaryOpDescriptor::InitializePlatformSpecific(
291 CallInterfaceDescriptorData* data) {
292 Register registers[] = {a1, a0};
293 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
294}
295
296
297void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
298 CallInterfaceDescriptorData* data) {
299 Register registers[] = {a2, a1, a0};
300 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
301}
302
Ben Murdochc5610432016-08-08 18:44:38 +0100303void CountOpDescriptor::InitializePlatformSpecific(
304 CallInterfaceDescriptorData* data) {
305 Register registers[] = {a1};
306 data->InitializePlatformSpecific(arraysize(registers), registers);
307}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000308
309void StringAddDescriptor::InitializePlatformSpecific(
310 CallInterfaceDescriptorData* data) {
311 Register registers[] = {a1, a0};
312 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
313}
314
315
316void KeyedDescriptor::InitializePlatformSpecific(
317 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000318 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000319 a2, // key
320 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000321 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000322}
323
324
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000325void NamedDescriptor::InitializePlatformSpecific(
326 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000327 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000328 a2, // name
329 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000330 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000331}
332
333
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000334void CallHandlerDescriptor::InitializePlatformSpecific(
335 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000336 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000337 a0, // receiver
338 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000339 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000340}
341
342
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000343void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
344 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000345 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000346 a1, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000347 a3, // the new target
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000348 a0, // actual number of arguments
349 a2, // expected number of arguments
350 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000351 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000352}
353
Ben Murdochda12d292016-06-02 14:46:10 +0100354void ApiCallbackDescriptorBase::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000355 CallInterfaceDescriptorData* data) {
356 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000357 a0, // callee
358 a4, // call_data
359 a2, // holder
360 a1, // api_function_address
361 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000362 data->InitializePlatformSpecific(arraysize(registers), registers);
363}
364
Ben Murdoch097c5b22016-05-18 11:27:45 +0100365void InterpreterDispatchDescriptor::InitializePlatformSpecific(
366 CallInterfaceDescriptorData* data) {
367 Register registers[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100368 kInterpreterAccumulatorRegister, kInterpreterBytecodeOffsetRegister,
369 kInterpreterBytecodeArrayRegister, kInterpreterDispatchTableRegister};
Ben Murdoch097c5b22016-05-18 11:27:45 +0100370 data->InitializePlatformSpecific(arraysize(registers), registers);
371}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000372
373void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
374 CallInterfaceDescriptorData* data) {
375 Register registers[] = {
376 a0, // argument count (not including receiver)
377 a2, // address of first argument
378 a1 // the target callable to be call
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000379 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000380 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000381}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000382
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000383void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
384 CallInterfaceDescriptorData* data) {
385 Register registers[] = {
386 a0, // argument count (not including receiver)
387 a3, // new target
388 a1, // constructor to call
389 a2 // address of the first argument
390 };
391 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000392}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000393
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000394void InterpreterCEntryDescriptor::InitializePlatformSpecific(
395 CallInterfaceDescriptorData* data) {
396 Register registers[] = {
397 a0, // argument count (argc)
398 a2, // address of first argument (argv)
399 a1 // the runtime function to call
400 };
401 data->InitializePlatformSpecific(arraysize(registers), registers);
402}
403
Ben Murdochc5610432016-08-08 18:44:38 +0100404void ResumeGeneratorDescriptor::InitializePlatformSpecific(
405 CallInterfaceDescriptorData* data) {
406 Register registers[] = {
407 v0, // the value to pass to the generator
408 a1, // the JSGeneratorObject to resume
409 a2 // the resume mode (tagged)
410 };
411 data->InitializePlatformSpecific(arraysize(registers), registers);
412}
413
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000414} // namespace internal
415} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000416
417#endif // V8_TARGET_ARCH_MIPS64