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