• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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