blob: 64263165ac8615b17b373c7cce9f0a586079ef66 [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
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000049const Register StringCompareDescriptor::LeftRegister() { return r4; }
50const Register StringCompareDescriptor::RightRegister() { return r3; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040051
Ben Murdochc5610432016-08-08 18:44:38 +010052const Register ApiGetterDescriptor::HolderRegister() { return r3; }
53const Register ApiGetterDescriptor::CallbackRegister() { return r6; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040054
55const Register MathPowTaggedDescriptor::exponent() { return r5; }
56
57
58const Register MathPowIntegerDescriptor::exponent() {
59 return MathPowTaggedDescriptor::exponent();
60}
61
62
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000063const Register GrowArrayElementsDescriptor::ObjectRegister() { return r3; }
64const Register GrowArrayElementsDescriptor::KeyRegister() { return r6; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040065
Ben Murdochc5610432016-08-08 18:44:38 +010066const Register HasPropertyDescriptor::ObjectRegister() { return r3; }
67const Register HasPropertyDescriptor::KeyRegister() { return r6; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040068
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000069void FastNewClosureDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -040070 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000071 Register registers[] = {r5};
72 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040073}
74
75
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000076void FastNewContextDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -040077 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000078 Register registers[] = {r4};
79 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040080}
81
Ben Murdoch097c5b22016-05-18 11:27:45 +010082void FastNewObjectDescriptor::InitializePlatformSpecific(
83 CallInterfaceDescriptorData* data) {
84 Register registers[] = {r4, r6};
85 data->InitializePlatformSpecific(arraysize(registers), registers);
86}
87
88void FastNewRestParameterDescriptor::InitializePlatformSpecific(
89 CallInterfaceDescriptorData* data) {
90 Register registers[] = {r4};
91 data->InitializePlatformSpecific(arraysize(registers), registers);
92}
93
94void FastNewSloppyArgumentsDescriptor::InitializePlatformSpecific(
95 CallInterfaceDescriptorData* data) {
96 Register registers[] = {r4};
97 data->InitializePlatformSpecific(arraysize(registers), registers);
98}
99
100void FastNewStrictArgumentsDescriptor::InitializePlatformSpecific(
101 CallInterfaceDescriptorData* data) {
102 Register registers[] = {r4};
103 data->InitializePlatformSpecific(arraysize(registers), registers);
104}
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400105
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400106
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000107// static
Ben Murdochda12d292016-06-02 14:46:10 +0100108const Register TypeConversionDescriptor::ArgumentRegister() { return r3; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400109
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000110void TypeofDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400111 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000112 Register registers[] = {r6};
113 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400114}
115
116
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000117void FastCloneRegExpDescriptor::InitializePlatformSpecific(
118 CallInterfaceDescriptorData* data) {
119 Register registers[] = {r6, r5, r4, r3};
120 data->InitializePlatformSpecific(arraysize(registers), registers);
121}
122
123
124void FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
125 CallInterfaceDescriptorData* data) {
126 Register registers[] = {r6, r5, r4};
127 data->InitializePlatformSpecific(arraysize(registers), registers);
128}
129
130
131void FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
132 CallInterfaceDescriptorData* data) {
133 Register registers[] = {r6, r5, r4, r3};
134 data->InitializePlatformSpecific(arraysize(registers), registers);
135}
136
137
138void CreateAllocationSiteDescriptor::InitializePlatformSpecific(
139 CallInterfaceDescriptorData* data) {
140 Register registers[] = {r5, r6};
141 data->InitializePlatformSpecific(arraysize(registers), registers);
142}
143
144
145void CreateWeakCellDescriptor::InitializePlatformSpecific(
146 CallInterfaceDescriptorData* data) {
147 Register registers[] = {r5, r6, r4};
148 data->InitializePlatformSpecific(arraysize(registers), registers);
149}
150
151
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000152void CallFunctionDescriptor::InitializePlatformSpecific(
153 CallInterfaceDescriptorData* data) {
154 Register registers[] = {r4};
155 data->InitializePlatformSpecific(arraysize(registers), registers);
156}
157
158
159void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
160 CallInterfaceDescriptorData* data) {
161 Register registers[] = {r4, r6};
162 data->InitializePlatformSpecific(arraysize(registers), registers);
163}
164
165
166void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
167 CallInterfaceDescriptorData* data) {
168 Register registers[] = {r4, r6, r5};
169 data->InitializePlatformSpecific(arraysize(registers), registers);
170}
171
172
173void CallConstructDescriptor::InitializePlatformSpecific(
174 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400175 // r3 : number of arguments
176 // r4 : the function to call
177 // r5 : feedback vector
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000178 // r6 : slot in feedback vector (Smi, for RecordCallTarget)
179 // r7 : new target (for IsSuperConstructorCall)
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400180 // TODO(turbofan): So far we don't gather type feedback and hence skip the
181 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000182 Register registers[] = {r3, r4, r7, r5};
183 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400184}
185
186
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000187void CallTrampolineDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400188 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000189 // r3 : number of arguments
190 // r4 : the target to call
191 Register registers[] = {r4, r3};
192 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400193}
194
195
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000196void ConstructStubDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400197 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000198 // r3 : number of arguments
199 // r4 : the target to call
200 // r6 : the new target
201 // r5 : allocation site or undefined
202 Register registers[] = {r4, r6, r3, r5};
203 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400204}
205
206
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000207void ConstructTrampolineDescriptor::InitializePlatformSpecific(
208 CallInterfaceDescriptorData* data) {
209 // r3 : number of arguments
210 // r4 : the target to call
211 // r6 : the new target
212 Register registers[] = {r4, r6, r3};
213 data->InitializePlatformSpecific(arraysize(registers), registers);
214}
215
216
217void RegExpConstructResultDescriptor::InitializePlatformSpecific(
218 CallInterfaceDescriptorData* data) {
219 Register registers[] = {r5, r4, r3};
220 data->InitializePlatformSpecific(arraysize(registers), registers);
221}
222
223
224void TransitionElementsKindDescriptor::InitializePlatformSpecific(
225 CallInterfaceDescriptorData* data) {
226 Register registers[] = {r3, r4};
227 data->InitializePlatformSpecific(arraysize(registers), registers);
228}
229
230
231void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
232 CallInterfaceDescriptorData* data) {
233 data->InitializePlatformSpecific(0, nullptr, nullptr);
234}
235
Ben Murdochda12d292016-06-02 14:46:10 +0100236#define SIMD128_ALLOC_DESC(TYPE, Type, type, lane_count, lane_type) \
237 void Allocate##Type##Descriptor::InitializePlatformSpecific( \
238 CallInterfaceDescriptorData* data) { \
239 data->InitializePlatformSpecific(0, nullptr, nullptr); \
240 }
241SIMD128_TYPES(SIMD128_ALLOC_DESC)
242#undef SIMD128_ALLOC_DESC
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000243
Ben Murdochc5610432016-08-08 18:44:38 +0100244void ArrayNoArgumentConstructorDescriptor::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000245 CallInterfaceDescriptorData* data) {
Ben Murdochc5610432016-08-08 18:44:38 +0100246 // register state
247 // r3 -- number of arguments
248 // r4 -- function
249 // r5 -- allocation site with elements kind
250 Register registers[] = {r4, r5, r3};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000251 data->InitializePlatformSpecific(arraysize(registers), registers);
252}
253
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000254void 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
Ben Murdochc5610432016-08-08 18:44:38 +0100317void CountOpDescriptor::InitializePlatformSpecific(
318 CallInterfaceDescriptorData* data) {
319 Register registers[] = {r4};
320 data->InitializePlatformSpecific(arraysize(registers), registers);
321}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000322
323void StringAddDescriptor::InitializePlatformSpecific(
324 CallInterfaceDescriptorData* data) {
325 Register registers[] = {r4, r3};
326 data->InitializePlatformSpecific(arraysize(registers), registers);
327}
328
329
330void KeyedDescriptor::InitializePlatformSpecific(
331 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400332 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400333 r5, // key
334 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000335 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400336}
337
338
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000339void NamedDescriptor::InitializePlatformSpecific(
340 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400341 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400342 r5, // name
343 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000344 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400345}
346
347
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000348void CallHandlerDescriptor::InitializePlatformSpecific(
349 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400350 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400351 r3, // receiver
352 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000353 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400354}
355
356
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000357void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
358 CallInterfaceDescriptorData* data) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400359 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400360 r4, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000361 r6, // the new target
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400362 r3, // actual number of arguments
363 r5, // expected number of arguments
364 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000365 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400366}
367
Ben Murdochda12d292016-06-02 14:46:10 +0100368void ApiCallbackDescriptorBase::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000369 CallInterfaceDescriptorData* data) {
370 Register registers[] = {
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400371 r3, // callee
372 r7, // call_data
373 r5, // holder
374 r4, // api_function_address
375 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000376 data->InitializePlatformSpecific(arraysize(registers), registers);
377}
378
Ben Murdoch097c5b22016-05-18 11:27:45 +0100379void InterpreterDispatchDescriptor::InitializePlatformSpecific(
380 CallInterfaceDescriptorData* data) {
381 Register registers[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100382 kInterpreterAccumulatorRegister, kInterpreterBytecodeOffsetRegister,
383 kInterpreterBytecodeArrayRegister, kInterpreterDispatchTableRegister};
Ben Murdoch097c5b22016-05-18 11:27:45 +0100384 data->InitializePlatformSpecific(arraysize(registers), registers);
385}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000386
387void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
388 CallInterfaceDescriptorData* data) {
389 Register registers[] = {
390 r3, // argument count (not including receiver)
391 r5, // address of first argument
392 r4 // the target callable to be call
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400393 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000394 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400395}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000396
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000397void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
398 CallInterfaceDescriptorData* data) {
399 Register registers[] = {
400 r3, // argument count (not including receiver)
401 r6, // new target
402 r4, // constructor to call
403 r5 // address of the first argument
404 };
405 data->InitializePlatformSpecific(arraysize(registers), registers);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400406}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000407
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000408void InterpreterCEntryDescriptor::InitializePlatformSpecific(
409 CallInterfaceDescriptorData* data) {
410 Register registers[] = {
411 r3, // argument count (argc)
412 r5, // address of first argument (argv)
413 r4 // the runtime function to call
414 };
415 data->InitializePlatformSpecific(arraysize(registers), registers);
416}
Ben Murdochc5610432016-08-08 18:44:38 +0100417
418void ResumeGeneratorDescriptor::InitializePlatformSpecific(
419 CallInterfaceDescriptorData* data) {
420 Register registers[] = {
421 r3, // the value to pass to the generator
422 r4, // the JSGeneratorObject to resume
423 r5 // the resume mode (tagged)
424 };
425 data->InitializePlatformSpecific(arraysize(registers), registers);
426}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000427} // namespace internal
428} // namespace v8
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400429
430#endif // V8_TARGET_ARCH_PPC