blob: 3db7bd5c17028c523f3b1083cef52390c2ea2f65 [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
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000109void ToNumberDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400110 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000111 Register registers[] = {r3};
112 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400113}
114
115
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000116// static
117const Register ToLengthDescriptor::ReceiverRegister() { return r3; }
118
119
120// static
121const Register ToStringDescriptor::ReceiverRegister() { return r3; }
122
123
124// static
Ben Murdoch097c5b22016-05-18 11:27:45 +0100125const Register ToNameDescriptor::ReceiverRegister() { return r3; }
126
127
128// static
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000129const Register ToObjectDescriptor::ReceiverRegister() { return r3; }
130
131
132void NumberToStringDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400133 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000134 Register registers[] = {r3};
135 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400136}
137
138
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000139void TypeofDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400140 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000141 Register registers[] = {r6};
142 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400143}
144
145
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000146void FastCloneRegExpDescriptor::InitializePlatformSpecific(
147 CallInterfaceDescriptorData* data) {
148 Register registers[] = {r6, r5, r4, r3};
149 data->InitializePlatformSpecific(arraysize(registers), registers);
150}
151
152
153void FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
154 CallInterfaceDescriptorData* data) {
155 Register registers[] = {r6, r5, r4};
156 data->InitializePlatformSpecific(arraysize(registers), registers);
157}
158
159
160void FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
161 CallInterfaceDescriptorData* data) {
162 Register registers[] = {r6, r5, r4, r3};
163 data->InitializePlatformSpecific(arraysize(registers), registers);
164}
165
166
167void CreateAllocationSiteDescriptor::InitializePlatformSpecific(
168 CallInterfaceDescriptorData* data) {
169 Register registers[] = {r5, r6};
170 data->InitializePlatformSpecific(arraysize(registers), registers);
171}
172
173
174void CreateWeakCellDescriptor::InitializePlatformSpecific(
175 CallInterfaceDescriptorData* data) {
176 Register registers[] = {r5, r6, r4};
177 data->InitializePlatformSpecific(arraysize(registers), registers);
178}
179
180
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000181void CallFunctionDescriptor::InitializePlatformSpecific(
182 CallInterfaceDescriptorData* data) {
183 Register registers[] = {r4};
184 data->InitializePlatformSpecific(arraysize(registers), registers);
185}
186
187
188void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
189 CallInterfaceDescriptorData* data) {
190 Register registers[] = {r4, r6};
191 data->InitializePlatformSpecific(arraysize(registers), registers);
192}
193
194
195void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
196 CallInterfaceDescriptorData* data) {
197 Register registers[] = {r4, r6, r5};
198 data->InitializePlatformSpecific(arraysize(registers), registers);
199}
200
201
202void CallConstructDescriptor::InitializePlatformSpecific(
203 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400204 // r3 : number of arguments
205 // r4 : the function to call
206 // r5 : feedback vector
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000207 // r6 : slot in feedback vector (Smi, for RecordCallTarget)
208 // r7 : new target (for IsSuperConstructorCall)
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400209 // TODO(turbofan): So far we don't gather type feedback and hence skip the
210 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000211 Register registers[] = {r3, r4, r7, r5};
212 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400213}
214
215
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000216void CallTrampolineDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400217 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000218 // r3 : number of arguments
219 // r4 : the target to call
220 Register registers[] = {r4, r3};
221 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400222}
223
224
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000225void ConstructStubDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400226 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000227 // r3 : number of arguments
228 // r4 : the target to call
229 // r6 : the new target
230 // r5 : allocation site or undefined
231 Register registers[] = {r4, r6, r3, r5};
232 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400233}
234
235
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000236void ConstructTrampolineDescriptor::InitializePlatformSpecific(
237 CallInterfaceDescriptorData* data) {
238 // r3 : number of arguments
239 // r4 : the target to call
240 // r6 : the new target
241 Register registers[] = {r4, r6, r3};
242 data->InitializePlatformSpecific(arraysize(registers), registers);
243}
244
245
246void RegExpConstructResultDescriptor::InitializePlatformSpecific(
247 CallInterfaceDescriptorData* data) {
248 Register registers[] = {r5, r4, r3};
249 data->InitializePlatformSpecific(arraysize(registers), registers);
250}
251
252
253void TransitionElementsKindDescriptor::InitializePlatformSpecific(
254 CallInterfaceDescriptorData* data) {
255 Register registers[] = {r3, r4};
256 data->InitializePlatformSpecific(arraysize(registers), registers);
257}
258
259
260void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
261 CallInterfaceDescriptorData* data) {
262 data->InitializePlatformSpecific(0, nullptr, nullptr);
263}
264
265
266void AllocateInNewSpaceDescriptor::InitializePlatformSpecific(
267 CallInterfaceDescriptorData* data) {
268 Register registers[] = {r3};
269 data->InitializePlatformSpecific(arraysize(registers), registers);
270}
271
272
273void ArrayConstructorConstantArgCountDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400274 CallInterfaceDescriptorData* data) {
275 // register state
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400276 // r3 -- number of arguments
277 // r4 -- function
278 // r5 -- allocation site with elements kind
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000279 Register registers[] = {r4, r5};
280 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400281}
282
283
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000284void ArrayConstructorDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400285 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000286 // stack param count needs (constructor pointer, and single argument)
287 Register registers[] = {r4, r5, r3};
288 data->InitializePlatformSpecific(arraysize(registers), registers);
289}
290
291
292void InternalArrayConstructorConstantArgCountDescriptor::
293 InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400294 // register state
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400295 // r3 -- number of arguments
296 // r4 -- constructor function
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000297 Register registers[] = {r4};
298 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400299}
300
301
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000302void InternalArrayConstructorDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400303 CallInterfaceDescriptorData* data) {
304 // stack param count needs (constructor pointer, and single argument)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000305 Register registers[] = {r4, r3};
306 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400307}
308
309
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000310void CompareDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400311 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000312 Register registers[] = {r4, r3};
313 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400314}
315
316
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000317void CompareNilDescriptor::InitializePlatformSpecific(
318 CallInterfaceDescriptorData* data) {
319 Register registers[] = {r3};
320 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400321}
322
323
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000324void ToBooleanDescriptor::InitializePlatformSpecific(
325 CallInterfaceDescriptorData* data) {
326 Register registers[] = {r3};
327 data->InitializePlatformSpecific(arraysize(registers), registers);
328}
329
330
331void BinaryOpDescriptor::InitializePlatformSpecific(
332 CallInterfaceDescriptorData* data) {
333 Register registers[] = {r4, r3};
334 data->InitializePlatformSpecific(arraysize(registers), registers);
335}
336
337
338void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
339 CallInterfaceDescriptorData* data) {
340 Register registers[] = {r5, r4, r3};
341 data->InitializePlatformSpecific(arraysize(registers), registers);
342}
343
344
345void StringAddDescriptor::InitializePlatformSpecific(
346 CallInterfaceDescriptorData* data) {
347 Register registers[] = {r4, r3};
348 data->InitializePlatformSpecific(arraysize(registers), registers);
349}
350
351
352void KeyedDescriptor::InitializePlatformSpecific(
353 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400354 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400355 r5, // key
356 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000357 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400358}
359
360
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000361void NamedDescriptor::InitializePlatformSpecific(
362 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400363 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400364 r5, // name
365 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000366 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400367}
368
369
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000370void CallHandlerDescriptor::InitializePlatformSpecific(
371 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400372 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400373 r3, // receiver
374 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000375 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400376}
377
378
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000379void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
380 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400381 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400382 r4, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000383 r6, // the new target
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400384 r3, // actual number of arguments
385 r5, // expected number of arguments
386 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000387 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400388}
389
390
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000391void ApiFunctionDescriptor::InitializePlatformSpecific(
392 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400393 Register registers[] = {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000394 r3, // callee
395 r7, // call_data
396 r5, // holder
397 r4, // api_function_address
398 r6, // actual number of arguments
399 };
400 data->InitializePlatformSpecific(arraysize(registers), registers);
401}
402
403
404void ApiAccessorDescriptor::InitializePlatformSpecific(
405 CallInterfaceDescriptorData* data) {
406 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400407 r3, // callee
408 r7, // call_data
409 r5, // holder
410 r4, // api_function_address
411 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000412 data->InitializePlatformSpecific(arraysize(registers), registers);
413}
414
Ben Murdoch097c5b22016-05-18 11:27:45 +0100415void InterpreterDispatchDescriptor::InitializePlatformSpecific(
416 CallInterfaceDescriptorData* data) {
417 Register registers[] = {
418 kInterpreterAccumulatorRegister, kInterpreterRegisterFileRegister,
419 kInterpreterBytecodeOffsetRegister, kInterpreterBytecodeArrayRegister,
420 kInterpreterDispatchTableRegister};
421 data->InitializePlatformSpecific(arraysize(registers), registers);
422}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000423
424void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
425 CallInterfaceDescriptorData* data) {
426 Register registers[] = {
427 r3, // argument count (not including receiver)
428 r5, // address of first argument
429 r4 // the target callable to be call
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400430 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000431 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400432}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000433
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000434void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
435 CallInterfaceDescriptorData* data) {
436 Register registers[] = {
437 r3, // argument count (not including receiver)
438 r6, // new target
439 r4, // constructor to call
440 r5 // address of the first argument
441 };
442 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400443}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000444
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000445void InterpreterCEntryDescriptor::InitializePlatformSpecific(
446 CallInterfaceDescriptorData* data) {
447 Register registers[] = {
448 r3, // argument count (argc)
449 r5, // address of first argument (argv)
450 r4 // the runtime function to call
451 };
452 data->InitializePlatformSpecific(arraysize(registers), registers);
453}
454} // namespace internal
455} // namespace v8
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400456
457#endif // V8_TARGET_ARCH_PPC