blob: ad381c7eb28905e81a9d4f39262bc1968773eb0c [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 Murdochb8a8cc12014-11-26 15:28:44 +00005#if V8_TARGET_ARCH_IA32
6
7#include "src/interface-descriptors.h"
8
9namespace v8 {
10namespace internal {
11
12const Register CallInterfaceDescriptor::ContextRegister() { return esi; }
13
14
15const Register LoadDescriptor::ReceiverRegister() { return edx; }
16const Register LoadDescriptor::NameRegister() { return ecx; }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000017const Register LoadDescriptor::SlotRegister() { return eax; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000018
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000019const Register LoadWithVectorDescriptor::VectorRegister() { return ebx; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000020
21
22const Register StoreDescriptor::ReceiverRegister() { return edx; }
23const Register StoreDescriptor::NameRegister() { return ecx; }
24const Register StoreDescriptor::ValueRegister() { return eax; }
25
26
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000027const Register VectorStoreICTrampolineDescriptor::SlotRegister() { return edi; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040028
29
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000030const Register VectorStoreICDescriptor::VectorRegister() { return ebx; }
31
32
33const Register VectorStoreTransitionDescriptor::SlotRegister() {
34 return no_reg;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000035}
36
37
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000038const Register VectorStoreTransitionDescriptor::VectorRegister() { return ebx; }
39
40
41const Register VectorStoreTransitionDescriptor::MapRegister() { return edi; }
42
43
44const Register StoreTransitionDescriptor::MapRegister() { return ebx; }
45
46
47const Register LoadGlobalViaContextDescriptor::SlotRegister() { return ebx; }
48
49
50const Register StoreGlobalViaContextDescriptor::SlotRegister() { return ebx; }
51const Register StoreGlobalViaContextDescriptor::ValueRegister() { return eax; }
52
53
54const Register InstanceOfDescriptor::LeftRegister() { return edx; }
55const Register InstanceOfDescriptor::RightRegister() { return eax; }
56
57
58const Register StringCompareDescriptor::LeftRegister() { return edx; }
59const Register StringCompareDescriptor::RightRegister() { return eax; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000060
61
62const Register ArgumentsAccessReadDescriptor::index() { return edx; }
63const Register ArgumentsAccessReadDescriptor::parameter_count() { return eax; }
64
65
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000066const Register ArgumentsAccessNewDescriptor::function() { return edi; }
67const Register ArgumentsAccessNewDescriptor::parameter_count() { return ecx; }
68const Register ArgumentsAccessNewDescriptor::parameter_pointer() { return edx; }
69
70
71const Register RestParamAccessDescriptor::parameter_count() { return ecx; }
72const Register RestParamAccessDescriptor::parameter_pointer() { return edx; }
73const Register RestParamAccessDescriptor::rest_parameter_index() { return ebx; }
74
75
Ben Murdochb8a8cc12014-11-26 15:28:44 +000076const Register ApiGetterDescriptor::function_address() { return edx; }
77
78
79const Register MathPowTaggedDescriptor::exponent() { return eax; }
80
81
82const Register MathPowIntegerDescriptor::exponent() {
83 return MathPowTaggedDescriptor::exponent();
84}
85
86
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000087const Register GrowArrayElementsDescriptor::ObjectRegister() { return eax; }
88const Register GrowArrayElementsDescriptor::KeyRegister() { return ebx; }
89
90
91void FastNewClosureDescriptor::InitializePlatformSpecific(
92 CallInterfaceDescriptorData* data) {
93 Register registers[] = {ebx};
94 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000095}
96
97
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000098void FastNewContextDescriptor::InitializePlatformSpecific(
99 CallInterfaceDescriptorData* data) {
100 Register registers[] = {edi};
101 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000102}
103
104
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000105void ToNumberDescriptor::InitializePlatformSpecific(
106 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000107 // ToNumberStub invokes a function, and therefore needs a context.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000108 Register registers[] = {eax};
109 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000110}
111
112
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000113// static
114const Register ToLengthDescriptor::ReceiverRegister() { return eax; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000115
116
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000117// static
118const Register ToStringDescriptor::ReceiverRegister() { return eax; }
119
120
121// static
122const Register ToObjectDescriptor::ReceiverRegister() { return eax; }
123
124
125void NumberToStringDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000126 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000127 Register registers[] = {eax};
128 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000129}
130
131
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000132void TypeofDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000133 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000134 Register registers[] = {ebx};
135 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000136}
137
138
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000139void FastCloneRegExpDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000140 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000141 Register registers[] = {edi, eax, ecx, edx};
142 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000143}
144
145
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000146void FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000147 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000148 Register registers[] = {eax, ebx, ecx};
149 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000150}
151
152
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000153void FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000154 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000155 Register registers[] = {eax, ebx, ecx, edx};
156 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000157}
158
159
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000160void CreateAllocationSiteDescriptor::InitializePlatformSpecific(
161 CallInterfaceDescriptorData* data) {
162 Register registers[] = {ebx, edx};
163 data->InitializePlatformSpecific(arraysize(registers), registers);
164}
165
166
167void CreateWeakCellDescriptor::InitializePlatformSpecific(
168 CallInterfaceDescriptorData* data) {
169 Register registers[] = {ebx, edx, edi};
170 data->InitializePlatformSpecific(arraysize(registers), registers);
171}
172
173
174void StoreArrayLiteralElementDescriptor::InitializePlatformSpecific(
175 CallInterfaceDescriptorData* data) {
176 Register registers[] = {ecx, eax};
177 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
178}
179
180
181void CallFunctionDescriptor::InitializePlatformSpecific(
182 CallInterfaceDescriptorData* data) {
183 Register registers[] = {edi};
184 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
185}
186
187
188void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
189 CallInterfaceDescriptorData* data) {
190 Register registers[] = {edi, edx};
191 data->InitializePlatformSpecific(arraysize(registers), registers);
192}
193
194
195void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
196 CallInterfaceDescriptorData* data) {
197 Register registers[] = {edi, edx, ebx};
198 data->InitializePlatformSpecific(arraysize(registers), registers);
199}
200
201
202void CallConstructDescriptor::InitializePlatformSpecific(
203 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000204 // eax : number of arguments
205 // ebx : feedback vector
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000206 // ecx : new target (for IsSuperConstructorCall)
207 // edx : slot in feedback vector (Smi, for RecordCallTarget)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000208 // edi : constructor function
209 // TODO(turbofan): So far we don't gather type feedback and hence skip the
210 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000211 Register registers[] = {eax, edi, ecx, ebx};
212 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000213}
214
215
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000216void CallTrampolineDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000217 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000218 // eax : number of arguments
219 // edi : the target to call
220 Register registers[] = {edi, eax};
221 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000222}
223
224
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000225void ConstructStubDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000226 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000227 // eax : number of arguments
228 // edx : the new target
229 // edi : the target to call
230 // ebx : allocation site or undefined
231 Register registers[] = {edi, edx, eax, ebx};
232 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000233}
234
235
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000236void ConstructTrampolineDescriptor::InitializePlatformSpecific(
237 CallInterfaceDescriptorData* data) {
238 // eax : number of arguments
239 // edx : the new target
240 // edi : the target to call
241 Register registers[] = {edi, edx, eax};
242 data->InitializePlatformSpecific(arraysize(registers), registers);
243}
244
245
246void RegExpConstructResultDescriptor::InitializePlatformSpecific(
247 CallInterfaceDescriptorData* data) {
248 Register registers[] = {ecx, ebx, eax};
249 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
250}
251
252
253void TransitionElementsKindDescriptor::InitializePlatformSpecific(
254 CallInterfaceDescriptorData* data) {
255 Register registers[] = {eax, ebx};
256 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
257}
258
259
260void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400261 CallInterfaceDescriptorData* data) {
262 // register state
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000263 data->InitializePlatformSpecific(0, nullptr, nullptr);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400264}
265
266
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000267void AllocateInNewSpaceDescriptor::InitializePlatformSpecific(
268 CallInterfaceDescriptorData* data) {
269 Register registers[] = {eax};
270 data->InitializePlatformSpecific(arraysize(registers), registers);
271}
272
273
274void ArrayConstructorConstantArgCountDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000275 CallInterfaceDescriptorData* data) {
276 // register state
277 // eax -- number of arguments
278 // edi -- function
279 // ebx -- allocation site with elements kind
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000280 Register registers[] = {edi, ebx};
281 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000282}
283
284
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000285void ArrayConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000286 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000287 // stack param count needs (constructor pointer, and single argument)
288 Register registers[] = {edi, ebx, eax};
289 data->InitializePlatformSpecific(arraysize(registers), registers);
290}
291
292
293void InternalArrayConstructorConstantArgCountDescriptor::
294 InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000295 // register state
296 // eax -- number of arguments
297 // edi -- function
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000298 Register registers[] = {edi};
299 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000300}
301
302
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000303void InternalArrayConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000304 CallInterfaceDescriptorData* data) {
305 // stack param count needs (constructor pointer, and single argument)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000306 Register registers[] = {edi, eax};
307 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000308}
309
310
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000311void CompareDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000312 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000313 Register registers[] = {edx, eax};
314 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000315}
316
317
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000318void CompareNilDescriptor::InitializePlatformSpecific(
319 CallInterfaceDescriptorData* data) {
320 Register registers[] = {eax};
321 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000322}
323
324
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000325void ToBooleanDescriptor::InitializePlatformSpecific(
326 CallInterfaceDescriptorData* data) {
327 Register registers[] = {eax};
328 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
329}
330
331
332void BinaryOpDescriptor::InitializePlatformSpecific(
333 CallInterfaceDescriptorData* data) {
334 Register registers[] = {edx, eax};
335 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
336}
337
338
339void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
340 CallInterfaceDescriptorData* data) {
341 Register registers[] = {ecx, edx, eax};
342 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
343}
344
345
346void StringAddDescriptor::InitializePlatformSpecific(
347 CallInterfaceDescriptorData* data) {
348 Register registers[] = {edx, eax};
349 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
350}
351
352
353void KeyedDescriptor::InitializePlatformSpecific(
354 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000355 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000356 ecx, // key
357 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000358 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000359}
360
361
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000362void NamedDescriptor::InitializePlatformSpecific(
363 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000364 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000365 ecx, // name
366 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000367 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000368}
369
370
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000371void CallHandlerDescriptor::InitializePlatformSpecific(
372 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000373 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000374 edx, // name
375 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000376 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000377}
378
379
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000380void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
381 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000382 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000383 edi, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000384 edx, // the new target
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000385 eax, // actual number of arguments
386 ebx, // expected number of arguments
387 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000388 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000389}
390
391
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000392void ApiFunctionDescriptor::InitializePlatformSpecific(
393 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000394 Register registers[] = {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000395 edi, // callee
396 ebx, // call_data
397 ecx, // holder
398 edx, // api_function_address
399 eax, // actual number of arguments
400 };
401 data->InitializePlatformSpecific(arraysize(registers), registers);
402}
403
404
405void ApiAccessorDescriptor::InitializePlatformSpecific(
406 CallInterfaceDescriptorData* data) {
407 Register registers[] = {
408 edi, // callee
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000409 ebx, // call_data
410 ecx, // holder
411 edx, // api_function_address
412 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000413 data->InitializePlatformSpecific(arraysize(registers), registers);
414}
415
416
417void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
418 CallInterfaceDescriptorData* data) {
419 Register registers[] = {
420 eax, // argument count (not including receiver)
421 ebx, // address of first argument
422 edi // the target callable to be call
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000423 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000424 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000425}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000426
427
428void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
429 CallInterfaceDescriptorData* data) {
430 Register registers[] = {
431 eax, // argument count (not including receiver)
432 edx, // new target
433 edi, // constructor
434 ebx, // address of first argument
435 };
436 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000437}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000438
439
440void InterpreterCEntryDescriptor::InitializePlatformSpecific(
441 CallInterfaceDescriptorData* data) {
442 Register registers[] = {
443 eax, // argument count (argc)
444 ecx, // address of first argument (argv)
445 ebx // the runtime function to call
446 };
447 data->InitializePlatformSpecific(arraysize(registers), registers);
448}
449
450} // namespace internal
451} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000452
453#endif // V8_TARGET_ARCH_IA32