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