blob: 98259c7269e22ce7046b28c21295fe27e10683ca [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
Ben Murdoch61f157c2016-09-16 13:49:30 +010014void CallInterfaceDescriptor::DefaultInitializePlatformSpecific(
15 CallInterfaceDescriptorData* data, int register_parameter_count) {
16 const Register default_stub_registers[] = {eax, ebx, ecx, edx, edi};
17 CHECK_LE(static_cast<size_t>(register_parameter_count),
18 arraysize(default_stub_registers));
19 data->InitializePlatformSpecific(register_parameter_count,
20 default_stub_registers);
21}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000022
23const Register LoadDescriptor::ReceiverRegister() { return edx; }
24const Register LoadDescriptor::NameRegister() { return ecx; }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000025const Register LoadDescriptor::SlotRegister() { return eax; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000026
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000027const Register LoadWithVectorDescriptor::VectorRegister() { return ebx; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000028
29
30const Register StoreDescriptor::ReceiverRegister() { return edx; }
31const Register StoreDescriptor::NameRegister() { return ecx; }
32const Register StoreDescriptor::ValueRegister() { return eax; }
33
34
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000035const Register VectorStoreICTrampolineDescriptor::SlotRegister() { return edi; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040036
37
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000038const Register VectorStoreICDescriptor::VectorRegister() { return ebx; }
39
40
41const Register VectorStoreTransitionDescriptor::SlotRegister() {
42 return no_reg;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000043}
44
45
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000046const Register VectorStoreTransitionDescriptor::VectorRegister() { return ebx; }
47
48
49const Register VectorStoreTransitionDescriptor::MapRegister() { return edi; }
50
51
52const Register StoreTransitionDescriptor::MapRegister() { return ebx; }
53
54
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000055const Register StoreGlobalViaContextDescriptor::SlotRegister() { return ebx; }
56const Register StoreGlobalViaContextDescriptor::ValueRegister() { return eax; }
57
58
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000059const Register StringCompareDescriptor::LeftRegister() { return edx; }
60const Register StringCompareDescriptor::RightRegister() { return eax; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000061
Ben Murdochc5610432016-08-08 18:44:38 +010062const Register ApiGetterDescriptor::HolderRegister() { return ecx; }
63const Register ApiGetterDescriptor::CallbackRegister() { return eax; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000064
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 Murdochc5610432016-08-08 18:44:38 +0100255void ArrayNoArgumentConstructorDescriptor::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000256 CallInterfaceDescriptorData* data) {
Ben Murdochc5610432016-08-08 18:44:38 +0100257 // register state
258 // eax -- number of arguments
259 // edi -- function
260 // ebx -- allocation site with elements kind
261 Register registers[] = {edi, ebx, eax};
262 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000263}
264
Ben Murdoch61f157c2016-09-16 13:49:30 +0100265void ArraySingleArgumentConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000266 CallInterfaceDescriptorData* data) {
267 // register state
268 // eax -- number of arguments
269 // edi -- function
270 // ebx -- allocation site with elements kind
Ben Murdoch61f157c2016-09-16 13:49:30 +0100271 Register registers[] = {edi, ebx, eax};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000272 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000273}
274
Ben Murdoch61f157c2016-09-16 13:49:30 +0100275void ArrayNArgumentsConstructorDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000276 CallInterfaceDescriptorData* data) {
277 // register state
278 // eax -- number of arguments
279 // edi -- function
Ben Murdoch61f157c2016-09-16 13:49:30 +0100280 // ebx -- allocation site with elements kind
281 Register registers[] = {edi, ebx, eax};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000282 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000283}
284
Ben Murdoch61f157c2016-09-16 13:49:30 +0100285void VarArgFunctionDescriptor::InitializePlatformSpecific(
Ben Murdochda12d292016-06-02 14:46:10 +0100286 CallInterfaceDescriptorData* data) {
287 // stack param count needs (arg count)
288 Register registers[] = {eax};
289 data->InitializePlatformSpecific(arraysize(registers), registers);
290}
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000291
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000292void CompareDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000293 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000294 Register registers[] = {edx, eax};
295 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000296}
297
298
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000299void BinaryOpDescriptor::InitializePlatformSpecific(
300 CallInterfaceDescriptorData* data) {
301 Register registers[] = {edx, eax};
302 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
303}
304
305
306void BinaryOpWithAllocationSiteDescriptor::InitializePlatformSpecific(
307 CallInterfaceDescriptorData* data) {
308 Register registers[] = {ecx, edx, eax};
309 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
310}
311
Ben Murdochc5610432016-08-08 18:44:38 +0100312void CountOpDescriptor::InitializePlatformSpecific(
313 CallInterfaceDescriptorData* data) {
314 Register registers[] = {eax};
315 data->InitializePlatformSpecific(arraysize(registers), registers);
316}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000317
318void StringAddDescriptor::InitializePlatformSpecific(
319 CallInterfaceDescriptorData* data) {
320 Register registers[] = {edx, eax};
321 data->InitializePlatformSpecific(arraysize(registers), registers, NULL);
322}
323
324
325void KeyedDescriptor::InitializePlatformSpecific(
326 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000327 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000328 ecx, // key
329 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000330 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000331}
332
333
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000334void NamedDescriptor::InitializePlatformSpecific(
335 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000336 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000337 ecx, // name
338 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000339 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000340}
341
342
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000343void CallHandlerDescriptor::InitializePlatformSpecific(
344 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000345 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000346 edx, // name
347 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000348 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000349}
350
351
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000352void ArgumentAdaptorDescriptor::InitializePlatformSpecific(
353 CallInterfaceDescriptorData* data) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000354 Register registers[] = {
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000355 edi, // JSFunction
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000356 edx, // the new target
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000357 eax, // actual number of arguments
358 ebx, // expected number of arguments
359 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000360 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000361}
362
Ben Murdochda12d292016-06-02 14:46:10 +0100363void ApiCallbackDescriptorBase::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000364 CallInterfaceDescriptorData* data) {
365 Register registers[] = {
366 edi, // callee
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000367 ebx, // call_data
368 ecx, // holder
369 edx, // api_function_address
370 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000371 data->InitializePlatformSpecific(arraysize(registers), registers);
372}
373
Ben Murdoch097c5b22016-05-18 11:27:45 +0100374void InterpreterDispatchDescriptor::InitializePlatformSpecific(
375 CallInterfaceDescriptorData* data) {
376 Register registers[] = {
Ben Murdochc5610432016-08-08 18:44:38 +0100377 kInterpreterAccumulatorRegister, kInterpreterBytecodeOffsetRegister,
378 kInterpreterBytecodeArrayRegister, kInterpreterDispatchTableRegister};
Ben Murdoch097c5b22016-05-18 11:27:45 +0100379 data->InitializePlatformSpecific(arraysize(registers), registers);
380}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000381
382void InterpreterPushArgsAndCallDescriptor::InitializePlatformSpecific(
383 CallInterfaceDescriptorData* data) {
384 Register registers[] = {
385 eax, // argument count (not including receiver)
386 ebx, // address of first argument
387 edi // the target callable to be call
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000388 };
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000389 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000390}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000391
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000392void InterpreterPushArgsAndConstructDescriptor::InitializePlatformSpecific(
393 CallInterfaceDescriptorData* data) {
394 Register registers[] = {
395 eax, // argument count (not including receiver)
396 edx, // new target
397 edi, // constructor
398 ebx, // address of first argument
399 };
400 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000401}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000402
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000403void InterpreterCEntryDescriptor::InitializePlatformSpecific(
404 CallInterfaceDescriptorData* data) {
405 Register registers[] = {
406 eax, // argument count (argc)
407 ecx, // address of first argument (argv)
408 ebx // the runtime function to call
409 };
410 data->InitializePlatformSpecific(arraysize(registers), registers);
411}
412
Ben Murdochc5610432016-08-08 18:44:38 +0100413void ResumeGeneratorDescriptor::InitializePlatformSpecific(
414 CallInterfaceDescriptorData* data) {
415 Register registers[] = {
416 eax, // the value to pass to the generator
417 ebx, // the JSGeneratorObject to resume
418 edx // the resume mode (tagged)
419 };
420 data->InitializePlatformSpecific(arraysize(registers), registers);
421}
422
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000423} // namespace internal
424} // namespace v8
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000425
426#endif // V8_TARGET_ARCH_IA32