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 StoreTransitionDescriptor::MapRegister() { return ebx; }
35 const Register ElementTransitionAndStoreDescriptor::MapRegister() {
40 const Register InstanceofDescriptor::left() { return eax; }
41 const Register InstanceofDescriptor::right() { return edx; }
44 const Register ArgumentsAccessReadDescriptor::index() { return edx; }
45 const Register ArgumentsAccessReadDescriptor::parameter_count() { return eax; }
48 const Register ApiGetterDescriptor::function_address() { return edx; }
51 const Register MathPowTaggedDescriptor::exponent() { return eax; }
54 const Register MathPowIntegerDescriptor::exponent() {
55 return MathPowTaggedDescriptor::exponent();
59 void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) {
60 Register registers[] = {esi, ebx};
61 data->Initialize(arraysize(registers), registers, NULL);
65 void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) {
66 Register registers[] = {esi, edi};
67 data->Initialize(arraysize(registers), registers, NULL);
71 void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) {
72 // ToNumberStub invokes a function, and therefore needs a context.
73 Register registers[] = {esi, eax};
74 data->Initialize(arraysize(registers), registers, NULL);
78 void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) {
79 Register registers[] = {esi, eax};
80 data->Initialize(arraysize(registers), registers, NULL);
84 void FastCloneShallowArrayDescriptor::Initialize(
85 CallInterfaceDescriptorData* data) {
86 Register registers[] = {esi, eax, ebx, ecx};
87 Representation representations[] = {
88 Representation::Tagged(), Representation::Tagged(), Representation::Smi(),
89 Representation::Tagged()};
90 data->Initialize(arraysize(registers), registers, representations);
94 void FastCloneShallowObjectDescriptor::Initialize(
95 CallInterfaceDescriptorData* data) {
96 Register registers[] = {esi, eax, ebx, ecx, edx};
97 data->Initialize(arraysize(registers), registers, NULL);
101 void CreateAllocationSiteDescriptor::Initialize(
102 CallInterfaceDescriptorData* data) {
103 Register registers[] = {esi, ebx, edx};
104 data->Initialize(arraysize(registers), registers, NULL);
108 void StoreArrayLiteralElementDescriptor::Initialize(
109 CallInterfaceDescriptorData* data) {
110 Register registers[] = {esi, ecx, eax};
111 data->Initialize(arraysize(registers), registers, NULL);
115 void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
116 Register registers[] = {esi, edi};
117 data->Initialize(arraysize(registers), registers, NULL);
121 void CallFunctionWithFeedbackDescriptor::Initialize(
122 CallInterfaceDescriptorData* data) {
123 Register registers[] = {esi, edi, edx};
124 Representation representations[] = {Representation::Tagged(),
125 Representation::Tagged(),
126 Representation::Smi()};
127 data->Initialize(arraysize(registers), registers, representations);
131 void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) {
132 // eax : number of arguments
133 // ebx : feedback vector
134 // edx : (only if ebx is not the megamorphic symbol) slot in feedback
136 // edi : constructor function
137 // TODO(turbofan): So far we don't gather type feedback and hence skip the
138 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
139 Register registers[] = {esi, eax, edi, ebx};
140 data->Initialize(arraysize(registers), registers, NULL);
144 void RegExpConstructResultDescriptor::Initialize(
145 CallInterfaceDescriptorData* data) {
146 Register registers[] = {esi, ecx, ebx, eax};
147 data->Initialize(arraysize(registers), registers, NULL);
151 void TransitionElementsKindDescriptor::Initialize(
152 CallInterfaceDescriptorData* data) {
153 Register registers[] = {esi, eax, ebx};
154 data->Initialize(arraysize(registers), registers, NULL);
158 void AllocateHeapNumberDescriptor::Initialize(
159 CallInterfaceDescriptorData* data) {
162 Register registers[] = {esi};
163 data->Initialize(arraysize(registers), registers, nullptr);
167 void ArrayConstructorConstantArgCountDescriptor::Initialize(
168 CallInterfaceDescriptorData* data) {
170 // eax -- number of arguments
172 // ebx -- allocation site with elements kind
173 Register registers[] = {esi, edi, ebx};
174 data->Initialize(arraysize(registers), registers, NULL);
178 void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
179 // stack param count needs (constructor pointer, and single argument)
180 Register registers[] = {esi, edi, ebx, eax};
181 Representation representations[] = {
182 Representation::Tagged(), Representation::Tagged(),
183 Representation::Tagged(), Representation::Integer32()};
184 data->Initialize(arraysize(registers), registers, representations);
188 void InternalArrayConstructorConstantArgCountDescriptor::Initialize(
189 CallInterfaceDescriptorData* data) {
191 // eax -- number of arguments
193 Register registers[] = {esi, edi};
194 data->Initialize(arraysize(registers), registers, NULL);
198 void InternalArrayConstructorDescriptor::Initialize(
199 CallInterfaceDescriptorData* data) {
200 // stack param count needs (constructor pointer, and single argument)
201 Register registers[] = {esi, edi, eax};
202 Representation representations[] = {Representation::Tagged(),
203 Representation::Tagged(),
204 Representation::Integer32()};
205 data->Initialize(arraysize(registers), registers, representations);
209 void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) {
210 Register registers[] = {esi, eax};
211 data->Initialize(arraysize(registers), registers, NULL);
215 void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) {
216 Register registers[] = {esi, eax};
217 data->Initialize(arraysize(registers), registers, NULL);
221 void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) {
222 Register registers[] = {esi, edx, eax};
223 data->Initialize(arraysize(registers), registers, NULL);
227 void BinaryOpWithAllocationSiteDescriptor::Initialize(
228 CallInterfaceDescriptorData* data) {
229 Register registers[] = {esi, ecx, edx, eax};
230 data->Initialize(arraysize(registers), registers, NULL);
234 void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) {
235 Register registers[] = {esi, edx, eax};
236 data->Initialize(arraysize(registers), registers, NULL);
240 void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
241 Register registers[] = {
245 Representation representations[] = {
246 Representation::Tagged(), // context
247 Representation::Tagged(), // key
249 data->Initialize(arraysize(registers), registers, representations);
253 void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
254 Register registers[] = {
258 Representation representations[] = {
259 Representation::Tagged(), // context
260 Representation::Tagged(), // name
262 data->Initialize(arraysize(registers), registers, representations);
266 void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) {
267 Register registers[] = {
271 Representation representations[] = {
272 Representation::Tagged(), // context
273 Representation::Tagged(), // receiver
275 data->Initialize(arraysize(registers), registers, representations);
279 void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
280 Register registers[] = {
283 eax, // actual number of arguments
284 ebx, // expected number of arguments
286 Representation representations[] = {
287 Representation::Tagged(), // context
288 Representation::Tagged(), // JSFunction
289 Representation::Integer32(), // actual number of arguments
290 Representation::Integer32(), // expected number of arguments
292 data->Initialize(arraysize(registers), registers, representations);
296 void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
297 Register registers[] = {
302 edx, // api_function_address
304 Representation representations[] = {
305 Representation::Tagged(), // context
306 Representation::Tagged(), // callee
307 Representation::Tagged(), // call_data
308 Representation::Tagged(), // holder
309 Representation::External(), // api_function_address
311 data->Initialize(arraysize(registers), registers, representations);
314 } // namespace v8::internal
316 #endif // V8_TARGET_ARCH_X87