blob: 693f341e997125a0d34748fecf8be2d56c96cf7d [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
5#include "src/v8.h"
6
7#if V8_TARGET_ARCH_PPC
8
9#include "src/interface-descriptors.h"
10
11namespace v8 {
12namespace internal {
13
14const Register CallInterfaceDescriptor::ContextRegister() { return cp; }
15
16
17const Register LoadDescriptor::ReceiverRegister() { return r4; }
18const Register LoadDescriptor::NameRegister() { return r5; }
19
20
21const Register VectorLoadICTrampolineDescriptor::SlotRegister() { return r3; }
22
23
24const Register VectorLoadICDescriptor::VectorRegister() { return r6; }
25
26
27const Register StoreDescriptor::ReceiverRegister() { return r4; }
28const Register StoreDescriptor::NameRegister() { return r5; }
29const Register StoreDescriptor::ValueRegister() { return r3; }
30
31
32const Register StoreTransitionDescriptor::MapRegister() { return r6; }
33
34
35const Register ElementTransitionAndStoreDescriptor::MapRegister() { return r6; }
36
37
38const Register InstanceofDescriptor::left() { return r3; }
39const Register InstanceofDescriptor::right() { return r4; }
40
41
42const Register ArgumentsAccessReadDescriptor::index() { return r4; }
43const Register ArgumentsAccessReadDescriptor::parameter_count() { return r3; }
44
45
46const Register ApiGetterDescriptor::function_address() { return r5; }
47
48
49const Register MathPowTaggedDescriptor::exponent() { return r5; }
50
51
52const Register MathPowIntegerDescriptor::exponent() {
53 return MathPowTaggedDescriptor::exponent();
54}
55
56
57void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) {
58 Register registers[] = {cp, r5};
59 data->Initialize(arraysize(registers), registers, NULL);
60}
61
62
63void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) {
64 Register registers[] = {cp, r4};
65 data->Initialize(arraysize(registers), registers, NULL);
66}
67
68
69void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) {
70 Register registers[] = {cp, r3};
71 data->Initialize(arraysize(registers), registers, NULL);
72}
73
74
75void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) {
76 Register registers[] = {cp, r3};
77 data->Initialize(arraysize(registers), registers, NULL);
78}
79
80
81void FastCloneShallowArrayDescriptor::Initialize(
82 CallInterfaceDescriptorData* data) {
83 Register registers[] = {cp, r6, r5, r4};
84 Representation representations[] = {
85 Representation::Tagged(), Representation::Tagged(), Representation::Smi(),
86 Representation::Tagged()};
87 data->Initialize(arraysize(registers), registers, representations);
88}
89
90
91void FastCloneShallowObjectDescriptor::Initialize(
92 CallInterfaceDescriptorData* data) {
93 Register registers[] = {cp, r6, r5, r4, r3};
94 data->Initialize(arraysize(registers), registers, NULL);
95}
96
97
98void CreateAllocationSiteDescriptor::Initialize(
99 CallInterfaceDescriptorData* data) {
100 Register registers[] = {cp, r5, r6};
101 data->Initialize(arraysize(registers), registers, NULL);
102}
103
104
105void StoreArrayLiteralElementDescriptor::Initialize(
106 CallInterfaceDescriptorData* data) {
107 Register registers[] = {cp, r6, r3};
108 data->Initialize(arraysize(registers), registers, NULL);
109}
110
111
112void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
113 Register registers[] = {cp, r4};
114 data->Initialize(arraysize(registers), registers, NULL);
115}
116
117
118void CallFunctionWithFeedbackDescriptor::Initialize(
119 CallInterfaceDescriptorData* data) {
120 Register registers[] = {cp, r4, r6};
121 Representation representations[] = {Representation::Tagged(),
122 Representation::Tagged(),
123 Representation::Smi()};
124 data->Initialize(arraysize(registers), registers, representations);
125}
126
127
128void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) {
129 // r3 : number of arguments
130 // r4 : the function to call
131 // r5 : feedback vector
132 // r6 : (only if r5 is not the megamorphic symbol) slot in feedback
133 // vector (Smi)
134 // TODO(turbofan): So far we don't gather type feedback and hence skip the
135 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
136 Register registers[] = {cp, r3, r4, r5};
137 data->Initialize(arraysize(registers), registers, NULL);
138}
139
140
141void RegExpConstructResultDescriptor::Initialize(
142 CallInterfaceDescriptorData* data) {
143 Register registers[] = {cp, r5, r4, r3};
144 data->Initialize(arraysize(registers), registers, NULL);
145}
146
147
148void TransitionElementsKindDescriptor::Initialize(
149 CallInterfaceDescriptorData* data) {
150 Register registers[] = {cp, r3, r4};
151 data->Initialize(arraysize(registers), registers, NULL);
152}
153
154
155void ArrayConstructorConstantArgCountDescriptor::Initialize(
156 CallInterfaceDescriptorData* data) {
157 // register state
158 // cp -- context
159 // r3 -- number of arguments
160 // r4 -- function
161 // r5 -- allocation site with elements kind
162 Register registers[] = {cp, r4, r5};
163 data->Initialize(arraysize(registers), registers, NULL);
164}
165
166
167void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
168 // stack param count needs (constructor pointer, and single argument)
169 Register registers[] = {cp, r4, r5, r3};
170 Representation representations[] = {
171 Representation::Tagged(), Representation::Tagged(),
172 Representation::Tagged(), Representation::Integer32()};
173 data->Initialize(arraysize(registers), registers, representations);
174}
175
176
177void InternalArrayConstructorConstantArgCountDescriptor::Initialize(
178 CallInterfaceDescriptorData* data) {
179 // register state
180 // cp -- context
181 // r3 -- number of arguments
182 // r4 -- constructor function
183 Register registers[] = {cp, r4};
184 data->Initialize(arraysize(registers), registers, NULL);
185}
186
187
188void InternalArrayConstructorDescriptor::Initialize(
189 CallInterfaceDescriptorData* data) {
190 // stack param count needs (constructor pointer, and single argument)
191 Register registers[] = {cp, r4, r3};
192 Representation representations[] = {Representation::Tagged(),
193 Representation::Tagged(),
194 Representation::Integer32()};
195 data->Initialize(arraysize(registers), registers, representations);
196}
197
198
199void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) {
200 Register registers[] = {cp, r3};
201 data->Initialize(arraysize(registers), registers, NULL);
202}
203
204
205void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) {
206 Register registers[] = {cp, r3};
207 data->Initialize(arraysize(registers), registers, NULL);
208}
209
210
211void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) {
212 Register registers[] = {cp, r4, r3};
213 data->Initialize(arraysize(registers), registers, NULL);
214}
215
216
217void BinaryOpWithAllocationSiteDescriptor::Initialize(
218 CallInterfaceDescriptorData* data) {
219 Register registers[] = {cp, r5, r4, r3};
220 data->Initialize(arraysize(registers), registers, NULL);
221}
222
223
224void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) {
225 Register registers[] = {cp, r4, r3};
226 data->Initialize(arraysize(registers), registers, NULL);
227}
228
229
230void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
231 Register registers[] = {
232 cp, // context
233 r5, // key
234 };
235 Representation representations[] = {
236 Representation::Tagged(), // context
237 Representation::Tagged(), // key
238 };
239 data->Initialize(arraysize(registers), registers, representations);
240}
241
242
243void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
244 Register registers[] = {
245 cp, // context
246 r5, // name
247 };
248 Representation representations[] = {
249 Representation::Tagged(), // context
250 Representation::Tagged(), // name
251 };
252 data->Initialize(arraysize(registers), registers, representations);
253}
254
255
256void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) {
257 Register registers[] = {
258 cp, // context
259 r3, // receiver
260 };
261 Representation representations[] = {
262 Representation::Tagged(), // context
263 Representation::Tagged(), // receiver
264 };
265 data->Initialize(arraysize(registers), registers, representations);
266}
267
268
269void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
270 Register registers[] = {
271 cp, // context
272 r4, // JSFunction
273 r3, // actual number of arguments
274 r5, // expected number of arguments
275 };
276 Representation representations[] = {
277 Representation::Tagged(), // context
278 Representation::Tagged(), // JSFunction
279 Representation::Integer32(), // actual number of arguments
280 Representation::Integer32(), // expected number of arguments
281 };
282 data->Initialize(arraysize(registers), registers, representations);
283}
284
285
286void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
287 Register registers[] = {
288 cp, // context
289 r3, // callee
290 r7, // call_data
291 r5, // holder
292 r4, // api_function_address
293 };
294 Representation representations[] = {
295 Representation::Tagged(), // context
296 Representation::Tagged(), // callee
297 Representation::Tagged(), // call_data
298 Representation::Tagged(), // holder
299 Representation::External(), // api_function_address
300 };
301 data->Initialize(arraysize(registers), registers, representations);
302}
303}
304} // namespace v8::internal
305
306#endif // V8_TARGET_ARCH_PPC