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