blob: b6cac760b2ef9392c203386e299a5d9c31a2ec26 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// Copyright 2012 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
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00005#include "src/arm/interface-descriptors-arm.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +00006
7#if V8_TARGET_ARCH_ARM
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 r1; }
18const Register LoadDescriptor::NameRegister() { return r2; }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000019const Register LoadDescriptor::SlotRegister() { return r0; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000020
21
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000022const Register LoadWithVectorDescriptor::VectorRegister() { return r3; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000023
24
25const Register StoreDescriptor::ReceiverRegister() { return r1; }
26const Register StoreDescriptor::NameRegister() { return r2; }
27const Register StoreDescriptor::ValueRegister() { return r0; }
28
29
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000030const Register VectorStoreICTrampolineDescriptor::SlotRegister() { return r4; }
31
32
33const Register VectorStoreICDescriptor::VectorRegister() { return r3; }
34
35
36const Register VectorStoreTransitionDescriptor::SlotRegister() { return r4; }
37const Register VectorStoreTransitionDescriptor::VectorRegister() { return r3; }
38const Register VectorStoreTransitionDescriptor::MapRegister() { return r5; }
39
40
Emily Bernierd0a1eb72015-03-24 16:35:39 -040041const Register StoreTransitionDescriptor::MapRegister() { return r3; }
42
43
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000044const Register LoadGlobalViaContextDescriptor::SlotRegister() { return r2; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000045
46
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000047const Register StoreGlobalViaContextDescriptor::SlotRegister() { return r2; }
48const Register StoreGlobalViaContextDescriptor::ValueRegister() { return r0; }
49
50
51const Register InstanceOfDescriptor::LeftRegister() { return r1; }
52const Register InstanceOfDescriptor::RightRegister() { return r0; }
53
54
55const Register StringCompareDescriptor::LeftRegister() { return r1; }
56const Register StringCompareDescriptor::RightRegister() { return r0; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000057
58
Ben Murdochb8a8cc12014-11-26 15:28:44 +000059const Register ApiGetterDescriptor::function_address() { return r2; }
60
61
62const Register MathPowTaggedDescriptor::exponent() { return r2; }
63
64
65const Register MathPowIntegerDescriptor::exponent() {
66 return MathPowTaggedDescriptor::exponent();
67}
68
69
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000070const Register GrowArrayElementsDescriptor::ObjectRegister() { return r0; }
71const Register GrowArrayElementsDescriptor::KeyRegister() { return r3; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000072
73
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000074void FastNewClosureDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +000075 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000076 Register registers[] = {r2};
77 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000078}
79
80
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000081void FastNewContextDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +000082 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000083 Register registers[] = {r1};
84 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000085}
86
Ben Murdoch097c5b22016-05-18 11:27:45 +010087void FastNewObjectDescriptor::InitializePlatformSpecific(
88 CallInterfaceDescriptorData* data) {
89 Register registers[] = {r1, r3};
90 data->InitializePlatformSpecific(arraysize(registers), registers);
91}
92
93void FastNewRestParameterDescriptor::InitializePlatformSpecific(
94 CallInterfaceDescriptorData* data) {
95 Register registers[] = {r1};
96 data->InitializePlatformSpecific(arraysize(registers), registers);
97}
98
99
100void FastNewSloppyArgumentsDescriptor::InitializePlatformSpecific(
101 CallInterfaceDescriptorData* data) {
102 Register registers[] = {r1};
103 data->InitializePlatformSpecific(arraysize(registers), registers);
104}
105
106
107void FastNewStrictArgumentsDescriptor::InitializePlatformSpecific(
108 CallInterfaceDescriptorData* data) {
109 Register registers[] = {r1};
110 data->InitializePlatformSpecific(arraysize(registers), registers);
111}
112
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000113
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000114// static
Ben Murdochda12d292016-06-02 14:46:10 +0100115const Register TypeConversionDescriptor::ArgumentRegister() { return r0; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000116
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000117void TypeofDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000118 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000119 Register registers[] = {r3};
120 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000121}
122
123
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000124void FastCloneRegExpDescriptor::InitializePlatformSpecific(
125 CallInterfaceDescriptorData* data) {
126 Register registers[] = {r3, r2, r1, r0};
127 data->InitializePlatformSpecific(arraysize(registers), registers);
128}
129
130
131void FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
132 CallInterfaceDescriptorData* data) {
133 Register registers[] = {r3, r2, r1};
134 data->InitializePlatformSpecific(arraysize(registers), registers);
135}
136
137
138void FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
139 CallInterfaceDescriptorData* data) {
140 Register registers[] = {r3, r2, r1, r0};
141 data->InitializePlatformSpecific(arraysize(registers), registers);
142}
143
144
145void CreateAllocationSiteDescriptor::InitializePlatformSpecific(
146 CallInterfaceDescriptorData* data) {
147 Register registers[] = {r2, r3};
148 data->InitializePlatformSpecific(arraysize(registers), registers);
149}
150
151
152void CreateWeakCellDescriptor::InitializePlatformSpecific(
153 CallInterfaceDescriptorData* data) {
154 Register registers[] = {r2, r3, r1};
155 data->InitializePlatformSpecific(arraysize(registers), registers);
156}
157
158
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000159void CallFunctionDescriptor::InitializePlatformSpecific(
160 CallInterfaceDescriptorData* data) {
161 Register registers[] = {r1};
162 data->InitializePlatformSpecific(arraysize(registers), registers);
163}
164
165
166void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
167 CallInterfaceDescriptorData* data) {
168 Register registers[] = {r1, r3};
169 data->InitializePlatformSpecific(arraysize(registers), registers);
170}
171
172
173void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
174 CallInterfaceDescriptorData* data) {
175 Register registers[] = {r1, r3, r2};
176 data->InitializePlatformSpecific(arraysize(registers), registers);
177}
178
179
180void CallConstructDescriptor::InitializePlatformSpecific(
181 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000182 // r0 : number of arguments
183 // r1 : the function to call
184 // r2 : feedback vector
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000185 // r3 : slot in feedback vector (Smi, for RecordCallTarget)
186 // r4 : new target (for IsSuperConstructorCall)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000187 // TODO(turbofan): So far we don't gather type feedback and hence skip the
188 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000189 Register registers[] = {r0, r1, r4, r2};
190 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000191}
192
193
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000194void CallTrampolineDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000195 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000196 // r0 : number of arguments
197 // r1 : the target to call
198 Register registers[] = {r1, r0};
199 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000200}
201
202
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000203void ConstructStubDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000204 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000205 // r0 : number of arguments
206 // r1 : the target to call
207 // r3 : the new target
208 // r2 : allocation site or undefined
209 Register registers[] = {r1, r3, r0, r2};
210 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000211}
212
213
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000214void ConstructTrampolineDescriptor::InitializePlatformSpecific(
215 CallInterfaceDescriptorData* data) {
216 // r0 : number of arguments
217 // r1 : the target to call
218 // r3 : the new target
219 Register registers[] = {r1, r3, r0};
220 data->InitializePlatformSpecific(arraysize(registers), registers);
221}
222
223
224void RegExpConstructResultDescriptor::InitializePlatformSpecific(
225 CallInterfaceDescriptorData* data) {
226 Register registers[] = {r2, r1, r0};
227 data->InitializePlatformSpecific(arraysize(registers), registers);
228}
229
230
231void TransitionElementsKindDescriptor::InitializePlatformSpecific(
232 CallInterfaceDescriptorData* data) {
233 Register registers[] = {r0, r1};
234 data->InitializePlatformSpecific(arraysize(registers), registers);
235}
236
237
238void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
239 CallInterfaceDescriptorData* data) {
240 data->InitializePlatformSpecific(0, nullptr, nullptr);
241}
242
Ben Murdochda12d292016-06-02 14:46:10 +0100243#define SIMD128_ALLOC_DESC(TYPE, Type, type, lane_count, lane_type) \
244 void Allocate##Type##Descriptor::InitializePlatformSpecific( \
245 CallInterfaceDescriptorData* data) { \
246 data->InitializePlatformSpecific(0, nullptr, nullptr); \
247 }
248SIMD128_TYPES(SIMD128_ALLOC_DESC)
249#undef SIMD128_ALLOC_DESC
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000250
251void AllocateInNewSpaceDescriptor::InitializePlatformSpecific(
252 CallInterfaceDescriptorData* data) {
253 Register registers[] = {r0};
254 data->InitializePlatformSpecific(arraysize(registers), registers);
255}
256
257
258void ArrayConstructorConstantArgCountDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400259 CallInterfaceDescriptorData* data) {
260 // register state
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000261 // r0 -- number of arguments
262 // r1 -- function
263 // r2 -- allocation site with elements kind
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000264 Register registers[] = {r1, r2};
265 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000266}
267
268
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000269void ArrayConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000270 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000271 // stack param count needs (constructor pointer, and single argument)
272 Register registers[] = {r1, r2, r0};
273 data->InitializePlatformSpecific(arraysize(registers), registers);
274}
275
276
277void InternalArrayConstructorConstantArgCountDescriptor::
278 InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000279 // register state
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000280 // r0 -- number of arguments
281 // r1 -- constructor function
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000282 Register registers[] = {r1};
283 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000284}
285
286
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000287void InternalArrayConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000288 CallInterfaceDescriptorData* data) {
289 // stack param count needs (constructor pointer, and single argument)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000290 Register registers[] = {r1, r0};
291 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000292}
293
Ben Murdochda12d292016-06-02 14:46:10 +0100294void FastArrayPushDescriptor::InitializePlatformSpecific(
295 CallInterfaceDescriptorData* data) {
296 // stack param count needs (arg count)
297 Register registers[] = {r0};
298 data->InitializePlatformSpecific(arraysize(registers), registers);
299}
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000300
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000301void CompareDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000302 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000303 Register registers[] = {r1, r0};
304 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000305}
306
307
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000308void BinaryOpDescriptor::InitializePlatformSpecific(
309 CallInterfaceDescriptorData* data) {
310 Register registers[] = {r1, r0};
311 data->InitializePlatformSpecific(arraysize(registers), registers);
312}
313
314
315void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
316 CallInterfaceDescriptorData* data) {
317 Register registers[] = {r2, r1, r0};
318 data->InitializePlatformSpecific(arraysize(registers), registers);
319}
320
321
322void StringAddDescriptor::InitializePlatformSpecific(
323 CallInterfaceDescriptorData* data) {
324 Register registers[] = {r1, r0};
325 data->InitializePlatformSpecific(arraysize(registers), registers);
326}
327
328
329void KeyedDescriptor::InitializePlatformSpecific(
330 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000331 static PlatformInterfaceDescriptor noInlineDescriptor =
332 PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS);
333
334 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000335 r2, // key
336 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000337 data->InitializePlatformSpecific(arraysize(registers), registers,
338 &noInlineDescriptor);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000339}
340
341
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000342void NamedDescriptor::InitializePlatformSpecific(
343 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000344 static PlatformInterfaceDescriptor noInlineDescriptor =
345 PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS);
346
347 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000348 r2, // name
349 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000350 data->InitializePlatformSpecific(arraysize(registers), registers,
351 &noInlineDescriptor);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000352}
353
354
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000355void CallHandlerDescriptor::InitializePlatformSpecific(
356 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000357 static PlatformInterfaceDescriptor default_descriptor =
358 PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
359
360 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000361 r0, // receiver
362 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000363 data->InitializePlatformSpecific(arraysize(registers), registers,
364 &default_descriptor);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000365}
366
367
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000368void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
369 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000370 static PlatformInterfaceDescriptor default_descriptor =
371 PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
372
373 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000374 r1, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000375 r3, // the new target
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000376 r0, // actual number of arguments
377 r2, // expected number of arguments
378 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000379 data->InitializePlatformSpecific(arraysize(registers), registers,
380 &default_descriptor);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000381}
382
Ben Murdochda12d292016-06-02 14:46:10 +0100383void ApiCallbackDescriptorBase::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000384 CallInterfaceDescriptorData* data) {
385 static PlatformInterfaceDescriptor default_descriptor =
386 PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
387
388 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000389 r0, // callee
390 r4, // call_data
391 r2, // holder
392 r1, // api_function_address
393 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000394 data->InitializePlatformSpecific(arraysize(registers), registers,
395 &default_descriptor);
396}
397
Ben Murdoch097c5b22016-05-18 11:27:45 +0100398void InterpreterDispatchDescriptor::InitializePlatformSpecific(
399 CallInterfaceDescriptorData* data) {
400 Register registers[] = {
401 kInterpreterAccumulatorRegister, kInterpreterRegisterFileRegister,
402 kInterpreterBytecodeOffsetRegister, kInterpreterBytecodeArrayRegister,
403 kInterpreterDispatchTableRegister};
404 data->InitializePlatformSpecific(arraysize(registers), registers);
405}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000406
407void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
408 CallInterfaceDescriptorData* data) {
409 Register registers[] = {
410 r0, // argument count (not including receiver)
411 r2, // address of first argument
412 r1 // the target callable to be call
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000413 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000414 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000415}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000416
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000417void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
418 CallInterfaceDescriptorData* data) {
419 Register registers[] = {
420 r0, // argument count (not including receiver)
421 r3, // new target
422 r1, // constructor to call
423 r2 // address of the first argument
424 };
425 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000426}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000427
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000428void InterpreterCEntryDescriptor::InitializePlatformSpecific(
429 CallInterfaceDescriptorData* data) {
430 Register registers[] = {
431 r0, // argument count (argc)
432 r2, // address of first argument (argv)
433 r1 // the runtime function to call
434 };
435 data->InitializePlatformSpecific(arraysize(registers), registers);
436}
437
438} // namespace internal
439} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000440
441#endif // V8_TARGET_ARCH_ARM