blob: 2748f907ac9ab1c05574c8152e0e51a799bdb025 [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
Ben Murdochb8a8cc12014-11-26 15:28:44 +000062const Register ApiGetterDescriptor::function_address() { return edx; }
63
64
65const Register MathPowTaggedDescriptor::exponent() { return eax; }
66
67
68const Register MathPowIntegerDescriptor::exponent() {
69 return MathPowTaggedDescriptor::exponent();
70}
71
72
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000073const Register GrowArrayElementsDescriptor::ObjectRegister() { return eax; }
74const Register GrowArrayElementsDescriptor::KeyRegister() { return ebx; }
75
76
77void FastNewClosureDescriptor::InitializePlatformSpecific(
78 CallInterfaceDescriptorData* data) {
79 Register registers[] = {ebx};
80 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000081}
82
83
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000084void FastNewContextDescriptor::InitializePlatformSpecific(
85 CallInterfaceDescriptorData* data) {
86 Register registers[] = {edi};
87 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000088}
89
Ben Murdoch097c5b22016-05-18 11:27:45 +010090void FastNewObjectDescriptor::InitializePlatformSpecific(
91 CallInterfaceDescriptorData* data) {
92 Register registers[] = {edi, edx};
93 data->InitializePlatformSpecific(arraysize(registers), registers);
94}
95
96void FastNewRestParameterDescriptor::InitializePlatformSpecific(
97 CallInterfaceDescriptorData* data) {
98 Register registers[] = {edi};
99 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
100}
101
102
103void FastNewSloppyArgumentsDescriptor::InitializePlatformSpecific(
104 CallInterfaceDescriptorData* data) {
105 Register registers[] = {edi};
106 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
107}
108
109
110void FastNewStrictArgumentsDescriptor::InitializePlatformSpecific(
111 CallInterfaceDescriptorData* data) {
112 Register registers[] = {edi};
113 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
114}
115
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000116
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000117// static
Ben Murdochda12d292016-06-02 14:46:10 +0100118const Register TypeConversionDescriptor::ArgumentRegister() { return eax; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000119
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000120void TypeofDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000121 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000122 Register registers[] = {ebx};
123 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000124}
125
126
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000127void FastCloneRegExpDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000128 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000129 Register registers[] = {edi, eax, ecx, edx};
130 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000131}
132
133
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000134void FastCloneShallowArrayDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000135 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000136 Register registers[] = {eax, ebx, ecx};
137 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000138}
139
140
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000141void FastCloneShallowObjectDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000142 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000143 Register registers[] = {eax, ebx, ecx, edx};
144 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000145}
146
147
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000148void CreateAllocationSiteDescriptor::InitializePlatformSpecific(
149 CallInterfaceDescriptorData* data) {
150 Register registers[] = {ebx, edx};
151 data->InitializePlatformSpecific(arraysize(registers), registers);
152}
153
154
155void CreateWeakCellDescriptor::InitializePlatformSpecific(
156 CallInterfaceDescriptorData* data) {
157 Register registers[] = {ebx, edx, edi};
158 data->InitializePlatformSpecific(arraysize(registers), registers);
159}
160
161
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000162void CallFunctionDescriptor::InitializePlatformSpecific(
163 CallInterfaceDescriptorData* data) {
164 Register registers[] = {edi};
165 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
166}
167
168
169void CallFunctionWithFeedbackDescriptor::InitializePlatformSpecific(
170 CallInterfaceDescriptorData* data) {
171 Register registers[] = {edi, edx};
172 data->InitializePlatformSpecific(arraysize(registers), registers);
173}
174
175
176void CallFunctionWithFeedbackAndVectorDescriptor::InitializePlatformSpecific(
177 CallInterfaceDescriptorData* data) {
178 Register registers[] = {edi, edx, ebx};
179 data->InitializePlatformSpecific(arraysize(registers), registers);
180}
181
182
183void CallConstructDescriptor::InitializePlatformSpecific(
184 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000185 // eax : number of arguments
186 // ebx : feedback vector
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000187 // ecx : new target (for IsSuperConstructorCall)
188 // edx : slot in feedback vector (Smi, for RecordCallTarget)
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000189 // edi : constructor function
190 // TODO(turbofan): So far we don't gather type feedback and hence skip the
191 // slot parameter, but ArrayConstructStub needs the vector to be undefined.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000192 Register registers[] = {eax, edi, ecx, ebx};
193 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000194}
195
196
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000197void CallTrampolineDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000198 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000199 // eax : number of arguments
200 // edi : the target to call
201 Register registers[] = {edi, eax};
202 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000203}
204
205
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000206void ConstructStubDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000207 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000208 // eax : number of arguments
209 // edx : the new target
210 // edi : the target to call
211 // ebx : allocation site or undefined
212 Register registers[] = {edi, edx, eax, ebx};
213 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000214}
215
216
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000217void ConstructTrampolineDescriptor::InitializePlatformSpecific(
218 CallInterfaceDescriptorData* data) {
219 // eax : number of arguments
220 // edx : the new target
221 // edi : the target to call
222 Register registers[] = {edi, edx, eax};
223 data->InitializePlatformSpecific(arraysize(registers), registers);
224}
225
226
227void RegExpConstructResultDescriptor::InitializePlatformSpecific(
228 CallInterfaceDescriptorData* data) {
229 Register registers[] = {ecx, ebx, eax};
230 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
231}
232
233
234void TransitionElementsKindDescriptor::InitializePlatformSpecific(
235 CallInterfaceDescriptorData* data) {
236 Register registers[] = {eax, ebx};
237 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
238}
239
240
241void AllocateHeapNumberDescriptor::InitializePlatformSpecific(
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400242 CallInterfaceDescriptorData* data) {
243 // register state
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000244 data->InitializePlatformSpecific(0, nullptr, nullptr);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400245}
246
Ben Murdochda12d292016-06-02 14:46:10 +0100247#define SIMD128_ALLOC_DESC(TYPE, Type, type, lane_count, lane_type) \
248 void Allocate##Type##Descriptor::InitializePlatformSpecific( \
249 CallInterfaceDescriptorData* data) { \
250 data->InitializePlatformSpecific(0, nullptr, nullptr); \
251 }
252SIMD128_TYPES(SIMD128_ALLOC_DESC)
253#undef SIMD128_ALLOC_DESC
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400254
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000255void AllocateInNewSpaceDescriptor::InitializePlatformSpecific(
256 CallInterfaceDescriptorData* data) {
257 Register registers[] = {eax};
258 data->InitializePlatformSpecific(arraysize(registers), registers);
259}
260
261
262void ArrayConstructorConstantArgCountDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000263 CallInterfaceDescriptorData* data) {
264 // register state
265 // eax -- number of arguments
266 // edi -- function
267 // ebx -- allocation site with elements kind
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000268 Register registers[] = {edi, ebx};
269 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000270}
271
272
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000273void ArrayConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000274 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000275 // stack param count needs (constructor pointer, and single argument)
276 Register registers[] = {edi, ebx, eax};
277 data->InitializePlatformSpecific(arraysize(registers), registers);
278}
279
280
281void InternalArrayConstructorConstantArgCountDescriptor::
282 InitializePlatformSpecific(CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000283 // register state
284 // eax -- number of arguments
285 // edi -- function
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000286 Register registers[] = {edi};
287 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000288}
289
290
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000291void InternalArrayConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000292 CallInterfaceDescriptorData* data) {
293 // stack param count needs (constructor pointer, and single argument)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000294 Register registers[] = {edi, eax};
295 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000296}
297
Ben Murdochda12d292016-06-02 14:46:10 +0100298void FastArrayPushDescriptor::InitializePlatformSpecific(
299 CallInterfaceDescriptorData* data) {
300 // stack param count needs (arg count)
301 Register registers[] = {eax};
302 data->InitializePlatformSpecific(arraysize(registers), registers);
303}
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000304
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000305void CompareDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000306 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000307 Register registers[] = {edx, eax};
308 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000309}
310
311
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000312void BinaryOpDescriptor::InitializePlatformSpecific(
313 CallInterfaceDescriptorData* data) {
314 Register registers[] = {edx, eax};
315 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
316}
317
318
319void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
320 CallInterfaceDescriptorData* data) {
321 Register registers[] = {ecx, edx, eax};
322 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
323}
324
325
326void StringAddDescriptor::InitializePlatformSpecific(
327 CallInterfaceDescriptorData* data) {
328 Register registers[] = {edx, eax};
329 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
330}
331
332
333void KeyedDescriptor::InitializePlatformSpecific(
334 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000335 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000336 ecx, // key
337 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000338 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000339}
340
341
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000342void NamedDescriptor::InitializePlatformSpecific(
343 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000344 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000345 ecx, // name
346 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000347 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000348}
349
350
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000351void CallHandlerDescriptor::InitializePlatformSpecific(
352 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000353 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000354 edx, // name
355 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000356 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000357}
358
359
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000360void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
361 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000362 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000363 edi, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000364 edx, // the new target
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000365 eax, // actual number of arguments
366 ebx, // expected number of arguments
367 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000368 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000369}
370
Ben Murdochda12d292016-06-02 14:46:10 +0100371void ApiCallbackDescriptorBase::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000372 CallInterfaceDescriptorData* data) {
373 Register registers[] = {
374 edi, // callee
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000375 ebx, // call_data
376 ecx, // holder
377 edx, // api_function_address
378 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000379 data->InitializePlatformSpecific(arraysize(registers), registers);
380}
381
Ben Murdoch097c5b22016-05-18 11:27:45 +0100382void InterpreterDispatchDescriptor::InitializePlatformSpecific(
383 CallInterfaceDescriptorData* data) {
384 Register registers[] = {
385 kInterpreterAccumulatorRegister, kInterpreterRegisterFileRegister,
386 kInterpreterBytecodeOffsetRegister, kInterpreterBytecodeArrayRegister };
387 data->InitializePlatformSpecific(arraysize(registers), registers);
388}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000389
390void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
391 CallInterfaceDescriptorData* data) {
392 Register registers[] = {
393 eax, // argument count (not including receiver)
394 ebx, // address of first argument
395 edi // the target callable to be call
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000396 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000397 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000398}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000399
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000400void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
401 CallInterfaceDescriptorData* data) {
402 Register registers[] = {
403 eax, // argument count (not including receiver)
404 edx, // new target
405 edi, // constructor
406 ebx, // address of first argument
407 };
408 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000409}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000410
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000411void InterpreterCEntryDescriptor::InitializePlatformSpecific(
412 CallInterfaceDescriptorData* data) {
413 Register registers[] = {
414 eax, // argument count (argc)
415 ecx, // address of first argument (argv)
416 ebx // the runtime function to call
417 };
418 data->InitializePlatformSpecific(arraysize(registers), registers);
419}
420
421} // namespace internal
422} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000423
424#endif // V8_TARGET_ARCH_IA32