V8 Project
interface-descriptors-arm.cc
Go to the documentation of this file.
1 // 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 
5 #include "src/v8.h"
6 
7 #if V8_TARGET_ARCH_ARM
8 
10 
11 namespace v8 {
12 namespace internal {
13 
14 const Register CallInterfaceDescriptor::ContextRegister() { return cp; }
15 
16 
17 const Register LoadDescriptor::ReceiverRegister() { return r1; }
18 const Register LoadDescriptor::NameRegister() { return r2; }
19 
20 
21 const Register VectorLoadICTrampolineDescriptor::SlotRegister() { return r0; }
22 
23 
24 const Register VectorLoadICDescriptor::VectorRegister() { return r3; }
25 
26 
27 const Register StoreDescriptor::ReceiverRegister() { return r1; }
28 const Register StoreDescriptor::NameRegister() { return r2; }
29 const Register StoreDescriptor::ValueRegister() { return r0; }
30 
31 
32 const Register ElementTransitionAndStoreDescriptor::MapRegister() { return r3; }
33 
34 
35 const Register InstanceofDescriptor::left() { return r0; }
36 const Register InstanceofDescriptor::right() { return r1; }
37 
38 
39 const Register ArgumentsAccessReadDescriptor::index() { return r1; }
40 const Register ArgumentsAccessReadDescriptor::parameter_count() { return r0; }
41 
42 
43 const Register ApiGetterDescriptor::function_address() { return r2; }
44 
45 
46 const Register MathPowTaggedDescriptor::exponent() { return r2; }
47 
48 
49 const Register MathPowIntegerDescriptor::exponent() {
51 }
52 
53 
54 void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) {
55  Register registers[] = {cp, r2};
56  data->Initialize(arraysize(registers), registers, NULL);
57 }
58 
59 
60 void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) {
61  Register registers[] = {cp, r1};
62  data->Initialize(arraysize(registers), registers, NULL);
63 }
64 
65 
66 void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) {
67  Register registers[] = {cp, r0};
68  data->Initialize(arraysize(registers), registers, NULL);
69 }
70 
71 
72 void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) {
73  Register registers[] = {cp, r0};
74  data->Initialize(arraysize(registers), registers, NULL);
75 }
76 
77 
78 void FastCloneShallowArrayDescriptor::Initialize(
79  CallInterfaceDescriptorData* data) {
80  Register registers[] = {cp, r3, r2, r1};
81  Representation representations[] = {
84  data->Initialize(arraysize(registers), registers, representations);
85 }
86 
87 
88 void FastCloneShallowObjectDescriptor::Initialize(
89  CallInterfaceDescriptorData* data) {
90  Register registers[] = {cp, r3, r2, r1, r0};
91  data->Initialize(arraysize(registers), registers, NULL);
92 }
93 
94 
95 void CreateAllocationSiteDescriptor::Initialize(
96  CallInterfaceDescriptorData* data) {
97  Register registers[] = {cp, r2, r3};
98  data->Initialize(arraysize(registers), registers, NULL);
99 }
100 
101 
102 void StoreArrayLiteralElementDescriptor::Initialize(
103  CallInterfaceDescriptorData* data) {
104  Register registers[] = {cp, r3, r0};
105  data->Initialize(arraysize(registers), registers, NULL);
106 }
107 
108 
109 void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
110  Register registers[] = {cp, r1};
111  data->Initialize(arraysize(registers), registers, NULL);
112 }
113 
114 
115 void CallFunctionWithFeedbackDescriptor::Initialize(
116  CallInterfaceDescriptorData* data) {
117  Register registers[] = {cp, r1, r3};
118  Representation representations[] = {Representation::Tagged(),
121  data->Initialize(arraysize(registers), registers, representations);
122 }
123 
124 
125 void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) {
126  // r0 : number of arguments
127  // r1 : the function to call
128  // r2 : feedback vector
129  // r3 : (only if r2 is not the megamorphic symbol) slot in feedback
130  // vector (Smi)
131  // TODO(turbofan): So far we don't gather type feedback and hence skip the
132  // slot parameter, but ArrayConstructStub needs the vector to be undefined.
133  Register registers[] = {cp, r0, r1, r2};
134  data->Initialize(arraysize(registers), registers, NULL);
135 }
136 
137 
138 void RegExpConstructResultDescriptor::Initialize(
139  CallInterfaceDescriptorData* data) {
140  Register registers[] = {cp, r2, r1, r0};
141  data->Initialize(arraysize(registers), registers, NULL);
142 }
143 
144 
145 void TransitionElementsKindDescriptor::Initialize(
146  CallInterfaceDescriptorData* data) {
147  Register registers[] = {cp, r0, r1};
148  data->Initialize(arraysize(registers), registers, NULL);
149 }
150 
151 
152 void ArrayConstructorConstantArgCountDescriptor::Initialize(
153  CallInterfaceDescriptorData* data) {
154  // register state
155  // cp -- context
156  // r0 -- number of arguments
157  // r1 -- function
158  // r2 -- allocation site with elements kind
159  Register registers[] = {cp, r1, r2};
160  data->Initialize(arraysize(registers), registers, NULL);
161 }
162 
163 
164 void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
165  // stack param count needs (constructor pointer, and single argument)
166  Register registers[] = {cp, r1, r2, r0};
167  Representation representations[] = {
170  data->Initialize(arraysize(registers), registers, representations);
171 }
172 
173 
174 void InternalArrayConstructorConstantArgCountDescriptor::Initialize(
175  CallInterfaceDescriptorData* data) {
176  // register state
177  // cp -- context
178  // r0 -- number of arguments
179  // r1 -- constructor function
180  Register registers[] = {cp, r1};
181  data->Initialize(arraysize(registers), registers, NULL);
182 }
183 
184 
185 void InternalArrayConstructorDescriptor::Initialize(
186  CallInterfaceDescriptorData* data) {
187  // stack param count needs (constructor pointer, and single argument)
188  Register registers[] = {cp, r1, r0};
189  Representation representations[] = {Representation::Tagged(),
192  data->Initialize(arraysize(registers), registers, representations);
193 }
194 
195 
196 void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) {
197  Register registers[] = {cp, r0};
198  data->Initialize(arraysize(registers), registers, NULL);
199 }
200 
201 
202 void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) {
203  Register registers[] = {cp, r0};
204  data->Initialize(arraysize(registers), registers, NULL);
205 }
206 
207 
208 void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) {
209  Register registers[] = {cp, r1, r0};
210  data->Initialize(arraysize(registers), registers, NULL);
211 }
212 
213 
214 void BinaryOpWithAllocationSiteDescriptor::Initialize(
215  CallInterfaceDescriptorData* data) {
216  Register registers[] = {cp, r2, r1, r0};
217  data->Initialize(arraysize(registers), registers, NULL);
218 }
219 
220 
221 void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) {
222  Register registers[] = {cp, r1, r0};
223  data->Initialize(arraysize(registers), registers, NULL);
224 }
225 
226 
227 void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
228  static PlatformInterfaceDescriptor noInlineDescriptor =
229  PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS);
230 
231  Register registers[] = {
232  cp, // context
233  r2, // key
234  };
235  Representation representations[] = {
236  Representation::Tagged(), // context
237  Representation::Tagged(), // key
238  };
239  data->Initialize(arraysize(registers), registers, representations,
240  &noInlineDescriptor);
241 }
242 
243 
244 void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
245  static PlatformInterfaceDescriptor noInlineDescriptor =
246  PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS);
247 
248  Register registers[] = {
249  cp, // context
250  r2, // name
251  };
252  Representation representations[] = {
253  Representation::Tagged(), // context
254  Representation::Tagged(), // name
255  };
256  data->Initialize(arraysize(registers), registers, representations,
257  &noInlineDescriptor);
258 }
259 
260 
261 void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) {
262  static PlatformInterfaceDescriptor default_descriptor =
263  PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
264 
265  Register registers[] = {
266  cp, // context
267  r0, // receiver
268  };
269  Representation representations[] = {
270  Representation::Tagged(), // context
271  Representation::Tagged(), // receiver
272  };
273  data->Initialize(arraysize(registers), registers, representations,
274  &default_descriptor);
275 }
276 
277 
278 void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
279  static PlatformInterfaceDescriptor default_descriptor =
280  PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
281 
282  Register registers[] = {
283  cp, // context
284  r1, // JSFunction
285  r0, // actual number of arguments
286  r2, // expected number of arguments
287  };
288  Representation representations[] = {
289  Representation::Tagged(), // context
290  Representation::Tagged(), // JSFunction
291  Representation::Integer32(), // actual number of arguments
292  Representation::Integer32(), // expected number of arguments
293  };
294  data->Initialize(arraysize(registers), registers, representations,
295  &default_descriptor);
296 }
297 
298 
299 void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
300  static PlatformInterfaceDescriptor default_descriptor =
301  PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
302 
303  Register registers[] = {
304  cp, // context
305  r0, // callee
306  r4, // call_data
307  r2, // holder
308  r1, // api_function_address
309  };
310  Representation representations[] = {
311  Representation::Tagged(), // context
312  Representation::Tagged(), // callee
313  Representation::Tagged(), // call_data
314  Representation::Tagged(), // holder
315  Representation::External(), // api_function_address
316  };
317  data->Initialize(arraysize(registers), registers, representations,
318  &default_descriptor);
319 }
320 }
321 } // namespace v8::internal
322 
323 #endif // V8_TARGET_ARCH_ARM
static const Register function_address()
void Initialize(int register_parameter_count, Register *registers, Representation *param_representations, PlatformInterfaceDescriptor *platform_descriptor=NULL)
static const Register ContextRegister()
const CallInterfaceDescriptorData * data() const
static const Register left()
static const Register right()
static const Register ReceiverRegister()
static const Register NameRegister()
static const Register exponent()
static const Register exponent()
static Representation External()
static Representation Smi()
static Representation Integer32()
static Representation Tagged()
static const Register ReceiverRegister()
static const Register NameRegister()
static const Register ValueRegister()
static const Register VectorRegister()
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes enable context specialization in TurboFan execution budget before interrupt is triggered max percentage of megamorphic generic ICs to allow optimization enable use of SAHF instruction if enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable use of MLS instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long enable alignment of csp to bytes on platforms which prefer the register to always be NULL
#define arraysize(array)
Definition: macros.h:86
const Register r2
const Register cp
const Register r0
const Register r3
const Register r4
const Register r1
Debugger support for the V8 JavaScript engine.
Definition: accessors.cc:20