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
FunctionRegister()23 const Register FastNewFunctionContextDescriptor::FunctionRegister() {
24 return a1;
25 }
SlotsRegister()26 const Register FastNewFunctionContextDescriptor::SlotsRegister() { return a0; }
27
ReceiverRegister()28 const Register LoadDescriptor::ReceiverRegister() { return a1; }
NameRegister()29 const Register LoadDescriptor::NameRegister() { return a2; }
SlotRegister()30 const Register LoadDescriptor::SlotRegister() { return a0; }
31
VectorRegister()32 const Register LoadWithVectorDescriptor::VectorRegister() { return a3; }
33
HandlerRegister()34 const Register LoadICProtoArrayDescriptor::HandlerRegister() { return a4; }
35
ReceiverRegister()36 const Register StoreDescriptor::ReceiverRegister() { return a1; }
NameRegister()37 const Register StoreDescriptor::NameRegister() { return a2; }
ValueRegister()38 const Register StoreDescriptor::ValueRegister() { return a0; }
SlotRegister()39 const Register StoreDescriptor::SlotRegister() { return a4; }
40
VectorRegister()41 const Register StoreWithVectorDescriptor::VectorRegister() { return a3; }
42
SlotRegister()43 const Register StoreTransitionDescriptor::SlotRegister() { return a4; }
VectorRegister()44 const Register StoreTransitionDescriptor::VectorRegister() { return a3; }
MapRegister()45 const Register StoreTransitionDescriptor::MapRegister() { return a5; }
46
LeftRegister()47 const Register StringCompareDescriptor::LeftRegister() { return a1; }
RightRegister()48 const Register StringCompareDescriptor::RightRegister() { return a0; }
49
HolderRegister()50 const Register ApiGetterDescriptor::HolderRegister() { return a0; }
CallbackRegister()51 const Register ApiGetterDescriptor::CallbackRegister() { return a3; }
52
exponent()53 const Register MathPowTaggedDescriptor::exponent() { return a2; }
54
55
exponent()56 const Register MathPowIntegerDescriptor::exponent() {
57 return MathPowTaggedDescriptor::exponent();
58 }
59
60
ObjectRegister()61 const Register GrowArrayElementsDescriptor::ObjectRegister() { return a0; }
KeyRegister()62 const Register GrowArrayElementsDescriptor::KeyRegister() { return a3; }
63
64
InitializePlatformSpecific(CallInterfaceDescriptorData * data)65 void FastNewClosureDescriptor::InitializePlatformSpecific(
66 CallInterfaceDescriptorData* data) {
67 Register registers[] = {a2};
68 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
69 }
70
InitializePlatformSpecific(CallInterfaceDescriptorData * data)71 void FastNewObjectDescriptor::InitializePlatformSpecific(
72 CallInterfaceDescriptorData* data) {
73 Register registers[] = {a1, a3};
74 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
75 }
76
InitializePlatformSpecific(CallInterfaceDescriptorData * data)77 void FastNewRestParameterDescriptor::InitializePlatformSpecific(
78 CallInterfaceDescriptorData* data) {
79 Register registers[] = {a1};
80 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
81 }
82
83
InitializePlatformSpecific(CallInterfaceDescriptorData * data)84 void FastNewSloppyArgumentsDescriptor::InitializePlatformSpecific(
85 CallInterfaceDescriptorData* data) {
86 Register registers[] = {a1};
87 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
88 }
89
90
InitializePlatformSpecific(CallInterfaceDescriptorData * data)91 void FastNewStrictArgumentsDescriptor::InitializePlatformSpecific(
92 CallInterfaceDescriptorData* data) {
93 Register registers[] = {a1};
94 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
95 }
96
97
98 // static
ArgumentRegister()99 const Register TypeConversionDescriptor::ArgumentRegister() { return a0; }
100
InitializePlatformSpecific(CallInterfaceDescriptorData * data)101 void TypeofDescriptor::InitializePlatformSpecific(
102 CallInterfaceDescriptorData* data) {
103 Register registers[] = {a3};
104 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
105 }
106
107
InitializePlatformSpecific(CallInterfaceDescriptorData * data)108 void FastCloneRegExpDescriptor::InitializePlatformSpecific(
109 CallInterfaceDescriptorData* data) {
110 Register registers[] = {a3, a2, a1, a0};
111 data->InitializePlatformSpecific(arraysize(registers), registers);
112 }
113
114
InitializePlatformSpecific(CallInterfaceDescriptorData * data)115 void FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
116 CallInterfaceDescriptorData* data) {
117 Register registers[] = {a3, a2, a1};
118 data->InitializePlatformSpecific(arraysize(registers), registers);
119 }
120
121
InitializePlatformSpecific(CallInterfaceDescriptorData * data)122 void FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
123 CallInterfaceDescriptorData* data) {
124 Register registers[] = {a3, a2, a1, a0};
125 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
126 }
127
128
InitializePlatformSpecific(CallInterfaceDescriptorData * data)129 void CreateAllocationSiteDescriptor::InitializePlatformSpecific(
130 CallInterfaceDescriptorData* data) {
131 Register registers[] = {a2, a3};
132 data->InitializePlatformSpecific(arraysize(registers), registers);
133 }
134
135
InitializePlatformSpecific(CallInterfaceDescriptorData * data)136 void CreateWeakCellDescriptor::InitializePlatformSpecific(
137 CallInterfaceDescriptorData* data) {
138 Register registers[] = {a2, a3, a1};
139 data->InitializePlatformSpecific(arraysize(registers), registers);
140 }
141
142
InitializePlatformSpecific(CallInterfaceDescriptorData * data)143 void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
144 CallInterfaceDescriptorData* data) {
145 Register registers[] = {a1, a3};
146 data->InitializePlatformSpecific(arraysize(registers), registers);
147 }
148
149
InitializePlatformSpecific(CallInterfaceDescriptorData * data)150 void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
151 CallInterfaceDescriptorData* data) {
152 Register registers[] = {a1, a0, a3, a2};
153 data->InitializePlatformSpecific(arraysize(registers), registers);
154 }
155
156
InitializePlatformSpecific(CallInterfaceDescriptorData * data)157 void CallFunctionDescriptor::InitializePlatformSpecific(
158 CallInterfaceDescriptorData* data) {
159 Register registers[] = {a1};
160 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
161 }
162
163
InitializePlatformSpecific(CallInterfaceDescriptorData * data)164 void CallConstructDescriptor::InitializePlatformSpecific(
165 CallInterfaceDescriptorData* data) {
166 // a0 : number of arguments
167 // a1 : the function to call
168 // a2 : feedback vector
169 // a3 : slot in feedback vector (Smi, for RecordCallTarget)
170 // a4 : new target (for IsSuperConstructorCall)
171 // TODO(turbofan): So far we don't gather type feedback and hence skip the
172 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
173 Register registers[] = {a0, a1, a4, a2};
174 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
175 }
176
177
InitializePlatformSpecific(CallInterfaceDescriptorData * data)178 void CallTrampolineDescriptor::InitializePlatformSpecific(
179 CallInterfaceDescriptorData* data) {
180 // a1: target
181 // a0: number of arguments
182 Register registers[] = {a1, a0};
183 data->InitializePlatformSpecific(arraysize(registers), registers);
184 }
185
186
InitializePlatformSpecific(CallInterfaceDescriptorData * data)187 void ConstructStubDescriptor::InitializePlatformSpecific(
188 CallInterfaceDescriptorData* data) {
189 // a1: target
190 // a3: new target
191 // a0: number of arguments
192 // a2: allocation site or undefined
193 Register registers[] = {a1, a3, a0, a2};
194 data->InitializePlatformSpecific(arraysize(registers), registers);
195 }
196
197
InitializePlatformSpecific(CallInterfaceDescriptorData * data)198 void ConstructTrampolineDescriptor::InitializePlatformSpecific(
199 CallInterfaceDescriptorData* data) {
200 // a1: target
201 // a3: new target
202 // a0: number of arguments
203 Register registers[] = {a1, a3, a0};
204 data->InitializePlatformSpecific(arraysize(registers), registers);
205 }
206
207
InitializePlatformSpecific(CallInterfaceDescriptorData * data)208 void TransitionElementsKindDescriptor::InitializePlatformSpecific(
209 CallInterfaceDescriptorData* data) {
210 Register registers[] = {a0, a1};
211 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
212 }
213
214
InitializePlatformSpecific(CallInterfaceDescriptorData * data)215 void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
216 CallInterfaceDescriptorData* data) {
217 // register state
218 data->InitializePlatformSpecific(0, nullptr, nullptr);
219 }
220
221 #define SIMD128_ALLOC_DESC(TYPE, Type, type, lane_count, lane_type) \
222 void Allocate##Type##Descriptor::InitializePlatformSpecific( \
223 CallInterfaceDescriptorData* data) { \
224 data->InitializePlatformSpecific(0, nullptr, nullptr); \
225 }
SIMD128_TYPES(SIMD128_ALLOC_DESC)226 SIMD128_TYPES(SIMD128_ALLOC_DESC)
227 #undef SIMD128_ALLOC_DESC
228
229 void ArrayNoArgumentConstructorDescriptor::InitializePlatformSpecific(
230 CallInterfaceDescriptorData* data) {
231 // register state
232 // a0 -- number of arguments
233 // a1 -- function
234 // a2 -- allocation site with elements kind
235 Register registers[] = {a1, a2, a0};
236 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
237 }
238
InitializePlatformSpecific(CallInterfaceDescriptorData * data)239 void ArraySingleArgumentConstructorDescriptor::InitializePlatformSpecific(
240 CallInterfaceDescriptorData* data) {
241 // register state
242 // a0 -- number of arguments
243 // a1 -- function
244 // a2 -- allocation site with elements kind
245 Register registers[] = {a1, a2, a0};
246 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
247 }
248
InitializePlatformSpecific(CallInterfaceDescriptorData * data)249 void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
250 CallInterfaceDescriptorData* data) {
251 // stack param count needs (constructor pointer, and single argument)
252 Register registers[] = {a1, a2, a0};
253 data->InitializePlatformSpecific(arraysize(registers), registers);
254 }
255
InitializePlatformSpecific(CallInterfaceDescriptorData * data)256 void VarArgFunctionDescriptor::InitializePlatformSpecific(
257 CallInterfaceDescriptorData* data) {
258 // stack param count needs (arg count)
259 Register registers[] = {a0};
260 data->InitializePlatformSpecific(arraysize(registers), registers);
261 }
InitializePlatformSpecific(CallInterfaceDescriptorData * data)262 void CompareDescriptor::InitializePlatformSpecific(
263 CallInterfaceDescriptorData* data) {
264 Register registers[] = {a1, a0};
265 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
266 }
267
268
InitializePlatformSpecific(CallInterfaceDescriptorData * data)269 void BinaryOpDescriptor::InitializePlatformSpecific(
270 CallInterfaceDescriptorData* data) {
271 Register registers[] = {a1, a0};
272 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
273 }
274
275
InitializePlatformSpecific(CallInterfaceDescriptorData * data)276 void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
277 CallInterfaceDescriptorData* data) {
278 Register registers[] = {a2, a1, a0};
279 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
280 }
281
InitializePlatformSpecific(CallInterfaceDescriptorData * data)282 void BinaryOpWithVectorDescriptor::InitializePlatformSpecific(
283 CallInterfaceDescriptorData* data) {
284 // register state
285 // a1 -- lhs
286 // a0 -- rhs
287 // a4 -- slot id
288 // a3 -- vector
289 Register registers[] = {a1, a0, a4, a3};
290 data->InitializePlatformSpecific(arraysize(registers), registers);
291 }
292
InitializePlatformSpecific(CallInterfaceDescriptorData * data)293 void CountOpDescriptor::InitializePlatformSpecific(
294 CallInterfaceDescriptorData* data) {
295 Register registers[] = {a1};
296 data->InitializePlatformSpecific(arraysize(registers), registers);
297 }
298
InitializePlatformSpecific(CallInterfaceDescriptorData * data)299 void StringAddDescriptor::InitializePlatformSpecific(
300 CallInterfaceDescriptorData* data) {
301 Register registers[] = {a1, a0};
302 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
303 }
304
305
InitializePlatformSpecific(CallInterfaceDescriptorData * data)306 void KeyedDescriptor::InitializePlatformSpecific(
307 CallInterfaceDescriptorData* data) {
308 Register registers[] = {
309 a2, // key
310 };
311 data->InitializePlatformSpecific(arraysize(registers), registers);
312 }
313
314
InitializePlatformSpecific(CallInterfaceDescriptorData * data)315 void NamedDescriptor::InitializePlatformSpecific(
316 CallInterfaceDescriptorData* data) {
317 Register registers[] = {
318 a2, // name
319 };
320 data->InitializePlatformSpecific(arraysize(registers), registers);
321 }
322
323
InitializePlatformSpecific(CallInterfaceDescriptorData * data)324 void CallHandlerDescriptor::InitializePlatformSpecific(
325 CallInterfaceDescriptorData* data) {
326 Register registers[] = {
327 a0, // receiver
328 };
329 data->InitializePlatformSpecific(arraysize(registers), registers);
330 }
331
332
InitializePlatformSpecific(CallInterfaceDescriptorData * data)333 void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
334 CallInterfaceDescriptorData* data) {
335 Register registers[] = {
336 a1, // JSFunction
337 a3, // the new target
338 a0, // actual number of arguments
339 a2, // expected number of arguments
340 };
341 data->InitializePlatformSpecific(arraysize(registers), registers);
342 }
343
InitializePlatformSpecific(CallInterfaceDescriptorData * data)344 void ApiCallbackDescriptor::InitializePlatformSpecific(
345 CallInterfaceDescriptorData* data) {
346 Register registers[] = {
347 a0, // callee
348 a4, // call_data
349 a2, // holder
350 a1, // api_function_address
351 };
352 data->InitializePlatformSpecific(arraysize(registers), registers);
353 }
354
InitializePlatformSpecific(CallInterfaceDescriptorData * data)355 void InterpreterDispatchDescriptor::InitializePlatformSpecific(
356 CallInterfaceDescriptorData* data) {
357 Register registers[] = {
358 kInterpreterAccumulatorRegister, kInterpreterBytecodeOffsetRegister,
359 kInterpreterBytecodeArrayRegister, kInterpreterDispatchTableRegister};
360 data->InitializePlatformSpecific(arraysize(registers), registers);
361 }
362
InitializePlatformSpecific(CallInterfaceDescriptorData * data)363 void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
364 CallInterfaceDescriptorData* data) {
365 Register registers[] = {
366 a0, // argument count (not including receiver)
367 a2, // address of first argument
368 a1 // the target callable to be call
369 };
370 data->InitializePlatformSpecific(arraysize(registers), registers);
371 }
372
InitializePlatformSpecific(CallInterfaceDescriptorData * data)373 void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
374 CallInterfaceDescriptorData* data) {
375 Register registers[] = {
376 a0, // argument count (not including receiver)
377 a3, // new target
378 a1, // constructor to call
379 a2, // allocation site feedback if available, undefined otherwise.
380 a4 // address of the first argument
381 };
382 data->InitializePlatformSpecific(arraysize(registers), registers);
383 }
384
InitializePlatformSpecific(CallInterfaceDescriptorData * data)385 void InterpreterPushArgsAndConstructArrayDescriptor::InitializePlatformSpecific(
386 CallInterfaceDescriptorData* data) {
387 Register registers[] = {
388 a0, // argument count (not including receiver)
389 a1, // the target to call verified to be Array function
390 a2, // allocation site feedback
391 a3, // address of first argument
392 };
393 data->InitializePlatformSpecific(arraysize(registers), registers);
394 }
395
InitializePlatformSpecific(CallInterfaceDescriptorData * data)396 void InterpreterCEntryDescriptor::InitializePlatformSpecific(
397 CallInterfaceDescriptorData* data) {
398 Register registers[] = {
399 a0, // argument count (argc)
400 a2, // address of first argument (argv)
401 a1 // the runtime function to call
402 };
403 data->InitializePlatformSpecific(arraysize(registers), registers);
404 }
405
InitializePlatformSpecific(CallInterfaceDescriptorData * data)406 void ResumeGeneratorDescriptor::InitializePlatformSpecific(
407 CallInterfaceDescriptorData* data) {
408 Register registers[] = {
409 v0, // the value to pass to the generator
410 a1, // the JSGeneratorObject to resume
411 a2 // the resume mode (tagged)
412 };
413 data->InitializePlatformSpecific(arraysize(registers), registers);
414 }
415
416 } // namespace internal
417 } // namespace v8
418
419 #endif // V8_TARGET_ARCH_MIPS64
420