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
ReceiverRegister()23 const Register LoadDescriptor::ReceiverRegister() { return r3; }
NameRegister()24 const Register LoadDescriptor::NameRegister() { return r4; }
SlotRegister()25 const Register LoadDescriptor::SlotRegister() { return r2; }
26
VectorRegister()27 const Register LoadWithVectorDescriptor::VectorRegister() { return r5; }
28
ReceiverRegister()29 const Register StoreDescriptor::ReceiverRegister() { return r3; }
NameRegister()30 const Register StoreDescriptor::NameRegister() { return r4; }
ValueRegister()31 const Register StoreDescriptor::ValueRegister() { return r2; }
32
SlotRegister()33 const Register VectorStoreICTrampolineDescriptor::SlotRegister() { return r6; }
34
VectorRegister()35 const Register VectorStoreICDescriptor::VectorRegister() { return r5; }
36
SlotRegister()37 const Register VectorStoreTransitionDescriptor::SlotRegister() { return r6; }
VectorRegister()38 const Register VectorStoreTransitionDescriptor::VectorRegister() { return r5; }
MapRegister()39 const Register VectorStoreTransitionDescriptor::MapRegister() { return r7; }
40
MapRegister()41 const Register StoreTransitionDescriptor::MapRegister() { return r5; }
42
SlotRegister()43 const Register StoreGlobalViaContextDescriptor::SlotRegister() { return r4; }
ValueRegister()44 const Register StoreGlobalViaContextDescriptor::ValueRegister() { return r2; }
45
LeftRegister()46 const Register StringCompareDescriptor::LeftRegister() { return r3; }
RightRegister()47 const Register StringCompareDescriptor::RightRegister() { return r2; }
48
HolderRegister()49 const Register ApiGetterDescriptor::HolderRegister() { return r2; }
CallbackRegister()50 const Register ApiGetterDescriptor::CallbackRegister() { return r5; }
51
exponent()52 const Register MathPowTaggedDescriptor::exponent() { return r4; }
53
exponent()54 const Register MathPowIntegerDescriptor::exponent() {
55 return MathPowTaggedDescriptor::exponent();
56 }
57
ObjectRegister()58 const Register GrowArrayElementsDescriptor::ObjectRegister() { return r2; }
KeyRegister()59 const Register GrowArrayElementsDescriptor::KeyRegister() { return r5; }
60
InitializePlatformSpecific(CallInterfaceDescriptorData * data)61 void FastNewClosureDescriptor::InitializePlatformSpecific(
62 CallInterfaceDescriptorData* data) {
63 Register registers[] = {r4};
64 data->InitializePlatformSpecific(arraysize(registers), registers);
65 }
66
InitializePlatformSpecific(CallInterfaceDescriptorData * data)67 void FastNewContextDescriptor::InitializePlatformSpecific(
68 CallInterfaceDescriptorData* data) {
69 Register registers[] = {r3};
70 data->InitializePlatformSpecific(arraysize(registers), registers);
71 }
72
InitializePlatformSpecific(CallInterfaceDescriptorData * data)73 void FastNewObjectDescriptor::InitializePlatformSpecific(
74 CallInterfaceDescriptorData* data) {
75 Register registers[] = {r3, r5};
76 data->InitializePlatformSpecific(arraysize(registers), registers);
77 }
78
InitializePlatformSpecific(CallInterfaceDescriptorData * data)79 void FastNewRestParameterDescriptor::InitializePlatformSpecific(
80 CallInterfaceDescriptorData* data) {
81 Register registers[] = {r3};
82 data->InitializePlatformSpecific(arraysize(registers), registers);
83 }
84
InitializePlatformSpecific(CallInterfaceDescriptorData * data)85 void FastNewSloppyArgumentsDescriptor::InitializePlatformSpecific(
86 CallInterfaceDescriptorData* data) {
87 Register registers[] = {r3};
88 data->InitializePlatformSpecific(arraysize(registers), registers);
89 }
90
InitializePlatformSpecific(CallInterfaceDescriptorData * data)91 void FastNewStrictArgumentsDescriptor::InitializePlatformSpecific(
92 CallInterfaceDescriptorData* data) {
93 Register registers[] = {r3};
94 data->InitializePlatformSpecific(arraysize(registers), registers);
95 }
96
97 // static
ArgumentRegister()98 const Register TypeConversionDescriptor::ArgumentRegister() { return r2; }
99
InitializePlatformSpecific(CallInterfaceDescriptorData * data)100 void TypeofDescriptor::InitializePlatformSpecific(
101 CallInterfaceDescriptorData* data) {
102 Register registers[] = {r5};
103 data->InitializePlatformSpecific(arraysize(registers), registers);
104 }
105
InitializePlatformSpecific(CallInterfaceDescriptorData * data)106 void FastCloneRegExpDescriptor::InitializePlatformSpecific(
107 CallInterfaceDescriptorData* data) {
108 Register registers[] = {r5, r4, r3, r2};
109 data->InitializePlatformSpecific(arraysize(registers), registers);
110 }
111
InitializePlatformSpecific(CallInterfaceDescriptorData * data)112 void FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
113 CallInterfaceDescriptorData* data) {
114 Register registers[] = {r5, r4, r3};
115 data->InitializePlatformSpecific(arraysize(registers), registers);
116 }
117
InitializePlatformSpecific(CallInterfaceDescriptorData * data)118 void FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
119 CallInterfaceDescriptorData* data) {
120 Register registers[] = {r5, r4, r3, r2};
121 data->InitializePlatformSpecific(arraysize(registers), registers);
122 }
123
InitializePlatformSpecific(CallInterfaceDescriptorData * data)124 void CreateAllocationSiteDescriptor::InitializePlatformSpecific(
125 CallInterfaceDescriptorData* data) {
126 Register registers[] = {r4, r5};
127 data->InitializePlatformSpecific(arraysize(registers), registers);
128 }
129
InitializePlatformSpecific(CallInterfaceDescriptorData * data)130 void CreateWeakCellDescriptor::InitializePlatformSpecific(
131 CallInterfaceDescriptorData* data) {
132 Register registers[] = {r4, r5, r3};
133 data->InitializePlatformSpecific(arraysize(registers), registers);
134 }
135
InitializePlatformSpecific(CallInterfaceDescriptorData * data)136 void CallFunctionDescriptor::InitializePlatformSpecific(
137 CallInterfaceDescriptorData* data) {
138 Register registers[] = {r3};
139 data->InitializePlatformSpecific(arraysize(registers), registers);
140 }
141
InitializePlatformSpecific(CallInterfaceDescriptorData * data)142 void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
143 CallInterfaceDescriptorData* data) {
144 Register registers[] = {r3, r5};
145 data->InitializePlatformSpecific(arraysize(registers), registers);
146 }
147
InitializePlatformSpecific(CallInterfaceDescriptorData * data)148 void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
149 CallInterfaceDescriptorData* data) {
150 Register registers[] = {r3, r5, r4};
151 data->InitializePlatformSpecific(arraysize(registers), registers);
152 }
153
InitializePlatformSpecific(CallInterfaceDescriptorData * data)154 void CallConstructDescriptor::InitializePlatformSpecific(
155 CallInterfaceDescriptorData* data) {
156 // r2 : number of arguments
157 // r3 : the function to call
158 // r4 : feedback vector
159 // r5 : slot in feedback vector (Smi, for RecordCallTarget)
160 // r6 : new target (for IsSuperConstructorCall)
161 // TODO(turbofan): So far we don't gather type feedback and hence skip the
162 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
163 Register registers[] = {r2, r3, r6, r4};
164 data->InitializePlatformSpecific(arraysize(registers), registers);
165 }
166
InitializePlatformSpecific(CallInterfaceDescriptorData * data)167 void CallTrampolineDescriptor::InitializePlatformSpecific(
168 CallInterfaceDescriptorData* data) {
169 // r2 : number of arguments
170 // r3 : the target to call
171 Register registers[] = {r3, r2};
172 data->InitializePlatformSpecific(arraysize(registers), registers);
173 }
174
InitializePlatformSpecific(CallInterfaceDescriptorData * data)175 void ConstructStubDescriptor::InitializePlatformSpecific(
176 CallInterfaceDescriptorData* data) {
177 // r2 : number of arguments
178 // r3 : the target to call
179 // r5 : the new target
180 // r4 : allocation site or undefined
181 Register registers[] = {r3, r5, r2, r4};
182 data->InitializePlatformSpecific(arraysize(registers), registers);
183 }
184
InitializePlatformSpecific(CallInterfaceDescriptorData * data)185 void ConstructTrampolineDescriptor::InitializePlatformSpecific(
186 CallInterfaceDescriptorData* data) {
187 // r2 : number of arguments
188 // r3 : the target to call
189 // r5 : the new target
190 Register registers[] = {r3, r5, r2};
191 data->InitializePlatformSpecific(arraysize(registers), registers);
192 }
193
InitializePlatformSpecific(CallInterfaceDescriptorData * data)194 void RegExpConstructResultDescriptor::InitializePlatformSpecific(
195 CallInterfaceDescriptorData* data) {
196 Register registers[] = {r4, r3, r2};
197 data->InitializePlatformSpecific(arraysize(registers), registers);
198 }
199
InitializePlatformSpecific(CallInterfaceDescriptorData * data)200 void TransitionElementsKindDescriptor::InitializePlatformSpecific(
201 CallInterfaceDescriptorData* data) {
202 Register registers[] = {r2, r3};
203 data->InitializePlatformSpecific(arraysize(registers), registers);
204 }
205
InitializePlatformSpecific(CallInterfaceDescriptorData * data)206 void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
207 CallInterfaceDescriptorData* data) {
208 data->InitializePlatformSpecific(0, nullptr, nullptr);
209 }
210
211 #define SIMD128_ALLOC_DESC(TYPE, Type, type, lane_count, lane_type) \
212 void Allocate##Type##Descriptor::InitializePlatformSpecific( \
213 CallInterfaceDescriptorData* data) { \
214 data->InitializePlatformSpecific(0, nullptr, nullptr); \
215 }
SIMD128_TYPES(SIMD128_ALLOC_DESC)216 SIMD128_TYPES(SIMD128_ALLOC_DESC)
217 #undef SIMD128_ALLOC_DESC
218
219 void ArrayNoArgumentConstructorDescriptor::InitializePlatformSpecific(
220 CallInterfaceDescriptorData* data) {
221 // register state
222 // r2 -- number of arguments
223 // r3 -- function
224 // r4 -- allocation site with elements kind
225 Register registers[] = {r3, r4, r2};
226 data->InitializePlatformSpecific(arraysize(registers), registers);
227 }
228
InitializePlatformSpecific(CallInterfaceDescriptorData * data)229 void ArraySingleArgumentConstructorDescriptor::InitializePlatformSpecific(
230 CallInterfaceDescriptorData* data) {
231 // register state
232 // r2 -- number of arguments
233 // r3 -- function
234 // r4 -- allocation site with elements kind
235 Register registers[] = {r3, r4, r2};
236 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
237 }
238
InitializePlatformSpecific(CallInterfaceDescriptorData * data)239 void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
240 CallInterfaceDescriptorData* data) {
241 // stack param count needs (constructor pointer, and single argument)
242 Register registers[] = {r3, r4, r2};
243 data->InitializePlatformSpecific(arraysize(registers), registers);
244 }
245
InitializePlatformSpecific(CallInterfaceDescriptorData * data)246 void VarArgFunctionDescriptor::InitializePlatformSpecific(
247 CallInterfaceDescriptorData* data) {
248 // stack param count needs (arg count)
249 Register registers[] = {r2};
250 data->InitializePlatformSpecific(arraysize(registers), registers);
251 }
252
InitializePlatformSpecific(CallInterfaceDescriptorData * data)253 void CompareDescriptor::InitializePlatformSpecific(
254 CallInterfaceDescriptorData* data) {
255 Register registers[] = {r3, r2};
256 data->InitializePlatformSpecific(arraysize(registers), registers);
257 }
258
InitializePlatformSpecific(CallInterfaceDescriptorData * data)259 void BinaryOpDescriptor::InitializePlatformSpecific(
260 CallInterfaceDescriptorData* data) {
261 Register registers[] = {r3, r2};
262 data->InitializePlatformSpecific(arraysize(registers), registers);
263 }
264
InitializePlatformSpecific(CallInterfaceDescriptorData * data)265 void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
266 CallInterfaceDescriptorData* data) {
267 Register registers[] = {r4, r3, r2};
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 ApiCallbackDescriptorBase::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 // address of the first argument
354 };
355 data->InitializePlatformSpecific(arraysize(registers), registers);
356 }
357
InitializePlatformSpecific(CallInterfaceDescriptorData * data)358 void InterpreterCEntryDescriptor::InitializePlatformSpecific(
359 CallInterfaceDescriptorData* data) {
360 Register registers[] = {
361 r2, // argument count (argc)
362 r4, // address of first argument (argv)
363 r3 // the runtime function to call
364 };
365 data->InitializePlatformSpecific(arraysize(registers), registers);
366 }
367
InitializePlatformSpecific(CallInterfaceDescriptorData * data)368 void ResumeGeneratorDescriptor::InitializePlatformSpecific(
369 CallInterfaceDescriptorData* data) {
370 Register registers[] = {
371 r2, // the value to pass to the generator
372 r3, // the JSGeneratorObject to resume
373 r4 // the resume mode (tagged)
374 };
375 data->InitializePlatformSpecific(arraysize(registers), registers);
376 }
377
378 } // namespace internal
379 } // namespace v8
380
381 #endif // V8_TARGET_ARCH_S390
382