blob: 63afca85ee5b45b99340bf5bd9cfc37c277a79fc [file] [log] [blame]
Ben Murdochda12d292016-06-02 14:46:10 +01001// 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
9namespace v8 {
10namespace internal {
11
12const Register CallInterfaceDescriptor::ContextRegister() { return cp; }
13
14const Register LoadDescriptor::ReceiverRegister() { return r3; }
15const Register LoadDescriptor::NameRegister() { return r4; }
16const Register LoadDescriptor::SlotRegister() { return r2; }
17
18const Register LoadWithVectorDescriptor::VectorRegister() { return r5; }
19
20const Register StoreDescriptor::ReceiverRegister() { return r3; }
21const Register StoreDescriptor::NameRegister() { return r4; }
22const Register StoreDescriptor::ValueRegister() { return r2; }
23
24const Register VectorStoreICTrampolineDescriptor::SlotRegister() { return r6; }
25
26const Register VectorStoreICDescriptor::VectorRegister() { return r5; }
27
28const Register VectorStoreTransitionDescriptor::SlotRegister() { return r6; }
29const Register VectorStoreTransitionDescriptor::VectorRegister() { return r5; }
30const Register VectorStoreTransitionDescriptor::MapRegister() { return r7; }
31
32const Register StoreTransitionDescriptor::MapRegister() { return r5; }
33
34const Register LoadGlobalViaContextDescriptor::SlotRegister() { return r4; }
35
36const Register StoreGlobalViaContextDescriptor::SlotRegister() { return r4; }
37const Register StoreGlobalViaContextDescriptor::ValueRegister() { return r2; }
38
39const Register InstanceOfDescriptor::LeftRegister() { return r3; }
40const Register InstanceOfDescriptor::RightRegister() { return r2; }
41
42const Register StringCompareDescriptor::LeftRegister() { return r3; }
43const Register StringCompareDescriptor::RightRegister() { return r2; }
44
45const Register ApiGetterDescriptor::function_address() { return r4; }
46
47const Register MathPowTaggedDescriptor::exponent() { return r4; }
48
49const Register MathPowIntegerDescriptor::exponent() {
50 return MathPowTaggedDescriptor::exponent();
51}
52
53const Register GrowArrayElementsDescriptor::ObjectRegister() { return r2; }
54const Register GrowArrayElementsDescriptor::KeyRegister() { return r5; }
55
56void FastNewClosureDescriptor::InitializePlatformSpecific(
57 CallInterfaceDescriptorData* data) {
58 Register registers[] = {r4};
59 data->InitializePlatformSpecific(arraysize(registers), registers);
60}
61
62void FastNewContextDescriptor::InitializePlatformSpecific(
63 CallInterfaceDescriptorData* data) {
64 Register registers[] = {r3};
65 data->InitializePlatformSpecific(arraysize(registers), registers);
66}
67
68void FastNewObjectDescriptor::InitializePlatformSpecific(
69 CallInterfaceDescriptorData* data) {
70 Register registers[] = {r3, r5};
71 data->InitializePlatformSpecific(arraysize(registers), registers);
72}
73
74void FastNewRestParameterDescriptor::InitializePlatformSpecific(
75 CallInterfaceDescriptorData* data) {
76 Register registers[] = {r3};
77 data->InitializePlatformSpecific(arraysize(registers), registers);
78}
79
80void FastNewSloppyArgumentsDescriptor::InitializePlatformSpecific(
81 CallInterfaceDescriptorData* data) {
82 Register registers[] = {r3};
83 data->InitializePlatformSpecific(arraysize(registers), registers);
84}
85
86void FastNewStrictArgumentsDescriptor::InitializePlatformSpecific(
87 CallInterfaceDescriptorData* data) {
88 Register registers[] = {r3};
89 data->InitializePlatformSpecific(arraysize(registers), registers);
90}
91
92// static
93const Register TypeConversionDescriptor::ArgumentRegister() { return r2; }
94
95void TypeofDescriptor::InitializePlatformSpecific(
96 CallInterfaceDescriptorData* data) {
97 Register registers[] = {r5};
98 data->InitializePlatformSpecific(arraysize(registers), registers);
99}
100
101void FastCloneRegExpDescriptor::InitializePlatformSpecific(
102 CallInterfaceDescriptorData* data) {
103 Register registers[] = {r5, r4, r3, r2};
104 data->InitializePlatformSpecific(arraysize(registers), registers);
105}
106
107void FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
108 CallInterfaceDescriptorData* data) {
109 Register registers[] = {r5, r4, r3};
110 data->InitializePlatformSpecific(arraysize(registers), registers);
111}
112
113void FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
114 CallInterfaceDescriptorData* data) {
115 Register registers[] = {r5, r4, r3, r2};
116 data->InitializePlatformSpecific(arraysize(registers), registers);
117}
118
119void CreateAllocationSiteDescriptor::InitializePlatformSpecific(
120 CallInterfaceDescriptorData* data) {
121 Register registers[] = {r4, r5};
122 data->InitializePlatformSpecific(arraysize(registers), registers);
123}
124
125void CreateWeakCellDescriptor::InitializePlatformSpecific(
126 CallInterfaceDescriptorData* data) {
127 Register registers[] = {r4, r5, r3};
128 data->InitializePlatformSpecific(arraysize(registers), registers);
129}
130
131void CallFunctionDescriptor::InitializePlatformSpecific(
132 CallInterfaceDescriptorData* data) {
133 Register registers[] = {r3};
134 data->InitializePlatformSpecific(arraysize(registers), registers);
135}
136
137void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
138 CallInterfaceDescriptorData* data) {
139 Register registers[] = {r3, r5};
140 data->InitializePlatformSpecific(arraysize(registers), registers);
141}
142
143void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
144 CallInterfaceDescriptorData* data) {
145 Register registers[] = {r3, r5, r4};
146 data->InitializePlatformSpecific(arraysize(registers), registers);
147}
148
149void 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
162void 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
170void 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
180void 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
189void RegExpConstructResultDescriptor::InitializePlatformSpecific(
190 CallInterfaceDescriptorData* data) {
191 Register registers[] = {r4, r3, r2};
192 data->InitializePlatformSpecific(arraysize(registers), registers);
193}
194
195void TransitionElementsKindDescriptor::InitializePlatformSpecific(
196 CallInterfaceDescriptorData* data) {
197 Register registers[] = {r2, r3};
198 data->InitializePlatformSpecific(arraysize(registers), registers);
199}
200
201void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
202 CallInterfaceDescriptorData* data) {
203 data->InitializePlatformSpecific(0, nullptr, nullptr);
204}
205
206#define SIMD128_ALLOC_DESC(TYPE, Type, type, lane_count, lane_type) \
207 void Allocate##Type##Descriptor::InitializePlatformSpecific( \
208 CallInterfaceDescriptorData* data) { \
209 data->InitializePlatformSpecific(0, nullptr, nullptr); \
210 }
211SIMD128_TYPES(SIMD128_ALLOC_DESC)
212#undef SIMD128_ALLOC_DESC
213
214void AllocateInNewSpaceDescriptor::InitializePlatformSpecific(
215 CallInterfaceDescriptorData* data) {
216 Register registers[] = {r2};
217 data->InitializePlatformSpecific(arraysize(registers), registers);
218}
219
220void ArrayConstructorConstantArgCountDescriptor::InitializePlatformSpecific(
221 CallInterfaceDescriptorData* data) {
222 // register state
223 // r2 -- number of arguments
224 // r3 -- function
225 // r4 -- allocation site with elements kind
226 Register registers[] = {r3, r4};
227 data->InitializePlatformSpecific(arraysize(registers), registers);
228}
229
230void ArrayConstructorDescriptor::InitializePlatformSpecific(
231 CallInterfaceDescriptorData* data) {
232 // stack param count needs (constructor pointer, and single argument)
233 Register registers[] = {r3, r4, r2};
234 data->InitializePlatformSpecific(arraysize(registers), registers);
235}
236
237void InternalArrayConstructorConstantArgCountDescriptor::
238 InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
239 // register state
240 // r2 -- number of arguments
241 // r3 -- constructor function
242 Register registers[] = {r3};
243 data->InitializePlatformSpecific(arraysize(registers), registers);
244}
245
246void InternalArrayConstructorDescriptor::InitializePlatformSpecific(
247 CallInterfaceDescriptorData* data) {
248 // stack param count needs (constructor pointer, and single argument)
249 Register registers[] = {r3, r2};
250 data->InitializePlatformSpecific(arraysize(registers), registers);
251}
252
253void FastArrayPushDescriptor::InitializePlatformSpecific(
254 CallInterfaceDescriptorData* data) {
255 // stack param count needs (arg count)
256 Register registers[] = {r2};
257 data->InitializePlatformSpecific(arraysize(registers), registers);
258}
259
260void CompareDescriptor::InitializePlatformSpecific(
261 CallInterfaceDescriptorData* data) {
262 Register registers[] = {r3, r2};
263 data->InitializePlatformSpecific(arraysize(registers), registers);
264}
265
266void BinaryOpDescriptor::InitializePlatformSpecific(
267 CallInterfaceDescriptorData* data) {
268 Register registers[] = {r3, r2};
269 data->InitializePlatformSpecific(arraysize(registers), registers);
270}
271
272void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
273 CallInterfaceDescriptorData* data) {
274 Register registers[] = {r4, r3, r2};
275 data->InitializePlatformSpecific(arraysize(registers), registers);
276}
277
278void StringAddDescriptor::InitializePlatformSpecific(
279 CallInterfaceDescriptorData* data) {
280 Register registers[] = {r3, r2};
281 data->InitializePlatformSpecific(arraysize(registers), registers);
282}
283
284void KeyedDescriptor::InitializePlatformSpecific(
285 CallInterfaceDescriptorData* data) {
286 Register registers[] = {
287 r4, // key
288 };
289 data->InitializePlatformSpecific(arraysize(registers), registers);
290}
291
292void NamedDescriptor::InitializePlatformSpecific(
293 CallInterfaceDescriptorData* data) {
294 Register registers[] = {
295 r4, // name
296 };
297 data->InitializePlatformSpecific(arraysize(registers), registers);
298}
299
300void CallHandlerDescriptor::InitializePlatformSpecific(
301 CallInterfaceDescriptorData* data) {
302 Register registers[] = {
303 r2, // receiver
304 };
305 data->InitializePlatformSpecific(arraysize(registers), registers);
306}
307
308void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
309 CallInterfaceDescriptorData* data) {
310 Register registers[] = {
311 r3, // JSFunction
312 r5, // the new target
313 r2, // actual number of arguments
314 r4, // expected number of arguments
315 };
316 data->InitializePlatformSpecific(arraysize(registers), registers);
317}
318
319void ApiCallbackDescriptorBase::InitializePlatformSpecific(
320 CallInterfaceDescriptorData* data) {
321 Register registers[] = {
322 r2, // callee
323 r6, // call_data
324 r4, // holder
325 r3, // api_function_address
326 };
327 data->InitializePlatformSpecific(arraysize(registers), registers);
328}
329
330void InterpreterDispatchDescriptor::InitializePlatformSpecific(
331 CallInterfaceDescriptorData* data) {
332 Register registers[] = {
333 kInterpreterAccumulatorRegister, kInterpreterRegisterFileRegister,
334 kInterpreterBytecodeOffsetRegister, kInterpreterBytecodeArrayRegister,
335 kInterpreterDispatchTableRegister};
336 data->InitializePlatformSpecific(arraysize(registers), registers);
337}
338
339void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
340 CallInterfaceDescriptorData* data) {
341 Register registers[] = {
342 r2, // argument count (not including receiver)
343 r4, // address of first argument
344 r3 // the target callable to be call
345 };
346 data->InitializePlatformSpecific(arraysize(registers), registers);
347}
348
349void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
350 CallInterfaceDescriptorData* data) {
351 Register registers[] = {
352 r2, // argument count (not including receiver)
353 r5, // new target
354 r3, // constructor to call
355 r4 // address of the first argument
356 };
357 data->InitializePlatformSpecific(arraysize(registers), registers);
358}
359
360void InterpreterCEntryDescriptor::InitializePlatformSpecific(
361 CallInterfaceDescriptorData* data) {
362 Register registers[] = {
363 r2, // argument count (argc)
364 r4, // address of first argument (argv)
365 r3 // the runtime function to call
366 };
367 data->InitializePlatformSpecific(arraysize(registers), registers);
368}
369
370} // namespace internal
371} // namespace v8
372
373#endif // V8_TARGET_ARCH_S390