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