blob: fa0c040f3dba4a7426b4682fbb51946707dc3ca6 [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
Ben Murdoch61f157c2016-09-16 13:49:30 +010016void CallInterfaceDescriptor::DefaultInitializePlatformSpecific(
17 CallInterfaceDescriptorData* data, int register_parameter_count) {
18 const Register default_stub_registers[] = {r0, r1, r2, r3, r4};
19 CHECK_LE(static_cast<size_t>(register_parameter_count),
20 arraysize(default_stub_registers));
21 data->InitializePlatformSpecific(register_parameter_count,
22 default_stub_registers);
23}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000024
25const Register LoadDescriptor::ReceiverRegister() { return r1; }
26const Register LoadDescriptor::NameRegister() { return r2; }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000027const Register LoadDescriptor::SlotRegister() { return r0; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000028
29
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000030const Register LoadWithVectorDescriptor::VectorRegister() { return r3; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000031
32
33const Register StoreDescriptor::ReceiverRegister() { return r1; }
34const Register StoreDescriptor::NameRegister() { return r2; }
35const Register StoreDescriptor::ValueRegister() { return r0; }
36
37
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000038const Register VectorStoreICTrampolineDescriptor::SlotRegister() { return r4; }
39
40
41const Register VectorStoreICDescriptor::VectorRegister() { return r3; }
42
43
44const Register VectorStoreTransitionDescriptor::SlotRegister() { return r4; }
45const Register VectorStoreTransitionDescriptor::VectorRegister() { return r3; }
46const Register VectorStoreTransitionDescriptor::MapRegister() { return r5; }
47
48
Emily Bernierd0a1eb72015-03-24 16:35:39 -040049const Register StoreTransitionDescriptor::MapRegister() { return r3; }
50
51
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000052const Register StoreGlobalViaContextDescriptor::SlotRegister() { return r2; }
53const Register StoreGlobalViaContextDescriptor::ValueRegister() { return r0; }
54
55
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000056const Register StringCompareDescriptor::LeftRegister() { return r1; }
57const Register StringCompareDescriptor::RightRegister() { return r0; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000058
Ben Murdochc5610432016-08-08 18:44:38 +010059const Register ApiGetterDescriptor::HolderRegister() { return r0; }
60const Register ApiGetterDescriptor::CallbackRegister() { return r3; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000061
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
Ben Murdochc5610432016-08-08 18:44:38 +0100251void ArrayNoArgumentConstructorDescriptor::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000252 CallInterfaceDescriptorData* data) {
Ben Murdochc5610432016-08-08 18:44:38 +0100253 // register state
254 // r0 -- number of arguments
255 // r1 -- function
256 // r2 -- allocation site with elements kind
257 Register registers[] = {r1, r2, r0};
258 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000259}
260
Ben Murdoch61f157c2016-09-16 13:49:30 +0100261void ArraySingleArgumentConstructorDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400262 CallInterfaceDescriptorData* data) {
263 // register state
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000264 // r0 -- number of arguments
265 // r1 -- function
266 // r2 -- allocation site with elements kind
Ben Murdoch61f157c2016-09-16 13:49:30 +0100267 Register registers[] = {r1, r2, r0};
268 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000269}
270
Ben Murdoch61f157c2016-09-16 13:49:30 +0100271void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000272 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000273 // stack param count needs (constructor pointer, and single argument)
274 Register registers[] = {r1, r2, r0};
275 data->InitializePlatformSpecific(arraysize(registers), registers);
276}
277
278
Ben Murdoch61f157c2016-09-16 13:49:30 +0100279void VarArgFunctionDescriptor::InitializePlatformSpecific(
Ben Murdochda12d292016-06-02 14:46:10 +0100280 CallInterfaceDescriptorData* data) {
281 // stack param count needs (arg count)
282 Register registers[] = {r0};
283 data->InitializePlatformSpecific(arraysize(registers), registers);
284}
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000285
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000286void CompareDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000287 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000288 Register registers[] = {r1, r0};
289 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000290}
291
292
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000293void BinaryOpDescriptor::InitializePlatformSpecific(
294 CallInterfaceDescriptorData* data) {
295 Register registers[] = {r1, r0};
296 data->InitializePlatformSpecific(arraysize(registers), registers);
297}
298
299
300void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
301 CallInterfaceDescriptorData* data) {
302 Register registers[] = {r2, r1, r0};
303 data->InitializePlatformSpecific(arraysize(registers), registers);
304}
305
Ben Murdochc5610432016-08-08 18:44:38 +0100306void CountOpDescriptor::InitializePlatformSpecific(
307 CallInterfaceDescriptorData* data) {
308 Register registers[] = {r1};
309 data->InitializePlatformSpecific(arraysize(registers), registers);
310}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000311
312void StringAddDescriptor::InitializePlatformSpecific(
313 CallInterfaceDescriptorData* data) {
314 Register registers[] = {r1, r0};
315 data->InitializePlatformSpecific(arraysize(registers), registers);
316}
317
318
319void KeyedDescriptor::InitializePlatformSpecific(
320 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000321 static PlatformInterfaceDescriptor noInlineDescriptor =
322 PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS);
323
324 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000325 r2, // key
326 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000327 data->InitializePlatformSpecific(arraysize(registers), registers,
328 &noInlineDescriptor);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000329}
330
331
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000332void NamedDescriptor::InitializePlatformSpecific(
333 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000334 static PlatformInterfaceDescriptor noInlineDescriptor =
335 PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS);
336
337 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000338 r2, // name
339 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000340 data->InitializePlatformSpecific(arraysize(registers), registers,
341 &noInlineDescriptor);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000342}
343
344
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000345void CallHandlerDescriptor::InitializePlatformSpecific(
346 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000347 static PlatformInterfaceDescriptor default_descriptor =
348 PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
349
350 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000351 r0, // receiver
352 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000353 data->InitializePlatformSpecific(arraysize(registers), registers,
354 &default_descriptor);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000355}
356
357
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000358void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
359 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000360 static PlatformInterfaceDescriptor default_descriptor =
361 PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
362
363 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000364 r1, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000365 r3, // the new target
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000366 r0, // actual number of arguments
367 r2, // expected number of arguments
368 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000369 data->InitializePlatformSpecific(arraysize(registers), registers,
370 &default_descriptor);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000371}
372
Ben Murdochda12d292016-06-02 14:46:10 +0100373void ApiCallbackDescriptorBase::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000374 CallInterfaceDescriptorData* data) {
375 static PlatformInterfaceDescriptor default_descriptor =
376 PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
377
378 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000379 r0, // callee
380 r4, // call_data
381 r2, // holder
382 r1, // api_function_address
383 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000384 data->InitializePlatformSpecific(arraysize(registers), registers,
385 &default_descriptor);
386}
387
Ben Murdoch097c5b22016-05-18 11:27:45 +0100388void InterpreterDispatchDescriptor::InitializePlatformSpecific(
389 CallInterfaceDescriptorData* data) {
390 Register registers[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100391 kInterpreterAccumulatorRegister, kInterpreterBytecodeOffsetRegister,
392 kInterpreterBytecodeArrayRegister, kInterpreterDispatchTableRegister};
Ben Murdoch097c5b22016-05-18 11:27:45 +0100393 data->InitializePlatformSpecific(arraysize(registers), registers);
394}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000395
396void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
397 CallInterfaceDescriptorData* data) {
398 Register registers[] = {
399 r0, // argument count (not including receiver)
400 r2, // address of first argument
401 r1 // the target callable to be call
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000402 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000403 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000404}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000405
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000406void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
407 CallInterfaceDescriptorData* data) {
408 Register registers[] = {
409 r0, // argument count (not including receiver)
410 r3, // new target
411 r1, // constructor to call
412 r2 // address of the first argument
413 };
414 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 InterpreterCEntryDescriptor::InitializePlatformSpecific(
418 CallInterfaceDescriptorData* data) {
419 Register registers[] = {
420 r0, // argument count (argc)
421 r2, // address of first argument (argv)
422 r1 // the runtime function to call
423 };
424 data->InitializePlatformSpecific(arraysize(registers), registers);
425}
426
Ben Murdochc5610432016-08-08 18:44:38 +0100427void ResumeGeneratorDescriptor::InitializePlatformSpecific(
428 CallInterfaceDescriptorData* data) {
429 Register registers[] = {
430 r0, // the value to pass to the generator
431 r1, // the JSGeneratorObject to resume
432 r2 // the resume mode (tagged)
433 };
434 data->InitializePlatformSpecific(arraysize(registers), registers);
435}
436
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000437} // namespace internal
438} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000439
440#endif // V8_TARGET_ARCH_ARM