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