blob: 21fe1ef0aaa46a32ee00402ee7511e421a61b0d7 [file] [log] [blame]
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001// Copyright 2014 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
Emily Bernierd0a1eb72015-03-24 16:35:39 -04005#if V8_TARGET_ARCH_PPC
6
7#include "src/interface-descriptors.h"
8
9namespace v8 {
10namespace internal {
11
12const Register CallInterfaceDescriptor::ContextRegister() { return cp; }
13
Ben Murdoch61f157c2016-09-16 13:49:30 +010014void CallInterfaceDescriptor::DefaultInitializePlatformSpecific(
15 CallInterfaceDescriptorData* data, int register_parameter_count) {
16 const Register default_stub_registers[] = {r3, r4, r5, r6, r7};
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}
Emily Bernierd0a1eb72015-03-24 16:35:39 -040022
23const Register LoadDescriptor::ReceiverRegister() { return r4; }
24const Register LoadDescriptor::NameRegister() { return r5; }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000025const Register LoadDescriptor::SlotRegister() { return r3; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040026
27
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000028const Register LoadWithVectorDescriptor::VectorRegister() { return r6; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040029
30
31const Register StoreDescriptor::ReceiverRegister() { return r4; }
32const Register StoreDescriptor::NameRegister() { return r5; }
33const Register StoreDescriptor::ValueRegister() { return r3; }
34
35
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000036const Register VectorStoreICTrampolineDescriptor::SlotRegister() { return r7; }
37
38
39const Register VectorStoreICDescriptor::VectorRegister() { return r6; }
40
41
42const Register VectorStoreTransitionDescriptor::SlotRegister() { return r7; }
43const Register VectorStoreTransitionDescriptor::VectorRegister() { return r6; }
44const Register VectorStoreTransitionDescriptor::MapRegister() { return r8; }
45
46
Emily Bernierd0a1eb72015-03-24 16:35:39 -040047const Register StoreTransitionDescriptor::MapRegister() { return r6; }
48
49
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000050const Register StoreGlobalViaContextDescriptor::SlotRegister() { return r5; }
51const Register StoreGlobalViaContextDescriptor::ValueRegister() { return r3; }
52
53
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000054const Register StringCompareDescriptor::LeftRegister() { return r4; }
55const Register StringCompareDescriptor::RightRegister() { return r3; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040056
Ben Murdochc5610432016-08-08 18:44:38 +010057const Register ApiGetterDescriptor::HolderRegister() { return r3; }
58const Register ApiGetterDescriptor::CallbackRegister() { return r6; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040059
60const Register MathPowTaggedDescriptor::exponent() { return r5; }
61
62
63const Register MathPowIntegerDescriptor::exponent() {
64 return MathPowTaggedDescriptor::exponent();
65}
66
67
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000068const Register GrowArrayElementsDescriptor::ObjectRegister() { return r3; }
69const Register GrowArrayElementsDescriptor::KeyRegister() { return r6; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040070
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000071void FastNewClosureDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -040072 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000073 Register registers[] = {r5};
74 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040075}
76
77
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000078void FastNewContextDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -040079 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000080 Register registers[] = {r4};
81 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040082}
83
Ben Murdoch097c5b22016-05-18 11:27:45 +010084void FastNewObjectDescriptor::InitializePlatformSpecific(
85 CallInterfaceDescriptorData* data) {
86 Register registers[] = {r4, r6};
87 data->InitializePlatformSpecific(arraysize(registers), registers);
88}
89
90void FastNewRestParameterDescriptor::InitializePlatformSpecific(
91 CallInterfaceDescriptorData* data) {
92 Register registers[] = {r4};
93 data->InitializePlatformSpecific(arraysize(registers), registers);
94}
95
96void FastNewSloppyArgumentsDescriptor::InitializePlatformSpecific(
97 CallInterfaceDescriptorData* data) {
98 Register registers[] = {r4};
99 data->InitializePlatformSpecific(arraysize(registers), registers);
100}
101
102void FastNewStrictArgumentsDescriptor::InitializePlatformSpecific(
103 CallInterfaceDescriptorData* data) {
104 Register registers[] = {r4};
105 data->InitializePlatformSpecific(arraysize(registers), registers);
106}
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400107
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400108
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000109// static
Ben Murdochda12d292016-06-02 14:46:10 +0100110const Register TypeConversionDescriptor::ArgumentRegister() { return r3; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400111
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000112void TypeofDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400113 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000114 Register registers[] = {r6};
115 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400116}
117
118
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000119void FastCloneRegExpDescriptor::InitializePlatformSpecific(
120 CallInterfaceDescriptorData* data) {
121 Register registers[] = {r6, r5, r4, r3};
122 data->InitializePlatformSpecific(arraysize(registers), registers);
123}
124
125
126void FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
127 CallInterfaceDescriptorData* data) {
128 Register registers[] = {r6, r5, r4};
129 data->InitializePlatformSpecific(arraysize(registers), registers);
130}
131
132
133void FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
134 CallInterfaceDescriptorData* data) {
135 Register registers[] = {r6, r5, r4, r3};
136 data->InitializePlatformSpecific(arraysize(registers), registers);
137}
138
139
140void CreateAllocationSiteDescriptor::InitializePlatformSpecific(
141 CallInterfaceDescriptorData* data) {
142 Register registers[] = {r5, r6};
143 data->InitializePlatformSpecific(arraysize(registers), registers);
144}
145
146
147void CreateWeakCellDescriptor::InitializePlatformSpecific(
148 CallInterfaceDescriptorData* data) {
149 Register registers[] = {r5, r6, r4};
150 data->InitializePlatformSpecific(arraysize(registers), registers);
151}
152
153
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000154void CallFunctionDescriptor::InitializePlatformSpecific(
155 CallInterfaceDescriptorData* data) {
156 Register registers[] = {r4};
157 data->InitializePlatformSpecific(arraysize(registers), registers);
158}
159
160
161void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
162 CallInterfaceDescriptorData* data) {
163 Register registers[] = {r4, r6};
164 data->InitializePlatformSpecific(arraysize(registers), registers);
165}
166
167
168void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
169 CallInterfaceDescriptorData* data) {
170 Register registers[] = {r4, r6, r5};
171 data->InitializePlatformSpecific(arraysize(registers), registers);
172}
173
174
175void CallConstructDescriptor::InitializePlatformSpecific(
176 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400177 // r3 : number of arguments
178 // r4 : the function to call
179 // r5 : feedback vector
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000180 // r6 : slot in feedback vector (Smi, for RecordCallTarget)
181 // r7 : new target (for IsSuperConstructorCall)
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400182 // TODO(turbofan): So far we don't gather type feedback and hence skip the
183 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000184 Register registers[] = {r3, r4, r7, r5};
185 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400186}
187
188
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000189void CallTrampolineDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400190 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000191 // r3 : number of arguments
192 // r4 : the target to call
193 Register registers[] = {r4, r3};
194 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400195}
196
197
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000198void ConstructStubDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400199 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000200 // r3 : number of arguments
201 // r4 : the target to call
202 // r6 : the new target
203 // r5 : allocation site or undefined
204 Register registers[] = {r4, r6, r3, r5};
205 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400206}
207
208
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000209void ConstructTrampolineDescriptor::InitializePlatformSpecific(
210 CallInterfaceDescriptorData* data) {
211 // r3 : number of arguments
212 // r4 : the target to call
213 // r6 : the new target
214 Register registers[] = {r4, r6, r3};
215 data->InitializePlatformSpecific(arraysize(registers), registers);
216}
217
218
219void RegExpConstructResultDescriptor::InitializePlatformSpecific(
220 CallInterfaceDescriptorData* data) {
221 Register registers[] = {r5, r4, r3};
222 data->InitializePlatformSpecific(arraysize(registers), registers);
223}
224
225
226void TransitionElementsKindDescriptor::InitializePlatformSpecific(
227 CallInterfaceDescriptorData* data) {
228 Register registers[] = {r3, r4};
229 data->InitializePlatformSpecific(arraysize(registers), registers);
230}
231
232
233void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
234 CallInterfaceDescriptorData* data) {
235 data->InitializePlatformSpecific(0, nullptr, nullptr);
236}
237
Ben Murdochda12d292016-06-02 14:46:10 +0100238#define SIMD128_ALLOC_DESC(TYPE, Type, type, lane_count, lane_type) \
239 void Allocate##Type##Descriptor::InitializePlatformSpecific( \
240 CallInterfaceDescriptorData* data) { \
241 data->InitializePlatformSpecific(0, nullptr, nullptr); \
242 }
243SIMD128_TYPES(SIMD128_ALLOC_DESC)
244#undef SIMD128_ALLOC_DESC
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000245
Ben Murdochc5610432016-08-08 18:44:38 +0100246void ArrayNoArgumentConstructorDescriptor::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000247 CallInterfaceDescriptorData* data) {
Ben Murdochc5610432016-08-08 18:44:38 +0100248 // register state
249 // r3 -- number of arguments
250 // r4 -- function
251 // r5 -- allocation site with elements kind
252 Register registers[] = {r4, r5, r3};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000253 data->InitializePlatformSpecific(arraysize(registers), registers);
254}
255
Ben Murdoch61f157c2016-09-16 13:49:30 +0100256void ArraySingleArgumentConstructorDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400257 CallInterfaceDescriptorData* data) {
258 // register state
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400259 // r3 -- number of arguments
260 // r4 -- function
261 // r5 -- allocation site with elements kind
Ben Murdoch61f157c2016-09-16 13:49:30 +0100262 Register registers[] = {r4, r5, r3};
263 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400264}
265
266
Ben Murdoch61f157c2016-09-16 13:49:30 +0100267void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400268 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000269 // stack param count needs (constructor pointer, and single argument)
270 Register registers[] = {r4, r5, r3};
271 data->InitializePlatformSpecific(arraysize(registers), registers);
272}
273
274
Ben Murdoch61f157c2016-09-16 13:49:30 +0100275void VarArgFunctionDescriptor::InitializePlatformSpecific(
Ben Murdochda12d292016-06-02 14:46:10 +0100276 CallInterfaceDescriptorData* data) {
277 // stack param count needs (arg count)
278 Register registers[] = {r3};
279 data->InitializePlatformSpecific(arraysize(registers), registers);
280}
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400281
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000282void CompareDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400283 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000284 Register registers[] = {r4, r3};
285 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400286}
287
288
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000289void BinaryOpDescriptor::InitializePlatformSpecific(
290 CallInterfaceDescriptorData* data) {
291 Register registers[] = {r4, r3};
292 data->InitializePlatformSpecific(arraysize(registers), registers);
293}
294
295
296void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
297 CallInterfaceDescriptorData* data) {
298 Register registers[] = {r5, r4, r3};
299 data->InitializePlatformSpecific(arraysize(registers), registers);
300}
301
Ben Murdochc5610432016-08-08 18:44:38 +0100302void CountOpDescriptor::InitializePlatformSpecific(
303 CallInterfaceDescriptorData* data) {
304 Register registers[] = {r4};
305 data->InitializePlatformSpecific(arraysize(registers), registers);
306}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000307
308void StringAddDescriptor::InitializePlatformSpecific(
309 CallInterfaceDescriptorData* data) {
310 Register registers[] = {r4, r3};
311 data->InitializePlatformSpecific(arraysize(registers), registers);
312}
313
314
315void KeyedDescriptor::InitializePlatformSpecific(
316 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400317 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400318 r5, // key
319 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000320 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400321}
322
323
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000324void NamedDescriptor::InitializePlatformSpecific(
325 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400326 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400327 r5, // name
328 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000329 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400330}
331
332
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000333void CallHandlerDescriptor::InitializePlatformSpecific(
334 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400335 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400336 r3, // receiver
337 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000338 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400339}
340
341
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000342void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
343 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400344 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400345 r4, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000346 r6, // the new target
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400347 r3, // actual number of arguments
348 r5, // expected number of arguments
349 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000350 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400351}
352
Ben Murdochda12d292016-06-02 14:46:10 +0100353void ApiCallbackDescriptorBase::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000354 CallInterfaceDescriptorData* data) {
355 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400356 r3, // callee
357 r7, // call_data
358 r5, // holder
359 r4, // api_function_address
360 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000361 data->InitializePlatformSpecific(arraysize(registers), registers);
362}
363
Ben Murdoch097c5b22016-05-18 11:27:45 +0100364void InterpreterDispatchDescriptor::InitializePlatformSpecific(
365 CallInterfaceDescriptorData* data) {
366 Register registers[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100367 kInterpreterAccumulatorRegister, kInterpreterBytecodeOffsetRegister,
368 kInterpreterBytecodeArrayRegister, kInterpreterDispatchTableRegister};
Ben Murdoch097c5b22016-05-18 11:27:45 +0100369 data->InitializePlatformSpecific(arraysize(registers), registers);
370}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000371
372void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
373 CallInterfaceDescriptorData* data) {
374 Register registers[] = {
375 r3, // argument count (not including receiver)
376 r5, // address of first argument
377 r4 // the target callable to be call
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400378 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000379 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400380}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000381
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000382void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
383 CallInterfaceDescriptorData* data) {
384 Register registers[] = {
385 r3, // argument count (not including receiver)
386 r6, // new target
387 r4, // constructor to call
388 r5 // address of the first argument
389 };
390 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400391}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000392
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000393void InterpreterCEntryDescriptor::InitializePlatformSpecific(
394 CallInterfaceDescriptorData* data) {
395 Register registers[] = {
396 r3, // argument count (argc)
397 r5, // address of first argument (argv)
398 r4 // the runtime function to call
399 };
400 data->InitializePlatformSpecific(arraysize(registers), registers);
401}
Ben Murdochc5610432016-08-08 18:44:38 +0100402
403void ResumeGeneratorDescriptor::InitializePlatformSpecific(
404 CallInterfaceDescriptorData* data) {
405 Register registers[] = {
406 r3, // the value to pass to the generator
407 r4, // the JSGeneratorObject to resume
408 r5 // the resume mode (tagged)
409 };
410 data->InitializePlatformSpecific(arraysize(registers), registers);
411}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000412} // namespace internal
413} // namespace v8
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400414
415#endif // V8_TARGET_ARCH_PPC