1 // 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
5 #if V8_TARGET_ARCH_MIPS64
6
7 #include "src/interface-descriptors.h"
8
9 namespace v8 {
10 namespace internal {
11
ContextRegister()12 const Register CallInterfaceDescriptor::ContextRegister() { return cp; }
13
DefaultInitializePlatformSpecific(CallInterfaceDescriptorData * data,int register_parameter_count)14 void 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 }
22
ReceiverRegister()23 const Register LoadDescriptor::ReceiverRegister() { return a1; }
NameRegister()24 const Register LoadDescriptor::NameRegister() { return a2; }
SlotRegister()25 const Register LoadDescriptor::SlotRegister() { return a0; }
26
27
VectorRegister()28 const Register LoadWithVectorDescriptor::VectorRegister() { return a3; }
29
30
ReceiverRegister()31 const Register StoreDescriptor::ReceiverRegister() { return a1; }
NameRegister()32 const Register StoreDescriptor::NameRegister() { return a2; }
ValueRegister()33 const Register StoreDescriptor::ValueRegister() { return a0; }
34
35
SlotRegister()36 const Register VectorStoreICTrampolineDescriptor::SlotRegister() { return a4; }
37
38
VectorRegister()39 const Register VectorStoreICDescriptor::VectorRegister() { return a3; }
40
41
SlotRegister()42 const Register VectorStoreTransitionDescriptor::SlotRegister() { return a4; }
VectorRegister()43 const Register VectorStoreTransitionDescriptor::VectorRegister() { return a3; }
MapRegister()44 const Register VectorStoreTransitionDescriptor::MapRegister() { return a5; }
45
46
MapRegister()47 const Register StoreTransitionDescriptor::MapRegister() { return a3; }
48
49
SlotRegister()50 const Register StoreGlobalViaContextDescriptor::SlotRegister() { return a2; }
ValueRegister()51 const Register StoreGlobalViaContextDescriptor::ValueRegister() { return a0; }
52
53
LeftRegister()54 const Register StringCompareDescriptor::LeftRegister() { return a1; }
RightRegister()55 const Register StringCompareDescriptor::RightRegister() { return a0; }
56
HolderRegister()57 const Register ApiGetterDescriptor::HolderRegister() { return a0; }
CallbackRegister()58 const Register ApiGetterDescriptor::CallbackRegister() { return a3; }
59
exponent()60 const Register MathPowTaggedDescriptor::exponent() { return a2; }
61
62
exponent()63 const Register MathPowIntegerDescriptor::exponent() {
64 return MathPowTaggedDescriptor::exponent();
65 }
66
67
ObjectRegister()68 const Register GrowArrayElementsDescriptor::ObjectRegister() { return a0; }
KeyRegister()69 const Register GrowArrayElementsDescriptor::KeyRegister() { return a3; }
70
71
InitializePlatformSpecific(CallInterfaceDescriptorData * data)72 void FastNewClosureDescriptor::InitializePlatformSpecific(
73 CallInterfaceDescriptorData* data) {
74 Register registers[] = {a2};
75 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
76 }
77
78
InitializePlatformSpecific(CallInterfaceDescriptorData * data)79 void FastNewContextDescriptor::InitializePlatformSpecific(
80 CallInterfaceDescriptorData* data) {
81 Register registers[] = {a1};
82 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
83 }
84
InitializePlatformSpecific(CallInterfaceDescriptorData * data)85 void FastNewObjectDescriptor::InitializePlatformSpecific(
86 CallInterfaceDescriptorData* data) {
87 Register registers[] = {a1, a3};
88 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
89 }
90
InitializePlatformSpecific(CallInterfaceDescriptorData * data)91 void FastNewRestParameterDescriptor::InitializePlatformSpecific(
92 CallInterfaceDescriptorData* data) {
93 Register registers[] = {a1};
94 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
95 }
96
97
InitializePlatformSpecific(CallInterfaceDescriptorData * data)98 void FastNewSloppyArgumentsDescriptor::InitializePlatformSpecific(
99 CallInterfaceDescriptorData* data) {
100 Register registers[] = {a1};
101 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
102 }
103
104
InitializePlatformSpecific(CallInterfaceDescriptorData * data)105 void FastNewStrictArgumentsDescriptor::InitializePlatformSpecific(
106 CallInterfaceDescriptorData* data) {
107 Register registers[] = {a1};
108 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
109 }
110
111
112 // static
ArgumentRegister()113 const Register TypeConversionDescriptor::ArgumentRegister() { return a0; }
114
InitializePlatformSpecific(CallInterfaceDescriptorData * data)115 void TypeofDescriptor::InitializePlatformSpecific(
116 CallInterfaceDescriptorData* data) {
117 Register registers[] = {a3};
118 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
119 }
120
121
InitializePlatformSpecific(CallInterfaceDescriptorData * data)122 void FastCloneRegExpDescriptor::InitializePlatformSpecific(
123 CallInterfaceDescriptorData* data) {
124 Register registers[] = {a3, a2, a1, a0};
125 data->InitializePlatformSpecific(arraysize(registers), registers);
126 }
127
128
InitializePlatformSpecific(CallInterfaceDescriptorData * data)129 void FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
130 CallInterfaceDescriptorData* data) {
131 Register registers[] = {a3, a2, a1};
132 data->InitializePlatformSpecific(arraysize(registers), registers);
133 }
134
135
InitializePlatformSpecific(CallInterfaceDescriptorData * data)136 void FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
137 CallInterfaceDescriptorData* data) {
138 Register registers[] = {a3, a2, a1, a0};
139 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
140 }
141
142
InitializePlatformSpecific(CallInterfaceDescriptorData * data)143 void CreateAllocationSiteDescriptor::InitializePlatformSpecific(
144 CallInterfaceDescriptorData* data) {
145 Register registers[] = {a2, a3};
146 data->InitializePlatformSpecific(arraysize(registers), registers);
147 }
148
149
InitializePlatformSpecific(CallInterfaceDescriptorData * data)150 void CreateWeakCellDescriptor::InitializePlatformSpecific(
151 CallInterfaceDescriptorData* data) {
152 Register registers[] = {a2, a3, a1};
153 data->InitializePlatformSpecific(arraysize(registers), registers);
154 }
155
156
InitializePlatformSpecific(CallInterfaceDescriptorData * data)157 void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
158 CallInterfaceDescriptorData* data) {
159 Register registers[] = {a1, a3};
160 data->InitializePlatformSpecific(arraysize(registers), registers);
161 }
162
163
InitializePlatformSpecific(CallInterfaceDescriptorData * data)164 void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
165 CallInterfaceDescriptorData* data) {
166 Register registers[] = {a1, a3, a2};
167 data->InitializePlatformSpecific(arraysize(registers), registers);
168 }
169
170
InitializePlatformSpecific(CallInterfaceDescriptorData * data)171 void CallFunctionDescriptor::InitializePlatformSpecific(
172 CallInterfaceDescriptorData* data) {
173 Register registers[] = {a1};
174 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
175 }
176
177
InitializePlatformSpecific(CallInterfaceDescriptorData * data)178 void CallConstructDescriptor::InitializePlatformSpecific(
179 CallInterfaceDescriptorData* data) {
180 // a0 : number of arguments
181 // a1 : the function to call
182 // a2 : feedback vector
183 // a3 : slot in feedback vector (Smi, for RecordCallTarget)
184 // a4 : new target (for IsSuperConstructorCall)
185 // 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.
187 Register registers[] = {a0, a1, a4, a2};
188 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
189 }
190
191
InitializePlatformSpecific(CallInterfaceDescriptorData * data)192 void CallTrampolineDescriptor::InitializePlatformSpecific(
193 CallInterfaceDescriptorData* data) {
194 // a1: target
195 // a0: number of arguments
196 Register registers[] = {a1, a0};
197 data->InitializePlatformSpecific(arraysize(registers), registers);
198 }
199
200
InitializePlatformSpecific(CallInterfaceDescriptorData * data)201 void ConstructStubDescriptor::InitializePlatformSpecific(
202 CallInterfaceDescriptorData* data) {
203 // 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);
209 }
210
211
InitializePlatformSpecific(CallInterfaceDescriptorData * data)212 void 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
InitializePlatformSpecific(CallInterfaceDescriptorData * data)222 void RegExpConstructResultDescriptor::InitializePlatformSpecific(
223 CallInterfaceDescriptorData* data) {
224 Register registers[] = {a2, a1, a0};
225 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
226 }
227
228
InitializePlatformSpecific(CallInterfaceDescriptorData * data)229 void TransitionElementsKindDescriptor::InitializePlatformSpecific(
230 CallInterfaceDescriptorData* data) {
231 Register registers[] = {a0, a1};
232 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
233 }
234
235
InitializePlatformSpecific(CallInterfaceDescriptorData * data)236 void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
237 CallInterfaceDescriptorData* data) {
238 // register state
239 data->InitializePlatformSpecific(0, nullptr, nullptr);
240 }
241
242 #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 }
SIMD128_TYPES(SIMD128_ALLOC_DESC)247 SIMD128_TYPES(SIMD128_ALLOC_DESC)
248 #undef SIMD128_ALLOC_DESC
249
250 void ArrayNoArgumentConstructorDescriptor::InitializePlatformSpecific(
251 CallInterfaceDescriptorData* data) {
252 // 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);
258 }
259
InitializePlatformSpecific(CallInterfaceDescriptorData * data)260 void ArraySingleArgumentConstructorDescriptor::InitializePlatformSpecific(
261 CallInterfaceDescriptorData* data) {
262 // register state
263 // a0 -- number of arguments
264 // a1 -- function
265 // a2 -- allocation site with elements kind
266 Register registers[] = {a1, a2, a0};
267 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
268 }
269
InitializePlatformSpecific(CallInterfaceDescriptorData * data)270 void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
271 CallInterfaceDescriptorData* data) {
272 // stack param count needs (constructor pointer, and single argument)
273 Register registers[] = {a1, a2, a0};
274 data->InitializePlatformSpecific(arraysize(registers), registers);
275 }
276
InitializePlatformSpecific(CallInterfaceDescriptorData * data)277 void VarArgFunctionDescriptor::InitializePlatformSpecific(
278 CallInterfaceDescriptorData* data) {
279 // stack param count needs (arg count)
280 Register registers[] = {a0};
281 data->InitializePlatformSpecific(arraysize(registers), registers);
282 }
InitializePlatformSpecific(CallInterfaceDescriptorData * data)283 void CompareDescriptor::InitializePlatformSpecific(
284 CallInterfaceDescriptorData* data) {
285 Register registers[] = {a1, a0};
286 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
287 }
288
289
InitializePlatformSpecific(CallInterfaceDescriptorData * data)290 void BinaryOpDescriptor::InitializePlatformSpecific(
291 CallInterfaceDescriptorData* data) {
292 Register registers[] = {a1, a0};
293 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
294 }
295
296
InitializePlatformSpecific(CallInterfaceDescriptorData * data)297 void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
298 CallInterfaceDescriptorData* data) {
299 Register registers[] = {a2, a1, a0};
300 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
301 }
302
InitializePlatformSpecific(CallInterfaceDescriptorData * data)303 void CountOpDescriptor::InitializePlatformSpecific(
304 CallInterfaceDescriptorData* data) {
305 Register registers[] = {a1};
306 data->InitializePlatformSpecific(arraysize(registers), registers);
307 }
308
InitializePlatformSpecific(CallInterfaceDescriptorData * data)309 void StringAddDescriptor::InitializePlatformSpecific(
310 CallInterfaceDescriptorData* data) {
311 Register registers[] = {a1, a0};
312 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
313 }
314
315
InitializePlatformSpecific(CallInterfaceDescriptorData * data)316 void KeyedDescriptor::InitializePlatformSpecific(
317 CallInterfaceDescriptorData* data) {
318 Register registers[] = {
319 a2, // key
320 };
321 data->InitializePlatformSpecific(arraysize(registers), registers);
322 }
323
324
InitializePlatformSpecific(CallInterfaceDescriptorData * data)325 void NamedDescriptor::InitializePlatformSpecific(
326 CallInterfaceDescriptorData* data) {
327 Register registers[] = {
328 a2, // name
329 };
330 data->InitializePlatformSpecific(arraysize(registers), registers);
331 }
332
333
InitializePlatformSpecific(CallInterfaceDescriptorData * data)334 void CallHandlerDescriptor::InitializePlatformSpecific(
335 CallInterfaceDescriptorData* data) {
336 Register registers[] = {
337 a0, // receiver
338 };
339 data->InitializePlatformSpecific(arraysize(registers), registers);
340 }
341
342
InitializePlatformSpecific(CallInterfaceDescriptorData * data)343 void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
344 CallInterfaceDescriptorData* data) {
345 Register registers[] = {
346 a1, // JSFunction
347 a3, // the new target
348 a0, // actual number of arguments
349 a2, // expected number of arguments
350 };
351 data->InitializePlatformSpecific(arraysize(registers), registers);
352 }
353
InitializePlatformSpecific(CallInterfaceDescriptorData * data)354 void ApiCallbackDescriptorBase::InitializePlatformSpecific(
355 CallInterfaceDescriptorData* data) {
356 Register registers[] = {
357 a0, // callee
358 a4, // call_data
359 a2, // holder
360 a1, // api_function_address
361 };
362 data->InitializePlatformSpecific(arraysize(registers), registers);
363 }
364
InitializePlatformSpecific(CallInterfaceDescriptorData * data)365 void InterpreterDispatchDescriptor::InitializePlatformSpecific(
366 CallInterfaceDescriptorData* data) {
367 Register registers[] = {
368 kInterpreterAccumulatorRegister, kInterpreterBytecodeOffsetRegister,
369 kInterpreterBytecodeArrayRegister, kInterpreterDispatchTableRegister};
370 data->InitializePlatformSpecific(arraysize(registers), registers);
371 }
372
InitializePlatformSpecific(CallInterfaceDescriptorData * data)373 void 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
379 };
380 data->InitializePlatformSpecific(arraysize(registers), registers);
381 }
382
InitializePlatformSpecific(CallInterfaceDescriptorData * data)383 void 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);
392 }
393
InitializePlatformSpecific(CallInterfaceDescriptorData * data)394 void 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
InitializePlatformSpecific(CallInterfaceDescriptorData * data)404 void 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
414 } // namespace internal
415 } // namespace v8
416
417 #endif // V8_TARGET_ARCH_MIPS64
418