blob: 48b6cdcf0cc1e59690e99a0c92a30b811fd6dd0e [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
14
15const Register LoadDescriptor::ReceiverRegister() { return r4; }
16const Register LoadDescriptor::NameRegister() { return r5; }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000017const Register LoadDescriptor::SlotRegister() { return r3; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040018
19
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000020const Register LoadWithVectorDescriptor::VectorRegister() { return r6; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040021
22
23const Register StoreDescriptor::ReceiverRegister() { return r4; }
24const Register StoreDescriptor::NameRegister() { return r5; }
25const Register StoreDescriptor::ValueRegister() { return r3; }
26
27
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000028const Register VectorStoreICTrampolineDescriptor::SlotRegister() { return r7; }
29
30
31const Register VectorStoreICDescriptor::VectorRegister() { return r6; }
32
33
34const Register VectorStoreTransitionDescriptor::SlotRegister() { return r7; }
35const Register VectorStoreTransitionDescriptor::VectorRegister() { return r6; }
36const Register VectorStoreTransitionDescriptor::MapRegister() { return r8; }
37
38
Emily Bernierd0a1eb72015-03-24 16:35:39 -040039const Register StoreTransitionDescriptor::MapRegister() { return r6; }
40
41
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000042const Register LoadGlobalViaContextDescriptor::SlotRegister() { return r5; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040043
44
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000045const Register StoreGlobalViaContextDescriptor::SlotRegister() { return r5; }
46const Register StoreGlobalViaContextDescriptor::ValueRegister() { return r3; }
47
48
49const Register InstanceOfDescriptor::LeftRegister() { return r4; }
50const Register InstanceOfDescriptor::RightRegister() { return r3; }
51
52
53const Register StringCompareDescriptor::LeftRegister() { return r4; }
54const Register StringCompareDescriptor::RightRegister() { return r3; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040055
56
Emily Bernierd0a1eb72015-03-24 16:35:39 -040057const Register ApiGetterDescriptor::function_address() { return r5; }
58
59
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
71
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000072void FastNewClosureDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -040073 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000074 Register registers[] = {r5};
75 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040076}
77
78
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000079void FastNewContextDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -040080 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000081 Register registers[] = {r4};
82 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040083}
84
Ben Murdoch097c5b22016-05-18 11:27:45 +010085void FastNewObjectDescriptor::InitializePlatformSpecific(
86 CallInterfaceDescriptorData* data) {
87 Register registers[] = {r4, r6};
88 data->InitializePlatformSpecific(arraysize(registers), registers);
89}
90
91void FastNewRestParameterDescriptor::InitializePlatformSpecific(
92 CallInterfaceDescriptorData* data) {
93 Register registers[] = {r4};
94 data->InitializePlatformSpecific(arraysize(registers), registers);
95}
96
97void FastNewSloppyArgumentsDescriptor::InitializePlatformSpecific(
98 CallInterfaceDescriptorData* data) {
99 Register registers[] = {r4};
100 data->InitializePlatformSpecific(arraysize(registers), registers);
101}
102
103void FastNewStrictArgumentsDescriptor::InitializePlatformSpecific(
104 CallInterfaceDescriptorData* data) {
105 Register registers[] = {r4};
106 data->InitializePlatformSpecific(arraysize(registers), registers);
107}
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400108
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400109
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000110// static
Ben Murdochda12d292016-06-02 14:46:10 +0100111const Register TypeConversionDescriptor::ArgumentRegister() { return r3; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400112
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000113void TypeofDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400114 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000115 Register registers[] = {r6};
116 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400117}
118
119
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000120void FastCloneRegExpDescriptor::InitializePlatformSpecific(
121 CallInterfaceDescriptorData* data) {
122 Register registers[] = {r6, r5, r4, r3};
123 data->InitializePlatformSpecific(arraysize(registers), registers);
124}
125
126
127void FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
128 CallInterfaceDescriptorData* data) {
129 Register registers[] = {r6, r5, r4};
130 data->InitializePlatformSpecific(arraysize(registers), registers);
131}
132
133
134void FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
135 CallInterfaceDescriptorData* data) {
136 Register registers[] = {r6, r5, r4, r3};
137 data->InitializePlatformSpecific(arraysize(registers), registers);
138}
139
140
141void CreateAllocationSiteDescriptor::InitializePlatformSpecific(
142 CallInterfaceDescriptorData* data) {
143 Register registers[] = {r5, r6};
144 data->InitializePlatformSpecific(arraysize(registers), registers);
145}
146
147
148void CreateWeakCellDescriptor::InitializePlatformSpecific(
149 CallInterfaceDescriptorData* data) {
150 Register registers[] = {r5, r6, r4};
151 data->InitializePlatformSpecific(arraysize(registers), registers);
152}
153
154
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000155void CallFunctionDescriptor::InitializePlatformSpecific(
156 CallInterfaceDescriptorData* data) {
157 Register registers[] = {r4};
158 data->InitializePlatformSpecific(arraysize(registers), registers);
159}
160
161
162void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
163 CallInterfaceDescriptorData* data) {
164 Register registers[] = {r4, r6};
165 data->InitializePlatformSpecific(arraysize(registers), registers);
166}
167
168
169void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
170 CallInterfaceDescriptorData* data) {
171 Register registers[] = {r4, r6, r5};
172 data->InitializePlatformSpecific(arraysize(registers), registers);
173}
174
175
176void CallConstructDescriptor::InitializePlatformSpecific(
177 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400178 // r3 : number of arguments
179 // r4 : the function to call
180 // r5 : feedback vector
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000181 // r6 : slot in feedback vector (Smi, for RecordCallTarget)
182 // r7 : new target (for IsSuperConstructorCall)
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400183 // TODO(turbofan): So far we don't gather type feedback and hence skip the
184 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000185 Register registers[] = {r3, r4, r7, r5};
186 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400187}
188
189
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000190void CallTrampolineDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400191 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000192 // r3 : number of arguments
193 // r4 : the target to call
194 Register registers[] = {r4, r3};
195 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400196}
197
198
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000199void ConstructStubDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400200 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000201 // r3 : number of arguments
202 // r4 : the target to call
203 // r6 : the new target
204 // r5 : allocation site or undefined
205 Register registers[] = {r4, r6, r3, r5};
206 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400207}
208
209
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000210void ConstructTrampolineDescriptor::InitializePlatformSpecific(
211 CallInterfaceDescriptorData* data) {
212 // r3 : number of arguments
213 // r4 : the target to call
214 // r6 : the new target
215 Register registers[] = {r4, r6, r3};
216 data->InitializePlatformSpecific(arraysize(registers), registers);
217}
218
219
220void RegExpConstructResultDescriptor::InitializePlatformSpecific(
221 CallInterfaceDescriptorData* data) {
222 Register registers[] = {r5, r4, r3};
223 data->InitializePlatformSpecific(arraysize(registers), registers);
224}
225
226
227void TransitionElementsKindDescriptor::InitializePlatformSpecific(
228 CallInterfaceDescriptorData* data) {
229 Register registers[] = {r3, r4};
230 data->InitializePlatformSpecific(arraysize(registers), registers);
231}
232
233
234void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
235 CallInterfaceDescriptorData* data) {
236 data->InitializePlatformSpecific(0, nullptr, nullptr);
237}
238
Ben Murdochda12d292016-06-02 14:46:10 +0100239#define SIMD128_ALLOC_DESC(TYPE, Type, type, lane_count, lane_type) \
240 void Allocate##Type##Descriptor::InitializePlatformSpecific( \
241 CallInterfaceDescriptorData* data) { \
242 data->InitializePlatformSpecific(0, nullptr, nullptr); \
243 }
244SIMD128_TYPES(SIMD128_ALLOC_DESC)
245#undef SIMD128_ALLOC_DESC
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000246
247void AllocateInNewSpaceDescriptor::InitializePlatformSpecific(
248 CallInterfaceDescriptorData* data) {
249 Register registers[] = {r3};
250 data->InitializePlatformSpecific(arraysize(registers), registers);
251}
252
253
254void ArrayConstructorConstantArgCountDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400255 CallInterfaceDescriptorData* data) {
256 // register state
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400257 // r3 -- number of arguments
258 // r4 -- function
259 // r5 -- allocation site with elements kind
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000260 Register registers[] = {r4, r5};
261 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400262}
263
264
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000265void ArrayConstructorDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400266 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000267 // stack param count needs (constructor pointer, and single argument)
268 Register registers[] = {r4, r5, r3};
269 data->InitializePlatformSpecific(arraysize(registers), registers);
270}
271
272
273void InternalArrayConstructorConstantArgCountDescriptor::
274 InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400275 // register state
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400276 // r3 -- number of arguments
277 // r4 -- constructor function
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000278 Register registers[] = {r4};
279 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400280}
281
282
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000283void InternalArrayConstructorDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400284 CallInterfaceDescriptorData* data) {
285 // stack param count needs (constructor pointer, and single argument)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000286 Register registers[] = {r4, r3};
287 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400288}
289
Ben Murdochda12d292016-06-02 14:46:10 +0100290void FastArrayPushDescriptor::InitializePlatformSpecific(
291 CallInterfaceDescriptorData* data) {
292 // stack param count needs (arg count)
293 Register registers[] = {r3};
294 data->InitializePlatformSpecific(arraysize(registers), registers);
295}
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400296
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000297void CompareDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400298 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000299 Register registers[] = {r4, r3};
300 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400301}
302
303
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000304void BinaryOpDescriptor::InitializePlatformSpecific(
305 CallInterfaceDescriptorData* data) {
306 Register registers[] = {r4, r3};
307 data->InitializePlatformSpecific(arraysize(registers), registers);
308}
309
310
311void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
312 CallInterfaceDescriptorData* data) {
313 Register registers[] = {r5, r4, r3};
314 data->InitializePlatformSpecific(arraysize(registers), registers);
315}
316
317
318void StringAddDescriptor::InitializePlatformSpecific(
319 CallInterfaceDescriptorData* data) {
320 Register registers[] = {r4, r3};
321 data->InitializePlatformSpecific(arraysize(registers), registers);
322}
323
324
325void KeyedDescriptor::InitializePlatformSpecific(
326 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400327 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400328 r5, // key
329 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000330 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400331}
332
333
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000334void NamedDescriptor::InitializePlatformSpecific(
335 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400336 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400337 r5, // name
338 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000339 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400340}
341
342
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000343void CallHandlerDescriptor::InitializePlatformSpecific(
344 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400345 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400346 r3, // receiver
347 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000348 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400349}
350
351
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000352void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
353 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400354 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400355 r4, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000356 r6, // the new target
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400357 r3, // actual number of arguments
358 r5, // expected number of arguments
359 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000360 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400361}
362
Ben Murdochda12d292016-06-02 14:46:10 +0100363void ApiCallbackDescriptorBase::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000364 CallInterfaceDescriptorData* data) {
365 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400366 r3, // callee
367 r7, // call_data
368 r5, // holder
369 r4, // api_function_address
370 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000371 data->InitializePlatformSpecific(arraysize(registers), registers);
372}
373
Ben Murdoch097c5b22016-05-18 11:27:45 +0100374void InterpreterDispatchDescriptor::InitializePlatformSpecific(
375 CallInterfaceDescriptorData* data) {
376 Register registers[] = {
377 kInterpreterAccumulatorRegister, kInterpreterRegisterFileRegister,
378 kInterpreterBytecodeOffsetRegister, kInterpreterBytecodeArrayRegister,
379 kInterpreterDispatchTableRegister};
380 data->InitializePlatformSpecific(arraysize(registers), registers);
381}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000382
383void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
384 CallInterfaceDescriptorData* data) {
385 Register registers[] = {
386 r3, // argument count (not including receiver)
387 r5, // address of first argument
388 r4 // the target callable to be call
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400389 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000390 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 InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
394 CallInterfaceDescriptorData* data) {
395 Register registers[] = {
396 r3, // argument count (not including receiver)
397 r6, // new target
398 r4, // constructor to call
399 r5 // address of the first argument
400 };
401 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400402}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000403
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000404void InterpreterCEntryDescriptor::InitializePlatformSpecific(
405 CallInterfaceDescriptorData* data) {
406 Register registers[] = {
407 r3, // argument count (argc)
408 r5, // address of first argument (argv)
409 r4 // the runtime function to call
410 };
411 data->InitializePlatformSpecific(arraysize(registers), registers);
412}
413} // namespace internal
414} // namespace v8
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400415
416#endif // V8_TARGET_ARCH_PPC