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