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.
9 #include "src/interface-descriptors.h"
14 const Register CallInterfaceDescriptor::ContextRegister() { return esi; }
17 const Register LoadDescriptor::ReceiverRegister() { return edx; }
18 const Register LoadDescriptor::NameRegister() { return ecx; }
21 const Register VectorLoadICTrampolineDescriptor::SlotRegister() { return eax; }
24 const Register VectorLoadICDescriptor::VectorRegister() { return ebx; }
27 const Register StoreDescriptor::ReceiverRegister() { return edx; }
28 const Register StoreDescriptor::NameRegister() { return ecx; }
29 const Register StoreDescriptor::ValueRegister() { return eax; }
32 const Register ElementTransitionAndStoreDescriptor::MapRegister() {
37 const Register InstanceofDescriptor::left() { return eax; }
38 const Register InstanceofDescriptor::right() { return edx; }
41 const Register ArgumentsAccessReadDescriptor::index() { return edx; }
42 const Register ArgumentsAccessReadDescriptor::parameter_count() { return eax; }
45 const Register ApiGetterDescriptor::function_address() { return edx; }
48 const Register MathPowTaggedDescriptor::exponent() { return eax; }
51 const Register MathPowIntegerDescriptor::exponent() {
52 return MathPowTaggedDescriptor::exponent();
56 void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) {
57 Register registers[] = {esi, ebx};
58 data->Initialize(arraysize(registers), registers, NULL);
62 void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) {
63 Register registers[] = {esi, edi};
64 data->Initialize(arraysize(registers), registers, NULL);
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);
75 void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) {
76 Register registers[] = {esi, eax};
77 data->Initialize(arraysize(registers), registers, NULL);
81 void FastCloneShallowArrayDescriptor::Initialize(
82 CallInterfaceDescriptorData* data) {
83 Register registers[] = {esi, eax, ebx, ecx};
84 Representation representations[] = {
85 Representation::Tagged(), Representation::Tagged(), Representation::Smi(),
86 Representation::Tagged()};
87 data->Initialize(arraysize(registers), registers, representations);
91 void FastCloneShallowObjectDescriptor::Initialize(
92 CallInterfaceDescriptorData* data) {
93 Register registers[] = {esi, eax, ebx, ecx, edx};
94 data->Initialize(arraysize(registers), registers, NULL);
98 void CreateAllocationSiteDescriptor::Initialize(
99 CallInterfaceDescriptorData* data) {
100 Register registers[] = {esi, ebx, edx};
101 data->Initialize(arraysize(registers), registers, NULL);
105 void StoreArrayLiteralElementDescriptor::Initialize(
106 CallInterfaceDescriptorData* data) {
107 Register registers[] = {esi, ecx, eax};
108 data->Initialize(arraysize(registers), registers, NULL);
112 void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
113 Register registers[] = {esi, edi};
114 data->Initialize(arraysize(registers), registers, NULL);
118 void CallFunctionWithFeedbackDescriptor::Initialize(
119 CallInterfaceDescriptorData* data) {
120 Register registers[] = {esi, edi, edx};
121 Representation representations[] = {Representation::Tagged(),
122 Representation::Tagged(),
123 Representation::Smi()};
124 data->Initialize(arraysize(registers), registers, representations);
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
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);
141 void RegExpConstructResultDescriptor::Initialize(
142 CallInterfaceDescriptorData* data) {
143 Register registers[] = {esi, ecx, ebx, eax};
144 data->Initialize(arraysize(registers), registers, NULL);
148 void TransitionElementsKindDescriptor::Initialize(
149 CallInterfaceDescriptorData* data) {
150 Register registers[] = {esi, eax, ebx};
151 data->Initialize(arraysize(registers), registers, NULL);
155 void ArrayConstructorConstantArgCountDescriptor::Initialize(
156 CallInterfaceDescriptorData* data) {
158 // eax -- number of arguments
160 // ebx -- allocation site with elements kind
161 Register registers[] = {esi, edi, ebx};
162 data->Initialize(arraysize(registers), registers, NULL);
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[] = {
170 Representation::Tagged(), Representation::Tagged(),
171 Representation::Tagged(), Representation::Integer32()};
172 data->Initialize(arraysize(registers), registers, representations);
176 void InternalArrayConstructorConstantArgCountDescriptor::Initialize(
177 CallInterfaceDescriptorData* data) {
179 // eax -- number of arguments
181 Register registers[] = {esi, edi};
182 data->Initialize(arraysize(registers), registers, NULL);
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(),
191 Representation::Tagged(),
192 Representation::Integer32()};
193 data->Initialize(arraysize(registers), registers, representations);
197 void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) {
198 Register registers[] = {esi, eax};
199 data->Initialize(arraysize(registers), registers, NULL);
203 void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) {
204 Register registers[] = {esi, eax};
205 data->Initialize(arraysize(registers), registers, NULL);
209 void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) {
210 Register registers[] = {esi, edx, eax};
211 data->Initialize(arraysize(registers), registers, NULL);
215 void BinaryOpWithAllocationSiteDescriptor::Initialize(
216 CallInterfaceDescriptorData* data) {
217 Register registers[] = {esi, ecx, edx, eax};
218 data->Initialize(arraysize(registers), registers, NULL);
222 void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) {
223 Register registers[] = {esi, edx, eax};
224 data->Initialize(arraysize(registers), registers, NULL);
228 void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
229 Register registers[] = {
233 Representation representations[] = {
234 Representation::Tagged(), // context
235 Representation::Tagged(), // key
237 data->Initialize(arraysize(registers), registers, representations);
241 void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
242 Register registers[] = {
246 Representation representations[] = {
247 Representation::Tagged(), // context
248 Representation::Tagged(), // name
250 data->Initialize(arraysize(registers), registers, representations);
254 void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) {
255 Register registers[] = {
259 Representation representations[] = {
260 Representation::Tagged(), // context
261 Representation::Tagged(), // receiver
263 data->Initialize(arraysize(registers), registers, representations);
267 void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
268 Register registers[] = {
271 eax, // actual number of arguments
272 ebx, // expected number of arguments
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
280 data->Initialize(arraysize(registers), registers, representations);
284 void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
285 Register registers[] = {
290 edx, // api_function_address
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
299 data->Initialize(arraysize(registers), registers, representations);
302 } // namespace v8::internal
304 #endif // V8_TARGET_ARCH_X87